Drupal のバックアップ

こちらの続きになります。

https://qiita.com/JQinglong/items/7ce6e09ef06950dcaf79

Backup and Migrate

https://www.drupal.org/project/backup_migrate

を使って、バックアップを取ろうとしましたが、

```
Cannot connect to the database because the MySQLi extension is missing.
```

というエラーが発生しているので、対応します。

## MySQLi

MySQLi エクステンションを有効にすれば良いのか？
そのためには、php.ini に、記述を追加する必要がありそうです。

https://stackoverflow.com/questions/10646655/the-mysqli-extension-is-missing-please-check-your-php-configuration

では、php.ini はどこにあるのか。

drupal では、管理画面から、phpinfo の情報を確認することができるようになってます。

サイト/admin/reports/status/php

この中の、「Configuration File (php.ini) Path」の項目に、パスが書かれています。

Dockerコンテナのシェルに入って見てみます。

```sh
# ls /usr/local/etc/php
conf.d  php.ini-development  php.ini-production
```

むむ・・・php.ini がない。

```sh
# php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
/usr/local/etc/php/conf.d/docker-php-ext-zip.ini,
/usr/local/etc/php/conf.d/opcache-recommended.ini
```

単一 php.ini を読むのではなく、/usr/local/etc/php/conf.d フォルダの各ファイルを統合して読む。

その一つ、

```
# cat /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
extension=pdo_mysql.so
```

では、mysqli を有効化するファイルをも追加してみる。

```
# cp /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini

# sed -i -e "s|extension=pdo_mysql.so|extension=mysqli|" /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini

# cat /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
/extension=mysqli

```

apache　再起動は、httpd　ではなく、apache2

```sh
# service httpd restart
httpd: unrecognized service

# service apache2 restart
[....] Restarting Apache httpd web server: apache2Terminated
```

しかし、変わらない。
コンテナ再起動しても変わらない。

そもそも、このエクステンションがインストールされていない。

```sh
# php -i | grep extension_dir
extension_dir => /usr/local/lib/php/extensions/no-debug-non-zts-20190902 => /usr/local/lib/php/extensions/no-debug-non-zts-20190902
sqlite3.extension_dir => no value => no value

# ls /usr/local/lib/php/extensions/no-debug-non-zts-20190902
gd.so  opcache.so  pdo_mysql.so  pdo_pgsql.so  sodium.so  zip.so
```

インストールするには？Docker コンテナ内では、これが使える。

```sh
# docker-php-ext-install mysqli
・・・

# ls /usr/local/lib/php/extensions/no-debug-non-zts-20190902
gd.so  mysqli.so  opcache.so  pdo_mysql.so  pdo_pgsql.so  sodium.so  zip.so
```

入ったけど、まだ有効になっていない。

```sh
# service apache2 restart
```

来た！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/683407c0-4a95-972b-815e-63c6965ad24a.png)

バックアップファイルのダウンロードができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/63367045-96a2-1f6c-f1c0-4eecf5a1dd15.png)

## private
しかしサーバ内へのバックアップはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/cac63f24-61f5-24f9-5b22-dc9078ef932e.png)

```
The backup file could not be saved to 'private://backup_migrate/' because your private files system path has not been set.
```

上記 Backup and Migrate のページでは、

> Bug fixes. Please upgrade to 5.0.0, the 8.x-4.x releases will not be supported any further.

と書かれているので、5.0.1 をインストールしました。
Documentation は
Backup and Migrate 7.x
Backup and Migrate 8.x
となっていますが、きっと 8.x を見れば良いのだろうと考えます。

https://www.drupal.org/docs/contributed-modules/backup-and-migrate/how-to-for-backup-and-migrate

その中の、Backup to Server のところを参考に、サーバを設定します。

> Create a directory, writable by the server, but outside the Drupal installation and not accessible over the web.

Drupal インストールの外側ということなので、

```sh
# ls /opt
drupal
# mkdir /opt/drupal_private
# ls /opt           
drupal  drupal_private
```

> In the Drupal settings file, add the absolute path to this directory for the file_private_path variable.

Drupal settings file は

```sh
cat /var/www/html/sites/default/settings.php

・・・
/**
 * Private file path:
 *
 * A local file system path where private files will be stored. This directory
 * must be absolute, outside of the Drupal installation directory and not
 * accessible over the web.
 *
 * Note: Caches need to be cleared when this value is changed to make the
 * private:// stream wrapper available to the system.
 *
 * See https://www.drupal.org/documentation/modules/file for more information
 * about securing private files.
 */
# $settings['file_private_path'] = '';
```

なので、

```sh
sed -i -e "s|# \$settings\['file_private_path'\] = '';|\$settings\['file_private_path'\] = '/opt/drupal_private/';|" /var/www/html/sites/default/settings.php
```


> Navigate to Configuration > File system (or Administration > Configuration > Media > File system to confirm that the settings are correct.

上記は、URLとしては
サイト/admin/config/media/file-system

特にサービス再起動等せずに即時反映されました。

```
プライベートファイルシステムパス
/opt/drupal_private/
プライベートファイルを格納する、既存のローカルファイルシステムパス。Drupal から書き込み可能で、ウェブからアクセス不可能でなくてはなりません。settings.php で変更する必要があります。
```

> Navigate to Configuration > Performance (or Administration > Configuration > Development > Performance) and click Clear all caches so the file streams are updated.

サイト/admin/config/development/performance
「すべてのキャッシュをクリアー」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/02b0d67c-b1d0-1572-0ba3-c82766239e51.png)


> Navigate to Configuration > Development > Backup and Migrate > Settings > Destinations. Click Edit to edit the Private files directory destination, or create a new destination. Enter the directory you want to use for backups, such as private://backup_migrate (if it is within the private file system), or the full path to the directory you want to use and save.

サイト/admin/config/development/backup_migrate/settings/destination

この時点で「private://backup_migrate」はセットされているので、このままでよいと思われたが、エラー。ただし、メッセージは変わった。

```
The backup file could not be saved to 'private://backup_migrate/' because the directory could not be created or cannot be written to. Please make sure your private files directory is writable by the web server.
```

フォルダも作って、権限も作る。

```
# mkdir /opt/drupal_private/backup_migrate
# chmod 777 /opt/drupal_private/backup_migrate
# ls -l /opt/drupal_private
total 0
drwxrwxrwx. 2 root root 6 Oct 17 14:37 backup_migrate
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/0be2a0ed-0ac7-c3a8-6128-2c9ab6134cbf.png)

できた！

## スケジューリング

サイト/admin/config/development/backup_migrate/schedule

初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/560fc474-a9c9-c2cf-37c9-84c6ade82845.png)

毎日実行、３世代保存に変更。有効化のチェックも忘れず。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/a1c8213e-b892-11ac-6718-c84a6d1a7c32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/9f42c651-3ec0-6454-f547-11a1bfbb0116.png)


環境設定　＞　cron から「cron を実行」してみる。
サイト/admin/config/system/cron


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/66fbf19e-aab9-7e22-1dad-474fc55a68a7.png)

「保存済みバックアップ」で確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/c22f60f0-4ec2-f43b-f202-4c9de6146590.png)

以上！