Ghostブログ · 4 min read · Oct 23, 2025
Debian 12でNginxを使用してGhostブログをデプロイする方法

Ghostは、プロフェッショナルな外観のブログを作成するのに役立つオープンソースのブログプラットフォームです。2013年にWordPressの代替として立ち上げられました。JavaScriptで書かれており、Node.jsライブラリによって動作しています。
このチュートリアルでは、Debian 12で動作するサーバー上にNginxとMySQLを使用してGhost CMSをインストールする方法を探ります。インストールを保護するためにLet’s Encrypt SSL証明書を使用します。
前提条件
- 最低2GBのRAMを搭載したDebian 12を実行しているサーバー。
- sudo権限を持つ非rootユーザー。
- サーバーを指す完全修飾ドメイン名(FQDN)例:
example.com。 - すべてが更新されていることを確認します。
$ sudo apt update $ sudo apt upgrade - システムに必要な数パッケージ。
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yこれらのパッケージのいくつかは、すでにシステムにインストールされている可能性があります。
ステップ1 - UFWファイアウォールの設定
最初のステップは、ファイアウォールを設定することです。Debianにはデフォルトでufw(Uncomplicated Firewall)が付属しています。
ファイアウォールが実行中かどうかを確認します。
$ sudo ufw status
次の出力が得られるはずです。
Status: inactive
SSHポートを許可して、ファイアウォールが有効にしたときに現在の接続が切断されないようにします。
$ sudo ufw allow OpenSSH
HTTPおよびHTTPSポートも許可します。
$ sudo ufw allow http
$ sudo ufw allow https
ファイアウォールを有効にします。
$ sudo ufw enable
コマンドは既存のssh接続を中断する可能性があります。この操作を続行しますか(y|n)? y
ファイアウォールはアクティブで、システム起動時に有効になります
再度ファイアウォールの状態を確認します。
$ sudo ufw status
同様の出力が表示されるはずです。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
ステップ2 - Nginxのインストール
Debian 12には古いバージョンのNginxが付属しています。最新バージョンをインストールするには、公式のNginxリポジトリをダウンロードする必要があります。
Nginxの署名キーをインポートします。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Nginxの安定版のリポジトリを追加します。
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
システムリポジトリを更新します。
$ sudo apt update
Nginxをインストールします。
$ sudo apt install nginx
インストールを確認します。sudoはDebianでコマンドを実行するために必要です。
$ sudo nginx -v
nginx version: nginx/1.24.0
Nginxサーバーを起動します。
$ sudo systemctl start nginx
ステップ3 - Node.jsのインストール
GhostインストーラーはNode.jsが必要です。最初のステップは、Nodesource GPGキーをインポートすることです。
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
次に、Nodesourceリポジトリファイルを作成します。Ghostが推奨する現在のLTS(Long Term Support)バージョンであるNode 18xをインストールします。
$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
システムリポジトリリストを更新します。
$ sudo apt update
Nodeをインストールします。
$ sudo apt install nodejs -y
Nodeのインストールを確認します。
$ node --version
v18.18.2
ステップ4 - Dockerを使用してMySQLをインストール
DebianにはもはやMySQLが付属していません。その代わりにMariaDBが付属しています。GhostはMySQLのみをサポートしています。MariaDBで動作するようにGhostを調整することもできますが、推奨されません。執筆時点でMySQLの公式リポジトリはDebian 12用に更新されていないため、Dockerを使用してインストールします。
Docker GPGキーをインポートします。
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
Dockerリポジトリファイルを作成します。
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
システムリポジトリリストを更新します。
$ sudo apt update
DockerとDocker Composeをインストールします。
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
デフォルトでは、Dockerはroot権限を必要とします。dockerコマンドを実行するたびにsudoを使用したくない場合は、ユーザー名をdockerグループに追加します。
$ sudo usermod -aG docker $(whoami)
この変更を有効にするには、サーバーからログアウトして同じユーザーとして再度ログインする必要があります。または、次のコマンドを使用します。
$ su - ${USER}
ユーザーがDockerグループに追加されたことを確認します。
$ groups
navjot wheel docker
Dockerがインストールされたので、MySQL用のDockerコンポーズファイルを作成する必要があります。MySQL Docker用のディレクトリを作成します。
$ mkdir ~/mysql
docker-compose.ymlファイルを作成して編集します。
$ nano docker-compose.yml
以下のコードを貼り付けます。
services:
database:
image: container-registry.oracle.com/mysql/community-server:latest
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: ghost
MYSQL_PASSWORD: ghostpassword
MYSQL_DATABASE: ghostdb
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
ここでは、rootパスワードとGhostデータベース用のMySQL資格情報を設定しました。これらはコンテナが実行されるときに作成されます。
MySQLコンテナを起動します。
$ docker compose up -d
Dockerコンテナの状態を確認します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec42fb205f1e container-registry.oracle.com/mysql/community-server:latest "/entrypoint.sh mysq…" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp mysql
Ghostはポート3306を使用してMySQLコンテナに接続し、操作を実行できます。
ステップ5 - Ghostのインストール
Dockerを使用してGhostをインストールすることもできますが、ここでは行いません。
Ghostのインストールは、Ghost-CLIコマンドラインツールとブログパッケージの3つのコンポーネントで構成されます。
Ghost-CLIのインストール
次のコマンドを実行してGhost-CLIツールをインストールします。
$ sudo npm install ghost-cli@latest -g
Ghostディレクトリの準備
Ghostのルートディレクトリを作成します。
$ sudo mkdir -p /var/www/html/ghost
ディレクトリの所有権を現在のユーザーに設定します。
$ sudo chown $USER:$USER /var/www/html/ghost
正しいディレクトリの権限を設定します。
$ sudo chmod 755 /var/www/html/ghost
Ghostディレクトリに移動します。
$ cd /var/www/html/ghost
Ghostのインストール
Ghostのインストールは単一のコマンドプロセスです。
$ ghost install
インストール中、CLIツールはブログを構成するためのいくつかの質問をします。
- ブログURL:完全なブログURLをhttpsプロトコルと共に入力します。 (
https://example.com) - MySQLホスト名:GhostのインストールとMySQLが同じサーバーにあるため、デフォルト値の
localhostを使用するにはEnterを押します。 - MySQLユーザー名:MySQLユーザー名として
ghostを入力します。 - MySQLパスワード:dockerファイルで以前に作成したrootパスワードを入力します。
- Ghostデータベース名:dockerファイルで設定されたデータベース名(
ghostdb)を入力します。 - Sudoパスワード:管理タスクを実行するためにsudoパスワードを求められます。
- Nginxを設定しますか? 通常、Ghost-CLIはNginxのインストールを検出し、ブログ用に自動的に構成します。しかし、これはOSパッケージを使用してインストールされたNginxにのみ機能します。私たちはNginxのリポジトリを使用してインストールしたため、Ghostはそれを検出できず、自動的にスキップします。
- SSLを設定しますか?:Nginxの構成をスキップしたため、CLIツールはSSLの設定もスキップします。
- systemdを設定しますか?:GhostはGhostのシステムサービスを設定するかどうかを尋ねます。Yを押して続行します。
- Ghostを開始しますか?:Ghostのインストールを開始するにはYを押します。ただし、NginxとSSLがまだ構成されていないため、機能しません。
ステップ6 - SSLのインストール
続行する前に、Certbotツールをインストールし、ドメイン用のSSL証明書をインストールする必要があります。
Certbotをインストールするために、Snapdパッケージインストーラーを使用します。Snapdは常にCertbotの最新の安定版を提供します。ただし、DebianにはSnapdがインストールされていませんので、最初にインストールします。
$ sudo apt install snapd
snapdのバージョンが最新であることを確認します。
$ sudo snap install core
$ sudo snap refresh core
Certbotをインストールします。
$ sudo snap install --classic certbot
次のコマンドを使用して、Certbotコマンドが/usr/binディレクトリで実行できるようにシンボリックリンクを作成します。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
インストールを確認します。
$ certbot --version
certbot 2.7.1
SSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
上記のコマンドは、サーバーの/etc/letsencrypt/live/example.comディレクトリに証明書をダウンロードします。
Diffie-Hellmanグループ証明書を生成します。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Certbotの更新スケジューラーサービスを確認します。
$ sudo systemctl list-timers
snap.certbot.renew.serviceがスケジュールされたサービスの1つとして見つかります。
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left Mon 2023-10-16 00:00:18 UTC 9h ago dpkg-db-backup.timer dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer apt-daily.service
SSL更新が正常に機能しているかどうかを確認するために、プロセスのドライランを実行します。
$ sudo certbot renew --dry-run
エラーが表示されない場合は、すべて設定完了です。証明書は自動的に更新されます。
ステップ7 - Nginxの設定
ファイル/etc/nginx/conf.d/ghost.confを作成して編集します。
$ sudo nano /etc/nginx/conf.d/ghost.conf
ghost.confファイルに以下のコードを貼り付けます。すべてのexample.comのインスタンスをあなたのドメインに置き換えます。
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
上記の設定は、すべてのHTTPリクエストをHTTPSにリダイレクトし、Ghostサービスをドメイン経由で提供するためのプロキシとして機能します。
Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
ファイル/etc/nginx/nginx.confを編集します。
$ sudo nano /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;の前に次の行を追加します。
server_names_hash_bucket_size 64;
Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
Nginxの設定を確認します。
$ sudo nginx -t
エラーが表示されない場合は、準備完了です。Nginxサーバーを再起動して設定を適用します。
$ sudo systemctl restart nginx
ステップ9 - サイトを実行する
今、ブラウザでhttps://example.comを開いてインストールを確認できます。成功したインストールを示すページが表示されます。

ステップ10 - セットアップを完了する
Ghostブログのセットアップを完了するには、ブラウザでhttps://example.com/ghostにアクセスします。ブログのドメインの末尾にある追加の/ghostは、Ghostの管理パネル、または初めてアクセスするためのセットアップにリダイレクトします。
ここでは、管理者アカウントを作成し、ブログのタイトルを選択する必要があります。

詳細を入力し、アカウントを作成して公開を開始ボタンをクリックして続行します。
次に、最初の投稿を書く、サイトをカスタマイズする、メンバーをインポートするなどのオプションが表示される次の画面に移動します。

Ghost管理を探索を選択して、ダッシュボードに直接移動します。セットアップの最後に、Ghostの管理パネルが表示されます。

ダークモードに切り替えたい場合は、設定ページの設定ギアボタンの隣にあるトグルスイッチをクリックすることで切り替えることができます。
デフォルトの投稿が表示されます。これを公開解除または削除して、投稿を開始できます。

ステップ11 - メーラーの設定
Ghostはブログプラットフォームとして機能するだけでなく、ニュースレター管理者としても機能します。日常業務には、Ghostと連携してメールを送信するために任意のトランザクションメールサービスを使用できます。しかし、Ghostを介してニュースレターを送信したい場合、公式にサポートされているバルクメールサービスはMailgunのみです。別のニュースレターサービスを使用することもできますが、その場合はGhostのZapier統合機能を使用する必要があります。
まず、トランザクションメール用のSMTPサービスを設定しましょう。ファイル/var/www/html/ghost/config.production.jsonを編集します。
$ nano /var/www/html/ghost/config.production.json
次の行を見つけます。
"mail": {
"transport": "Direct"
},
これを次のコードに置き換えます。
"mail": {
"from": "'HowtoForge Support' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
ここでは、Amazon SESメールサービスを使用しています。これは手頃で、月額料金が不要です。
Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。変更を有効にするためにGhostアプリケーションを再起動します。
$ ghost restart
ニュースレター設定を構成するには、設定 >> メールニュースレターセクションに移動します。

Mailgun設定リンクをクリックして展開します。
Mailgunのリージョン、ドメイン、およびAPIキーを入力します。

右上の保存ボタンをクリックして設定を保存します。
ニュースレター配信をテストするには、新しいテスト投稿を作成し、公開をクリックし、メールのみオプションを選択します。投稿も公開したい場合は、公開してメールオプションを選択します。

続行、最終確認ボタンをクリックして進みます。次のページで最終確認を再度求められます。

今すぐメールを送信ボタンをクリックしてニュースレターを送信します。メールが送信されると、次のメッセージが表示されます。

投稿のメールを確認します。

ステップ12 - Ghostの更新
Ghostの更新には、マイナー更新とメジャー更新の2種類があります。
マイナー更新を実行する場合は、最初に完全バックアップを取ります。これにより、すべての投稿、メンバー、テーマ、画像、ファイル、リダイレクトファイルのバックアップが作成されます。
$ cd /var/www/html/ghost
$ ghost backup
更新コマンドを実行してマイナー更新を実行します。
$ ghost update
メジャー更新を実行するには、Ghostの公式詳細更新ガイドに従う必要があります。現在のバージョンと更新したいメジャーバージョンによって手順が異なります。
結論
これで、Debian 12サーバー上にNginxを使用してGhost CMSをセットアップする方法に関するチュートリアルが終了します。質問やフィードバックがあれば、下のコメントで共有してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。