Drush
We use Drush a lot.
Drush Aliases
Drush 9+ (used on Drupal 8+ projects only) allows for the storage and use of drush aliases within the repository which allows us to configure and store aliases and distribute them easily to other team members, just by checking out the project repository.
One-time configuration
This step only needs to be done just once on your host machine. You will need to create a global config file for Lando, called ~/.lando/config.yml
:
touch ~/.lando/config.yml
Edit ~/.lando/config.yml
and add the following if it doesn't already exist:
containerGlobalEnv:
USER: tanc
Change the value for the USER
key to whatever your username is on the remote servers. This may well be your local username.
Set up on a new or existing projects
If there is no [project root]/drush
directory then one needs to be created. Aliases will be defined in [project root]/drush/sites
. From the gitoot, make the directories needed:
mkdir -p drush/sites
You will need two alias files stored in [project root]/drush/sites/
:
- A
remote.site.yml
file - A
server.site.yml
file
File: remote.site.yml
The remote.site.yml file will contain the configuration for drush to understand how to connect to the sites on a remote server. This will look like the following boilerplate code:
stage:
host: stage.projectname.com
root: /var/www/stage.projectname.com/gitroot/web/
uri: default
user: ${env.USER}
prod:
host: production.projectname.com
root: /var/www/production.projectname.com/gitroot/web/
uri: default
user: ${env.USER}
Change the host and root directives to suit the server and site you are working with.
The value for the user key is making use of the global Lando environment variable called USER which we previously set in ~/.lando/config.yml
. Without this ssh based commands run from within a container are unaware of the host's user name and therefore cannot correctly access a remote server.
File: server.site.yml
The server.site.yml
file is used for any commands that need to be issues on the server. For example, if you are ssh'd in to the remote server and want to clone the prod database to the stage site you can use this alias to do it.
Add the following boilerplate to the gitroot/sites/server.site.yml
file:
stage:
root: /var/www/stage.projectname.com/gitroot/web/
uri: default
prod:
root: /var/www/production.projectname.com/gitroot/web/
uri: default
Change the root directive to the correct path on the server.
Usage
With these two site aliases in place you can do various things. Some examples are:
- Clone production database to your local Lando dev site:
lando drush sql-sync @remote.prod @self
- Whilst on the server, clone the production database to the stage site:
cd /var/www/stage.projectname.com/gitroot/web
drush sql-sync @server.prod @self
- Whilst on your local development machine and within a Lando project, clone the production database to the stage site on the remote server:
lando drush @remote.prod sql-sync @server.prod @server.stage
- Whilst on your local development machine and within a Lando project, clone the production files to the stage site:
lando drush @remote.prod ssh "sudo drush rsync @server.prod:sites/default/files/ @server.stage:sites/default/files/"
Examples 3 & 4 are quite advanced use of drush aliases and may require some explanation:
3: We are asking lando to issue a drush command within the appserver container (lando drush
) and this command is to remotely execute (@remote.prod
) the drush sql-sync
command, syncing the production (@server.prod
) database to the stage (@server.stage
) site.
4: Even more complex as we are issuing a remote command using ssh. First we ask lando to execute the drush command on the appserver (lando drush
) but we pass it the remote alias (@remote.prod
) and the drush ssh
command so it actually executes the quoted string over ssh on the remote server. This ssh command executes drush rsync
as the root user (root is needed as www-data user owns the files) and syncs the production site's public files directory (@server.prod:sites/default/files/
) to the stage site (@server.stage:sites/default/files/
).
Last updated: