ウェブサイト検索

Ubuntu 20.04にDockerを使用してGhost CMSをインストールする方法


Ubuntu 20.04にDockerを使用してGhost CMSをインストールする方法

Ghostは、プロフェッショナルな外観のブログを作成するのを助けるオープンソースのブログプラットフォームです。2013年にWordPressの代替として立ち上げられたのは、WordPressが過度に複雑になっていたためです。GhostはJavaScriptで書かれており、Node.jsによって動作しています。

このチュートリアルでは、Ubuntu 20.04で動作するサーバー上にDockerを使用してGhost CMSをインストールする方法を探ります。また、プロキシとしてNginxを使用し、インストールを安全に保つためにLet's Encrypt SSL証明書も使用します。

前提条件

  • Ubuntu 20.04を実行しているサーバー。

  • 非ルートのsudoユーザー。

  • すべてが最新であることを確認してください。

    sudo apt update 
    sudo apt upgrade
    

ステップ1 - UFWファイアウォールを設定する

最初のステップはファイアウォールを設定することです。Ubuntuにはデフォルトでufw(簡易ファイアウォール)が付属しています。

ファイアウォールが実行中かどうか確認してください。

sudo ufw status

次の出力を得るべきです。

Status: inactive

SSHポートを許可して、ファイアウォールがそれを有効にした際に現在の接続が切れないようにしてください。

sudo ufw allow OpenSSH

HTTPおよびHTTPSポートも許可してください。

sudo ufw allow 80
sudo ufw allow 443

ファイアウォールを有効にする

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ファイアウォールの状態を再度確認してください。

sudo ufw status

あなたは似たような出力を見るべきです。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

ステップ2 - Certbotをインストールし、SSL証明書を取得する

進む前に、Certbotツールをインストールし、私たちのドメインにSSL証明書をインストールする必要があります。

Certbotをインストールするには、Snapdパッケージインストーラーを使用します。Certbotの公式リポジトリは非推奨になっており、UbuntuのCertbotパッケージは1年以上古いです。Snapdは常に最新の安定版のCertbotを提供しているため、それを使用するべきです。幸いなことに、Ubuntu 20.04にはSnapdがプリインストールされています。

Snapdのバージョンが最新であることを確認してください。

sudo snap install core 
sudo snap refresh core

古いバージョンのCertbotを削除してください。

sudo apt remove certbot

Certbotをインストールします。

sudo snap install --classic certbot

次のコマンドを使用して、Certbot コマンドが /usr/bin ディレクトリへのシンボリックリンクを作成することで実行できることを確認してください。

sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL証明書を生成する。

sudo certbot certonly --standalone -d example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/example.comディレクトリに証明書をダウンロードします。

ステップ3 - DockerとDocker Composeをインストールする

最初のステップは、Docker EngineとDocker Composeをインストールすることです。まず、古いバージョンのDockerをアンインストールします。

sudo apt remove docker docker-engine docker.io containerd runc

Dockerを実行するために必要なパッケージをいくつかインストールします。

sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

Dockerの公式GPGキーを追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Dockerの公式リポジトリを追加します。

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

システムリポジトリを更新してください。

sudo apt update

最新のDocker Engineをインストールしてください。

sudo apt install docker-ce docker-ce-cli containerd.io

Docker Engineが正しくインストールされていて、実行中であることを確認してください。

sudo docker run hello-world

デフォルトでは、Dockerを実行するにはsudoが必要です。それを回避するために、現在のユーザーアカウントをdockerユーザーグループに追加することができます。

sudo usermod -aG docker ${USER}

新しいグループメンバーシップを適用するには、ログアウトして再度ログインするか、次のコマンドを使用してください。

su - ${USER}

これで、sudoを使わずにdockerコマンドを実行できるようになります。

次に、Docker Composeの現在の安定版をダウンロードしてください。

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

