【自作ブログ】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
GCP無料枠の説明画像

e2-microとなりスペックが2 vCPU, 1GB RAMなので大量にアクセスされるサイトには向いてないですね。

個人ブログではいいかもしれないです。


ドメイン名などはお好きに取得してください。自分はお金をかけたくなかったのでMyDNSで取得しました。(将来的にはお名前ドットコムでしっかりしたドメイン名を取りたいです...)

GCPの無料インスタンスを作成する方法はたくさん記事がありますので割愛します。

OSは「Ubuntu 25.04 minimal」で作成しています。

sshをしてターミナルに入ります。

とりあえずパッケージリスト更新をしてから

sudo apt update

Dockerインストール

参考

Docker Engine インストール(Ubuntu 向け)
Ubuntu 上に Docker Engine をインストールする手順を説明。

リポジトリを利用したインストール

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」にアクセスしてみてください。


動作が重いときはスワップを作成してみてください。

参考

swapfileの追加
目次: 対象の標準OS, swapfileの追加- スワップが存在しない事を確認, スワップファイルを作成, スワップファイルの有効化.. 「さくらのVPS」の標準OSで swapfile を利…

余談

docker-ghostのフォルダ内に「config.production.json」というファイルがあると思います。

Ghostにメール認証機能があり、メール設定が必要になりますので下記記事を参考にしてみてください。

【Ghost】別端末からログインしようとした時に詰まった話
セルフホストでGhostでブログを運用していて別端末からログインしようとしたらずっとグルグルして入れない現象になってしまってました。 最初に初期設定した端末ではCookieを持っているためログイン画面を飛ばしてログインが可能だったのでその端末でしか入れませんでした。 原因は2段階認証があったこと、、 メールアドレスとパスワードを入力後にそのメールアドレス宛に6桁の数字が送られてくる、それを画面遷移後のページに入力が必要になるが、セルフホストしていてメール設定をしていないとグルグルして進まなくなってしまう、、 自分はGhostのメール設定に自身のGmailを利用してメールを飛ばすようにしている。 先ずは、Gmailのアプリパスワードを発行します。 Account settings: Your browser is not supported. その後にGhostの以外ファイルのmailの箇所を編集 「config.production.json」 { “mail”: { “transport”: “SMTP”, “options”: {

Read more

【統合版】ポート開放なし!自宅サーバーでマイクラサーバーをDockerで立てて外部公開する方法「playit.gg」利用

24時間稼働させているNASサーバーがありDockerを動かせるのでマイクラ統合版のサーバーの立て方を記載します。 自分のネットワーク環境がJCOMとなり、ポート開放ができないため「playit.gg」というサービスを利用します。(※2025/05時点で無料プランがあるため無料で利用できます。) 公式ページのFreeという箇所をご自身で確認してみてください。 playit.ggplayit.gg 「playit.gg」もDockerで動作させて接続が可能となります。 マインクラフト統合版のサーバーをDockerで動作させる。 公式のDockerイメージを利用してサーバーを起動させます。 https://hub.docker.com/r/itzg/minecraft-bedrock-server 私の持っているNAS(UGREEN DPX2800)ではDocker構築が簡単にできるため詳細な記述方法などは省略します。 ネットワークモード:host ポート番号:19132 にしてゲームモードや難易度はお好みで設定して起動させてみてください。 playit.gg

By 管理者

【雑談】~コーヒー初心者歓迎~ 安く道具を揃えて家でコーヒーを淹れ飲もうの話

在宅勤務の合間にドリップして淹れたコーヒーを飲みながら仕事する時間が大好きです。 普段、コンビニやカフェなどでコーヒーを飲む人もいると思います。 コーヒー自体、元々安いですが毎回買っていると出費になりますよね... 自分で淹れるのは良いですが、洗い物したりコーヒーの粉のゴミがでるので買った方が楽ではあります。面倒くさいという方には向いてはないですね。 ですが、自分で淹れて飲むコーヒーは特別美味しいです。 本題です。(コーヒー大好きで道具にこだわりがある方はブラウザバックしてください。笑) 自分で買ったコーヒー豆でドリップして飲むには ・コーヒー豆 ・コーヒーミル(私は電動の物を利用) ・マグカップ(なんでもOK) ・ドリッパー ・ドリップカップ ・ペーパーフィルター(100均でOK) ・必要であればコーヒー豆を保管する密閉容器 などの道具が必要です。 コーヒー豆 コーヒー豆は好みの味の豆をカルディなどで買ってみてください。 私はコーヒーの苦みが好きで、カルディの「マンデリンフレンチ」という豆を毎回買っています。 皆さんはお好みで買ってくださいね。

By 管理者

【雑談】JCOMのWi-Fiモデム「HG100R-02JG」で通信が途切れることがあったのでBridgeモードにして市販ルーターを繋げた話

JCOMで貸出されているモデム「HG100R-02JG」を利用していてネットが途切れることがあったりページを読み込みしているとタイムアウトしたりすることがありました。 問い合わせして現地対応していただきましたが原因不明で同じルーターの機種ですが端末交換のみで改善することもなく終わりました。 色々と調べてみると同じ症状の人がいたりして、「HG100R-02JG」のルーター機能やDHCP機能がイマイチだったりするという情報もありました... (機器自体のスペックの詳細は分かりませんでした、何年使わてれいるルーターなのか...) 市販ルーターでルーター機能やWi-Fi機能、DHCP機能の部分を補い JCOMのモデム「HG100R-02JG」はBridgeモードでただの箱として動作させようと決めました。 構成 JCOMルーター:HG100R-02JG(Bridgeモード) 市販ルーター:TP-Link Archer AX4800(ルーターモード) スマホのみでも可能ですが、ルーターを切り替えながら有線接続してパソコンで操作されるのがやりやすいです。 まずはHG100R

By 管理者

【PowerShell】Windowsをスリープや画面ロックにならないよう操作し続けるコマンド-カスタマイズ

以前、下記記事にてPowerShellのコマンドで操作し続けるようなコマンドを紹介しました。 【PowerShell】Windowsをスリープや画面ロックにならないよう操作し続けるコマンドPowerShellのコマンドでWindows端末をスリープや画面ロックにさせないように操作し続けるコマンドを紹介その辺のエンジニアの記録管理者 今回はそのコマンドから少しカスタマイズを紹介しようと思います。 まずはおさらいです。 Add-Type -AssemblyName System.Windows.Forms while ($true){ [System.Windows.Forms.SendKeys]::SendWait("%{TAB}") Start-Sleep -Seconds 30 } このコマンドだと30秒に1回「Alt + Tab」のウィンドウ切り替え操作を行っています。 カスタマイズ1.何回実行されたかカウントしてPowerShell上に表示する。 Add-Type -AssemblyName System.Windows.Forms while ($

By 管理者