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
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
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.
╭─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
╭─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 ╰─$
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
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!
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
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
╭─markmcfate@ma8660 ~/GitHub/wieting-lando ‹ruby-2.3.0› ‹master*› ╰─$ rsync -aruvi . email@example.com:/opt/docker-compose-drupal/drupal/. --progress
Then back on
╭─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. 😄