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を開いてインストールを確認できます。成功したインストールを示すページが表示されます。

Ghost Homepage

ステップ10 - セットアップを完了する

Ghostブログのセットアップを完了するには、ブラウザでhttps://example.com/ghostにアクセスします。ブログのドメインの末尾にある追加の/ghostは、Ghostの管理パネル、または初めてアクセスするためのセットアップにリダイレクトします。

ここでは、管理者アカウントを作成し、ブログのタイトルを選択する必要があります。

Ghost Setup Details

詳細を入力し、アカウントを作成して公開を開始ボタンをクリックして続行します。

次に、最初の投稿を書く、サイトをカスタマイズする、メンバーをインポートするなどのオプションが表示される次の画面に移動します。

Ghost Installer Suggestions

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

Ghost Admin Dashboard

ダークモードに切り替えたい場合は、設定ページの設定ギアボタンの隣にあるトグルスイッチをクリックすることで切り替えることができます。

デフォルトの投稿が表示されます。これを公開解除または削除して、投稿を開始できます。

Ghost Posts Panel

ステップ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

ニュースレター設定を構成するには、設定 >> メールニュースレターセクションに移動します。

Ghost Email newsletter Settings

Mailgun設定リンクをクリックして展開します。

Mailgunのリージョン、ドメイン、およびAPIキーを入力します。

Ghost MailGun newsletter Settings

右上の保存ボタンをクリックして設定を保存します。

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

Ghost Post Publish/Email Option

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

Ghost Send Email Newsletter Confirm

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

Ghost Newsletteter Successful Delivery message

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

Ghost Newsletter Email

ステップ12 - Ghostの更新

Ghostの更新には、マイナー更新とメジャー更新の2種類があります。

マイナー更新を実行する場合は、最初に完全バックアップを取ります。これにより、すべての投稿、メンバー、テーマ、画像、ファイル、リダイレクトファイルのバックアップが作成されます。

$ cd /var/www/html/ghost
$ ghost backup

更新コマンドを実行してマイナー更新を実行します。

$ ghost update

メジャー更新を実行するには、Ghostの公式詳細更新ガイドに従う必要があります。現在のバージョンと更新したいメジャーバージョンによって手順が異なります。

結論

これで、Debian 12サーバー上にNginxを使用してGhost CMSをセットアップする方法に関するチュートリアルが終了します。質問やフィードバックがあれば、下のコメントで共有してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。