1.メインアプリのドメインをリバースプロキシする
443 ポートに SSL 証明書を設定し、location / をメインアプリ(Docker モードは http://127.0.0.1:80、ベアメタルは http://127.0.0.1:5180)へプロキシします。重要な 3 行:proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"——どれか 1 つでも欠けると /socket.io の WebSocket アップグレードが 400 で失敗します。フロントエンドのコンテナ/テンプレートが既に /api をバックエンドへ転送しているため、この外側の層で API ルーティングを別途分ける必要はありません。
2.env を 2 つ更新して api を再起動する
新しいドメインを api/.env の CORS_ALLOWED_ORIGINS に追加(カンマ区切り)し、PUBLIC_API_BASE_URL をメインアプリの公開ルートアドレス(例 https://app.your-domain.com、/api は付けない)に変更します。変更後は api を再起動して反映。
3.運用エンドポイントを保護する
/admin/* はメインアプリと同じバックエンドを通ります。公開インターネットから運用エンドポイントを呼ぶ場合は、ADMIN_SECRET の総当たりを防ぐため IP 許可リストか Basic 認証を追加してください。またプロキシがカスタムヘッダーを明示的に透過するよう確認を:proxy_set_header X-Admin-Secret $http_x_admin_secret;(一部のプロキシは非標準ヘッダーをデフォルトで除去します)。
トラブルシューティング:フロントエンドで Failed to fetch
ブラウザ devtools の Network タブでリクエストを確認:/api リクエストが text/html で返ってきたら、nginx が /api をバックエンドへ転送せず SPA フォールバックに落ちています。CORS エラーなら、CORS_ALLOWED_ORIGINS に今アクセスしているドメインが含まれていません。
トラブルシューティング:WebSocket 400
/socket.io/ の location には Upgrade / Connection ヘッダーを明示し、proxy_http_version 1.1 を指定する必要があります——どれか 1 つ欠けても 400 になります。プロキシが多層の場合はすべての層で必要です。
関連する質問
Enclave はセルフホストできますか?難しいですか?
できます。難易度は普通の web サービスを動かすのと同程度です。docker compose を使ったことがあれば、3 ステップで自分のインスタンスを持てます。リポジトリをクローンし、.env をコピーし、docker compose up するだけ。API・フロントエンド・データベース・ベクトルインデックスはすべて自分のマシン上で動きます。