Migration to Lando
I have ITS tickets, for seemingly simple DNS changes, that are now more than a month old, and because of that I’ve taken steps to try and do some ISLE staging work on one of my DigitalOcean droplets, namely summitt-services-droplet-01. In order to accommodate that I’ve moved nearly all of the sites and services from that droplet to my other, summitt-dweller-DO-docker. The site migration was a smooth process except for https://Wieting.TamaToledo.com. That Drupal 8 site has been difficult to upgrade and migrate largely because it was deployed using my old Port-Ability scripts, and about a year ago I scrapped Port-Ability in favor of Docksal, but I never got around to moving that particular site to a Docksal environment. Well, now I’m finding it almost impossible to complete that migration to Docksal.
The Problem with Docksal
Docksal is a wonderful development environment, but I can’t find an effective, and easily repeatable, path from development to production when using it. Docksal provides system services including an SSH Agent
, DNS
, and Reverse Proxy
as documented here. Docksal services are provided by a cli
container/service which is also responsible for providing a robust set of fin
commands. In addition to cli
, a typical Docksal stack also provides containers for web
and db
, and those look a lot like what I like to deploy for Drupal in production. However, the cli
container looks nothing like what I deploy in production, and therein lies the rub.
The Promise of Lando
Hindsight is 20/20, so this must be the year to look back and make course corrections, right? Had I not fallen so quickly for the speed and glitz of Docksal I would have given some of its alternatives, like Lando, a closer look. The immediate promise of Lando is that it builds, in development, a stack that looks much more like what I wish to deploy in production, and it does so by not integrating as tightly as Docksal does.
Migrating the Wieting Theatre Web Site to Lando
Another thing that I like about Lando is the fact that Jeff Geerling has taken it for a spin and documented some of his experience with it in his blog. So I have elected to begin my adventures in Lando with this post.
After following Jeff’s lead I discovered that it left me a little short of my goal… to spin up an existing Drupal 8 site using Lando. So, I backed off a bit and returned to studying the contents of https://github.com/lando/lando. Along the way I found a post by the folks at colorfield.
Following colorfield.be
See Drupal and Docker the easy way with Lando.
╭─mark@Marks-Mac-Mini ~/GitHub
╰─$ php -d memory_limit=-1 composer.phar create-project drupal-composer/drupal-project:8.x-dev wieting-lando --stability dev --no-interaction
...wait for it...
╭─mark@Marks-Mac-Mini ~/GitHub
╰─$ cd wieting-lando
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ lando init
? From where should we get your app's codebase? current working directory
? What recipe do you want to use? drupal8
? Where is your webroot relative to the init destination? web
? What do you want to call this app? wieting
NOW WE'RE COOKING WITH FIRE!!!
Your app has been initialized!
Go to the directory where your app was initialized and run `lando start` to get rolling.
Check the LOCATION printed below if you are unsure where to go.
Oh... and here are some vitals:
NAME wieting
LOCATION /Users/mark/GitHub/wieting-lando
RECIPE drupal8
DOCS https://docs.devwithlando.io/tutorials/drupal8.html
Then…
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ atom . # to add config: keys for via:nginx and database:mariadb
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ lando start
Let's get this party started! Starting app..
Creating network "landoproxyhyperion5000gandalfedition_edge" with driver "bridge"
Creating landoproxyhyperion5000gandalfedition_proxy_1 ... done
Creating network "wieting_default" with the default driver
Creating wieting_database_1 ... done
Creating wieting_appserver_1 ... done
Creating wieting_appserver_nginx_1 ... done
Waiting until appserver_nginx service is ready...
Waiting until appserver service is ready...
Waiting until database service is ready...
BOOMSHAKALAKA!!!
Your app has started up correctly.
Here are some vitals:
NAME wieting
LOCATION /Users/mark/GitHub/wieting-lando
SERVICES appserver_nginx, appserver, database
APPSERVER_NGINX URLS https://localhost:32808
http://localhost:32809
http://wieting.lndo.site
https://wieting.lndo.site
A visit to https://wieting.lndo.site takes me to the /core/install.php
script where I set the following…
- Language: English
- Installation Profile: Standard
- Database type: MariaDB
- Database name: drupal8
- Database username: drupal8
- Database password: drupal8
- Host: database
BOOMSHAKALAKA! The site info was already there. The site is up!
Composer, Drush and Drupal Console
Did some checking just to be sure these work…
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ lando composer --version
Composer 1.9.3 2020-02-04 12:58:49
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ lando drush status
Drupal version : 8.8.2
Site URI : http://default
DB driver : mysql
DB hostname : database
DB port : 3306
DB username : drupal8
DB name : drupal8
Database : Connected
Drupal bootstrap : Successful
Default theme : bartik
Admin theme : seven
PHP binary : /usr/local/bin/php
PHP config :
PHP OS : Linux
Drush script : /app/vendor/drush/drush/drush
Drush version : 10.2.1
Drush temp : /tmp
Drush configs : /app/vendor/drush/drush/drush.yml
/app/drush/drush.yml
Install profile : standard
Drupal root : /app/web
Site path : sites/default
Files, Public : sites/default/files
Files, Temp : /tmp
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$ lando drupal about
Drupal Console (1.9.4)
======================
Copy configuration files.
drupal init
Download, install and serve Drupal 8
drupal quick:start
Create a new Drupal project
drupal site:new
Install a Drupal project
drupal site:install
Lists all available commands
drupal list
Update project to the latest version.
drupal self-update
╭─mark@Marks-Mac-Mini ~/GitHub/wieting-lando
╰─$
Woot!
Committing to GitHub
Since there are no secrets in this config, yet, I’m going to push it to GitHub. Specifically… SummittDweller/wieting-lando.
Restarting Local Development
I’m back at work on the campus of Grinnell College today and am looking to pick up last evening’s development here, so I need to “move” my project to a different host, namely MA8660. Let’s see if this works…
╭─markmcfate@ma8660 ~/GitHub ‹ruby-2.3.0›
╰─$ git clone https://github.com/SummittDweller/wieting-lando
Cloning into 'wieting-lando'...
remote: Enumerating objects: 30, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 30 (delta 0), reused 30 (delta 0), pack-reused 0
Unpacking objects: 100% (30/30), done.
╭─markmcfate@ma8660 ~/GitHub ‹ruby-2.3.0›
╰─$ cd wieting-lando
Whoa! The wieting-lando
directory looks a little empty, probably because I see that my .gitignore
file ignored alot of stuff. 😦 No matter, let’s see if we can work some magic…
╭─markmcfate@ma8660 ~/GitHub/wieting-lando ‹ruby-2.3.0› ‹master›
╰─$ lando composer update
...and the magic happens...
╭─markmcfate@ma8660 ~/GitHub/wieting-lando ‹ruby-2.3.0› ‹master›
╰─$ lando start
Let's get this party started! Starting app..
...more magic...
Waiting until database service is ready...
BOOMSHAKALAKA!!!
Your app has started up correctly.
Here are some vitals:
NAME wieting
LOCATION /Users/markmcfate/GitHub/wieting-lando
SERVICES appserver_nginx, appserver, database
APPSERVER_NGINX URLS https://localhost:32773
http://localhost:32774
http://wieting.lndo.site:8000
https://wieting.lndo.site:444
And BOOM, we are ready to install a new site again!
Switching Gears…Again
I’m turning my attention now to summitt-dweller-DO-docker
and https://github.com/mogtofu33/docker-compose-drupal(https://github.com/mogtofu33/docker-compose-drupal) which I recently forked to https://github.com/SummittDweller/docker-compose-drupal.
My attempt to get my wieting-lando
Drupal code up and working at DigitalOcean per the instructions in Installation and configuration working as administrator
on summitt-dweller-DO-docker
looks like this:
╭─administrator@summitt-dweller-DO-docker /opt
╰─$ git clone https://github.com/SummittDweller/docker-compose-drupal.git
╭─administrator@summitt-dweller-DO-docker /opt
╰─$ cd docker-compose-drupal
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹master›
╰─$ git checkout -b wieting
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹wieting›
╰─$ cp docker-compose.tpl.yml docker-compose.yml\ncp default.env .env
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹wieting›
╰─$ nano .env # to make recommended edits
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹wieting›
╰─$ nano docker-compose.yml # to make recommended edits
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹wieting›
╰─$ docker-compose config # to check the config...good to go
Then from MA8660
…
╭─markmcfate@ma8660 ~/GitHub/wieting-lando ‹ruby-2.3.0› ‹master*›
╰─$ rsync -aruvi . administrator@104.248.237.235:/opt/docker-compose-drupal/drupal/. --progress
Then back on summitt-dweller-DO-docker
…
╭─administrator@summitt-dweller-DO-docker /opt/docker-compose-drupal ‹wieting›
╰─$ docker-compose up --build -d
But this command failed because of two issues:
Cannot start service portainer: driver failed programming external connectivity on endpoint wieting-portainer
- Portainer is already running on this node, we don’t need it again!Cannot start service nginx: driver failed programming external connectivity on endpoint wieting-nginx
- Sure, port 80 is already occupied…we need some Traefik magic here!
First step… remove (comment out) the portainer
service in docker-compose.yml
, and bring back the dashboard
service just to see how it works.
Next step… add some Traefik labels and port assignments (see summitt-dweller-DO-docker /opt/omeka-s2/docker-compose.yml
for examples) to our docker-compose.yml
to aleviate the nginx
port conflict issues.
^^^ Do As He Says ^^^
And that’s…promising. I’ll be back. 😄