Tailscale内のクローズドな環境でも自動生成したサブドメインでSSLを使う
システム開発部の前野です。いつもウェブネーションのコーポレートサイトへご訪問頂きありがとうございます。
営業との連携がうまくできていなかったこともあり、突然の需要過多から開発チームはここ数ヶ月ほど非常に過密なスケジュールで進行しており、ブログ更新がしばらく途絶えておりました。
現在も絶賛過密スケジュールですが、面白いネタを発見したので忘れる前にご紹介したいと思います。
ところで私が書いた前回のブログではPrimeセールを書いていたようですが、最近はHome Assistantにハマってて、昨日までのセールではTP-Linkの防犯カメラや、ESPHomeに使えそうなセンサーなど(ESP32本体はだいぶ前に買ったものが転がってたので)をいくつか買いましたので、そのうちご紹介したいと思います。
そういえば息子が小学生入学時の頃から月1でZoomを使った理科の実験などを行う教室に入っているのですが、4年生の今年夏からプログラミング教室がスタートし、初回からいきなりmicro:bitを使ったプログラミング教室と高度な授業内容となっています。前回の教室(3回目)では内蔵の温度計センサーからデータの取得をするなど、親もついていくのがやっとでした。
さて、今回はTailscaleのお話です。以前の記事では簡単に設定ができるTailscaleというクローズドな環境を構築できるサービスを紹介しました。
クローズドな環境であること、独自ドメイン(Tailscaleドメイン:ts.netで終わる)との連携にはHTTPSオプションを有効にし、運用するにはCaddyやNginx Proxy Managerを間に挟んでSSLを終端化するなど工夫が必要でした。またサブドメインで運用するには制限があり、かといってDocker環境ごとにVMを用意するのも手間です。
そこで登場したのが今回のテーマである「TSDProxy」です。
これはDockerコンテナで動作するソフトウェアでなんと先月の2024年10月に登場とまだ立ち上がったばかりのプロジェクトです。その機能としてはDockerとProxyに特化していますが、立ち上げるコンテナごとにDockerコンテナのラベル機能を用い、Tailscaleネットワークと連携してサブドメイン&SSLを発行することで、Tailscaleネットワーク上では1コンテナ=1マシンとして扱うことができるまさに画期的なプロジェクトです。
# TSDProxyのDocker Composeファイルの内容
$ vi docker-compose.yml
========================================
services:
tailscale-docker-proxy:
image: almeidapaulopt/tsdproxy:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- datadir:/data
restart: unless-stopped
environment:
# Tailscale アカウントからキーを生成して貼り付け
- TSDPROXY_AUTHKEY=tskey-auth-SecretKey
# DockerホストのIPアドレス
- TSDPROXY_HOSTNAME=192.168.1.1
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
datadir:
========================================
# Dockerで立ち上げ
$ sudo docker-compose up -d
今回はサンプルとして前回の記事で紹介したHoarderを例に挙げましたが、連携先のコンテナは(↓から↑)までの内容を追加で記述するだけです。
# Docker Composeファイルの取得
$ wget https://raw.githubusercontent.com/hoarder-app/hoarder/main/docker/docker-compose.yml
$ vi docker-compose.yml
==================================================
version: "3.8"
services:
web:
image: ghcr.io/hoarder-app/hoarder:${HOARDER_VERSION:-release}
restart: unless-stopped
volumes:
- data:/data
ports:
- 3000:3000
env_file:
- .env
environment:
MEILI_ADDR: http://meilisearch:7700
BROWSER_WEB_URL: http://chrome:9222
# OPENAI_API_KEY: ...
DATA_DIR: /data
↓↓↓↓↓ここから
labels:
tsdproxy.enable: "true"
tsdproxy.name: "hoarder"
tsdproxy.container_port: 3000
↑↑↑↑↑ここまでを追加
chrome:
image: gcr.io/zenika-hub/alpine-chrome:123
restart: unless-stopped
command:
- --no-sandbox
- --disable-gpu
- --disable-dev-shm-usage
- --remote-debugging-address=0.0.0.0
- --remote-debugging-port=9222
- --hide-scrollbars
meilisearch:
image: getmeili/meilisearch:v1.11.1
restart: unless-stopped
env_file:
- .env
environment:
MEILI_NO_ANALYTICS: "true"
volumes:
- meilisearch:/meili_data
volumes:
meilisearch:
data:
==================================================
# Dockerコンテナの再起動
$ sudo docker-compose down
$ sudo docker-compose up -d
それぞれ追加された項目は以下の意味となっています。
tsdproxy.enable: “true”
tsdproxy.enableをtrueにする設定です。
tsdproxy.name: “hoarder”
tsdproxy.nameを指定することで、ここではhoarderと定義されています。実際にこれでdockerコンテナを立ち上げると以下のようにhoarderという名前が付けられます。
tsdproxy.container_port: 3000
ここではコンテナポートを指定します。hoarderが3000番ポートで外向き公開されているため、それに合わせて記述を行います。
これらの設定によりhttps://hoarder.****.ts.net/でSSL証明書が自動発行されアクセスすることができました!
(ブラウザーでアクセスする場合、上記で指定したポート番号でのアクセスは不要です)