Ubuntu 20.04.1 LTSにMovableType 7を構築する

MovableType 7の構築記事は、Wordpressと比較して大変少ないので、あとから参照できるように手順を残します。

#OS選定作業
- 国内のレンタルサーバー事業者にて、2サイトの契約を行いました。
 - 1台目であるwwwには、マルチドメインmultiを設置して、複数サイトを運用する。
 - 2台目であるwww2には、1台目からのファイルとDBのバックアップを入れておき、障害時にコールドスタンバイから復帰させる
- CentOSでは将来の見通しが困難なので、手堅くUbuntu 20.04.01 LTSを選択します。
- カスタマーコントロール画面のパケットフィルタ機能で、TCP 22, 80, 443,メール関連ポートを開発ホストからアクセスできるように設定しておきます。

#OSインストール、アップデート設定
- Ubuntu 20.04.1 LTSインストールがされていることを確認

```bash
%cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
## パッケージのアップグレード

```bash
% sudo apt update && sudo apt upgrade
```

##cron-aptによるアップデート自動化
- cron-aptによるパッケージの自動更新を設定。aptのupdateおよびupgradeを自動で行う。

```bash
% sudo apt install cron-apt
% sudo sed -i 's/-d //' /etc/cron-apt/action.d/3-download
```

#MariaDB データベースサーバの設定

```bash
% sudo apt install mariadb-server mariadb-client
% sudo mysql_secure_installation
% sudo mysql -u root -p 
MariaDB [(none)] > CREATE DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
MariaDB [(none)] > CREATE USER dbusername@localhost identified by 'dbpassword';
MariaDB [(none)] > grant all on dbname.* to dbusername@localhost identified by 'dbpassword';
MariaDB [(none)] > FLUSH PRIVILEGES;
MariaDB [(none)] > quit
```

参考：https://www.movabletype.jp/documentation/mt7/installation/database/mysql/

# Apache2 Webサーバインストール、設定

## Apache2を導入

```bash
% sudo apt install apache2
% sudo systemctl enable apache2
% sudo systemctl start apache2
```
## ディレクトリのパーミッション設定

```bash
#メインサイト
% sudo chown -R www-data:www-data /var/www/html 

#同IPでマルチドメインを運営
% sudo chown -R www-data:www-data /var/www/multi.example.com 

