mdx.jp上のvLLMをCloudflare Tunnel経由でOpenAI互換APIとして公開する

mdx.jp 上で動かした vLLM を Cloudflare Tunnel 経由で外部公開し、OpenAI 互換 API として利用できるようにした手順と注意点

cloudflaretunnelzero-trustvllmllmmdx

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • mdx.jp 上の vLLM を Cloudflare Tunnel で外部公開
  • OpenAI 互換 API としてローカルから安全に利用
うさぎ
今日は mdx.jp 上の vLLM を Cloudflare Tunnel 経由で公開した話を教えてください。
WhiteCUL
mdx.jp の A100 を 2 枚使って vLLM を動かし、Cloudflare Tunnel 経由で外部から叩けるようにした記事です。
うさぎ
サーバのポートを開けずに済むのが利点ですね。
WhiteCUL
そうです。インバウンドポートを開けずに、Cloudflare Tunnel 経由で外部から HTTPS で到達させます。
うさぎ
SSH も Cloudflare 経由にまとめているんですね。
WhiteCUL
はい。SSH は Cloudflare Zero Trust 経由に寄せています。

vLLM の起動

  • vLLM は Docker コンテナで起動、--host 0.0.0.0 が必要
  • 127.0.0.1 バインドのままだと cloudflared から 502 になる
うさぎ
vLLM の起動でポイントはありますか?
WhiteCUL
--host 0.0.0.0 の指定が重要です。127.0.0.1 のままだと cloudflared の別コンテナから届きません。
うさぎ
最初それで 502 エラーになったんですね。
WhiteCUL
はい。vLLM はホスト上で動いているのに、外部から 502 が返ってくるのは、このバインドアドレスの違いが原因でした。
うさぎ
起動後は curl で localhost:8000/v1/models で確認できるんですね。
WhiteCUL
そうです。モデル一覧が返ってきたら起動成功です。

cloudflared コンテナの起動と Ingress 設定

  • --add-host host.docker.internal:host-gateway が必要
  • API 用と SSH 用のホスト名を Ingress で振り分け
うさぎ
cloudflared の起動でもポイントがあるんですか?
WhiteCUL
--add-host host.docker.internal:host-gateway を付けないと、コンテナからホストの 8000 番に届かないです。
うさぎ
Ingress の設定はどうやって指定するんですか?
WhiteCUL
Zero Trust ダッシュボードで Tunnel を作成して、API 用と SSH 用のホスト名に対応するサービスを指定します。
うさぎ
最後にキャッチオールのルールが必要なんですね。
WhiteCUL
http_status:404 をキャッチオールとして入れておくのが必須です。

認証と公開方針

  • LLM API は利用コストが高く認証なし公開は避けるべき
  • Cloudflare Access による保護か SSH ポートフォワード限定が安全
うさぎ
公開後の認証についても触れられていましたね。
WhiteCUL
LLM API はコストが高いので、認証なしでそのまま公開するのは避けた方がよいです。
うさぎ
どんな選択肢がありますか?
WhiteCUL
Cloudflare Access で保護するか、API 用ホスト名を外部公開せず SSH ポートフォワード経由だけで使う方法があります。
うさぎ
Zero Trust SSH の設定も紹介されていましたね。
WhiteCUL
~/.ssh/config に ProxyCommand として cloudflared access ssh を指定すると、22 番ポートを開けずに SSH できます。

thinking モデルの扱い

  • thinking モデルの vLLM でのサーブは自然な選択
  • 出力に analysis が含まれるので後処理が必要な場合もある
うさぎ
thinking モデルを vLLM で使うのはどんな点に注意が必要ですか?
WhiteCUL
vLLM でのサーブ自体は自然ですが、thinking モデルの出力は必ずしも素直ではありません。
うさぎ
具体的にはどういうことですか?
WhiteCUL
最終回答の前に analysis のような中間表現が出る場合があり、アプリ側で取り除く処理が必要になることがあります。
うさぎ
外部公開 API なら通常版モデルの方が扱いやすいんですね。
WhiteCUL
推論力を優先したい場面では thinking、素直な出力が必要なら通常版という使い分けが現実的です。

まとめ

  • vLLM は --host 0.0.0.0 で起動、cloudflared は host.docker.internal 設定が必要
  • 公開後の認証方針を事前に決めておくことが重要
うさぎ
今日の内容をまとめてもらえますか?
WhiteCUL
vLLM を --host 0.0.0.0 で起動して、cloudflared には --add-host host.docker.internal を渡すのが重要なポイントです。
うさぎ
公開後の認証も先に決めておくんですね。
WhiteCUL
Cloudflare Access か SSH 経由限定で保護するのが安全です。
うさぎ
GPU サーバの検証用途に Cloudflare Tunnel をまとめて使えるのが便利ですね。
WhiteCUL
DNS と公開経路を Cloudflare 側にまとめられるのは、短期間で立てたり消したりする環境に向いています。