ご質問・お見積り等お気軽にご相談ください
お問い合わせ

Tailscale内のクローズドな環境でも自動生成したサブドメインでSSLを使う

Tailscale内のクローズドな環境でも自動生成したサブドメインでSSLを使う

システム開発部の前野です。いつもウェブネーションのコーポレートサイトへご訪問頂きありがとうございます。

営業との連携がうまくできていなかったこともあり、突然の需要過多から開発チームはここ数ヶ月ほど非常に過密なスケジュールで進行しており、ブログ更新がしばらく途絶えておりました。

現在も絶賛過密スケジュールですが、面白いネタを発見したので忘れる前にご紹介したいと思います。

ところで私が書いた前回のブログではPrimeセールを書いていたようですが、最近はHome Assistantにハマってて、昨日までのセールではTP-Linkの防犯カメラや、ESPHomeに使えそうなセンサーなど(ESP32本体はだいぶ前に買ったものが転がってたので)をいくつか買いましたので、そのうちご紹介したいと思います。

そういえば息子が小学生入学時の頃から月1でZoomを使った理科の実験などを行う教室に入っているのですが、4年生の今年夏からプログラミング教室がスタートし、初回からいきなりmicro:bitを使ったプログラミング教室と高度な授業内容となっています。前回の教室(3回目)では内蔵の温度計センサーからデータの取得をするなど、親もついていくのがやっとでした。

今回はtsdproxyというDockerで利用できるProxyサーバー?の紹介です。

さて、今回は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証明書が自動発行されアクセスすることができました!
(ブラウザーでアクセスする場合、上記で指定したポート番号でのアクセスは不要です)

この記事を書いた人
大樹前野
maeno
株式会社ウェブネーションの取締役です。ある時はうどん屋の皿洗い、ある時はサービス運営チームのメンバー、ある時はクラウド環境の設計を担当するバランス型なキャラですが、唯一プログラミングだけ苦手です。3度の飯よりドライブが好きで、週末に安心してドライブを楽しむために日々自動化の技術に取り組んでいます。