% sudo usermod -aG www-data username 
% sudo chmod 775 /var/www/*
```

##Perlモジュール設定
- Movable Type動作のために、多数のPerlモジュールが必要となりますので、できるだけパッケージで導入していきます。

```bash
% sudo apt install imagemagick perlmagick libimager-perl libgd-perl 
% sudo apt install libcache-memcached-perl libarchive-zip-perl libauthen-sasl-perl 
% sudo apt install libcrypt-dsa-perl libio-socket-ssl-perl libxml-atom-perl 
% sudo apt install libxml-sax-perl libyaml-syck-perl libxml-sax-expatxs-perl 
% sudo apt install build-essential 
% sudo perl -MCPAN -e 'install Mozilla::CA'
```

##PHPの設定
- Movable Typeは基本的には「再構築」ボタンを押して静的にHTMLを出力させますが、ダイナミックパブリッシングを用いて動的にページを出力させることも可能です。このためにはPHPのインストールが必要です。

```bash
% sudo apt install php-mysql libapache2-mod-php
```

##mod_rewriteモジュールの設定

```bash
% sudo a2enmod rewrite
% sudo vi /etc/apache2/apache2.conf
```

```Apache:/etc/apache2/apache2.conf
<Directory /var/www/html>
        AllowOverride All
</Directory>
<Directory /var/www/multi.example.com>
        AllowOverride All
</Directory>
```
参考：https://www.movabletype.jp/documentation/supporting_dynamic_publishing.html

#Apache2 SSL設定

##Let’s Encrypt証明書導入
- certbotがDNSの所有者を確認するために一時的にWebサーバとして振る舞う。そのためcertbotコマンド入力時はApacheを停止させる必要あり。
- ネットワークフィルタを一時的に外さないと、検証に失敗する。
- また、失敗を繰り返すと数時間～１週間のロックアウトがかかるため、必ずdry-runでの成功を確認する。

```bash
% sudo apt install certbot
% sudo systemctl stop apache2 
% sudo certbot certonly --standalone  -d www.example.com --dry-run 
% sudo certbot certonly --standalone  -d www.example.com
% sudo systemctl start apache2
```

```bash
% sudo vi /etc/apache2/sites-available/virtual.host.conf
```

```Apache:virtual.host.conf
SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.example.com/chain.pem
```

```bash
% sudo a2ensite virtual.host
% sudo a2enmod ssl 
```
- Let’s Encryptでマルチドメインの証明書を取得するには、-dオプションのあとにホスト名を,（カンマ）区切りで複数指定します（今回は未実施）。
- 証明書自動更新については、certbot-autoからsnapdを用いた更新に変わったようです。自動更新においてはこちらを試したいと思います。

参考：https://certbot.eff.org/lets-encrypt/ubuntufocal-apache

#MovableType 7の設置
##ディレクトリ構成
- スタティックディレクトリ	/var/www/html/mt/mt-static
- アプリケーションディレクトリ	/var/www/html/mt
- ウェブサイトディレクトリ	/var/www/html/
- 管理画面URL			https://www.example.com/mt
- ウェブサイトの公開URL		https://www.example.com

参考： https://www.movabletype.jp/documentation/mt7/installation/preparation/new-installation/

##パッケージの配置

```bash
% sudo apt install unzip 
% unzip ~/MT7-R****.zip
% mkdir /var/www/html/mt
% mkdir /var/www/html/mt/mt-static
% cp -R ~/MT7-R****/* /var/www/html/mt/.
```

##CGI動作設定
```bash
% sudo vi /etc/apache2/conf-available/mt-cgi.conf
```

```Apache:mt-cgi.conf
 <Directory "/var/www/html/mt">
  Options +ExecCGI
  AddHandler cgi-script .cgi .pl .py .rb
