更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。 タグで新バージョンを見つけても、実際のデプロイにはイメージダイジェストを使い、更新前のイメージをローカルに保全します。 新コンテナのヘルスチェックに失敗した場合は旧イメージへ戻します。ただし、ホスト障害やDocker自体の停止まで含めた自動復旧は保証できません。
公開者GPT Image 2 で画像を生成
研究の答え
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
提案するのは、ホスト側のsystemdタイマーで更新を確認し、イメージをダイジェストで固定してデプロイ、失敗時にはローカルに保管した旧イメージへ戻す方法です。更新専用コンテナは使いません。
ただし、これは無条件に安全という意味ではありません。インターネット越しのレジストリ確認が毎回1秒以内に終わる保証はなく、単一インスタンスのゲートウェイを作り直す以上、無停止や処理中リクエストの完全な維持も保証できません。ホストの電源断やDocker障害、旧イメージ自体が起動しないケースでは、自動復旧ではなく失敗通知が必要です。
また、今回提示できるのは設計草案と実装契約までです。スクリプトやsystemdユニットは未作成で、テストも2台のVPSへの接続確認も行われていません。
latestのようなタグは、どの版を確認するかを決める目印には使えます。しかし実際に動かすイメージまでタグ任せにすると、同じ指定でも後から指す内容が変わる可能性があります。そこで、タグから最新候補を見つけたあと、そのイメージをダイジェストで指定して配備します。Docker Composeはタグだけでなくダイジェスト指定のイメージも扱えます。1
設計上は、マルチアーキテクチャのインデックスダイジェスト、各プラットフォームのマニフェストダイジェスト、Docker上のローカルイメージIDを別々に記録します。異なる種類の値をそのまま比較して「同じイメージ」と判断しないためです。
更新前には稼働中コンテナのイメージIDを取得し、専用のローカルタグで旧版を保全。ロールバック時にレジストリへ接続できなくても戻せるようにします。更新処理の途中でホストが再起動した場合に備え、新旧の参照先や処理段階を記録したトランザクション状態もディスクへ保存します。状態ファイルは一時ファイルからの置換だけでなく、ファイルとディレクトリの永続化まで考慮する必要があります。
今回の構成では、ゲートウェイはソースからビルドされ、本機の8080番ポートを使い、読み取り専用の設定ディレクトリを参照します。一方、メールボックスはメモリ上にデータを持つ構成です。そのため、更新時にメールボックスまで再作成しないことが重要です(docker-compose.yml)。
Composeでは、ビルドを行わず、依存サービスを起動せず、追加のイメージ取得もしない指定を使い、対象サービスをゲートウェイだけに限定します。--no-deps、--no-build、--pull neverなどのオプションは、対象サービスの起動や更新方法を絞るために利用できます。2
APP_IMAGE="$NEW_REF" timeout --kill-after=5s 60s \
docker compose --project-name "$PROJECT" \
--project-directory "$DEPLOY_DIR" -f "$COMPOSE_FILE" \
up -d --no-deps --no-build --pull never app
実際に呼び出す前に、Composeプロジェクト名、ゲートウェイが一意であること、設定の指紋、メールボックスコンテナの識別情報を確認します。人手で構成が変更されていた場合は、自動で引き継がず停止する設計です。ローカル開発用のComposeファイルも変更せず、異地配置用の設定だけでイメージ指定を差し替えます。
更新・復旧・初期化・イメージ清掃は、すべて同じファイルロックを使います。すでに別処理が動いていれば、新しい処理は静かに終了。未完了の更新記録がある場合は、遠隔レジストリの確認より先に復旧を試みます。
コマンドがタイムアウトしたからといって、Docker側の処理まで終了したとは限りません。実際のコンテナ状態を調べてから復旧を進め、切り替え処理を重ねないことが必要です。また、強制終了や電源断では終了時の後処理に頼れません。次回起動時に、保存済みの未完了トランザクションを優先して処理する設計にします。
初期案では、チェック全体の時間枠を60秒、1回の接続タイムアウトを1秒、リクエスト上限を3秒、確認間隔を2秒とし、3回連続で成功したら切り替えを確定します。これらは候補値であり、実測で確認された性能ではありません。
確認対象は、ローカルのモデル一覧エンドポイントがHTTP 200を返すことと、応答が期待するJSON形式であることです。リダイレクト先のログイン画面やプロキシのエラーページを成功扱いにしません。さらに、応答したコンテナが候補イメージであることや、再起動回数が増え続けていないことも確認します。
一方、このモデル一覧処理はレジストリのスナップショットを読むもので、実際のチャットリクエストを送るものではありません。ヘルスエンドポイントも静的な生存応答です(internal/api/models.go、internal/api/chat.go)。したがって、これらのチェックだけで上流アカウントの準備や実際のチャット利用可能性まで証明できるわけではありません。実利用テストを加える場合も、利用枠を消費するリクエストを自動で送らないよう、別途設計が必要です。
また、アプリケーションは終了シグナルを受けるとサービスを停止し、HTTPサーバーの終了猶予は5秒です(main.go)。コンテナの停止猶予だけを延ばしても、長時間のストリーミング接続を最後まで維持できる保証にはなりません。無損失の切り替えが必須なら、2インスタンス化や入口の切り替え、接続の排出を含む別設計が必要です。
定期確認にはsystemdのoneshotサービスとタイマーを使い、前回の処理が終わってから次回の間隔を数える案です。起動時に1分後、以降は5分間隔を基本とし、最大30秒のランダムな遅延を加える例を想定しています。2台の確認・更新をずらすことで、同時に負荷がかかったり、同じ更新障害を同時に受けたりするリスクを抑えます。
ただし、これは2台が同時に更新される仕組みではありません。目指すのは最終的なバージョン同期であり、1台がロールバックした場合は、問題のあるイメージに追随させず旧版のままにするのが安全です。更新器の優先度を下げても、Dockerデーモンがイメージを展開する際のCPU負荷まで抑えられるとは限りません。低スペック機での実測が必要です。
更新器にはBash、Docker Engine、Composeプラグイン、curl、jq、flockに加え、イメージマニフェストを読むためのSkopeoを想定しています。ホストのディストリビューションや各ツールのバージョンは、実装前に確認します。Docker操作権限を持つホスト側アカウントで動かし、Dockerソケットやレジストリ認証情報をコンテナに渡さない方針です。ただし、実行アカウントがDockerを管理できる以上、ホスト管理者権限に関わるリスクがなくなるわけではありません。
GHCRの非公開イメージ取得には、パッケージ読み取り権限を持つPersonal Access Token(classic)を使い、対象パッケージへアクセスできるアカウントであることを確認します。組織の設定によってはSSO認可も必要です。9 CI用の書き込みトークンをVPSへ配布したり、読み取りに不要な書き込み・削除権限を与えたりしません。
各VPSには別々の読み取り専用認証情報を用意し、標準入力経由でログインします。トークンをコマンド引数や監査ログへ残さず、更新器専用の管理者のみ読み取れる場所で保管。認証失敗時は旧サービスを維持して更新を止めます。
イメージの清掃も全体に対する一括削除は避けます。更新器が管理する履歴だけを対象にし、現行版、前回の正常版、未完了トランザクションに関係するイメージは保護します。ほかのコンテナが参照しているイメージや、手動の復旧用タグが付いたものも削除しません。候補として14日を超えた履歴を整理する場合も、強制削除はせず、削除できなければ記録して残します。容量不足を解消するために唯一のロールバック用イメージを消すことはしません。
実装に進む前に、両VPSの実際の環境、プロジェクト名、設定マウント、認証情報の権限、現在の正常イメージを確認し、復旧可能な初期状態を作ります。その後、隔離環境で更新とロールバックを演習。問題がなければ1台目で更新・復旧を検証してから、2台目へ進みます。
最低限、次の項目を確認したいところです。
結論として、短いゲートウェイ切り替え時間を許容し、1秒以内の遠隔確認を保証ではなく性能目標とし、各VPSの実環境を確認できるなら、このホスト側更新方式は現実的な候補です。 ただし、現段階で互換性や性能、ロールバック一連の動作が検証済みとは言えません。
Studio Global AI
このページにはソースに裏付けされた回答が含まれており、Studio Global 内で続行できます。
更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。
更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。 タグで新バージョンを見つけても、実際のデプロイにはイメージダイジェストを使い、更新前のイメージをローカルに保全します。
新コンテナのヘルスチェックに失敗した場合は旧イメージへ戻します。ただし、ホスト障害やDocker自体の停止まで含めた自動復旧は保証できません。
更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。 タグで新バージョンを見つけても、実際のデプロイにはイメージダイジェストを使い、更新前のイメージをローカルに保全します。 新コンテナのヘルスチェックに失敗した場合は旧イメージへ戻します。ただし、ホスト障害やDocker自体の停止まで含めた自動復旧は保証できません。
公開者GPT Image 2 で画像を生成
研究の答え
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
提案するのは、ホスト側のsystemdタイマーで更新を確認し、イメージをダイジェストで固定してデプロイ、失敗時にはローカルに保管した旧イメージへ戻す方法です。更新専用コンテナは使いません。
ただし、これは無条件に安全という意味ではありません。インターネット越しのレジストリ確認が毎回1秒以内に終わる保証はなく、単一インスタンスのゲートウェイを作り直す以上、無停止や処理中リクエストの完全な維持も保証できません。ホストの電源断やDocker障害、旧イメージ自体が起動しないケースでは、自動復旧ではなく失敗通知が必要です。
また、今回提示できるのは設計草案と実装契約までです。スクリプトやsystemdユニットは未作成で、テストも2台のVPSへの接続確認も行われていません。
latestのようなタグは、どの版を確認するかを決める目印には使えます。しかし実際に動かすイメージまでタグ任せにすると、同じ指定でも後から指す内容が変わる可能性があります。そこで、タグから最新候補を見つけたあと、そのイメージをダイジェストで指定して配備します。Docker Composeはタグだけでなくダイジェスト指定のイメージも扱えます。1
設計上は、マルチアーキテクチャのインデックスダイジェスト、各プラットフォームのマニフェストダイジェスト、Docker上のローカルイメージIDを別々に記録します。異なる種類の値をそのまま比較して「同じイメージ」と判断しないためです。
更新前には稼働中コンテナのイメージIDを取得し、専用のローカルタグで旧版を保全。ロールバック時にレジストリへ接続できなくても戻せるようにします。更新処理の途中でホストが再起動した場合に備え、新旧の参照先や処理段階を記録したトランザクション状態もディスクへ保存します。状態ファイルは一時ファイルからの置換だけでなく、ファイルとディレクトリの永続化まで考慮する必要があります。
今回の構成では、ゲートウェイはソースからビルドされ、本機の8080番ポートを使い、読み取り専用の設定ディレクトリを参照します。一方、メールボックスはメモリ上にデータを持つ構成です。そのため、更新時にメールボックスまで再作成しないことが重要です(docker-compose.yml)。
Composeでは、ビルドを行わず、依存サービスを起動せず、追加のイメージ取得もしない指定を使い、対象サービスをゲートウェイだけに限定します。--no-deps、--no-build、--pull neverなどのオプションは、対象サービスの起動や更新方法を絞るために利用できます。2
APP_IMAGE="$NEW_REF" timeout --kill-after=5s 60s \
docker compose --project-name "$PROJECT" \
--project-directory "$DEPLOY_DIR" -f "$COMPOSE_FILE" \
up -d --no-deps --no-build --pull never app
実際に呼び出す前に、Composeプロジェクト名、ゲートウェイが一意であること、設定の指紋、メールボックスコンテナの識別情報を確認します。人手で構成が変更されていた場合は、自動で引き継がず停止する設計です。ローカル開発用のComposeファイルも変更せず、異地配置用の設定だけでイメージ指定を差し替えます。
更新・復旧・初期化・イメージ清掃は、すべて同じファイルロックを使います。すでに別処理が動いていれば、新しい処理は静かに終了。未完了の更新記録がある場合は、遠隔レジストリの確認より先に復旧を試みます。
コマンドがタイムアウトしたからといって、Docker側の処理まで終了したとは限りません。実際のコンテナ状態を調べてから復旧を進め、切り替え処理を重ねないことが必要です。また、強制終了や電源断では終了時の後処理に頼れません。次回起動時に、保存済みの未完了トランザクションを優先して処理する設計にします。
初期案では、チェック全体の時間枠を60秒、1回の接続タイムアウトを1秒、リクエスト上限を3秒、確認間隔を2秒とし、3回連続で成功したら切り替えを確定します。これらは候補値であり、実測で確認された性能ではありません。
確認対象は、ローカルのモデル一覧エンドポイントがHTTP 200を返すことと、応答が期待するJSON形式であることです。リダイレクト先のログイン画面やプロキシのエラーページを成功扱いにしません。さらに、応答したコンテナが候補イメージであることや、再起動回数が増え続けていないことも確認します。
一方、このモデル一覧処理はレジストリのスナップショットを読むもので、実際のチャットリクエストを送るものではありません。ヘルスエンドポイントも静的な生存応答です(internal/api/models.go、internal/api/chat.go)。したがって、これらのチェックだけで上流アカウントの準備や実際のチャット利用可能性まで証明できるわけではありません。実利用テストを加える場合も、利用枠を消費するリクエストを自動で送らないよう、別途設計が必要です。
また、アプリケーションは終了シグナルを受けるとサービスを停止し、HTTPサーバーの終了猶予は5秒です(main.go)。コンテナの停止猶予だけを延ばしても、長時間のストリーミング接続を最後まで維持できる保証にはなりません。無損失の切り替えが必須なら、2インスタンス化や入口の切り替え、接続の排出を含む別設計が必要です。
定期確認にはsystemdのoneshotサービスとタイマーを使い、前回の処理が終わってから次回の間隔を数える案です。起動時に1分後、以降は5分間隔を基本とし、最大30秒のランダムな遅延を加える例を想定しています。2台の確認・更新をずらすことで、同時に負荷がかかったり、同じ更新障害を同時に受けたりするリスクを抑えます。
ただし、これは2台が同時に更新される仕組みではありません。目指すのは最終的なバージョン同期であり、1台がロールバックした場合は、問題のあるイメージに追随させず旧版のままにするのが安全です。更新器の優先度を下げても、Dockerデーモンがイメージを展開する際のCPU負荷まで抑えられるとは限りません。低スペック機での実測が必要です。
更新器にはBash、Docker Engine、Composeプラグイン、curl、jq、flockに加え、イメージマニフェストを読むためのSkopeoを想定しています。ホストのディストリビューションや各ツールのバージョンは、実装前に確認します。Docker操作権限を持つホスト側アカウントで動かし、Dockerソケットやレジストリ認証情報をコンテナに渡さない方針です。ただし、実行アカウントがDockerを管理できる以上、ホスト管理者権限に関わるリスクがなくなるわけではありません。
GHCRの非公開イメージ取得には、パッケージ読み取り権限を持つPersonal Access Token(classic)を使い、対象パッケージへアクセスできるアカウントであることを確認します。組織の設定によってはSSO認可も必要です。9 CI用の書き込みトークンをVPSへ配布したり、読み取りに不要な書き込み・削除権限を与えたりしません。
各VPSには別々の読み取り専用認証情報を用意し、標準入力経由でログインします。トークンをコマンド引数や監査ログへ残さず、更新器専用の管理者のみ読み取れる場所で保管。認証失敗時は旧サービスを維持して更新を止めます。
イメージの清掃も全体に対する一括削除は避けます。更新器が管理する履歴だけを対象にし、現行版、前回の正常版、未完了トランザクションに関係するイメージは保護します。ほかのコンテナが参照しているイメージや、手動の復旧用タグが付いたものも削除しません。候補として14日を超えた履歴を整理する場合も、強制削除はせず、削除できなければ記録して残します。容量不足を解消するために唯一のロールバック用イメージを消すことはしません。
実装に進む前に、両VPSの実際の環境、プロジェクト名、設定マウント、認証情報の権限、現在の正常イメージを確認し、復旧可能な初期状態を作ります。その後、隔離環境で更新とロールバックを演習。問題がなければ1台目で更新・復旧を検証してから、2台目へ進みます。
最低限、次の項目を確認したいところです。
結論として、短いゲートウェイ切り替え時間を許容し、1秒以内の遠隔確認を保証ではなく性能目標とし、各VPSの実環境を確認できるなら、このホスト側更新方式は現実的な候補です。 ただし、現段階で互換性や性能、ロールバック一連の動作が検証済みとは言えません。
Studio Global AI
このページにはソースに裏付けされた回答が含まれており、Studio Global 内で続行できます。
更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。
更新用コンテナは増やさず、ホスト側のsystemdタイマーから更新スクリプトを実行する案です。 タグで新バージョンを見つけても、実際のデプロイにはイメージダイジェストを使い、更新前のイメージをローカルに保全します。
新コンテナのヘルスチェックに失敗した場合は旧イメージへ戻します。ただし、ホスト障害やDocker自体の停止まで含めた自動復旧は保証できません。