Drupal Site Quickstart
Works with Drupal: ^8 || ^9
Create Database and User
mysql -u [user] -p
Where [user] has ALL PRIVILEGES globally
CREATE DATABASE [dbname];
GRANT ALL PRIVILEGES ON [dbname].* TO [dbuser]@localhost IDENTIFIED BY '[password]';
FLUSH PRIVILEGES;
Install Drupal Core from Composer
See Using Composer to Install Drupal and Manage Dependencies.
cd /var/www/
mkdir [dirname]
composer create-project drupal/recommended-project [dirname]
Install Drupal Core from a Git Repo You've Already Created*
* See below.
cd /var/www/
git clone [repo URI]
Rename this directory as required.
cd /var/www/[dirname]
composer i
Configure Apache
Config file template:
<VirtualHost *:80>
        ServerAdmin [you@domain]
        ServerName [fqdn]
        #ServerAlias www.[fqdn]
        
        RewriteEngine on
        RewriteCond  %{HTTP_HOST}  !^[fqdn]          [NC]
        RewriteCond  %{HTTP_HOST}  !^$
        RewriteRule  ^/(.*)        http://[fqdn]/$1  [L,R]
        #Uncomment if production server with HTTPS
        #RewriteCond %{SERVER_NAME} =[fqdn] [OR]
        #RewriteCond %{SERVER_NAME} =[fqdn]
        #RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
  
        DocumentRoot /var/www/[dirname]/web
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/[dirname]/web>
                RewriteEngine on
                RewriteBase /
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog /var/log/apache2/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
        ServerSignature On
</VirtualHost>
Drupal initial setup
cd /var/www/[dirname]
mkdir -p config/sync
mkdir db
cd /var/www/[dirname]/web/sites/default/
mkdir files
cp default.settings.php settings.php
Set this value in settings.php:
$settings['config_sync_directory'] = '/var/www/[dirname]/config/sync';
Also set trusted hosts.
sudo chown www-data:www-data files/ settings.php
Run Drupal installer
sudo chown [you]:staff settings.php
sudo chmod 664 settings.php
composer require drush/drush drupal/devel drupal/admin_toolbar
See also Drush Launcher.
sudo -u www-data drush en devel admin_toolbar media_library layout_builder
(Running as www-data because media module needs to create a directory in 'files'.)
SSL Certificate
sudo certbot --apache
(On live sites only, obviously.)
[Todo: git stuff.]
Database
Backup
drush sql:dump | gzip > /var/www/[dirname]/db/[whatever].sql.gz
Restore
drush sql:drop
drush sqlq --file=/var/www/[dirname]/[whatever].sql.gz