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をセットアップする方法に関するチュートリアルは終了です。質問やフィードバックがあれば、以下のコメントで共有してください。





