【自作ブログ】Google Cloud Platform(GCP)の無料枠インスタンスにGhostブログを作成しよう
Google Cloud Platform(GCP)には無料枠のVM インスタンスを作成することができます。
そのインスタンスにDockerを入れて、Docker上でGhost、mysql、caddyで自作ブログを立てていきます。
2025/05現在の条件では画像のようになっています。
参考:https://cloud.google.com/free/docs/free-cloud-features#compute

e2-microとなりスペックが2 vCPU, 1GB RAMなので大量にアクセスされるサイトには向いてないですね。
個人ブログではいいかもしれないです。
ドメイン名などはお好きに取得してください。自分はお金をかけたくなかったのでMyDNSで取得しました。(将来的にはお名前ドットコムでしっかりしたドメイン名を取りたいです...)
GCPの無料インスタンスを作成する方法はたくさん記事がありますので割愛します。
OSは「Ubuntu 25.04 minimal」で作成しています。
sshをしてターミナルに入ります。
とりあえずパッケージリスト更新をしてから
sudo apt update
Dockerインストール
参考
リポジトリを利用したインストール
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engine のインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
これでインストールできているはずです。バージョン確認のコマンドを打ち込んで表示されるか確認してみてください。
docker -v
Dockerを一般ユーザで実行できるようにするには(管理者権限sudoで操作する場合はやらなくてもいい)
dockerグループの確認(出力結果ではまだ誰もグループにいないことが分かります。)
getent group | grep docker
docker:x:999:
一般ユーザーを追加(ユーザー名の箇所は自身のユーザー名)
sudo usermod -aG docker ユーザー名
再度dockerグループの確認(出力結果に追加した自身のユーザー名が表示されていれば成功です。)
getent group | grep docker
docker:x:999:ユーザー名
その後、一度sshを切って再度ログインしなおしてください。
docker-compose.yml を作成
・Caddyは自動でSSL化(Let's Encryptの証明書発行)してくれるのでこの時点でGCPのインスタンスの外部IPアドレスとドメイン名と紐づけしておくといい
Dockerの作業フォルダを作成して移動します。
mkdir docker-ghost
cd docker-ghost
docker-compose.ymlを作成
docker-compose.yml
services:
ghost:
image: ghost:latest
container_name: ghost
restart: always
environment:
database__client: mysql
database__connection__host: db
database__connection__user: root
database__connection__password: ghostpassword
database__connection__database: ghost
url: "https://あなたのドメイン名"
volumes:
- ./ghost:/var/lib/ghost/content
- ./config.production.json:/var/lib/ghost/config.production.json
expose:
- "2368"
db:
image: mysql:8.0
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ghostpassword
volumes:
- ./db:/var/lib/mysql
caddy:
image: caddy:alpine
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
そしたら次にCaddyfileを作成します。
テキストでそのままの名前「Caddyfile」で作成して中身は以下のようにしてください。
Caddyfile
あなたのドメイン名 {
reverse_proxy ghost:2368 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
header_up Cookie {http.request.header.Cookie}
}
}
ここまで来たらOK
起動してみてください。
docker compose up -d
起動したら「https://あなたのドメイン名/ghost」にアクセスしてみてください。
動作が重いときはスワップを作成してみてください。
参考

余談
docker-ghostのフォルダ内に「config.production.json」というファイルがあると思います。
Ghostにメール認証機能があり、メール設定が必要になりますので下記記事を参考にしてみてください。
