目次

サーバの引越(GCE内)

Google Compute Engine(GCE)でクラウドサーバを立ててDokuwikiを運用しているが、 当然、そのままでは様々なアプリケーション等が古くなっていくので、 定期的なアップデートが必要となる。

次第に大きな更新が様々なアプリで起こると、 どこかしらで互換性にガタが来て、エラーが発生するなど上手く動かなくなりやすい。

それなら、いっそ新規に作り直した方が速い!となる。
クラウドサーバなら壊して作ることもやりやすい。
Dokuwikiも、データベースを使わないWikiなのでファイルコピーだけで済み、移行しやすい。

その手順をメモしておく。
(とはいえ、次に自分がこれを参照することがあるとすれば またガタが来るような年数が経ってからで、その頃にはやり方も変わってるんだよな)

なお、試行錯誤後に備忘録として書いているため、 書き忘れがあったり、 わざわざしなくても済むようなことをやっていたりするかも知れない。

環境

流れ

  1. 旧サーバインスタンスを停止
    1. 旧サーバのボリュームからスナップショットを作成
    2. スナップショットから新規ディスクを作成
  2. 新サーバインスタンスを作成・開始
    1. 新サーバでApache,PHPのインストール・設定
    2. 新規ディスクのマウント・Dokuwiki用ファイルコピー
  3. Dokuwikiの移行テスト
    1. テスト用にDokuwikiの設定変更
    2. ちゃんと動くか確認
  4. 移行実行
    1. 旧サーバから固定IPを割り当て解除、新サーバに割り当て
    2. 本番用にDokuwikiの設定変更
    3. SSL証明書取得
  5. 後片付け

手順

旧サーバを停止

コンソールなどから旧サーバのインスタンスを停止。

ディスク(ボリューム)の複製

バックアップ&新サーバにDokuwikiのファイルをコピーするため、ボリュームを複製する。

旧サーバのボリュームのスナップショットを作成し、その後、スナップショットからディスクを作成する。

もし後戻りする気が無いのなら、旧サーバのボリュームをインスタンスから引っ剥がして新サーバにマウントした方が速いが、 まぁ、バックアップ目的としても、いざ上手くいかなかったときに振り返る先としても、 旧サーバは(少なくとも移行作業中は)残しつつ、ボリュームを複製した方が安心。

移行が終わったら旧サーバのボリュームはそのままでは料金がかかるため消したいが、 その際、スナップショットがあれば万が一があってもまた複製できる。
スナップショットの方が安いし、また無料枠もある。

スナップショット・ディスク作成の際、リージョンは今と変えない。 (GCE無料枠が適用されるリージョンが限られているので変える理由もあんまり無いし)

新サーバの起動

コンソールから新サーバのインスタンスを作成・起動する。
旧サーバのインスタンスページの「:」(本当は縦3連のメニューボタン。マウスホバーで「その他の操作」とTipsが出る)から、 「同様のものを作成」を選ぶと、旧サーバの設定が最初からある程度埋まっていて、変更が少なくて済む。

で、作成する。

新サーバにSSHでログインする。
この際、今の段階ではまだIPアドレスはドメインが割り当てられてないやつなので、IPアドレス直指定で接続する。
(インスタンスを停止→開始した場合はそのたびに振り直されるので注意)

起動後の環境設定

まずはとりあえず

sudo apt update
sudo apt upgrade

いくつか更新を保留されるのがあるが、気になる場合はリスト化された名前を個別に指定して apt install すると入る。 (した方がいいのかよくわかんない)

その後、必要なものを入れる。

sudo apt install apache2 php php-gd php-xml php-json php-mbstring php-fpm

Ubuntu22.04で入るPHPは、8.1固定らしい。まぁ、今のところは問題ないでしょう。
新しいバージョンのを入れたくなったら、多分その辺に解説があるはず。

ファイルパーミッションの関係上、Dokuwiki関連ファイルはowner,groupとも www-data(Apacheの実行ユーザ)となるのだが、 ログインユーザが触れないのは不便なので、ログインユーザもwww-dataグループに追加する。

sudo usermod -aG www-data [GCEログインユーザ名]

旧ディスクマウント・ファイルコピー

接続されているディスクを確認。

sudo lsblk

で、多分 sdb1 とかいうディスクが、MOUNTPOINTSが空白の状態であったりするので、名前を確認。

マウントポイントを作成し、マウント。

sudo mkdir -p /mnt/disks/olddisk
sudo sudo mount -o discard,defaults /dev/sdb1 /mnt/disks/olddisk
                                         ~~~~
                                    さっき確認した名前

旧サーバのDokuwikiのファイルが /mnt/disks/olddisk/var/www/html/dokuwiki あたりにあることを確認。

それを新サーバのApacheのHTMLルート以下の好きな場所にコピー。
(ここでは旧サーバと同様にルート直下にdokuwikiというフォルダを作る)

その際、ファイルパーミッションは維持してコピーする。

sudo cp -rp /mnt/disks/olddisk/var/www/html/dokuwiki /var/www/html/dokuwiki

※ -r サブディレクトリを再帰的にコピー
   -p パーミッションを維持してコピー

コピーしたら、とりあえずDokuwikiの設定は後にして、Apacheなどの設定を行う。

Apacheの設定

Dokuwikiは、全てをファイルで管理することもあり、フォルダ内にある特定のファイルが外部アクセス可能だと警告が出る。

また、URLをいい感じにするためには、.htaccess(AllowOverride)とmod_rewriteの有効化が必要となる。

