Migrations are not always a walk in the park and, as we have already seen in previous articles, they may need a lot of planning.
If we are talking about moving from big versions (namely Drupal 6 or Drupal 7 to Drupal 8), just talking about infrastructure can cause you to start to sweat.
Even in Drupal itself, the truth is (or was until recently) migrations were not fully stable and they could give you more than a headache. On top of that, building the local infrastructure is a necessary pain, where you can lose a lot of precious time that you'd rather be dedicating to the migration itself.
Well, all of that was true a year, or even months ago… but not anymore.
First, core Drupal 8 migration is pleasantly stable now, and the process itself can be -- for many cases -- a walk in the park. I've been following the evolution since it was announced, and it has evolved from a painful process where you would end up with a site where lots of things were broken (images and files, taxonomies, modules that were not yet supported, etc.) to where we are nowadays, where everything works just like magic. At least for simple sites like blogs, content types without excessively sophisticated fields or dependencies, and so on.
Second, we have tools like DDEV that have transformed the process of building your local environments into an absolute joy.
So let’s go for it! I’ll use my personal site, alexmoreno.net as migration example.
Step 0. Install DDEV
First thing you are going to need is to install DDEV. Simply go to
And just follow the setup steps. The installation instructions are here:
Note that I’ve chosen DDEV because, as we are going to see, it makes the process really simple. But that should not stop you from trying the same, or very similar, process using Lando or Docksal for example. In fact if you can do it please let us know how it went :-).
Step 1. Configure your old Drupal site locally.
First things first, we'll need to get the source, or get the latest version of the core, for the current version of whatever our site is using (Drupal 7, Drupal 6...). And as always, make sure your site has both core and contributed modules updated to the most recent versions.
Also get the latest version of whatever the latest Drupal 8 is at that moment, as we'll be running both in parallel in the next step. I like to organize both in folders like this:
While the second folder contains the goal, Drupal 8, the first one is self explanatory: my old blog in Drupal 6 (or 7 if that's your case).
Step 2. Open your old site
Then let's fire up the Drupal 6/7 version that we want to migrate to Drupal 8. We'll go to the folder where we have the sources, those that we have just downloaded, and we'll follow the normal steps we execute to start any new project in DDEV.
ddev config ddev start
At the end we should see something like this:
Successfully started moreno-d6 Project can be reached at http://moreno-d6.ddev.local, https://moreno-d6.ddev.local, http://127.0.0.1:32791
The magic about DDEV is that it'll detect your Drupal version and it will take care of everything else for you. From php versions, databases, routing, the http engine, etc. Just like that, what is not to love? Next we won't be following the next steps in DDEV creating a new project. Instead we'll import the database from the current projector site (the one that we want to migrate from).
ddev exec drush sql-cli < ../morenodotnet.sql
Depending on your site you may need to set up a few things, making sure all is running and working. In my case, for example, I had some modules missing and a theme, so I scp’ed everything (ftp’ed or whatever - remember composer didn't exist yet in Drupal 6) into the DDEV folder. Once everything looks like its working, and we are happy with the old site running in DDEV, we can move on to the next step.
Step 3. Configure your new (Drupal 8) site
Which is configuring a new Drupal 8 site. We'll repeat the same steps, but this time in the Drupal 8 folder, and finishing the install with drush site-install:
ddev config ddev start ddev exec drush site-install --account-name=admin --account-pass=admin
I told you the process is simple, but it never ceases to amaze me how simple it is nowadays. I would have spent 30 minutes or more on this in the past -- just preparing the machine, php, apache, MySQL…
It's worth it to note that all this has been done in these simple steps.
Apart from that, please please please, don't use admin/admin as I have. Replace them with a strong user/password combination.
Step 4. Ready, Steady, Migrate!!
Now let's move to the migration itself.
We are going to need a few tools.
composer require drupal/migration_tools composer require drupal/migrate_plus # And lets enable them in Drupal ddev exec drush en -y migration_tools, migrate_drupal_ui, migrate_drupal, migrate
Thunderbirds, it's all systems go!
We’ll use the Drupal Migrate UI, so this is going to be easy. But if you opt for Drush, it will be equally easy. Just head to the Drupal 8 upgrade url:
Then, the important parameters to use here are the url or host, and the public files folder. The host will be the DDEV machine name. You can get this from docker ps:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d85d82d8b18 drud/ddev-router:v1.4.0 "/app/docker-entrypo…" 12 hours ago Up 12 hours (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8025->8025/tcp, 0.0.0.0:8036->8036/tcp ddev-router c8c0cc9e3340 drud/ddev-webserver:v1.4.0 "/start.sh" 12 hours ago Up 12 hours (healthy) 0.0.0.0:32791->80/tcp, 0.0.0.0:32790->8025/tcp ddev-moreno-d6-web 70f3e4a4ed53 drud/phpmyadmin:v1.4.0 "/run.sh phpmyadmin" 12 hours ago Up 12 hours (healthy) 0.0.0.0:32789->80/tcp ddev-moreno-d6-dba ac0a377b9b3c drud/ddev-dbserver:v1.4.0 "/docker-entrypoint.…" 12 hours ago Up 12 hours (healthy) 0.0.0.0:32788->3306/tcp ddev-moreno-d6-db 413227d3eea1 drud/ddev-webserver:v1.4.0 "/start.sh" 21 hours ago Up 21 hours (healthy) 0.0.0.0:32787->80/tcp, 0.0.0.0:32786->8025/tcp ddev-moreno-web 1e00a0636051 drud/phpmyadmin:v1.4.0 "/run.sh phpmyadmin" 21 hours ago Up 21 hours (healthy) 0.0.0.0:32785->80/tcp ddev-moreno-dba dc4ea56ad25c drud/ddev-dbserver:v1.4.0 "/docker-entrypoint.…" 21 hours ago Up 21 hours (healthy) 0.0.0.0:32784->3306/tcp ddev-moreno-db
So it would be:
Drupal version to migrate from: D7 db host: ddev-moreno-d6-db user: db password: db public files: https://moreno-d6.ddev.local/
Note that you could also use your current site for the public files, for example: https://alexmoreno.net/. Sometimes this may help to debug issues, wrong migrations, etc.
Press next, wait a few minutes, and that's pretty much it.
In your new Drupal 8 site you'll have to add a new theme, maybe some new modules, customize a bit, and, once you are happy with the results, you are good to go. Export your db like this:
ddev exec drush sql-dump --result-file=morenod8.sql
And then deploy, maybe in a Kubernetes environment if you have the time for that.
Otherwise, I'd recommend a hosting platform like Acquia Cloud, where everything is optimised and monitored for you -- in case you need something more robust and/or you don't have the time to maintain the machines by yourself.