Web サーバ Caddy に数日嵌っているのですが、
まともに使おうとするとサーバを立ち上げる必要があります。
しかし、サーバの構築が面倒なんですよね~ 😫

そこで!

2019年11月 Google Cloud Platform で正式サービスとなった Google Cloud Run です!
これなら数分で Caddy のサーバを起動できます。

まだ使ってみた事ない人はこちらから。
ここではこれが完了して、Google Cloud Run の簡単な使い方を把握している前提です。

この記事では Caddy v1 を使用する前提となります。
Caddy v1 と Caddy v2 で Caddyfile の記述に違いがありますのでご注意下さい。
(Caddy v2 はこの記事の下、追加で記載しています)


PHP 付で Caddy サーバを立ち上げる

この「クイックスタート: ビルドとデプロイ」では、
PHP 公式 Docker の php:apache を使用しています。Web サーバが Apache という事ですね。
これを Caddy に置き換えます。

index.php は置き換えても構いません。
また同じところに多数のファイルを入れると、それらもアップロードします。
このまま Caddyfile の root(Apache のドキュメントルート)となって公開されます。

ビルドして……(docker コマンドでも可)

gcloud builds submit --project [PROJECT-ID] --tag gcr.io/[PROJECT-ID]/caddy

デプロイします。(コンソールからでも可)

gcloud run deploy --image gcr.io/[PROJECT-ID]/caddy

正常であれば URL が表示されるので、これを参照します。

表示結果

この時デプロイして URL が表示されてすぐクリックすると
502 Bad Gateway が出てくる場合があります。
Caddy は PHP に php-fpm を採用していますが、php-fpm がまだ起動中の時です。
数秒経過すると正常に表示されます。(特にメモリを少なくしている場合は注意)


Caddyfile も自由に編集したい!

Caddy をまともに使おうとすると、
Caddyfile もそれなりにカスタマイズするようになります。
そこで、Caddyfile も一緒にアップロードする前提としましょう。

注意として、 Caddyfile にある次のところは変更しないで下さい。

  • 0.0.0.0:{$POPT} - Cloud Run では IP アドレス・ポートは不定です。
    独自ドメイン(カスタムドメイン)を使用する場合でも変更しないで下さい。
  • tls off - Cloud Run が Let’s Encrypt による SSL サーバ証明書を発行します。
    なので、Caddy が発行する必要がないので、これで発行手続きを無効にしています。

Caddyfile の設定がおかしい場合はデプロイの段階でエラーとなります。
(すでに稼働している場合は、ダウンする事なく現在のものが稼働しつづけます)
ログを参照すると、その原因が分かるでしょう。

ここではテンプレートを追加して、テンプレート側で今日の日付を表示しています。

表示結果

テンプレートは Go 言語共通のものですが、Caddy でいくつか加えてあります。
自分は Go 言語で作られた Hugo を使っているので、テーマで近いものを見ています。
でも自分の頭では Apache の SSI がパワーアップしたような感覚でした。


Caddy のメリットである自身の SSL サーバ証明書発行や
複数ドメイン使用は Cloud Run ではできません。別サービスにする必要がありますが、
サーバ構築なく、すぐに Caddy のサーバが使えるのは魅力に感じるかもしれません。
簡単なコードで使えるようにできるのも嬉しいところですね。


追加 2020/01/28

Caddy v2 では Caddy 公式 Docker イメージが用意されています。

alpine イメージで実行してみます。

/etc/caddy/Caddyfile の編集には root 権限が必要だったので、
USER root を入れています。

もちろん Caddyfile も一緒に用意し、コピーして運用もできます。


追加 2020/01/30

Docker を用いた場合の問題として、コンテナの削除により、
ファイルシステム内での変更は破棄されてしまう点があります。
これには Caddy が Let’s Encrypt で発行した SSL サーバ証明書も含まれます。
つまり、コンテナ変更時に証明書を再発行しなければいけなくなってしまいます。
Let’s Encrypt には証明書発行にレート制限があるので、
最悪の場合、証明書が発行されずに表示できなくなる恐れがあります。
(最近ではその対処として永続化があり、証明書を含む部分を残す手段があります)

Google Cloud Run では Cloud Run 側で Let’s Encrypt で証明書を発行します。
そのため、この記事では Caddy v1 で tls off としているなど、
Caddy 側では証明書の発行・保存を行っていません。
その点で証明書の考慮をしなくてすむメリットもあります。


追加 2020/02/13

当初 Caddy v1 の Docker を用いていたのですが、
Caddy v2 の Docker も追加で紹介していたので、タイトルを修正しました。


追加 2020/02/20

Caddy の使い方を簡単にまとめました。