drupal8へアップグレード

アップグレードの準備

drupal 7.59をバックアップ

まず、現在稼働しているdrupal7のサイトのバックアップを作成します。
バックアップはデータベースとドキュメントルート(drupalインストールパス)全てです。
drushコマンドでもバックアップは作成できますが、今回は普通にmysqldumpコマンドとtarコマンドで行いました。

drupal7サイトを構築

このバックアップデータを使って、自宅のLinuxサーバにdrupal7サイトの複製を作成しました。
本番稼働しているサイトはmemcacheなどの設定をしていますが、この複製サイトはこれらの機能を停止するよう構築しました。
sites/default/settings.phpに直接環境設定を記述している場合はそれらもコメントにしておきました。
たとえば、$base_urlやmemcacheの設定です。そのままだとサイトが正常に表示できない可能性があります。
構築後にはキャッシュクリアを行っておきました。
以下、アップグレードにはこのdrupal7サイトを使用します。

不要モジュールのアンインストール

d6⇒d7へのアップグレードの時とは違い、影響はないのかもしれませんが、念のため、複製したdrupal7サイトからなるべくカスタムモジュールや寄贈モジュールをアンインストールするようにしました。ブログサイトなので残したいのは記事自体やその記事に使用している画像ファイルやその画像ファイルのImagefieldなどです。これらに影響がないようなモジュールをアンインストールしました。できれば記事ごとの閲覧数のカウントもリセットしたくはありません。
アップグレードが失敗した際にやり直しもあると考え、この時点でのデータベースのバックアップを作成しました。
データベース作成前にも念のためキャッシュクリアをしておきました。
※利用可能なアップデートのページからそれぞれのモジュールのプロジェクトサイトへアクセスできるのでdrupal8対応状況を調べるには便利です。

drupal8サイトを構築

自宅のLinuxサーバにdrupal8のサイトを新規で構築しました。
drupal-8.5.3はbookモジュールに対応していないようだったため開発バージョンのdrupal-8.6.0-dev(2018/5/18)にしました。
サイトにアクセスしてinstall.phpを標準インストールで実行しただけです。

アップグレード用モジュールの準備

アップグレード方法は大きく分けて2通りあります。

  1. WEBブラウザのUIを使う方法
  2. drushコマンドを使う方法

今回は、カスタムモジュールなどもないため1番の方法で行いました。

以下のモジュールを有効にします。

  • Migrate
  • Migrate Drupal
  • Migrate Drupal UI

UIを使う方法のモジュールはコアに含まれているので有効にするだけで使用できます。

アップグレードに必要な情報は、drupal7のデータベースに接続する情報(sites/default/settings.phpに記載あり)とパブリックファイルシステムパスとプライベートファイルシステムパスの情報です。
パブリックファイルシステムパスの指定をミスすると画像などそのフォルダにあるファイルが移行できなくなると思います。

必要な情報を入力するとどのモジュールがアップグレードできるかどうかのレポートを出力してくれます。
それでよければ、実際にアップグレードを実施します。

以下はdrupal-8.5.3の結果です。
bookモジュールがないためアップグレード対象ではなくなっています。
Migrate Drupal UI

コアがbookモジュールに対応していてもbookモジュールを有効にしていないとアップグレード対象にはなりません。
また、コア以外でモジュールを有効化していてもコアで対応していなければこの方法でのアップグレードの対象にはなりません。
たとえばlibrariesモジュールやinsertモジュールをdrupal8で事前に有効化していても対象にはなりません。

アップグレードの実施

実行中はメッセージが出力されます。
また、drupal8のデータベースにmigrate_message_XXXXテーブルやmigrate_map_d6_XXXXテーブルやmigrate_map_d7_XXXXテーブルなどがいっぱい作成されます。
とりあえず、bookモジュールに対応したので当サイトの記事はすべてdrupal8に移行できました。

アップグレード後の問題

ユーザと役割

