ConoHa VPS + Ghost + Mailgun でニュースレター配信システムを構築する

概要
ConoHa VPSを使ってGhost + Mailgun連携によるニュースレター配信システムを構築するガイドです.
既存ドメイン(お名前.com管理)を使用し,本番環境での運用を目指しています.
前提条件
- お名前.comでドメイン取得済み
- Mailgunアカウント
- ConoHaアカウント
- ターミナル操作(ローカルマシン)
config.production.json
に追記することになります.方法について,以下の記事にまとめました.
Part 1: Mailgun設定
Step 1: Mailgunサンドボックスでの初期テスト
1.1 API Key取得
- Mailgunダッシュボードにログイン
- Get started -> Create an API key -> Manage API keys -> Add new key
- 表示されるAPI key をコピー保存(初回作成時のみ表示)
1.2 サンドボックステスト
- Send -> SENDING -> Domain settings
- 右上の
Domain
から,sandboxのドメインを選択 Setup
タブを開く- 必要であれば,
Add test email recipient
で,受信メールアドレスを追加 Choose method
を開き,API
からSelect
をクリックSet up the test email
が開くので,cURL
をクリックして,出てきたスクリプトをコピーする(例は以下)
【ローカルターミナル】
curl -s --user 'api:YOUR_API_KEY' \
https://api.mailgun.net/v3/sandbox-xxxxxxxx.mailgun.org/messages \
-F from='Test <postmaster@sandbox-xxxxxxxx.mailgun.org>' \
-F to='your-email@example.com' \
-F subject='Test Email' \
-F text='Hello from Mailgun!'
- ターミナルにペーストし,
YOUR_API_KEY
を,1.1でメモしたキーに置き換えて実行する - メールが受信できたら成功
Step 2: 独自ドメインの設定
2.1 Mailgunドメイン追加
- Domains → Add New Domain
- ドメイン名:
mail.yourdomain.com
- Use automatic sender security を選択
2.2 DNS設定(お名前.com)
【ブラウザ(お名前.com管理画面)】
ネームサーバー確認
- Cloudflare等の外部DNSを使用している場合は、お名前.comのネームサーバーに変更
- ネームサーバー1:
dns1.onamae.com
- ネームサーバー2:
dns2.onamae.com
DNS機能有効化
- お名前.comでDNS設定機能を有効化(年額1323円)
DNSレコード追加
Mailgunが表示するSending recordsを追加:
TXT mail.yourdomain.com "v=spf1 include:mailgun.org ~all"
CNAME pdk1._domainkey.mail [Mailgunが指定する値]
CNAME pdk2._domainkey.mail [Mailgunが指定する値]
2.3 DNS検証
- DNS伝播確認: https://dns.google/query?name=mail.yourdomain.com&type=TXT
- Mailgunで Verify DNS Settings クリック
- 全てのSending recordsが緑色になることを確認
2.4 独自ドメインでのテスト送信
【ローカルターミナル】
curl -s --user 'api:YOUR_API_KEY' \
https://api.mailgun.net/v3/mail.yourdomain.com/messages \
-F from='Test <noreply@mail.yourdomain.com>' \
-F to='your-email@example.com' \
-F subject='Test from custom domain' \
-F text='Custom domain test successful!'
結果: 独自ドメインからのメール送信成功
Part 2: ConoHa VPS + Ghost構築
Step 3: ConoHa VPS契約
【ブラウザ】
3.1 アカウント作成
- ConoHa VPS にアクセス
- 「今すぐお申し込み」からアカウント作成
3.2 VPS契約
- ログイン後,コントロールパネルで「VPS」を選択
- 設定項目を以下のように選択・入力:
- サービス: VPS
- イメージタイプ: Ubuntu 24.04 (x86_64)
- 料金タイプ: 12ヶ月(コストパフォーマンス良好)
- プラン: 1GB(508円/月)を選択(Ghost + MySQL + Nginxには1GB以上推奨)
- rootパスワード: 9〜70文字で英数字記号の組み合わせ,安全性の高いパスワードを設定
- ネームタグ: デフォルトまたは
ghost-newsletter
など分かりやすい名前
- 設定後,「オプション」で追加設定を確認してから契約を進める
重要: SSH接続のため,セキュリティグループを「default」から「IPv4v6-SSH」に変更する必要があります.VPS詳細画面の「ネットワーク情報」→「セキュリティグループ」から変更してください.
Step 4: 初期設定
【ローカルターミナル】
# SSH接続
ssh root@[VPS IP ADDRESS]
# システムアップデート
sudo apt update && sudo apt upgrade -y
Step 5: 初期セキュリティ設定
セキュリティ向上のため,root以外のユーザーを作成します.
【ローカルターミナル】
# SSH接続
ssh root@[VPS IP ADDRESS]
# 一般ユーザー作成
sudo adduser [ユーザー名]
sudo gpasswd -a [ユーザー名] sudo
# 作成したユーザーでログインし直す
exit
ssh [ユーザー名]@[VPS IP ADDRESS]
Step 6: SSH鍵認証設定
セキュリティ向上のため,パスワード認証を無効化しSSH鍵認証のみに設定します.
6.1 ローカルでの公開鍵準備
【ローカルターミナル】
# ローカルで公開鍵をクリップボードにコピー(macOS)
cat ~/.ssh/id_rsa.pub | pbcopy
# または手動でコピー
cat ~/.ssh/id_rsa.pub
6.2 サーバーでの鍵設定
【ローカルターミナル】
# 作成したユーザーでSSH接続
ssh [ユーザー名]@[VPS IP ADDRESS]
# .sshディレクトリ作成
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# authorized_keysファイル作成・編集
nano ~/.ssh/authorized_keys
# ↑ ここでクリップボードの公開鍵を貼り付け
# 権限設定
chmod 600 ~/.ssh/authorized_keys
6.3 SSH設定変更
【ローカルターミナル】
# sshd_config編集
sudo nano /etc/ssh/sshd_config
# 以下の設定を変更/追記:
# Port 2222 # デフォルトポート変更
# PasswordAuthentication no # パスワード認証無効化
# PubkeyAuthentication yes # 鍵認証有効化
# PermitRootLogin no # root直接ログイン禁止
6.4 SSH再起動・接続テスト
【ローカルターミナル】
# SSH設定確認
sudo sshd -t
# SSH再起動
sudo systemctl restart sshd
6.5 ConoHaセキュリティグループ設定
【ブラウザ(ConoHa管理画面)】
SSH設定変更後,ConoHaコントロールパネルでポート設定を変更します.
- コントロールパネルアクセス
- VPS詳細画面→「ネットワーク情報」→「セキュリティグループ」
- 新規セキュリティグループ作成
- 「セキュリティグループ」→「セキュリティグループ追加」
- 名前:
myssh
(任意の名前) - 説明: カスタムSSHポート用
- ルール設定IPv4ルール:IPv6ルール:
- 方向: ingress(受信)
- IP プロトコル: TCP
- ポート: 2222(設定したSSHポート)
- 送信元: 0.0.0.0/0(または接続元IPを限定)
- 方向: ingress(受信)
- IP プロトコル: TCP
- ポート: 2222(設定したSSHポート)
- 送信元: ::/0(または接続元IPv6を限定)
- VPSに適用
- 作成したセキュリティグループをVPSに適用
6.6 接続テスト
【ローカルターミナル(新規)】
# 新しいターミナルで鍵認証テスト
ssh -p 2222 [ユーザー名]@[VPS IP ADDRESS]
重要: 鍵認証が確実に動作することを確認してからパスワード認証を無効化してください.
Step 7: DNS設定
7.1 DNS設定の概要
Aレコード:ドメイン名をIPアドレスに変換する設定です.
7.2 お名前.com管理画面での設定
【ブラウザ(お名前.com管理画面)】
- 管理画面アクセス
- お名前.com Navi にログイン
- 「ドメイン」→「DNS関連機能の設定」
- DNSレコード設定
- 「A/AAAA/CNAME/MX/NS/TXT/SRV/DS/CAAレコード」を選択
- レコード追加
設定項目 | 1つ目 | 2つ目 |
---|---|---|
ホスト名 | 空欄(@になる) | www |
TYPE | A | A |
TTL | 3600(デフォルト) | 3600(デフォルト) |
VALUE | VPSのIPアドレス | VPSのIPアドレス |
結果例:
@.ir-laboratory.com
→203.0.113.1
www.ir-laboratory.com
→203.0.113.1
7.3 設定の意味
- @レコード: ルートドメイン(
ir-laboratory.com
)をVPSに向ける - wwwレコード: wwwサブドメイン(
www.ir-laboratory.com
)をVPSに向ける - 両方設定により,どちらのURLでもアクセス可能
注意: DNS反映には数時間〜48時間かかる場合があります.
Step 8: DNS反映確認
【ローカルターミナル】
# 反映確認
dig yourdomain.com
nslookup yourdomain.com
8.1 確認ポイント
digコマンドでの判定:
反映前(設定が未反映):
$ dig ir-laboratory.com
;; ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; AUTHORITY SECTION:
ir-laboratory.com. 300 IN SOA 01.dnsv.jp. hostmaster.dnsv.jp. ...
ANSWER: 0
→ Aレコードが見つからない
反映後(設定が正常に反映):
$ dig ir-laboratory.com
;; ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; ANSWER SECTION:
ir-laboratory.com. 3600 IN A 163.44.121.48
ANSWER: 1
→ Aレコードが設定済みANSWER SECTION
にVPSのIPアドレスが表示- IPアドレスがVPSの実際のIPと一致することを確認
nslookupコマンドでの判定:
反映前(設定が未反映):
$ nslookup ir-laboratory.com
Server: 127.0.0.53
Address: 127.0.0.53#53
** server can't find ir-laboratory.com: NXDOMAIN
NXDOMAIN
→ ドメインが見つからない
反映後(設定が正常に反映):
$ nslookup ir-laboratory.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: ir-laboratory.com
Address: 163.44.121.48
Non-authoritative answer
以下にIPアドレスが表示Address: 163.44.121.48
→ VPSのIPアドレスが返される
Step 9: Ghost CLI インストール
【ローカルターミナルからVPSへSSHログイン後】
# Node.js インストール(推奨LTS版)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# Ghost CLI インストール
sudo npm install -g ghost-cli@latest
# インストール確認
ghost --version
node --version
npm --version
9.1 インストール確認
正常にインストールされていれば,以下のようにバージョンが表示されます.
$ ghost --version
Ghost-CLI version: 1.25.3
$ node --version
v20.15.1
$ npm --version
10.7.0
注意: バージョン番号は例です.実際の出力は環境やインストール時期により異なりますが,エラーなくバージョン情報が表示されれば正常です.
Step 10: MySQL事前設定
Ghost CLIはMySQLを必要とするため,事前にインストール・設定します.
【ローカルターミナルからVPSへSSHログイン後】
# MySQL Server インストール
sudo apt install mysql-server -y
# MySQL セキュリティ設定
sudo mysql_secure_installation
10.1 MySQL セキュリティ設定の質問と回答
mysql_secure_installation
実行時の質問に以下のように回答します.
- VALIDATE PASSWORD COMPONENT:
y
(パスワード複雑性チェック有効) - パスワード強度レベル:
1
(MEDIUM推奨)- 8文字以上,大小英字・数字・記号を含む
- Set root password:
y
(rootパスワード設定)- 強固なパスワードを入力・確認(複雑性要件を満たす必要あり)
- Remove anonymous users:
y
(匿名ユーザー削除) - Disallow root login remotely:
y
(リモートroot禁止) - Remove test database:
y
(テストDB削除) - Reload privilege tables:
y
(権限テーブル再読み込み)
10.2 MySQL rootパスワード確認・設定
Ubuntu 24.04では初期状態でrootパスワードが空の場合があります.セキュリティのため確認・設定します.
# パスワードなしでMySQLに接続テスト
sudo mysql -u root
接続できた場合(空パスワード):
-- 現在の認証状況確認
SELECT user,authentication_string,plugin,host FROM mysql.user WHERE user='root';
-- rootパスワードを設定(システムrootと異なるパスワード推奨)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
FLUSH PRIVILEGES;
exit;
パスワード要件(mysql_secure_installationで有効化済み):
- 8文字以上
- 大文字・小文字・数字・記号をすべて含む
接続できない場合:
既にパスワードが設定済みです.設定したパスワードを使用してください.
10.3 MySQL動作確認
# 設定したパスワードでMySQL接続テスト
sudo mysql -u root -p
# パスワード入力後,MySQLプロンプトが表示されれば成功
# mysql> プロンプトで exit; で終了
Step 11: Nginx事前インストール
Ghost CLIがNginxとSSLを自動設定するため,事前にNginxをインストールします.
【ローカルターミナルからVPSへSSHログイン後】
# Nginxインストール
sudo apt install nginx -y
# Nginxサービス開始・有効化
sudo systemctl start nginx
sudo systemctl enable nginx
# 動作確認
sudo systemctl status nginx
11.1 UFWファイアウォール設定
WebアクセスのためHTTP/HTTPSポートを許可します.
# HTTP(port 80)を許可
sudo ufw allow 80
# HTTPS(port 443)を許可(SSL設定後のため)
sudo ufw allow 443
# 設定確認
sudo ufw status
11.2 ConoHaセキュリティグループ設定
【ブラウザ(ConoHa管理画面)】
HTTPアクセス用のルールを追加します.
- VPS詳細画面→セキュリティグループ→現在のセキュリティグループ
- HTTP用ルール追加:
- 方向: ingress(受信)
- IPプロトコル: TCP
- ポート: 80
- 送信元: 0.0.0.0/0(IPv4)
- IPv6 HTTP用ルール追加:
- 方向: ingress(受信)
- IPプロトコル: TCP
- ポート: 80
- 送信元: ::/0(IPv6)
- HTTPS用ルール追加(IPv4):
- 方向: ingress(受信)
- IPプロトコル: TCP
- ポート: 443
- 送信元: 0.0.0.0/0(IPv4)
- HTTPS用ルール追加(IPv6):
- 方向: ingress(受信)
- IPプロトコル: TCP
- ポート: 443
- 送信元: ::/0(IPv6)
11.3 Nginx動作確認
http://yourdomain.com
にアクセスしてNginxデフォルトページが表示されることを確認します.
Step 12: Ghost インストール
【ローカルターミナルからVPSへSSHログイン後】
# Ghostディレクトリ作成
sudo mkdir -p /var/www/ghost
sudo chown $USER:$USER /var/www/ghost
cd /var/www/ghost
# Ghostインストール実行
ghost install --url=https://yourdomain.com
12.1 インストール中の質問と回答
MySQL設定:
? Enter your MySQL hostname:
→127.0.0.1
? Enter your MySQL username:
→root
? Enter your MySQL password:
→ Step 10.2で設定したrootパスワードを入力? Enter your Ghost database name:
→ghost_prod
(デフォルトのままEnter)? Do you wish to set up "ghost" mysql user?
→Y
その他の設定:
? Do you wish to set up Nginx?
→Y
? Do you wish to set up SSL?
→Y
? Enter your email (For SSL Certificate):
→ 実際に受信可能なメールアドレスを入力- SSL証明書の更新通知・有効期限切れ警告・Let's Encryptからの重要な通知に使用
? Do you wish to set up Systemd?
→Y
? Do you want to start Ghost?
→Y
- Ghostサービスを開始し,即座にアクセス可能になります
Part 3: Ghost + Mailgun連携
Step 13: Ghost管理画面でのMailgun設定
- Ghost管理画面アクセス
https://yourdomain.com/ghost
にアクセス
- 管理者アカウント作成
- メール設定
- Settings → Membership → Newsletters -> Mailgun のEdit ボタンをクリック
- 設定項目:
- Mailgun region: US(通常)
- Mailgun domain:
mail.yourdomain.com
- Mailgun private API key: Part 1のStep 1.1で取得したAPI key
- ニュースレター機能有効化
- Settings → Membership → Newsletters -> Newsletter sendingをONにする
Step 14: テスト送信
- Ghost管理画面でのテスト送信
- Settings → Membership → Newsletters → Test emailでテスト実行
- 管理者メールアドレスに送信確認
- ニュースレター機能確認
- Posts → Newsletter作成
- 購読者追加(手動)
- 配信テスト実行
Step 15: 動作確認
Ghostの稼働状況や運営には以下のようなコマンドが使えます.
# Ghostサービス状態確認
ghost status
# ログ確認
ghost log
# 再起動(必要時)
ghost restart
トラブルシューティング
(発生したら追記します)
まとめ
ConoHa VPS上にGhostをインストールし,Mailgunを使ってニュースレターを配信するシステムを構築できました.少し手順が多いので,しばらくぶりに実行しようとすると迷うかと思います.将来の自分に役立つと思いますし,どなたかの参考になりましたら幸いです.