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

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

概要

ConoHa VPSを使ってGhost + Mailgun連携によるニュースレター配信システムを構築するガイドです.
既存ドメイン(お名前.com管理)を使用し,本番環境での運用を目指しています.

前提条件

  • お名前.comでドメイン取得済み
  • Mailgunアカウント
  • ConoHaアカウント
  • ターミナル操作(ローカルマシン)
💡
新しいユーザーをユーザー自身が登録できるようにする設定が別にあります.内容としては,config.production.jsonに追記することになります.方法について,以下の記事にまとめました.
ユーザーメール登録の設定方法
問題の症状 初期状態でGhost でニュースレター登録を試すと以下のエラーが発生しました. * 記事ページ上では, “Failed to sign up, please try again”とポップアップがでる. * ghost log の表示は, EmailError: Failed to send email. Reason: Sending failed. 原因 Ghost管理画面でMailgunを設定しても,config.production.jsonでメール設定が“transport”: “Direct”のままになっており,Mailgun設定が反映されていない. 解決方法 1. 設定ファイル確認 cd /var/www/ghost cat config.production.json # 以下のような設定になっている場合が問題: “mail”: { “transport”: “Direct” } 2. 手動設定変更 ghost

Part 1: Mailgun設定

Step 1: Mailgunサンドボックスでの初期テスト

1.1 API Key取得

  1. Mailgunダッシュボードにログイン
  2. Get started -> Create an API key -> Manage API keys -> Add new key
  3. 表示されるAPI key をコピー保存(初回作成時のみ表示)

1.2 サンドボックステスト

  1. Send -> SENDING -> Domain settings
  2. 右上のDomainから,sandboxのドメインを選択
  3. Setupタブを開く
  4. 必要であれば,Add test email recipientで,受信メールアドレスを追加
  5. Choose methodを開き,APIからSelectをクリック
  6. 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!'
  1. ターミナルにペーストし,YOUR_API_KEYを,1.1でメモしたキーに置き換えて実行する
  2. メールが受信できたら成功

Step 2: 独自ドメインの設定

2.1 Mailgunドメイン追加

  1. Domains → Add New Domain
  2. ドメイン名: mail.yourdomain.com
  3. 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検証

  1. DNS伝播確認: https://dns.google/query?name=mail.yourdomain.com&type=TXT
  2. Mailgunで Verify DNS Settings クリック
  3. 全ての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コントロールパネルでポート設定を変更します.

  1. コントロールパネルアクセス
    • VPS詳細画面→「ネットワーク情報」→「セキュリティグループ」
  2. 新規セキュリティグループ作成
    • 「セキュリティグループ」→「セキュリティグループ追加」
    • 名前: myssh(任意の名前)
    • 説明: カスタムSSHポート用
  3. ルール設定IPv4ルールIPv6ルール
    • 方向: ingress(受信)
    • IP プロトコル: TCP
    • ポート: 2222(設定したSSHポート)
    • 送信元: 0.0.0.0/0(または接続元IPを限定)
    • 方向: ingress(受信)
    • IP プロトコル: TCP
    • ポート: 2222(設定したSSHポート)
    • 送信元: ::/0(または接続元IPv6を限定)
  4. VPSに適用
    • 作成したセキュリティグループをVPSに適用

6.6 接続テスト

【ローカルターミナル(新規)】

# 新しいターミナルで鍵認証テスト
ssh -p 2222 [ユーザー名]@[VPS IP ADDRESS]

重要: 鍵認証が確実に動作することを確認してからパスワード認証を無効化してください.

Step 7: DNS設定

7.1 DNS設定の概要

Aレコード:ドメイン名をIPアドレスに変換する設定です.

7.2 お名前.com管理画面での設定

【ブラウザ(お名前.com管理画面)】

  1. 管理画面アクセス
    • お名前.com Navi にログイン
    • 「ドメイン」→「DNS関連機能の設定」
  2. DNSレコード設定
    • 「A/AAAA/CNAME/MX/NS/TXT/SRV/DS/CAAレコード」を選択
  3. レコード追加
設定項目 1つ目 2つ目
ホスト名 空欄(@になる) www
TYPE A A
TTL 3600(デフォルト) 3600(デフォルト)
VALUE VPSのIPアドレス VPSのIPアドレス

結果例

  • @.ir-laboratory.com203.0.113.1
  • www.ir-laboratory.com203.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実行時の質問に以下のように回答します.

  1. VALIDATE PASSWORD COMPONENT: y(パスワード複雑性チェック有効)
  2. パスワード強度レベル: 1(MEDIUM推奨)
    • 8文字以上,大小英字・数字・記号を含む
  3. Set root password: y(rootパスワード設定)
    • 強固なパスワードを入力・確認(複雑性要件を満たす必要あり)
  4. Remove anonymous users: y(匿名ユーザー削除)
  5. Disallow root login remotely: y(リモートroot禁止)
  6. Remove test database: y(テストDB削除)
  7. 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アクセス用のルールを追加します.

  1. VPS詳細画面セキュリティグループ→現在のセキュリティグループ
  2. HTTP用ルール追加
    • 方向: ingress(受信)
    • IPプロトコル: TCP
    • ポート: 80
    • 送信元: 0.0.0.0/0(IPv4)
  3. IPv6 HTTP用ルール追加
    • 方向: ingress(受信)
    • IPプロトコル: TCP
    • ポート: 80
    • 送信元: ::/0(IPv6)
  4. HTTPS用ルール追加(IPv4)
    • 方向: ingress(受信)
    • IPプロトコル: TCP
    • ポート: 443
    • 送信元: 0.0.0.0/0(IPv4)
  5. 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設定

  1. Ghost管理画面アクセス
    • https://yourdomain.com/ghostにアクセス
    • 管理者アカウント作成
  2. メール設定
    • Settings → Membership → Newsletters -> Mailgun のEdit ボタンをクリック
    • 設定項目:
      • Mailgun region: US(通常)
      • Mailgun domain: mail.yourdomain.com
      • Mailgun private API key: Part 1のStep 1.1で取得したAPI key
  3. ニュースレター機能有効化
    • Settings → Membership → Newsletters -> Newsletter sendingをONにする

Step 14: テスト送信

  1. Ghost管理画面でのテスト送信
    • Settings → Membership → Newsletters → Test emailでテスト実行
    • 管理者メールアドレスに送信確認
  2. ニュースレター機能確認
    • Posts → Newsletter作成
    • 購読者追加(手動)
    • 配信テスト実行

Step 15: 動作確認

Ghostの稼働状況や運営には以下のようなコマンドが使えます.

# Ghostサービス状態確認
ghost status

# ログ確認
ghost log

# 再起動(必要時)
ghost restart

トラブルシューティング

(発生したら追記します)

まとめ

ConoHa VPS上にGhostをインストールし,Mailgunを使ってニュースレターを配信するシステムを構築できました.少し手順が多いので,しばらくぶりに実行しようとすると迷うかと思います.将来の自分に役立つと思いますし,どなたかの参考になりましたら幸いです.