このチュートリアルを書いている時点で、Docker Composeの最新バージョンは1.28.6です。Docker ComposeのGitHubリリースページを確認することで、コマンド内で常に異なるバージョンを変更または選択できます。

インストールされたDocker Composeのバージョンに実行権限を付与します。

sudo chmod +x /usr/local/bin/docker-compose

インストールをテストします。

docker-compose --version
docker-compose version 1.28.6, build 5db8d86f

ステップ4 - ゴーストをインストールする

Ghostのインストールは、Ghostパッケージ、MySQLなどのデータベースサーバー、そしてウェブサーバー(Nginx)の3つのコンポーネントで構成されます。これらすべてのサービスは、単一のDocker Composeファイルを使用してインストールできます。

Docker Composeファイルを作成する

最初に、Docker Composeファイルを保存して起動するディレクトリを作成します。

mkdir ghost && cd ghost

「docker-compose.yml」という名前のファイルを作成し、Nanoエディタで開いてください。

nano docker-compose.yml

次のコードをファイルに貼り付けてください。example.comをあなたのドメインに置き換え、your_passwordの値をデータベースのパスワードに置き換えてください。database__connection__passwordとMYSQL_ROOT_PASSWORDの値は同じにしてください。<username>をサーバーのユーザー名に置き換えてください。

version: '3.3'
services:

  ghost:
    image: ghost:latest
    restart: always
    depends_on:
      - db
    environment:
      url: https://example.com
      database__client: mysql
      database__connection__host: db
      database__connection__user: ghost
      database__connection__password: ghostdbpass
      database__connection__database: ghostdb
      mail__transport: SMTP
      mail__options__host: {Your Mail Service host}
      mail__options__port: {Your Mail Service port}
      mail__options__secureConnection: {true/false}
      mail__options__service: {Your Mail Service}
      mail__options__auth__user: {Your User Name}
      mail__options__auth__pass: {Your Password}
    volumes:
      - /home/<username>/ghost/content:/var/lib/ghost/content

  db:
    image: mariadb:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
	  MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostdbpass
      MYSQL_DATABASE: ghostdb
    volumes:
      - /home/<username>/ghost/mysql:/var/lib/mysql

  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    restart: always
    depends_on:
      - ghost
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/letsencrypt/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html

Dockerコンポーズファイルは、いくつかのマウントポイントを作成します。つまり、サーバー上の特定のディレクトリをコンテナ内のディレクトリにマッピングします。

  • コンテナ内の /var/lib/ghost/content と /var/lib/mysql ディレクトリは、サーバーの /home/<username>/ghost/content と /home/<username>/ghost/mysql にマッピングされています。
  • Nginxは、サーバーからLet's Encryptの証明書にアクセスするために/etc/letsencrypt/を使用します。
  • Nginxは証明書のためのLet's Encrypt Challengeファイルにアクセスできるように、ユーザーディレクトリ/usr/share/nginx/htmlへのアクセスも必要です。

上記のファイルには、メール設定のオプションも含まれています。もし Mailgun、Mailjet、Mandrill、Postmark、Sendgrid、SendCloud、SES、Zoho、または Gmail といった人気のあるSMTPメールサービスを使用している場合は、サービス名とSMTPユーザー名およびパスワードを追加するだけで、他のフィールドは不要です。それ以外の場合は、他のすべてのオプションを入力し、サービス名を削除すれば、まだ機能するはずです。Ghostのメールオプションに関する文書で、さらに多くのメールオプションを確認できます。

上記のすべてのバインドマウントのためのディレクトリを作成します(/etc/letsencryptは、以前に証明書を作成したときにすでに作成されていますので、除外します)

cd ~/ghost
mkdir content
mkdir mysql
sudo mkdir -p /usr/share/nginx/html

NginxのDockerイメージを作成する

私たちが作成したDockerコンポーズファイルは、NginxのDockerイメージに依存しています。これを機能させるためには、Ghostと連携するためのカスタマイズされたNginxの設定ファイルを含める必要があります。

