Argo Tunnelで複数のトンネルをサービスとして起動

CloudflareのArgo Tunnelはサービスとして起動することができるが、現時点では設定ファイルが決め打ちになっているため、そのままでは1本のトンネルしか起動できない。

そこで、ユニットファイルを少し変更して1台のマシン上で複数のトンネルを起動できるようにした。

ユニットファイルの作成

以下の内容で/etc/systemd/system/cloudflared@.serviceを作成する(要root)。

[Unit]
Description=Argo Tunnel (%I)
After=network.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/local/bin/cloudflared --config /etc/cloudflared/config-%i.yml --no-autoupdate tunnel run
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

もしかしたらExecStart=/usr/local/bin/cloudflared --config /etc/cloudflared/config-%i.yml --no-autoupdate tunnel runの部分は ExecStart=/usr/local/bin/cloudflared tunnel --config /etc/cloudflared/config-%i.yml --no-autoupdate runと順序を変えたほうが良いかも。

保存したらユニットファイルを再読込み。

sudo systemctl daemon-reload

起動

チュートリアル(Connect applications · Cloudflare for Teams documentation)に従ってトンネルを作成。

cloudflared tunnel create test001

~/.cloudflared以下に作成された.jsonファイルを/etc/cloudflaredに移動する。

また、~/.cloudflared/cert.pem/etc/cloudflaredに移動しないとサービスが起動しなかった(ドキュメントには既存のトンネルの接続にはcert.pemは不要、と書いてあったのだが…)。

次にルートを設定。

cloudflared tunnel route dns test001 test001.example.com

あとは/etc/cloudflared/ディレクトリにconfig-(設定名).ymlという名前で設定ファイルを作成。

sudo nano /etc/cloudflared/config-test001.yml

設定ファイルの内容は以下のような感じ。

hostname: test001.example.com
tunnel: a75c4ff3-a8ed-471e-8d76-e30b780b98f7
url: https://localhost:8080/
no-tls-verify: true
logfile: /var/log/cloudflared_test001.log
credentials-file: /etc/cloudflared/a75c4ff3-a8ed-471e-8d76-e30b780b98f7.json

ここまでできれば、あとは@に続けて設定名を指定してユニットを起動する。

sudo systemctl start cloudflared@test001

複数のトンネルを起動する時は上記手順を繰り返せばOK。

Cloudflareとしては複数起動する場合はdockerを使うことを想定しているのかも。