Ghost + MariaDB Galera Cluster @ Ubuntu 24.04 セットアップ
早速Ghostのインストールを進めていく。
最終的なゴールは、XServerのVPS 2台によるAct/Act運用(ホットスタンバイ)だが、今回は半自動半手動で1台のみにインストールする。
多くのコンポーネントが混在しているVPSのため、Dockerを使わずに済むものは原則パッケージインストールする方針で進めている。
既存のGalera Cluster(MariaDB)やワイルドカード証明書を使い回すが、これらのセットアップについては、また別の機会に。
1. インフラの前提条件
初期状態を伺うためにも、ghost-cliまでをAnsibleで入れて、ハンドキックでinstallを実施する。
Node.jsは既存の共通タスクを流用。ghost-cliはnpmでインストールするだけなので、AIにお願いすればよしなにPlaybookを作ってくれる。Ansibleを流して準備は完了。
- SSL: Cloudflare経由で更新している既存のワイルドカード証明書(Let's Encrypt)を流用。
- WEB: 既存の nginx(リバプロ)を利用。
- DB: 既存の Galera Cluster (MariaDB) を利用。
インストールを実行する前に、あらかじめDB側で専用のデータベースとユーザーを作成しておく。セキュリティの観点から、DB名やユーザー名、パスワードは環境に合わせて適切に設定し、外部から推測されにくいものを使用する。
/* データベースの作成 */
CREATE DATABASE ${DB_NAME};
/* ユーザーの作成と権限付与 */
CREATE USER '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'%';
FLUSH PRIVILEGES;
設定ファイルの挙動やユーザーの自動生成プロセスを確認したいため、ghost install はハンドキックで行う。
2. Node.jsのバージョン修正
まずは環境変数を展開しつつ、Ghostをインストールディレクトリへ流し込む。
cd /var/www/ghost && ghost install \
--url "https://${GHOST_DOMAIN}" \
--db mysql \
--dbhost "${DB_HOST}" \
--dbuser "${DB_USER}" \
--dbpass "${DB_PASS}" \
--dbname "${DB_NAME}"
ここで最初のエラーに遭遇。
Message: Ghost v6.32.0 is not compatible with the current Node version. Your node version is 20.20.2, but Ghost v6.32.0 requires ^22.13.1
共通タスクで使っていたNode.jsが20系だったため、Ghostの要求スペックに届かず。Ansibleの共通タスクを修正してNode.jsを22系へアップグレード。気を取り直してリトライ。
3. ghost-cliとの対話
Node.js 22系への更新により、インストールが順調に進みだす。
✔ Checking system Node.js version - found v22.22.2
✔ Downloading and installing Ghost v6.32.0
✔ Finishing install process
✔ Configuring Ghost
✔ Setting up instance
+ sudo useradd --system --user-group ghost
ここからCLIとの対話が始まる。
- Do you wish to set up Nginx?
-
Yesを選択。設定ファイルが/etc/nginx/sites-available/${GHOST_DOMAIN}.confに自動生成される。
-
- Do you wish to set up SSL?
Noを選択。既存のワイルドカード証明書を手動で当てるためだ。
- Do you wish to set up Systemd?
Yesを選択。
- Do you want to start Ghost?
Yesで起動まで持っていく。
4. ワイルドカード証明書の設定
Ghostが自動生成したNginxの設定ファイルはacme.sh(HTTP-01認証)を想定しているため、これを自分の環境に合わせて書き換えて、nginxを再起動。
vi /etc/nginx/sites-available/${GHOST_DOMAIN}.conf
sudo nginx -t
sudo systemctl restart nginx変更したnginxの設定は以下。
server {
listen 443 ssl;
server_name ${GHOST_DOMAIN};
# 既存のワイルドカード証明書パスへ変更
ssl_certificate /etc/nginx/ssl/${MAIN_DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/${MAIN_DOMAIN}/privkey.pem;
# ...その他のプロキシ設定
}
ブラウザでアクセス。無事にGhostの初期画面が現れた。

5. 管理者アカウント作成
インストール直後に https://${GHOST_DOMAIN}/ghost/ へアクセスすると、管理者アカウントの作成画面が表示される。ここで以下を入力。
- Site Title
- Site Description
- Full Name
尚、設定した内容はGhostのプロフィールだけでなく、デフォルトのポストやページ、読者へ届くシステムのメール文面にも入り込む。フルネームに引っ張られて本名を使ったりすると、後であちこちに散りばめられた名前を修正して回る羽目になってしまう。
まとめ:インストール完了
以上で、1台目の初回セットアップは完了。
Galera ClusterのおかげでDB層の冗長化は担保されているので、 content ディレクトリなども2台目と同期する設定を検討。今回、調整した設定ファイルや起動ファイルをansible タスクにフィードバックし、Ghostセットアップの全自動化を実現する。そして2台目に適用すればAct/Actの完成だ。