この画像のために現在のディレクトリにディレクトリを作成してください。

mkdir nginx

このディレクトリに Dockerfile という名前のファイルを作成してください。

touch nginx/Dockerfile

Dockerfileに以下のコードを貼り付けてください。

FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
COPY ghost.conf /etc/nginx/conf.d

上記のコードはDockerに最新のNginxイメージを使用するよう指示します。また、デフォルトのNginx設定ファイルを削除し、私たちがGhost CMSのために作成したカスタム設定ファイルをコピーします。

nginxディレクトリにghost.confという名前のファイルを作成します。

touch nginx/ghost.conf

ghost.confファイルに以下のコードを貼り付けてください。すべてのexample.comのインスタンスをあなたのドメインに置き換えてください。

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; }
  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;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.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://ghost:2368;
  }
}

上記の構成は、すべてのHTTPリクエストをHTTPSにリダイレクトし、Ghostサービスのプロキシとして機能して、あなたのドメインを介してそれを提供します。

ステップ5 - サイトを実行する

Ghostサービスを開始するには、ghostディレクトリから次のコマンドを実行してください。

docker-compose up -d

今、ウェブブラウザでhttps://example.comを開くことで、インストールを確認できます。Dockerがすべてのサービスを立ち上げるのに数分かかる場合がありますので、すぐにブログが表示されない場合は、リフレッシュする必要があります。

もしあなたのサイトがブラウザに表示されない場合は、Dockerのログを確認する必要があります。それを行うには、まずコンテナを停止してください。

cd ghost
docker-compose down

各コンテナによって生成されたログを見るために、アタッチされた状態でDocker Composeを実行します。

docker-compose up

コンテナをシャットダウンして、bashプロンプトに戻るには、CTRL+Cを押してください。トラブルシューティングが完了したら、再びコンテナを実行でき、今度はあなたのブログが表示されるはずです。

ステップ6 - セットアップ完了

Ghostブログの設定を完了するには、ブラウザでhttps://example.com/ghostにアクセスしてください。ブログのドメインの最後にある/ghostは、Ghostの管理パネルにリダイレクトされます。今回は初めてアクセスしているため、設定画面に移動します。

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

ブログに追加のスタッフメンバーやコラボレーターを招待することもできます。今はスキップすることに決めた場合でも、後で行うことができます。

セットアップの最後に、ゴーストの管理パネルが表示されます。

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

すでにGhostをナビゲートし、使用するのに役立つ基本的なガイドとなるデフォルトの投稿がいくつか表示されます。それらを公開解除または削除して、新しい投稿を始めることができます。

ステップ7 - ゴーストを更新する

私たちのDocker Composeファイルでは、インストール時点で利用可能な最新のGhostバージョンを取得しており、これによりGhostブログの更新が簡単になります。

更新するには、コンテナをシャットダウンし、最新のイメージを取得してから、再度コンテナを実行する必要があります。

docker-compose down
docker-compose pull && docker-compose up -d

ステップ8 - Let's Encrypt SSL証明書を更新する

Let's Encryptの証明書は90日間のみ有効です。したがって、証明書を自動的に更新するcronジョブを設定する必要があります。

エディタでCronタブを開きます。

sudo crontab -e

次の行を末尾に貼り付けると、毎日午後11時にCertbotが実行されます。example.comをあなたのドメインに置き換えてください。

0 23 * * *   certbot certonly -n --webroot -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'

毎晩11時に実行することは、あなたの証明書が毎日更新されることを意味するわけではありません。Certbotは、証明書の有効期限が30日以内の場合にのみ証明書を更新します。これを毎晩実行することで、期限切れになる前にスクリプトが試行できる機会が増えるのです。

上記のコマンドは、成功裏に更新された後、Dockerコンテナ内のNginxサーバーも再起動します。

Certbotの--dry-runオプションを使用して、cronジョブをテストできます。

sudo bash -c "certbot certonly -n --webroot --dry-run -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'"

結論

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

関連記事: