LandoでDrupal 9のマルチサイトを起動する

Drupalでは、**マルチサイト**と呼ばれる、単一のコードベースから複数のサイトを提供できる機能が用意されています。各サイトは独立したデータベース、構成設定、ファイルを持ちます。コードベースが共通化されていることによって次のことが実現できます。

- モジュール、テーマの一括配置
- セキュリティアップデートの一括適用

同じモジュール、テーマを配布しながら、設定やコンテンツは各サイトごとに持てるので、類似するサイトをある程度柔軟性を持ちながら建てることができます。グローバル企業の各現地法人ウェブサイトなどがユースケースとしてよく挙げられます。

https://www.drupal.org/docs/multisite-drupal

## 設定方法

Dockerベースのローカル開発環境を構築できる[Lando](https://lando.dev/)を使用して、ローカル環境にマルチサイトを起動します。

- http://site1.lndo.site
- http://site2.lndo.site

### Drupalプロジェクトの作成

ローカル環境で `composer create-project` を実行し、Drupalプロジェクトを作成する。後々drushコマンドを使用してサイトをインストールするのでdrushコマンドもインストールする。

```terminal
$ composer create-project drupal/recommended-project my-multi-site
$ cd my-multi-site
$ composer require drush/drush
```

### 各設定ファイルの作成

次の4つのファイルを作成していく。

- .lando.yml
- drush/sites/site1.site.yml
- drush/sites/site2.site.yml
- web/sites/sites.php

.lando.ymlを次の内容で作成する。

```yaml:.lando.yml
name: my-multi-site
recipe: drupal9
config:
  webroot: web
proxy:
  appserver:
    - site1.lndo.site
    - site2.lndo.site
services:
  site1_db:
    type: mysql:5.7
    portforward: 33068
  site2_db:
    type: mysql:5.7
    portforward: 33069
```

Drushで簡単にマルチサイトを操作できるようにするために、Drushのサイトエイリアスファイルを作成する。まず drush/sites ディレクトリを作成する。

```terminal
$ mkdir -p drush/sites
```

YAMLファイルのrootキーには、Drupalのプロジェクトルートを指定する。今回はlandoで作成した環境に対してdrushコマンドを実行するので、ローカル環境のプロジェクトルートではなく、lando環境内のプロジェクトルートを指定する。


```yaml:drush/sites/site1.site.yml
local:
  root: /app
  uri: 'http://site1.lndo.site'
  paths:
   - files: sites/site1/files
```

```yaml:drush/sites/site2.site.yml
local:
  root: /app
  uri: 'http://site2.lndo.site'
  paths:
   - files: sites/site2/files
```

web/sites/sites.phpファイルを作成する。

```php:web/sites/sites.php
<?php
$sites['site1.lndo.site'] = 'site1';
$sites['site2.lndo.site'] = 'site2';
```

web/sites/site1、web/sites/site2ディレクトリを作成する。

```terminal
$ mkdir web/sites/site1
$ mkdir web/sites/site2
```

### 各サイトの起動

lando環境を起動する。

```terminal
$ lando start

# ...省略...

Here are some vitals:

 NAME            my-multi-site                              
 LOCATION        /Users/hikaru.maruyama/src/test/my-multi-site 
 SERVICES        appserver, database, site1_db, site2_db    
 APPSERVER URLS  https://localhost:54934                    
                 http://localhost:54935                     
                 http://site1.lndo.site/                    
                 https://site1.lndo.site/                   
                 http://site2.lndo.site/                    
                 https://site2.lndo.site/
```

drushコマンドで site1 の初期インストールを行う。`@site1.local` と指定することで、 site1.site.yml で設定したDrushのサイトエイリアスが利用される。

```terminal
$ lando drush @site1.local site:install standard \
--locale=ja \
--db-url=mysql://mysql:mysql@site1_db:3306/database \
--sites-subdir=site1

You are about to:
 * Create a sites/site1/settings.php file        
 * DROP all tables in your 'database' database.
 Do you want to continue? (yes/no) [yes]:
 > yes

# ...省略...

[success] Installation complete.  User name: admin  User password: WALZ8wD47z
```

http://site1.lndo.site にアクセスすると、初期インストールが完了したDrupalサイトが作成できていることがわかる。また、web/sites/site1ディレクトリにsettings.phpファイルとfilesディレクトリが作成されていることがわかる。

site2の初期インストールも同様に行う。マルチサイトで異なるデータベースが使用されるようにしたいので、データベースの構成をsite1と同じ設定にしないように気をつける。

```terminal
$ lando drush @site2.local site:install standard \
--locale=ja \
--db-url=mysql://mysql:mysql@site2_db:3306/database \
--sites-subdir=site2
```

ちなみにデータベース名やユーザー名は `lando info` コマンドで確認できる。特に設定していなければ、

- データベース名：database
- ユーザー名：mysql
- パスワード：mysql

となる。

```terminal
$ lando info

# ...省略...

{ service: 'site1_db',
    urls: [],
    type: 'mysql',
    healthy: true,
    internal_connection: { host: 'site1_db', port: '3306' },
    external_connection: { host: '127.0.0.1', port: '33068' },
    healthcheck: 'bash -c "[ -f /bitnami/mysql/.mysql_initialized ]"',
    creds: { database: 'database', password: 'mysql', user: 'mysql' },
```

以上の手順で、コードベースを共有しながら異なるDB、ファイル、設定を持つサイトを起動することができる。

## 参考サイト

- [https://github.com/lando/lando/issues/433](https://github.com/lando/lando/issues/433)
- [https://github.com/nalipaz/lando-acquia-multisite-recipe](https://github.com/nalipaz/lando-acquia-multisite-recipe)