前提と注意事項
- Caddy によるリバースプロキシが設定済みであることを前提としています。
- SSL 自動取得のために
xcaddy
とcaddy-dns
を使用します。 - Cloudflare で管理している独自ドメインを持っている前提となります。
その他に以下の記事の内容を前提としています。
📱 Caddyで独自ドメインのワイルドカードSSL証明書に対応したリバースプロキシを構築する
社内・ホームネットワークやTailscaleやZeroTierを使ったVPN上で動作しているサービスに自分が持つ独自ドメインのサブドメインでアクセスするために、Caddyを使ったリバースプロキシを構築する手順を解説します。
ritaiz.com
この記事のゴール
Caddy によるリバースプロキシで、Cloudflare で管理している独自ドメインの SSL 化を自動化することがゴールです。
Cloudflare で API トークンを作成する
まずはじめに、Cloudflare の DNS ゾーンを外部から編集するための2つの API トークンを作成します。それぞれの手順を説明します。
DNS ゾーン編集用のトークンを作成する
以下のように、Cloudflare にログイン後、管理画面の右上にあるメニューから「マイプロフィール」をクリックします。
「マイプロフィール」をクリックすると、画面左側のメニューに「API トークン」というメニューが表示されるのでそれをクリックします。「API トークン」をクリックすると以下のように「ユーザー API トークン」というページが表示されますので、その中にある「トークンを作成する」という青いボタンをクリックします。
以下のようなページが表示されるので、「ゾーン DNS を編集する」という項目の「テンプレートを使用する」という青いボタンをクリックします。
「テンプレートを使用する」という青いボタンをクリックすると以下のようなページに遷移しますので、各項目を設定します。
設定内容は以下のようにします。
- アクセス許可: 「ゾーン」、「DNS」、「編集」を指定します。
- ゾーンリソース: 「含む」、「特定のゾーン」、「目的のドメイン」を指定します。
その他の項目についてはデフォルトのままで問題ありませんが、必要に応じて設定してください。 「概要に進む」という青いボタンををクリックします。すると以下のように設定内容が表示されます。 以下のように目的のドメインの設定内容が「DNS:編集」になっていることを確認して、「トークンを作成する」をクリックします。
「トークンを作成する」をクリックすると、以下のようにトークンが表示されます。このトークンは後で使うので、コピーして安全な場所に保存しておいてください。なお、このトークンは一度しか表示されないので、表示されたらすぐにコピーして保存してください。
以上で DNS 編集用のトークンの作成が完了しました。
DNS ゾーン読み取り用のトークンを作成する
続いて、同様の手順で「ゾーン DNS を編集する」という項目の「テンプレートを使用する」ボタンをクリックして、今度は以下のような内容を指定して「トークンを作成する」をクリックします。トークン名も以下では「ゾーン DNS を読み取る」としています。
以下のように設定内容が表示されるので、ここで「ゾーン:読み取り」となっていることを確認して「トークンを作成する」をクリックします。
以下のように、Cloudflare でゾーン DNS を読み取るためのトークンが表示されます。これもコピーして保存しておいてください。
以上で DNS ゾーンを編集するためのトークンと、読み取るためのトークンの作成が完了しました。
Caddy をビルドして設定ファイルを修正する
以下のように適当なディレクトリを作成し、そこでxcaddy
を使用してcaddy-dns/cloudflare
を指定したものをビルドします。
$ mkdir ~/caddy-cloudflare
$ cd ~/caddy-cloudflare
$ xcaddy build --with github.com/caddy-dns/cloudflare
実行すると以下のようなメッセージが表示されます。
xcaddy build --with github.com/caddy-dns/cloudflare
2024/09/08 21:13:29 [INFO] absolute output file path: /home/hisui/caddy-cloudflare/caddy
2024/09/08 21:13:29 [INFO] Temporary folder: /tmp/buildenv_2024-09-08-2113.3085560503
2024/09/08 21:13:29 [INFO] Writing main module: /tmp/buildenv_2024-09-08-2113.3085560503/main.go
package main
import (
caddycmd "github.com/caddyserver/caddy/v2/cmd"
// plug in Caddy modules here
_ "github.com/caddyserver/caddy/v2/modules/standard"
_ "github.com/caddy-dns/cloudflare"
)
func main() {
caddycmd.Main()
}
2024/09/08 21:13:29 [INFO] Initializing Go module
# 省略
2024/09/08 21:14:31 [INFO] Build complete: ./caddy
2024/09/08 21:14:31 [INFO] Cleaning up temporary folder: /tmp/buildenv_2024-09-08-2113.3085560503
././caddy version
v2.8.4 h2:sksnikfajdfa/lsoujagniwentg8923nouasf
上記が正常に完了すると、caddy
という実行ファイルが生成されます。試しにバージョンを確認します。
$ ./caddy version
v2.8.4 h2:sksnikfajdfa/lsoujagniwentg8923nouasf
上記のようにバージョンが表示されれば成功です。 これを使って Caddy を起動します。
Caddy の設定ファイルを修正する
以下のような内容で Caddyfile
を作成します。zone_token
には先ほど作成した DNS ゾーン読み取り用トークンを、api_token
にはゾーン DNS 編集用トークンを指定します。なお、Caddyfile
に直接トークンを書くのはセキュリティ上好ましくないため、実際には環境変数などを使ってトークンを渡すことをお勧めします。
{
acme_dns cloudflare {
zone_token a9j20MyaASki7NZP76O9UqaNBZ0H67jk3sh7bh1
api_token k6nao12pKqUmnbYATq698sk8J2a8Nv93jA7j3mv8
}
}
# code-serverへのリバースプロキシ
code.example.com {
reverse_proxy localhost:8080
}
# immichへのリバースプロキシ
immich.example.com {
reverse_proxy localhost:2283
}
# その他の設定内容
以上 Caddy の設定ファイルの修正は完了です。
Caddy を起動する
あとは以下で Caddy を起動します。
$ sudo ./caddy run
エラーがでないこと、ブラウザから設定ファイル内で設定したドメインにアクセスできることを確認してください。
問題なければ一度 Ctrl + C
で Caddy を停止し、以下のようにstart
コマンドを使うとバックグラウンドで動作します。
$ sudo ./caddy start
停止する時はstop
を使用します。
$ sudo ./caddy stop
まとめ
Caddy で Cloudflare で管理している独自ドメインの SSL 化を自動化するための手順を解説しました。Caddy と Cloudflare で管理している独自ドメインを使うことで、SSL 化を自動化することができます。SSL の更新も自動で行われるため手間を減らすことができます。