drupal8サイトのインストール時に作成したユーザはAdministratorの役割ですが、アップグレード後はdrupal7の管理者ユーザがAdministratorの役割になります。
このとき混乱してしまうのがパスワードです。
例えば、drupal8インストール時のユーザが「たろう」で、drupal7の管理ユーザが「たかし」、認証ユーザが「ひろし」だった場合、アップグレード後はユーザには「たかし」と「ひろし」しか存在していません。また、役割にはdrupal7のときの役割がそのまま追加されています。アップグレードが完了すると「たろう」で作業していたはずが、「たかし」に変わっています。そして「たかし」のパスワードはどうやら「たろう」のものであるため、1度ログアウトすると「たかし」のパスワードではログインできないようです。不安なのでログアウトする前に明確にするため、パスワード設定をやり直せばよいと思います。
おそらくこのとき現在のパスワードは「たろう」の物を入力する必要があるはずです。

FileField(Image)

標準プロファイルでインストールするとコンテンツタイプ記事(Article)に画像フィールド(field_image)が作成されています。
この画像フィールドの数の制限値はデフォルトの1に制限されています。
もし、同じ名前の画像フィールド(field_image)がD7サイトに存在しておりなおかつ数の制限を無限で使用していた場合、アップグレード後はD8デフォルトの制限1のままであるため、画像フィールド(field_image)のアイテムが1つになってしまい、結果、記事に貼り付けた画像は1枚しか存在しなくなります。
※フィールドに存在しない画像はD8のパブリックファイルシステムパスには移動されずデータベースにも登録されません。
※この状態で画像スタイルをフラッシュすると再構築できません。
これを回避するにはアップグレード前に画像フィールド(field_image)の制限を無制限にしておきます。

テキストフォーマット

フロントページなど記事の本文が表示されていません。その原因がこのテキストフォーマットです。
テキストフォーマットとは「FIlter」モジュールのことです。
「Full HTML」とか「Plain Text」とかのあれです。
drupal7で「FIlter」モジュールを有効にしているとアップグレード後のdrupal8では二重にテキストフォーマットが登録された状態になります。
ただし、システム名称がdrupal7のものはID番号の数値になっているため存在はできるようですが、上書き保存ができないので別名で保存するしかない状態です。
また、drupal7での「Plain Text」はデフォルトの設定であるため無効にすることができません。
drupal7から移行したノードではdrupal7のテキストフォーマットを使用しているため、アップデート後そのままでは記事の本文が表示されません。
これを修復するには、drupal7で使っていた「Full HTML」の設定を変更するか、記事で使用しているテキストフォーマットをすべてdrupal8のテキストフォーマットに変更するかになります。
しかし、先ほど述べたように上書き保存ができないのでdrupal7で使っていた「Full HTML」の変更はできません。
かといって600以上もある記事のテキストフォーマットを変更するのも大変です。
そもそも、保存時に重複していると判断されるためdrupal8の設定が変更できませんので将来的にもよくありません。

解決策は、まず、drupal7のテキストフォーマットをすべて削除することにしました。これにより本文のテキストフォーマットが未選択の状態になり表示できないのはかわりませんが、drupal8のテキストフォーマットは変更ができるようになります。
さらに、テキストフォーマットが未選択になったのものをすべてdrupal8の「Full HTML」に設定することにしました。

drupal7のテキストフォーマットの削除

テキストフォーマットを削除するために、phpMyAdminでデータベースを直接操作して削除することにしました。
以下手順です。

  1. データベースのバックアップ
  2. configテーブルを参照
  3. nameがfilter.format.1~filter.format.6までを削除
  4. キャッシュクリア

以上でテキストフォーマットは削除できますが、本文のテキストフォーマットが未選択になっています。

テキストフォーマットの再設定

本文のテキストフォーマットを設定するには記事を順番に編集する必要がありますが、600以上もあるので手動ではいつ終わるのかわかりません。
この作業もphpMyAdminからデータベースを直接操作して設定することにしました。
以下をdrupal8データベースに対して実行します。

