zaki work log

作業ログやら生活ログやらなんやら

Caddyコンテナでローカルに自己署名の検証用途などのHTTPSサーバーをシュッとたてる

ローカルでの検証などで、静的なweb系のファイルアクセスをオレオレな証明書で構わないのでHTTPSで行いたいとき、nginxやApacheでやろうとするとダミーのSSL証明書を作成する必要があって若干面倒です。
そんなときはDocker版Caddy自動HTTPS機能のlocal HTTPSを使えば、Caddyが内蔵しているroot CAを使ってHTTPSを構築できるので、証明書エラーを無視してブラウザのエラーは表示されますが、HTTPSサーバーを簡単に実現できます。

以前まとめたのはインターネット経由前提でLet's Encryptで証明書を使う構成だったので、ローカルの場合についてまとめ。

caddyserver.com

起動

docker run --rm -d -v $PWD:/srv -p 8443:443 --name web caddy caddy file-server --domain localhost --root /srv --browse

これでローカルで8443/TCPでListenし、カレントディレクトリ($PWD)にあるファイル群にHTTPSでアクセスできます。

CaddyのDirectoryIndexはちょっとリッチでこんな感じ。

オプション説明

Caddyに対するコマンド・オプションは以下の通り

コマンド/オプション 説明
caddy file-server Caddyを静的なファイルを返すfile_serverとして起動
--domain localhost サーバーのドメインlocalhostに指定
--root /srv ルートドキュメントを(コンテナ内の)/srvに指定
--browse ディレクトリのファイル一覧表示(不要なら付けない)

Dockerコンテナに対するオプションは以下の通り。

オプション 説明
--rm 終了時に自動でコンテナ削除
-d バックグラウンド実行
-v $PWD:/srv docker実行時のカレントディレクトリをコンテナの/srvにバインド (Caddyのオプションの--rootに対応)
-p 8443:443 ホストOSの8443/TCPへのアクセスをコンテナの443/TCPフォワード
--name web コンテナ名の指定 (停止時のコンテナ名指定用docker stop web)

設定ファイルを使う場合

上記のCLIで良ければ不要だけど、何度も実行するならCaddyファイルにしておくと楽。前述のCaddyのオプションをファイルにすると以下の通り。

localhost {
  root * /srv
  file_server {
    browse
  }
}

これを使ってデプロイする場合は以下。
(上記のファイルをカレントにCaddyfileという名前で保存している場合)

docker run --rm -d -v $PWD/Caddyfile:/etc/caddy/Caddyfile -v $PWD:/srv -p 8443:443 --name web caddy 

そのほかの細かい設定は、ドキュメントやコンテナ内でcaddy --helpを実行して確認できます。

caddyserver.com

証明書

こんな感じ。

既存のHTTPサーバーを流用したい場合

すでにHTTPで動いてるサーバーがあってそれを流用しつつ、リバースプロキシ構成でHTTPSアクセスしたいのであればfile_serverでなくreverse_proxyを使用します。

docker run --rm -d -p 8443:443 --name web caddy caddy reverse-proxy --to <addr>:<port>

インターネット経由でパブリックのドメインを使うパターンは以下参照。

qiita.com