</Directory>
```

```bash
% sudo a2enconf mt-cgi
% sudo a2enmod cgid
% sudo chmod 755 /var/www/html/mt/*.cgi 
% sudo chmod 777 /var/www/html/mt
% sudo chmod 777 /var/www/html/mt/mt-static/support
```
参考：https://www.movabletype.jp/documentation/mt7/installation/install/linux/

##システム管理者アカウントを作成
- ログインURL　	https://www.example.com/mt/
- ユーザ名	username
- パスワード password

参考：https://www.movabletype.jp/documentation/mt7/installation/install/movabletype/

##Movable Type 7詳細設定
- 下記の通りmt-config.cgi設定ファイルを構成。

```bash:/var/www/html/mt/mt-config.cgi
#======== REQUIRED SETTINGS ==========
CGIPath        https://www.example.com/mt/
StaticWebPath  https://www.example.com/mt/mt-static/
StaticFilePath /var/www/html/mt/mt-static
# マルチドメインで一つのCGIにアクセスさせるためには、上記CGIPathとStaticWebPathを変更する。
#======== DATABASE SETTINGS ==========
ObjectDriver DBI::mysql
Database dbname
DBUser dbusername
DBPassword dbpassword
DBHost localhost
#======== MAIL =======================
EmailAddressMain mail@example.com
MailTransfer smtp
SMTPServer example.com
SMTPPort 587 (or 25)
SMTPAuth starttls (or 1 or ssl)
SMTPUser username
SMTPPassword password
DefaultLanguage ja
ImageDriver ImageMagick
```
参考：https://www.movabletype.jp/documentation/mt7/installation/install/smtp/ （SMTP）
参考２：https://www.movabletype.jp/faq/publish-blogs-by-multidomain.html （マルチドメイン）

#冗長化設定
##MariaDBのバックアップを取得

- スクリプトはrootで動かし、ユーザのホームディレクトリにバックアップを貯めていきます。

```bash
# mkdir /root/bin
% mkdir ~/db_backup
```

```bash
# vi /root/bin/backup4mysql.sh
```

```bash:/root/bin/backup4mysql.sh
#!/bin/sh
# umask 077
period=3
dirpath='/home/username/db_backup'
filename=`date +%y%m%d`
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=dbpassword | gzip > $dirpath/$filename.sql.gz
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz
```

- パスワードが記載されているのでスクリプトはchmodしておきます。

```bash
# chmod 0700 /root/bin/backup4mysql.sh
```

## rootのcrontabに登録して自動実行
```bash
# echo "0 3 * * * root /root/backup4mysql.sh" > /etc/cron.d/backup4mysql
```

参考：https://qiita.com/crimson_21/items/6171a95f8ddb2861e2e6

##wwwからwww2にデータを転送する準備
- パスワードレスの公開鍵認証でrsyncができるようにします。
- www2.example.comについて、rsyncでの転送のためにホスティング事業者のカスタマーコントロール画面でパケットフィルタを設定し、TCP22をwww.example.comのIPアドレスに対して許可する必要があります。

```bash:www.example.comにて
% ssh keygen -t rsa -b 4096
% chmod 700 /home/username/.ssh
% chmod 600 /home/username/.ssh/id_rsa.pub
% scp /home/username/.ssh/id_rsa.pub 
 username@www2.example.com:/home/username/.ssh/id_rsa.pub
```

```bash:www2.example.comにて
% cat /home/username/.ssh/id_rsa.pub >> /home/username/.ssh/authorized_keys
% rm /home/username/.ssh/id_rsa.pub
```

##データベースのバックアップ
- MariaDBのバックアップ３世代をメインからサブに転送する

```bash:www.example.comにて
% vi /home/username/bin/rsyncTo2ndhost.sh
```
```bash:~/bin/rsyncTo2ndhost.sh
 rsync -avzu -e ssh --delete /home/username/db_backup username@www2.example.com:/home/username/
# --deleteオプションをつけているので、メインにないバックアップはサブからも削除されます。
```

## ファイルのバックアップ
- /var/www/htmlのデータをメインからサブに転送する

```bash:~/bin/rsyncTo2ndhost.sh
 rsync -avzu -e ssh /var/www/html username@www2.example.com:/home/username/html_backup
# --deleteオプションをつけていないので、メインから誤って消去したファイルもサブには残ります。
```

##ユーザのcrontabに登録
```bash
% crontab -e 
```

```bash:crontab
0 4 * * * /home/username/bin/rsyncTo2ndhost.sh
```

#メール送信設定
- SMTP-AUTHに対応したメール送信を行うために、PostfixとDovecotを設定

```bash
% sudo cp /etc/postfix/main.cf.proto /etc/postfix/main.cf
% sudo vi /etc/postfix/main.cf
```

```bash:/etc/postfix/main.cf
mail_owner = postfix
myhostname = www.example.com
mydomain = example.com
myorigin = mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks_style = subnet
mynetworks = 127.0.0.0/8, [IPアドレス/ネットマスク]
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
#smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_banner = $myhostname ESMTP unknown
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
#html_directory =
#manpage_directory =
#sample_directory =
#readme_directory =

# SMTP Auth
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, perm\
it_sasl_authenticated, reject

message_size_limit = 10485760
```

```bash
%sudo vi /etc/postfix/master.cf
```

```bash:/etc/postfix/master.cf
# submission inet n - y - - smtpd
submission inet n - y - - smtpd
# -o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
% sudo newaliases
% sudo systemctl restart postfix
```

#コールドスタンバイ
- www2.example.comのapache2は停止して、自動起動を止めておく。
- バックアップを手動で取得した後、停止させる。

```bash
% sudo systemctl stop apache2
% sudo systemctl disable apache2
```

##異常発生時
- www2.example.comのWebサーバを起動して、自動起動を設定する。

```bash
% sudo systemctl start apache2
% sudo systemctl enable apache2
```

##mysqldumpファイルの書き戻し
- /home/username/db_backupから、データを選択する。

```bash
% sudo mysql -u root -p < dump.sql
```