UPDATE node__body set body_format = 'full_html' where bundle = 'blog';
UPDATE node_revision__body set body_format = 'full_html' where bundle = 'blog';

「node__body」テーブルと「node_revision__body」テーブルに対して、body_formatをfull_hmtlへ変更しています。
対象はコンテンツタイプがblogです。
複数のコンテンツタイプがあるならその分だけ繰り返し行います。

これで正常に記事が表示されるようになりました。

おまじないとして「drush entity-updates」を実行しておくといいかもしれません。

記事の画像挿入

Insertモジュール

Insertモジュールを使って記事に画像を貼り付けようと思っていましたが、「Insert」ボタンが表示されません。
どうやら「admin/structure/types/manage/blog/form-display」で「Image Insert」を選択しないといけないようです。

ColorBoxモジュール

drupal7でできていたInsertでColorboxスタイルの貼り付けですがdrupal8ではスタイルにColorboxが選択できないので「admin/structure/types/manage/blog/form-display」ではできません。表示だけなら「admin/structure/types/manage/blog/display」でcolorboxが選択できるので可能です。
ギャラリーを表示するのをcolorboxでとかは可能です。
この記事に貼り付けた画像はcolorboxで表示できていませんでしたが、マニュアルでcolorbox対応に書き換えました。

colorboxのStylesheetが反映されていないなかった理由がわかりました。
colorboxの設定でexample5を選択していましたが、colorboxモジュールの"colorbox.libraries.yml"でexample5となるところがexample4になっていたため、たまたまexample5だけスタイルシートが設定されなかっただけでした。

アクセスカウンタ

アクセスカウンタには「Counter」モジュールを使っていましたがdrupal8では「Advanced Counter」と「Initial Counter」がどうやらエラーのために設定が保存できません。それではと代わりに「Visitors」モジュールをインストールしてしまいましたが、このモジュールは動きません。
アンインストールでもエラーになるので現在は絶対にインストールしないでください。
これの影響で、バックアップから再構築することになりました。
現在はアクセスカウンタはありませんが、人気のあるコンテンツなどで我慢しておきます。

FileField

drupal6のころにFieldが実装され始めました。drupal7ではコアに組み込まれましたが、drupal6のころにFileFieldやImageFieldを使わずに記事に貼り付けた画像はFieldがないのでアップグレードで移行されません。そのため、drupal8のパブリックファイルシステムパス以下に保存されている画像ファイルなどが不足しているためリンク切れで記事の画像が表示されません。
手動でファイルをコピーして対応しましたが、これらの記事をFieldを使って更新するべきか悩んでいます。

画像のスタイル

アップグレード後はスタイル処理された画像は作成されていません。
drupal7でflush処理した後のように、Viewsなどでスタイル画像を表示してやることで作成されると思います。
ただ、drupal7ではViews Slideshowを使用していましたが、drupal8でViews Slideshowがうまく動作しないため困っています。

Configuration Manager

「Configuration Manager」モジュールで設定のインポートをする際に無数のエラーが発生してインポートができませんでした。
これはconfigテーブルに過去のテーマブロックの設定が残っているためのようです。
これの削除はphpMyAdminからconfigテーブル内を直接操作して削除しました。
「full archive」を実行しているとパブリックファイルシステムパスの中の所定の場所に設定ファイルが作成されてしまっています。
同期をしてしまうと削除してもまた作成されてしまうのか・・・
詳細はわかりませんが注意が必要です。

以上、アップグレードは成功したもののいろいろアップグレード後の処理が大変です。
これでいいかなぁとなったところで自宅サーバのdrupal8のバックアップを本番環境に移行してdrupal8サイトを公開しました。

今回は同じような内容で困っている方の参考になればと思い記載しました。

Drupalバージョン

Drupal 8.x

カテゴリ

インストール