建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。 映像版本不變時不拉取、不重建;更新只針對網關服務,避免連帶重啟使用記憶體儲存的郵件容器。 更新前先保留並驗證舊映像;新版本未通過健康檢查,就以本機舊版回復。
發布者圖片由 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
較穩妥的方向是由宿主機執行原生排程,以固定映像摘要部署,再搭配持久化更新狀態與本機舊版回滾,不額外引入更新容器。映像參照可使用 OCI 格式支援的摘要形式。1
不過,跨網路查詢遠端摘要不能保證每次都在一秒內完成;目前是單一網關容器,重建時也不能保證零停機或在途請求完全不受影響。這份內容是設計草案與實作契約,尚未建立檔案、執行測試,也未操作兩台異地 VPS。
對正常運作的宿主機與 Docker,設計目標是更新失敗時自動回復。若宿主機斷電、Docker 無法使用,或回滾映像本身無法啟動,系統應留下錯誤並告警,不能宣稱一定能自行修復。
v主版本.次版本 格式,例如 v3.12,並發布 latest、3.12、v3.12 與提交短 SHA 等標籤;工作流程沒有自動維護名為 v3.x 的系列別名。流程雖設定四種架構,但這不代表某次發布已經成功。可核對 .github/workflows/build_docker.yml:19。docker-compose.yml:1。Dockerfile:13 與 main.go:21。internal/api/models.go:23、internal/api/chat.go:2078。main.go:233。這次設計不修改郵件服務、不同步執行中的帳號狀態、不升級依賴、不從遠端取得原始碼,也不改變本機開發建置方式。它不保證兩台主機同時切換,也不提供真正無停機更新;若要求無損切換,還須另行設計雙實例、入口切換與連線排空。
預計入口為 scripts/auto-update.sh,目前尚未建立。草案假設宿主機已安裝 Bash、Docker Engine、Compose 插件、curl、jq、flock,以及用來讀取映像清單的原生 Skopeo;實際作業系統與工具版本仍須在實作時確認。
更新器由受保護的宿主機帳號執行,直接操作本機 Docker,不把 Docker socket 或登錄檔憑證掛載到任何容器。要注意的是,能管理 Docker 的帳號仍具備宿主機管理權限;不掛載 socket 不代表消除了這項權限風險。
latest。實際部署則固定使用「映像庫位址+摘要」,避免標籤後續移動造成版本不確定。以下是核心呼叫的草案示意,並非完整或已驗收的安裝腳本;持久化交易、身分核對與復原邏輯仍須補齊:
# 參數須來自經過驗證、一般帳號無法修改的設定。
exec 9>"$LOCK_FILE"
flock -n 9 || exit 0
# 只讀取清單;須先核實 Skopeo 的認證檔與原始清單行為。
timeout --kill-after=2s 15s \\
skopeo inspect --authfile "$DOCKER_CONFIG/config.json" \\
--raw "docker://$TRACK_IMAGE" \\
</dev/null >"$MANIFEST_TMP"
# 先確認指令成功,再計算摘要;不可使用失敗後留下的部分輸出。
# NEW_REF 必須是已驗證的 ghcr.io/映像庫@sha256:摘要。
timeout --kill-after=5s 600s \\
docker pull "$NEW_REF" </dev/null
# 執行前須已持久化交易紀錄,並確認本機回滾映像有效。
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 </dev/null
# 失敗路徑:OLD_LOCAL_REF 是已保留並核驗的本機舊映像標籤。
APP_IMAGE="$OLD_LOCAL_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 </dev/null
Compose 的 --no-deps、--no-build 與 --pull never,分別用來避免啟動相依服務、禁止建置,以及避免重建時額外拉取映像;操作目標也應只列出網關服務。2 不應重啟整個專案、刪除孤兒服務,或停止所有服務。
指令逾時不代表 Docker 背景操作已經停止。遇到逾時,必須先檢查實際容器狀態並協調復原,不能立刻啟動另一個互相競爭的切換程序。強制終止或斷電時,也不能只靠退出陷阱處理;應在下次啟動時依照已落盤的交易狀態優先復原。
可先把下列數值當作候選設定:總檢查窗口 60 秒、單次連線逾時 1 秒、請求上限 3 秒、每兩秒輪詢一次,連續三次成功才提交。這些是待現場驗證的參數,不是實測結果。
只修改異地部署副本中的映像來源,保留原本的連接埠、記憶體限制、日誌、環境變數、唯讀設定掛載與郵件設定;不要覆蓋本機開發用的 docker-compose.yml。原始網關建置欄位可參考 docker-compose.yml:26。
以下只展示要替換的片段,不是完整 Compose 設定:
services:
app:
image: "${APP_IMAGE:?必須提供已固定的映像參照}"
pull_policy: never
遠端部署目錄仍須保留完整服務定義,並移除網關的 build 欄位。持久化的映像參照應是已驗收的摘要或回滾用本機標籤;不要讓人工重啟時自動退回 latest。
docker-compose.yml:38 與 _bmad-output/project-context.md:246。若 GHCR 映像庫為私有,拉取可使用具備套件讀取權限的傳統個人存取權杖(PAT),並設定 read:packages;也要確認該帳戶確實有權讀取目標套件。組織若要求 SSO,還須完成相應授權。不要把 CI 的寫入權杖交給 VPS,也不要授予套件寫入、刪除或原始碼寫入權限。9
建議每台 VPS 使用各自可撤銷的唯讀憑證,透過標準輸入完成 Docker 登入,避免把權杖放進命令參數或稽核日誌。登入設定應存放於更新器專用、僅管理員可讀的目錄,並讓更新器與清單讀取工具使用同一份經核驗的認證設定。憑證不應傳入網關或郵件容器;還應設定到期提醒與撤銷流程。驗證失敗時只停止更新,不影響舊服務。
草案優先採用 systemd,預計提供 deploy/systemd/aurora-update.service 與 deploy/systemd/aurora-update.timer;以下只是安裝示例,尚未安裝或啟用。
[Unit]
Description=Aurora 原生映像更新與復原
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
WorkingDirectory=/opt/aurora
Environment=DOCKER_CONFIG=/etc/aurora-updater/docker
ExecStart=/opt/aurora/scripts/auto-update.sh
TimeoutStartSec=20min
UMask=0077
Nice=10
IOSchedulingClass=idle
NoNewPrivileges=yes
StandardOutput=journal
StandardError=journal
[Unit]
Description=Aurora 映像更新定時檢查
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
[Install]
WantedBy=timers.target
啟用排程前,先安裝依賴、核對設定、建立健康的舊版錨點並完成演練;這份草案不會自動執行安裝或啟動排程。採用前一次服務結束後再計時,並搭配檔案鎖;兩台主機應錯開執行,避免同時下載或一起承受升級故障。
排程代表最終會同步,不代表原子同步。若某台主機回滾後暫時停留在舊版,這是保護措施,不應為了版本一致而強迫重試有問題的映像。降低更新器優先權也不代表 Docker 解壓縮映像時的 CPU 峰值一定受控,低規格主機仍須實測資源門檻。
「無更新時保持安靜」可定義為不輸出業務訊息、不新增更新歷史;systemd 仍可能記錄服務啟動與結束等生命週期事件。
稽核紀錄建議包含 UTC 時間、節點識別、交易識別、新舊摘要、操作階段、耗時、健康檢查結果與回滾結果。不得記錄憑證、完整環境變數、郵件帳號或回應本文。
更新器專用日誌可考慮使用 logrotate 每週輪替,超過 1 MB 時提前輪替,壓縮並保留 26 份;這是待確認的保留政策,不應順帶修改宿主機的全域日誌設定。
映像清理不要使用全域清理或卷清理。每週作業只處理更新器登記為自有的歷史映像,並共用更新交易鎖。永久保留目前版本、上一個可用版本,以及未完成交易會用到的映像。刪除前還要排除任何現存容器正在使用的映像與其他用途的標籤。
對超過候選保留期十四天的自有歷史映像,先移除自有保留標籤,再嘗試非強制刪除;刪除失敗就保留並記錄,不強制移除。即使映像顯示為懸空,也不能直接認定它不是人工保留的回滾材料。若拉取前磁碟不足,應放棄升級,而不是刪除唯一的回滾錨點來騰出空間。
驗收至少應包括:
在接受網關切換時可能短暫中斷、把「每次一秒內完成」改為現場效能目標,並先核實遠端部署現況的前提下,宿主機原生排程加上摘要固定與本機回滾,是值得實作的方案。
但目前沒有兩台 VPS 的實際執行回報,因此兼容性、檢查速度與完整回滾流程都還未獲驗證。本次只完成方案草案,沒有產生 ADR、修改部署檔案或覆蓋既有計畫。
Studio Global AI
這個頁面包含附來源佐證的答案,你可以在 Studio Global 內繼續追問。
建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。
建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。 映像版本不變時不拉取、不重建;更新只針對網關服務,避免連帶重啟使用記憶體儲存的郵件容器。
更新前先保留並驗證舊映像;新版本未通過健康檢查,就以本機舊版回復。
建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。 映像版本不變時不拉取、不重建;更新只針對網關服務,避免連帶重啟使用記憶體儲存的郵件容器。 更新前先保留並驗證舊映像;新版本未通過健康檢查,就以本機舊版回復。
發布者圖片由 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
較穩妥的方向是由宿主機執行原生排程,以固定映像摘要部署,再搭配持久化更新狀態與本機舊版回滾,不額外引入更新容器。映像參照可使用 OCI 格式支援的摘要形式。1
不過,跨網路查詢遠端摘要不能保證每次都在一秒內完成;目前是單一網關容器,重建時也不能保證零停機或在途請求完全不受影響。這份內容是設計草案與實作契約,尚未建立檔案、執行測試,也未操作兩台異地 VPS。
對正常運作的宿主機與 Docker,設計目標是更新失敗時自動回復。若宿主機斷電、Docker 無法使用,或回滾映像本身無法啟動,系統應留下錯誤並告警,不能宣稱一定能自行修復。
v主版本.次版本 格式,例如 v3.12,並發布 latest、3.12、v3.12 與提交短 SHA 等標籤;工作流程沒有自動維護名為 v3.x 的系列別名。流程雖設定四種架構,但這不代表某次發布已經成功。可核對 .github/workflows/build_docker.yml:19。docker-compose.yml:1。Dockerfile:13 與 main.go:21。internal/api/models.go:23、internal/api/chat.go:2078。main.go:233。這次設計不修改郵件服務、不同步執行中的帳號狀態、不升級依賴、不從遠端取得原始碼,也不改變本機開發建置方式。它不保證兩台主機同時切換,也不提供真正無停機更新;若要求無損切換,還須另行設計雙實例、入口切換與連線排空。
預計入口為 scripts/auto-update.sh,目前尚未建立。草案假設宿主機已安裝 Bash、Docker Engine、Compose 插件、curl、jq、flock,以及用來讀取映像清單的原生 Skopeo;實際作業系統與工具版本仍須在實作時確認。
更新器由受保護的宿主機帳號執行,直接操作本機 Docker,不把 Docker socket 或登錄檔憑證掛載到任何容器。要注意的是,能管理 Docker 的帳號仍具備宿主機管理權限;不掛載 socket 不代表消除了這項權限風險。
latest。實際部署則固定使用「映像庫位址+摘要」,避免標籤後續移動造成版本不確定。以下是核心呼叫的草案示意,並非完整或已驗收的安裝腳本;持久化交易、身分核對與復原邏輯仍須補齊:
# 參數須來自經過驗證、一般帳號無法修改的設定。
exec 9>"$LOCK_FILE"
flock -n 9 || exit 0
# 只讀取清單;須先核實 Skopeo 的認證檔與原始清單行為。
timeout --kill-after=2s 15s \\
skopeo inspect --authfile "$DOCKER_CONFIG/config.json" \\
--raw "docker://$TRACK_IMAGE" \\
</dev/null >"$MANIFEST_TMP"
# 先確認指令成功,再計算摘要;不可使用失敗後留下的部分輸出。
# NEW_REF 必須是已驗證的 ghcr.io/映像庫@sha256:摘要。
timeout --kill-after=5s 600s \\
docker pull "$NEW_REF" </dev/null
# 執行前須已持久化交易紀錄,並確認本機回滾映像有效。
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 </dev/null
# 失敗路徑:OLD_LOCAL_REF 是已保留並核驗的本機舊映像標籤。
APP_IMAGE="$OLD_LOCAL_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 </dev/null
Compose 的 --no-deps、--no-build 與 --pull never,分別用來避免啟動相依服務、禁止建置,以及避免重建時額外拉取映像;操作目標也應只列出網關服務。2 不應重啟整個專案、刪除孤兒服務,或停止所有服務。
指令逾時不代表 Docker 背景操作已經停止。遇到逾時,必須先檢查實際容器狀態並協調復原,不能立刻啟動另一個互相競爭的切換程序。強制終止或斷電時,也不能只靠退出陷阱處理;應在下次啟動時依照已落盤的交易狀態優先復原。
可先把下列數值當作候選設定:總檢查窗口 60 秒、單次連線逾時 1 秒、請求上限 3 秒、每兩秒輪詢一次,連續三次成功才提交。這些是待現場驗證的參數,不是實測結果。
只修改異地部署副本中的映像來源,保留原本的連接埠、記憶體限制、日誌、環境變數、唯讀設定掛載與郵件設定;不要覆蓋本機開發用的 docker-compose.yml。原始網關建置欄位可參考 docker-compose.yml:26。
以下只展示要替換的片段,不是完整 Compose 設定:
services:
app:
image: "${APP_IMAGE:?必須提供已固定的映像參照}"
pull_policy: never
遠端部署目錄仍須保留完整服務定義,並移除網關的 build 欄位。持久化的映像參照應是已驗收的摘要或回滾用本機標籤;不要讓人工重啟時自動退回 latest。
docker-compose.yml:38 與 _bmad-output/project-context.md:246。若 GHCR 映像庫為私有,拉取可使用具備套件讀取權限的傳統個人存取權杖(PAT),並設定 read:packages;也要確認該帳戶確實有權讀取目標套件。組織若要求 SSO,還須完成相應授權。不要把 CI 的寫入權杖交給 VPS,也不要授予套件寫入、刪除或原始碼寫入權限。9
建議每台 VPS 使用各自可撤銷的唯讀憑證,透過標準輸入完成 Docker 登入,避免把權杖放進命令參數或稽核日誌。登入設定應存放於更新器專用、僅管理員可讀的目錄,並讓更新器與清單讀取工具使用同一份經核驗的認證設定。憑證不應傳入網關或郵件容器;還應設定到期提醒與撤銷流程。驗證失敗時只停止更新,不影響舊服務。
草案優先採用 systemd,預計提供 deploy/systemd/aurora-update.service 與 deploy/systemd/aurora-update.timer;以下只是安裝示例,尚未安裝或啟用。
[Unit]
Description=Aurora 原生映像更新與復原
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
WorkingDirectory=/opt/aurora
Environment=DOCKER_CONFIG=/etc/aurora-updater/docker
ExecStart=/opt/aurora/scripts/auto-update.sh
TimeoutStartSec=20min
UMask=0077
Nice=10
IOSchedulingClass=idle
NoNewPrivileges=yes
StandardOutput=journal
StandardError=journal
[Unit]
Description=Aurora 映像更新定時檢查
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
[Install]
WantedBy=timers.target
啟用排程前,先安裝依賴、核對設定、建立健康的舊版錨點並完成演練;這份草案不會自動執行安裝或啟動排程。採用前一次服務結束後再計時,並搭配檔案鎖;兩台主機應錯開執行,避免同時下載或一起承受升級故障。
排程代表最終會同步,不代表原子同步。若某台主機回滾後暫時停留在舊版,這是保護措施,不應為了版本一致而強迫重試有問題的映像。降低更新器優先權也不代表 Docker 解壓縮映像時的 CPU 峰值一定受控,低規格主機仍須實測資源門檻。
「無更新時保持安靜」可定義為不輸出業務訊息、不新增更新歷史;systemd 仍可能記錄服務啟動與結束等生命週期事件。
稽核紀錄建議包含 UTC 時間、節點識別、交易識別、新舊摘要、操作階段、耗時、健康檢查結果與回滾結果。不得記錄憑證、完整環境變數、郵件帳號或回應本文。
更新器專用日誌可考慮使用 logrotate 每週輪替,超過 1 MB 時提前輪替,壓縮並保留 26 份;這是待確認的保留政策,不應順帶修改宿主機的全域日誌設定。
映像清理不要使用全域清理或卷清理。每週作業只處理更新器登記為自有的歷史映像,並共用更新交易鎖。永久保留目前版本、上一個可用版本,以及未完成交易會用到的映像。刪除前還要排除任何現存容器正在使用的映像與其他用途的標籤。
對超過候選保留期十四天的自有歷史映像,先移除自有保留標籤,再嘗試非強制刪除;刪除失敗就保留並記錄,不強制移除。即使映像顯示為懸空,也不能直接認定它不是人工保留的回滾材料。若拉取前磁碟不足,應放棄升級,而不是刪除唯一的回滾錨點來騰出空間。
驗收至少應包括:
在接受網關切換時可能短暫中斷、把「每次一秒內完成」改為現場效能目標,並先核實遠端部署現況的前提下,宿主機原生排程加上摘要固定與本機回滾,是值得實作的方案。
但目前沒有兩台 VPS 的實際執行回報,因此兼容性、檢查速度與完整回滾流程都還未獲驗證。本次只完成方案草案,沒有產生 ADR、修改部署檔案或覆蓋既有計畫。
Studio Global AI
這個頁面包含附來源佐證的答案,你可以在 Studio Global 內繼續追問。
建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。
建議使用宿主機原生定時器、固定映像摘要、持久化交易狀態與本機舊版回滾,不另加更新容器。 映像版本不變時不拉取、不重建;更新只針對網關服務,避免連帶重啟使用記憶體儲存的郵件容器。
更新前先保留並驗證舊映像;新版本未通過健康檢查,就以本機舊版回復。