升級自行託管的 Claude Managed Agents
在 Kubernetes 或 Docker Compose 上升級自行託管的 Claude Managed Agents 部署,並在新版本無法運作時回復。
本頁面說明如何在 Kubernetes 或 Docker Compose 上升級部署,以及如何回復。在 Kubernetes 上,停機時間取決於升級的幅度:
| 升級 | 先備份資料庫 | Kubernetes 上的停機時間 |
|---|---|---|
| 修補:只有第三個數字改變 | 否。資料庫結構描述維持不變。 | 無 |
次要:第二個數字加一,例如從 1.2.0 到 1.3.0 | 是。結構描述會改變。 | 無,除非 CHANGELOG.md 的某個章節指出伺服器必須停止 |
跳過一個次要版本,例如從 1.1.0 到 1.3.0,或第一個數字改變 | 是。結構描述會改變。 | 從您停止舊伺服器的那一刻起,直到新伺服器就緒為止 |
無論哪一種升級,Docker Compose 堆疊在重新啟動期間都會停止運作。
升級之前
請閱讀新版本在 CHANGELOG.md 中的章節,該檔案位於解壓縮後封存檔的最上層。該章節以該版本特有的升級步驟開頭。如果您跳過某些版本,請依照比您目前版本更新的每個章節進行,從最舊的開始。
接著,請逐一檢查要檢查的設定與路徑。
次要或主要升級包含資料庫備份。傾印檔以明文保存所有對話,因此本頁面上的指令會使用 age 加密工具將其加密。請建立一次金鑰組,並將私密金鑰 cma-backup.agekey 與備份分開存放:
age-keygen -o cma-backup.agekey
age-keygen -y cma-backup.agekey > cma-backup.agepub在 Kubernetes 上升級
本頁面上的 kubectl 指令會從 shell 變數讀取伺服器 Deployment 的名稱。請在每個執行這些指令的終端機中執行下列兩行。第一行會查詢該名稱,第二行會將其印出:
server=$(kubectl -n cma-server get deployment -l anthropic.com/role=server -o jsonpath='{.items[*].metadata.name}')
echo "$server"如果第二行印出 cma-server,請繼續。如果印出其他名稱,請在升級之前閱讀您的物件名稱。如果沒有印出任何內容,請確認 kubectl 指向正確的叢集,然後再次執行這兩行。
建置並推送新映像
解壓縮新的封存檔。以新版本建置並推送其三個映像,如建置並推送映像中所述。如果您執行「egress gateway」(輸出閘道),也請建置並推送其映像。
如果您自行建置沙箱映像,也請以新版本重新建置並推送該映像。請將其 Dockerfile 與新封存檔中的
kubernetes/sandbox/Dockerfile進行比較,並參閱您自己的映像需要具備什麼。在您的 values 檔案中設定新版本
如果某個 values 檔案設定了
image.tag,請將其變更為新版本。如果升級需要,請停止所有伺服器
僅在下列情況下執行此步驟:
- 您執行的某個伺服器落後新版本超過一個次要版本。
- 第一個數字(即主要版本)增加。
CHANGELOG.md中比您目前執行之版本更新的某個章節指出伺服器必須停止。
從此步驟起直到新伺服器就緒為止,用戶端都無法連線到部署,因此請規劃維護時段。
kubectl -n cma-server scale deployment/$server --replicas=0 kubectl -n cma-server wait --for=delete pod -l anthropic.com/role=server --timeout=90s備份資料庫
在次要或主要升級之前,或如果您停止了伺服器,請執行此操作。如果舊版本無法在變更後的結構描述上執行,這份備份就是唯一的回復途徑。
請使用與您資料庫伺服器相同 PostgreSQL 主要版本的
pg_dump。對於<role>與<database>,請使用cma-server-values.yaml中database.url的user與dbname值。pg_dump會提示輸入該角色的密碼。set -o pipefail PGSSLMODE=require pg_dump -h <database-host> -U <role> -d <database> -Fc \ | age -r "$(cat cma-backup.agepub)" -o cma_server-<old-version>.dump.age如果任一指令印出錯誤,它留下的檔案就不是備份。請修正原因並重新執行該指令,然後再繼續。
如果伺服器正在執行,備份只包含用戶端在傾印開始之前寫入的內容。
先升級伺服器,再升級沙箱
請從新封存檔的最上層目錄執行這些指令,並使用您安裝時的 values 檔案:
helm upgrade cma-server kubernetes/server/chart --namespace cma-server -f cma-server-values.yaml --wait helm upgrade cma kubernetes/chart --namespace cma -f cma-values.yaml --wait如果您執行多個環境,請針對每個沙箱 Helm release 執行第二個指令,並使用該 Helm release 的名稱、命名空間與 values 檔案。
如果您停止了伺服器,第一個指令會遷移結構描述、恢復伺服器數量,並在新伺服器就緒後返回。
在伺服器執行時,Helm 會先啟動每個新伺服器,再停止舊伺服器,因此就緒伺服器的數量永遠不會減少。在次要升級中,第一個指令會在舊伺服器持續提供服務的同時變更結構描述,接著取代舊伺服器。正在被取代之伺服器上開啟的事件串流會正常結束,因此追蹤串流的用戶端必須重新連線。
如果某個指令失敗,請參閱如果升級失敗。
在 Docker Compose 上升級
每一種升級的步驟都相同。請從版本的 Compose 目錄執行每個 docker compose 指令,也就是存放 docker-compose.yml 的目錄。在解壓縮後的封存檔中,該目錄為 compose。請使用未設定 ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY 與 ANTHROPIC_AUTH_TOKEN 的終端機,因為 Compose 會將 shell 中這些變數的值傳遞給伺服器。
備份資料庫
在次要或主要升級之前,請從舊版本的 Compose 目錄執行此操作:
set -o pipefail docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' \ | age -r "$(cat cma-backup.agepub)" -o cma_server-<old-version>.dump.age在指令中,請保留
$POSTGRES_USER與$POSTGRES_DB原樣。單引號中的文字會在postgres容器內執行,該容器會在這些變數中保存其角色與資料庫的名稱。堆疊在備份期間會持續提供服務,因此傾印檔不會包含傾印開始後用戶端寫入的任何內容。如果任一指令印出錯誤,它留下的檔案就不是備份。請修正原因並重新執行該指令,然後再繼續。
解壓縮新的封存檔
將新的封存檔放在新版本可以持續存放的目錄中,例如舊版本的上層目錄。這些指令會在該處解壓縮封存檔,而新的堆疊會從解壓縮後的檔案執行。
如果您的 umask 比
022更嚴格,請先執行umask 022。接著從舊版本的 Compose 目錄執行下列指令。請以存放新封存檔之目錄的完整路徑取代<directory>。請以封存檔的名稱(不含.tar.gz)取代<archive>。releases="<directory>" tar -xzf "$releases/<archive>.tar.gz" -C "$releases" && cp .env compose.config.yaml "$releases/<archive>/compose/"第二行還會將您的
.env與compose.config.yaml複製到解壓縮後的compose目錄。在這兩行執行期間,舊的堆疊都會持續運作。如果某一行印出錯誤,請修正原因並重新執行這兩行。重做您的其他變更
只有
.env與compose.config.yaml會被沿用。請在新版本的 Compose 目錄中再次進行您的其他變更:- 您新增的檔案: 複製該檔案。
- 您編輯過的隨附檔案: 在新版本的副本中進行相同的編輯。請勿以舊檔案覆寫它,因為那會復原該版本對此檔案的變更。
- 代理身分: 使用
cp -a複製agent-identity目錄(如果該目錄由 root 擁有,請使用sudo),並再次編輯docker-compose.yml的volumes:區塊。 - 您自己的 Compose 檔案: 複製該檔案,並檢查其相對路徑。
接著,進行要檢查的設定與路徑中的 Docker Compose 變更。
停止舊堆疊並啟動新堆疊
請在您解壓縮封存檔的終端機中執行這幾行,因為它們會使用其
$releases變數。請停留在舊版本的 Compose 目錄中,並以相同的名稱取代<archive>。如果您曾為舊堆疊匯出COMPOSE_FILE,請先匯出相同的值。ls "$releases/<archive>/compose/.env" && docker compose down cd "$releases/<archive>/compose" && docker compose up --build -d只有在新版本的
.env已就位時,第一行才會停止舊堆疊。docker compose down會保留資料庫。請勿加上-v,那會將資料庫刪除。新的堆疊會沿用該資料庫,其migrate容器會在伺服器啟動前更新結構描述。
如果某個指令失敗,請參閱如果升級失敗。
如果升級失敗
在回復之前,請從記錄中找出原因:
- Kubernetes: 如果遷移 Job 失敗,
helm upgrade會在 Job 重試期間等待數分鐘,然後失敗。在等待期間,請在第二個終端機中執行kubectl -n cma-server logs job/$server-migrate,並如在 Kubernetes 上升級中所述設定$server。當 Job 停止重試時,Kubernetes 會刪除記錄。如果您錯過了,請再次執行helm upgrade,這會再次啟動該 Job。 - Docker Compose:
docker compose up --build -d的輸出可能不會顯示原因。請執行docker compose logs找出原因。
| 記錄顯示的內容 | 代表的意義 | 處理方式 |
|---|---|---|
包含 refusing to migrate: servers of another release are still running against this database 的一行 | 某些升級需要先停止所有伺服器,而舊版本的伺服器仍在執行。遷移未做任何變更。 | 如在 Kubernetes 上升級中所述停止所有伺服器,然後再次執行 helm upgrade。如果某個伺服器未正常關閉,請先等待 20 秒:在此之前,遷移仍會將該伺服器視為執行中。 |
在您再次部署舊版本時,包含 cannot downgrade 的一行 | 舊版本無法在變更後的結構描述上執行。 | 如回復中所述還原備份。 |
| 遷移產生的其他錯誤 | 您不需要回復。在 Kubernetes 上,伺服器會維持原狀,直到遷移成功為止。 | 修正原因,然後再次執行 helm upgrade 或 docker compose up --build -d。 |
遷移可能成功,但新伺服器沒有進入就緒狀態。若要找出原因,請閱讀伺服器的記錄:
- Kubernetes:
kubectl -n cma-server logs -l anthropic.com/role=server --prefix --tail=20 - Docker Compose:
docker compose logs cma-server
例如,在 Kubernetes 上,包含 has invalid keys 的一行會指出 server.config 底下新版本不接受的設定。請在考慮還原備份之前,先修正原因並再次執行升級指令,因為還原備份會遺失資料。在 Kubernetes 上,結構描述變更後,執行中的舊版本伺服器會持續提供服務,但若它停止,可能無法再次啟動。
回復
本節中的 kubectl 指令會使用在 Kubernetes 上升級中的 $server 變數。在回復之前,請檢查如果升級失敗。接著依升級類型進行回復:
- 修補升級之後: 再次部署舊版本。兩個版本使用相同的結構描述。
- 次要或主要升級之後: 請開啟新封存檔中的
CHANGELOG.md。閱讀您要回復到的版本之後每個版本的章節。- 如果某個章節指出舊版本無法在已遷移的資料庫上啟動,請還原備份。
- 否則,請再次部署舊版本。如果這樣做失敗並顯示
cannot downgrade,請還原備份。
再次部署舊版本
- Kubernetes: 前往舊版本封存檔的頂層目錄。使用該版本當時的 values 檔案,執行在 Kubernetes 上升級中的兩個
helm upgrade指令。例如,如果您為了升級而新增了earlierNames,請將其移除。只有在第一個指令成功後,才執行第二個指令。 - Docker Compose: 在新版本的 Compose 目錄中執行
docker compose down,然後在舊版本的 Compose 目錄中執行docker compose up --build -d。
如果舊版本無法在變更後的結構描述上執行,記錄會顯示 cannot downgrade:
- Kubernetes: 遷移 Job 會失敗,伺服器會維持原狀。如果升級失敗說明如何閱讀 Job 的記錄。
- Docker Compose: 伺服器不會啟動。請使用
docker compose logs migrate閱讀記錄。
在 Docker Compose 上,docker compose logs 的輸出可能改為顯示 stored value is encrypted but no encryption key is configured。在此情況下,表示舊版本的 .env 沒有 CMA_STORE__CREDENTIALS_ENCRYPTION_KEY 這一行。請從新版本的 .env 複製該行,然後再次執行 docker compose up --build -d。
在 Kubernetes 上還原備份
您的資料庫伺服器需要有空間容納資料庫的第二份副本。對於 <role> 與 <database>,請使用 cma-server-values.yaml 中 database.url 的 user 與 dbname 值。
將備份還原到新資料庫
以管理員身分連線到資料庫伺服器上的
postgres資料庫,然後執行:CREATE DATABASE <database>_restored OWNER <role>;接著,在存放備份的機器上,以您的金鑰與備份檔案路徑執行下列指令。請使用與您資料庫伺服器相同主要版本的
pg_restore。它會提示您輸入該角色的密碼,成功時不會印出任何內容。age -d -i cma-backup.agekey cma_server-<old-version>.dump.age \ | PGSSLMODE=require pg_restore -h <database-host> -U <role> -d <database>_restored --no-owner --exit-on-error如果這輸出錯誤,請停止。您的資料庫沒有變更。以管理員身分執行
DROP DATABASE <database>_restored;,然後重新開始此步驟。停止所有伺服器
kubectl -n cma-server scale deployment/$server --replicas=0 kubectl -n cma-server wait --for=delete pod -l anthropic.com/role=server --timeout=90s切換到還原的資料庫
以管理員身分連線到
postgres資料庫,然後執行:ALTER DATABASE <database> RENAME TO <database>_upgraded; ALTER DATABASE <database>_restored RENAME TO <database>;如果第一個陳述式表示有其他工作階段正在使用該資料庫,請關閉這些工作階段,然後再次執行這兩個陳述式。連線集區程式可能會持有這類工作階段。
刪除您擱置的資料庫
該資料庫仍保存著用戶端在備份之後寫入的內容。當舊版本正常運作後,使用
DROP DATABASE <database>_upgraded;刪除該資料庫。
如果金鑰檢查失敗
在「部署舊版本」步驟中,第一個 helm upgrade 指令會等待舊伺服器就緒。接著它會檢查沙箱用來連線的金鑰。如果該指令失敗,但 kubectl -n cma-server get pods 顯示舊伺服器已就緒,表示該檢查失敗。
您的資料已還原且伺服器正常運作,但沙箱尚無法連線到伺服器。沙箱會使用其自身命名空間 cma 中 cma-environment Secret 的金鑰進行連線。該金鑰比您的備份更新,因此還原的資料庫無法辨識它。
若要確認原因,請再次執行第一個指令。在它等待期間,開啟第二個終端機,並在其中同樣設定 $server。接著執行 kubectl -n cma-server logs job/$server-environment-default(將 default 換成您環境的名稱)。尋找包含 Secret cma/cma-environment records key 的一行。如果記錄顯示其他錯誤,請修正其指出的問題。
如果記錄顯示該行,請使用 kubectl -n cma delete secret cma-environment 刪除該 Secret,然後再次執行第一個指令。它會以新的金鑰重新建立該 Secret。接著執行第二個指令。
在 Docker Compose 上還原備份
只啟動資料庫
在新版本的 Compose 目錄中執行
docker compose down。然後在舊版本的 Compose 目錄中執行docker compose up -d --wait postgres。在接下來的步驟中,請停留在該目錄。將備份還原到新資料庫
從舊版本的 Compose 目錄,以您的金鑰與備份檔案路徑執行此指令:
docker compose exec -T postgres sh -c 'psql -U "$POSTGRES_USER" -d postgres \ -c "DROP DATABASE IF EXISTS ${POSTGRES_DB}_restored" -c "CREATE DATABASE ${POSTGRES_DB}_restored"' \ && age -d -i cma-backup.agekey cma_server-<old-version>.dump.age \ | docker compose exec -T postgres sh -c 'pg_restore -U "$POSTGRES_USER" -d "${POSTGRES_DB}_restored" --no-owner --exit-on-error'如果它輸出
DROP DATABASE與CREATE DATABASE,且沒有錯誤,即表示成功。在此處及接下來的步驟中,請保留
$POSTGRES_USER與$POSTGRES_DB原樣。單引號中的文字會在postgres容器內執行,該容器會在這些變數中保存其角色與資料庫的名稱。如果它輸出錯誤,您的資料庫沒有變更,因此您可以再次執行整個指令。如果無法還原備份,請在新版本的 Compose 目錄中執行
docker compose up --build -d,再次啟動該版本。切換到還原的資料庫
docker compose exec -T postgres sh -c 'psql -U "$POSTGRES_USER" -d postgres \ -c "ALTER DATABASE $POSTGRES_DB RENAME TO ${POSTGRES_DB}_upgraded" \ -c "ALTER DATABASE ${POSTGRES_DB}_restored RENAME TO $POSTGRES_DB"'啟動舊版本
執行
docker compose up --build -d。刪除您擱置的資料庫
該資料庫仍保存著用戶端在備份之後寫入的內容。舊版本正常運作後,刪除該資料庫:
docker compose exec -T postgres sh -c 'psql -U "$POSTGRES_USER" -d postgres -c "DROP DATABASE ${POSTGRES_DB}_upgraded"'
還原之後
還原會使環境金鑰回到備份當時的狀態:
- 您在備份之後撤銷的金鑰: 它會再次生效。請再次撤銷。
- 您在備份之後建立的金鑰: 它會消失。請為使用它的 worker 建立新的金鑰。
為您自己的 worker 更換環境金鑰提供了相關指令,這些指令也適用於 Docker Compose。Docker Compose 堆疊啟動的沙箱不需要任何操作,因為堆疊會在啟動時更換其金鑰。
若要列出環境的金鑰(包括已撤銷的金鑰),請依下列方式執行 list-keys:
- 請使用您於在自行託管的伺服器上呼叫 API 中設定的終端機。請勿使用執行
docker compose的終端機。 - 在 Kubernetes 上,請先在另一個終端機中執行
kubectl -n cma-server port-forward svc/$server 8400:8400,並在該終端機中同樣設定$server。 - 請從封存檔的最上層目錄,針對每個環境執行一次此指令,並使用該環境的 ID。
echo "$ANTHROPIC_API_KEY" | ./cma-server-admin list-keys \
-base-url http://127.0.0.1:8400 -env env_01595EKxaaTTGwwY3kyXdtbs \
-key-file - -all測試備份
若要證明傾印檔可以還原,請只執行「將備份還原到新資料庫」步驟。該步驟位於在 Kubernetes 上還原備份與在 Docker Compose 上還原備份中。該步驟不會變更使用中的資料庫。接著刪除新資料庫。在 Docker Compose 上,其名稱是您資料庫的名稱再加上結尾的 _restored。
要檢查的設定與路徑
請在執行升級指令之前閱讀本節。
請檢查您設定檔中的 web_tools 區段。如果該檔案沒有此區段,或該區段未設定任何鍵,升級後 web_search 與 web_fetch 工具會關閉。使用預設工具集的代理屆時會在沒有這些工具的情況下執行,且不會出現任何錯誤。工具集開啟任一工具的代理則無法啟動工作階段。若要保留這些工具,請參閱網頁工具需要伺服器設定。
在 Kubernetes 上,請確認每個沙箱 values 檔案(例如 cma-values.yaml)都設定了 egress.mode。若要保留沙箱對公用網際網路的存取,請在 egress 底下新增 mode: publicInternet。如果某個檔案未設定模式,chart 會套用其預設模式 closed。沙箱 chart 的 helm upgrade 指令接著會停止並顯示錯誤(例如 egress.mode is closed and egress.closed.hosts is empty),且不會變更任何內容。
請檢查相同檔案中的 sandbox.idleTimeout。如果某個檔案未設定此值,工作階段的 pod 會在代理的回合結束約 5 分鐘後消失。代理留下仍在執行的程序會隨 pod 一起停止。根據預設,/workspace 中的檔案會保留。若要將 pod 保留 30 分鐘,請在 sandbox 底下新增 idleTimeout: 30m。
請檢查設定檔中的 inference.attribution,以及伺服器環境中的 CMA_INFERENCE__ATTRIBUTION。如果找到,請刪除該行。您要升級到的版本沒有此設定,若設定了其中任一項,其伺服器就不會啟動。
當 Claude API 是您的推論提供者時,升級後每次模型呼叫都會攜帶其工作階段,以及該工作階段之代理與環境的 ID。請參閱伺服器傳送給其推論供應商的內容。
Kubernetes:您的物件名稱
cma-server-values.yaml 必須在其 earlierNames 設定中指出您的安裝使用哪些名稱。若要找出伺服器 Deployment 的名稱,請執行 kubectl -n cma-server get deployment -l anthropic.com/role=server。
| Deployment 的名稱 | cma-server-values.yaml 中的那一行 |
|---|---|
cma-onprem | earlierNames: true |
cma-server | earlierNames: false |
如果該檔案沒有這一行,請在升級之前新增,並在之後的每次升級中保留。若沒有這一行,伺服器 chart 的 helm upgrade 指令會停止並顯示提及 earlierNames 的錯誤,且不會變更任何內容。
使用 earlierNames: true 時,chart 的物件會保留其 cma-onprem 名稱,伺服器仍會找到您以這些名稱建立的 Secret。這些頁面使用中間欄的名稱。使用 earlierNames: true 時,請改用最後一欄的名稱:
| 物件 | 這些頁面上的名稱 | 使用 earlierNames: true 時的名稱 |
|---|---|---|
| 伺服器的 Deployment 與 Service | cma-server | cma-onprem |
| 遷移 Job | cma-server-migrate | cma-onprem-migrate |
| 每個環境的 Job | cma-server-environment-<name> | cma-onprem-environment-<name> |
| 含有資料庫密碼的 Secret | cma-server-db | cma-onprem-db |
| 含有推論提供者憑證的 Secret | cma-server-upstream | cma-onprem-upstream |
| 含有伺服器 API 金鑰與加密金鑰的 Secret | cma-server-keys | cma-onprem-server |
無論 earlierNames 的值為何,命名空間都名為 cma-server,伺服器的映像則名為 cma-server-image。
每個設定了 egress.mode: gateway 的沙箱 values 檔案,都必須在 egress.gateway 底下指出伺服器的兩個 Service。如果某個檔案沒有,請新增這兩行。此範例使用的是 earlierNames: true 安裝的名稱:
egress:
gateway:
serverService: cma-onprem
serverEgressService: cma-onprem-egressDocker Compose:封存檔的配置與路徑
如果您要升級的來源版本沒有 compose 目錄,其 docker-compose.yml 位於封存檔的最上層,與 bin 並列。在新的封存檔中,該檔案會深一層,位於 compose 中。
在「重做您的其他變更」步驟中,也請進行下列變更:
- 您自己的 Compose 檔案: 如果舊封存檔沒有
compose目錄,您的檔案也會深一層。檔案中像./bin這樣的路徑會變成../bin。如果該檔案提及cma-onprem服務,請將該名稱變更為cma-server。 - 位於
/etc/cma-onprem/或/run/cma-onprem/底下的路徑: 請將每個路徑變更為以/etc/cma-server/或/run/cma-server/開頭。請檢查新版本的.env與compose.config.yaml、您自己的 Compose 檔案,以及您新增的每一行volumes:。在volumes:行中,只變更第一個冒號之後的部分,也就是容器內的路徑。
這個頁面有幫助嗎?