個人的な実験用にDigitalOcean でサーバを借りています。せっかくなので一台のサーバにいろんなソフトウェアをインストールして有効活用したいので以下のような仕組みを考案しました。
構成
traefik というリバースプロキシを使って、リクエストされたURLに応じてサービスのDockerコンテナに振り分けます。さらに、オレオレ証明書ではなく、Let’sEncryptで証明書を無料で取得してSSLも実現します。
以下説明のためのプロジェクトをgithubにあげてあるので取得してください。
$ git clone https://github.com/tumf/traefik-webrouter
Cloudflare DNS
Cloudflare のDNSは無料で使える上に、UIも使いやすいのでおすすめです。ドメインレジストラの設定で、CloudflareにDNSを移管します。LetsEncrypt の証明書発行時にCloudFlareのAPIキーが必要ですので発行をしておきます。 Cloudflareのダッシュボードの右下にGet your API token と言うリンクがありますのでここから

APIキーのパミッションを設定できるので、ZONE.DNS EDITを設定します。

発行したAPIキーは、.envの中に書いておきます。
CLOUDFLARE_DNS_API_TOKEN=トークンをここにペースト
traefikの設定
traefik.yml内部のemailを修正します。
| |
ネットワークの作成
Dockern内部でtraefikからコンテナへリクエストを振り分けるネットワークをfrontという名前で作成します。
$ docker network create front
traefikの起動
以下のようにしてtraefikを起動します。
$ docker compose up -d
サービスを追加する
ここまで出来たらあとはメモリの上限までサービスを増やせます。例としてwhoamiと言うサービスを作ってみます。https://whoami.example.comにアクセスすることでwhoamiを返答します。
traefikは各コンテナに振られているlabelをみてルーティングを決定します。サービスを増やすにあたって、traefikの設定を変えたり、再起動する必要がありません。便利でしょ?!
関連記事
- Docker: ポート公開・開放でよくあるトラブルと解決法 - Dockerのポート設定で悩んだらこちら
- FRP入門(インストール編) - NAT越えでローカルサーバを公開する別の方法