その辺の設定を行う。

正直、この辺が一番、運用方法によって設定が変わりうるし、また使用ツールのバージョンやOSによって変わるので、 面倒な割に記録として残したり、他の人のを参考にしにくい部分である。

基本的にはこの辺を参考にするが、これはDokuwikiを /var/www/dokuwiki において運用する設定なので、適宜読み替えが必要。

AllowOverride有効化
sudo vim sudo vim /etc/apache2/conf-available/dokuwiki.conf(なんか適当な名前)
dokuwiki.conf
<Directory /var/www/html/dokuwiki>
    Options FollowSymLinks
    AllowOverride All
</Directory>
sudo a2enconf dokuwiki
mod_rewrite有効化
sudo a2enmod rewrite
PHP-FPMの設定(任意)

PHPの実行が速くなる(といわれている)。
php-fpmをインストールしていれば、apache用の設定がconf-availableに入っているので、有効化する。

sudo a2enmod proxy_fcgi
sudo a2enconf php8.1-fpm

上手く設定されているかは、phpinfoからわかる。

Apache再起動

もろもろの有効化後、Apache再起動。

sudo systemctl restart apache2

テスト用のDokuwikiの設定

実際に新サーバでDokuwikiが動くか、確認する。

ここまで来たら、固定IPを旧から新サーバに割り当てなおした方が、設定をそのまま生かせて速かったかもしれないが、 この時はまだ旧サーバをなるべくその状態で残しておきたかったため、 新サーバのDokuwikiを軽く設定しなおすことで動作テストした。

公式の解説として、以下の記事が参考になる。

.htaccessの設定(確認)

/var/www/html/dokuwiki/.htaccess にておこなう。

まぁ、旧サーバでちゃんと設定していれば特にそのままでもよいのだが、一応確認。

/var/www/html/dokuwiki/.htaccess.dist というのが、Dokuwikiが推奨する.htaccessの設定例なので、上記ページと合わせて参考にする。

もし http→https に自動転送していた場合などは、まだSSLは有効化していないため、コメントアウトしておく。

conf/local.php の設定

local.php
  ...
  $conf['baseurl'] = 'http://(新サーバのIP)'
  ...

特に変更が無くても、local.phpのタイムスタンプを更新することでキャッシュが無効化されるため、 キャッシュのためにエラーになる (または本来エラーとなるのにキャッシュのためにそれが発生しない)ということがなくなるので、 touchだけでもしておくとよい。

確認

上手くいかない場合は、

くらいかなあ。

上手く動くことが確認できたら、いよいよドメインを移行する。

IPの再割り当て

いったん、サーバを停止。(新・旧とも)

(ここで、無料枠外のインスタンスを使っていた場合は、無料枠のe2-microに戻してもいいかも)

Compute Engine コンソールの、VMインスタンス一覧から、旧サーバの外部IPとして紐付いたIPを確認。
そこの (nic0) というリンクから、ネットワークのコンソールに移れる。

VPCネットワークの「IPアドレス」から、内部・外部でインスタンスに使用されているIP一覧が確認できる。

そのうち、さっきの静的外部IPの欄の、一番右の「変更」を選択。

新サーバに割り当てなおす。

SSL対応(任意)

Let's Encryptで取得する。

以前は無かったが、今はUbuntuでもcertbotが使えるので、それを使うのが便利。

sudo apt install certbot

ただ、AWSのEC2のcertbotなどはApacheへの設定まで一括でやってくれる一方、こちらは証明書取得するにとどまる。

sudo certbot certonly --webroot -w /var/www/html/ -d example.com
                                   ~~~~~~~~~~~~~~    ~~~~~~~~~~~
                               Apacheでドメインを      ドメイン
                             割り当てるルートパス

メールアドレスが聞かれたり、Terms of Serviecへの同意が求められたりするので答える。
最終的に以下のようなメッセージが表示されればOK。

Congratulations! You have successfully enabled https://XXXX.com ...

生成された証明書のパスが表示されるので、覚えておく。

サイトによっては以下のコマンドを実行している例もあり、これならApacheへの設定もやってくれるのかな?
こっちにすればよかったかも。

sudo certbot --apache

Let's Encryptは証明書の期間が短く90日しか持たないため更新を自動化させておくのが常だが、 このcertbotはタイマーがデーモンで付いており、こちらで設定せずとも、1日に2回、問い合わせるようになっている。

タイマーが動いているか確認
sudo systemctl status certbot.timer
Apacheへの設定

certbotを実行した時に表示された証明書と鍵のパスをApacheに設定する。

[ ] でくくった部分は適宜書き換える。

/etc/apache2/sites-available/dokuwiki.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName [exsample.com]    ←自分のドメイン
        DocumentRoot [/var/www/html]   ←ドメインを設定するルートパス
        <Directory [/var/www/html/]>   ←同上
                AllowOverride All
                Options FollowSymLinks
                Require all granted
        </Directory>
        SSLCertificateFile [/etc/letsencrypt/live/example.com/fullchain.pem]  ←証明書
        SSLCertificateKeyFile [/etc/letsencrypt/live/example.com/privkey.pem]  ←鍵
        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
        SSLOptions +StrictRequire
</VirtualHost>
</IfModule>

サイトを設定、再起動。

sudo a2site dokuwiki
sudo systemctl restart apache2

これで、httpsでのアクセスもできるはず。

後片付け

しばらく運用して、問題なさそうなら、旧インスタンス・ディスクを削除する。