Drupal 8 のバックアップとコア＋モジュールアップデートをやってみる。

# はじめに
今年も [Drupal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/drupal)  にも参加します！ネタとしては、[昨年,「Drupal 8で認証付きの勉強会サイトを作ってみる」](http://qiita.com/nkawa/items/3bb10d8ed3683e296caf)で制作したサイトのコア＋モジュールのアップデートにチャレンジします。あ、ちなみに昨年初めてDrupal 8 を触ってサイト構築してからは、ほとんど触ってません。つまりDrupal 8 については初心者の記事である、ってことをご了承ください。誤りや修正すべき箇所があれば、ぜひご指摘ください。

# まずはバックアップから
さて、サイトを触るときは、当然バックアップからですよね。Drupal 8 では、バックアップには drush(Drupal 管理用のシェルコマンド)を使うのが良いはず。スマートにやるなら、[「Drupal 本体(core)を手軽にアップデートする方法」](http://qiita.com/bezeklik/items/474242c02095925f2333)が参考になります。でも、最初は、手堅く手動でやってみます。

Drupal は、インストールディレクトリと、データベースにデータが分かれてるので、単純にインストールディレクトリをバックアップするだけではダメなんですが、まずは、ディレクトリをバックアップ。tar コマンドでディレクトリ全部を圧縮しちゃいます。

```bash
tar czvf backups/XXXX.tgz [対象ディレクトリ]
```
今回は、282Mbyte になりました。データベースも手動でやってみましょう。あ、データベース名とか、パスワードとか忘れてます。うーむ、どこにあるかな。１年触ってないとすっかり忘れちゃいます。私の場合は、以下にありました。データベース名、パスワードがわかります。

```bash
tail -20 sites/default/setting.php
...
databases['default']['default'] = array (
  'database' => 'mydatabase',
  'username' => 'myusername',
  'password' => 'mypassword',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);
```
これでデータベース名、ユーザ名、パスワードがわかりました。
さっそく、MySQLのダンプをします。

```bash
mysqldump -u myusername -p mydatabase > myfile20161217.sql
Enter password: [パスワード入力]
gzip myfile20161217.sql
```
### sqlダンプ前にキャッシュはクリアしよう！
sqlダンプは 60Mbyte程度になったのですが、圧縮すると 2.7Mbyte でした。テキストを見てみるとキャッシュデータが入ってたので、ダンプする前にキャッシュを消すと良いのかもしれません。（試してみます。管理メニューの 管理>環境設定>パフォーマンス（なぜかパン屑リストには開発と表記） に「すべてのキャッシュをクリアー」ってのがあります）
![20161217_225110.jpg](https://qiita-image-store.s3.amazonaws.com/0/28113/e7c1408d-e407-38e4-2b8b-b2186ec0a008.jpeg)
さて、同様にバックアップすると、なんと、ダンプファイルが6.3Mbyte、gzip圧縮後は 850Kbyte ですので、キャッシュクリアの効果は絶大でした！
( ちなみに drush では drush cc all で消せます → と書いてましたがDrupal 8 では、 drush cache-rebuild(cr)が正しいようです。）

## ついでに各種アップデート
サーバのディストリビューションは Ubuntu 14.04(LTS)を選定したので、2019年までのサポートがあります。各種のソフトもアップデートしておきます。

```bash
sudo apt-get update; sudo apt-get upgrade
```

昨年は、apache2.4.7, php5.5.9, MySQL5.5.3 だったのですが、apache2は2.4.7-1ubuntu4.13, php5.5.9+dfsg-1ubuntu4.20, mysql5.6.33-0ubuntu0.14.04.1 となってました。（昨年は詳細なバージョンは記録してなかったので、今後はここまで細かくしておくのが良いかも）

## メンテナンスモードを開始
### composer / drush のアップデート
さて、こっからは drush を使った正当な手順を踏んでみます。上述の記事に従って進めます。まずはメンテナンスモードに入れるとのこと。（初めて知りました）
その前に、drush をアップデートしたほうが良いですね。drush のインストールには composer を使っていたので、composer もアップデートすべきです。

```bash
sudo composer self-update
sudo composer global update
```

むむ。するとエラーが出て、なんとcomposer (drush)の最新版は Ubuntu 14.04 のデフォルト php 5.5.9では使えないとのこと。php を 5.6 にあげるしかなさそうです。さて、どうしますかね。まずは php5.5 関係のパッケージをリストアップ。

```bash
dpkg -l | grep php  | awk '{print $2}'
```

php に関係するパッケージが一覧で確認できるので、アンインストールします。

```bash
sudo apt-get remove php5-cli php5-common php5-gd php5-json php5-mysqlnd php5-readline pkg-php-tools php-pear php5
```

trusty(Ubuntu14.04)のリポジトリはダメなので PPA（外部リポジトリ） を使います。以下で、PPAを追加します。

```bash
sudo apt-add-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php5.6 php5.6-gd php5.6-json php5.6-mysql php5.6-mbstring php5.6-xml
```

ここでもう一度 composer update です。これで同時にdrush も最新版になるようです。（ drush/drush:dev-master 版 )

```bash
sudo composer global update
```

これで何とかなったようです。

やっとメンテナンスモードを設定
## メンテナンスモード

```bash:Drupal8
drush sset system.maintenance_mode 1
drush cr
```

### アーカイブの取得

```bash:Drupal8
drush dump-archive
```

これで、自分のホームディレクトリの drush-backups/archive-dump/[日付] の下に、ディレクトリと、sqlダンプ一式の tar.gz ファイルが作られます。

## やっとアップデート
ここまで準備ができて、やっと、コア/モジュールのアップデートの準備が整いました。こういう作業は、定期的にやっておかないといけないですね。（しみじみ）
サイトを確認すると、
![20161218_012902.jpg](https://qiita-image-store.s3.amazonaws.com/0/28113/cc358b32-f5dc-6cd5-c134-53e0ba1f3666.jpeg)
こんな表示が出ています。さっそくupdateしましょう。

```bash:Drupal8
drush pm-update drupal
```
さて、いかがでしょう。
なんとか無事にCore のアップデートができたようです！

##モジュールのアップデート
つぎは、モジュールのアップデートです。

```bash:Drupal8
drush up
```

これで複数のモジュールアップデートができるはずです。
コマンドの結果は

```
%% drush pm-update
Update information last refreshed: 日, 12/17/2016 - 01:30
 Name                             Installed Version  Proposed version  Message
 Content Access (content_access)  8.x-1.x-dev        8.x-1.x-dev       アップデートが利用可能です
 Imce File Manager (imce)         8.x-1.0-rc2        8.x-1.4           アップデートが利用可能です
 AT Core (adaptivetheme)          8.x-1.x-dev        8.x-1.0-rc2       アップデートが利用可能です

Code updates will be made to the following projects: Content Access [content_access-8.x-1.x-dev], IMCE [imce-8.x-1.4], AdaptiveTheme [adaptivetheme-8.x-1.0-rc2]

Note: A backup of your project will be stored to backups directory if it is not managed by a supported version control system.
Note: If you have made any modifications to any file that belongs to one of these projects, you will have to migrate those modifications after updating.
Do you really want to continue with the update process? (y/n):
```

モジュールを３つ一度にアップデートするのは、ちょっと不安です。順番にやったほうが安心かも。ここは "n"と答えて、モジュールを１つづつアップデートしてみます。

```
drush pm-update imce
drush pm-update content_access
drush pm-update adaptivetheme
```

それぞれの実行後には、サイトにアクセスして簡単な動作確認もします。
（しかし、モジュールのアップデートはサイトからやったほうが簡単かも、ですね。。）
アップデート後には、データべースのアップデートが必要な場合があり、サイト上からの実行が望ましそうです。

## メンテナンスモード終了
ひととおり、アップデートが終わったら、メンテナンスモードを終了させます。

```bash:Drupal8
drush sset system.maintenance_mode 0
drush cr
```

以上、バックアップ＋コア・モジュールアップデートでした。