---
title: "解決 erpc worker 的故障"
description: "最常遇到的 erpc worker 錯誤訊息、各自的意思與處理方式、如何恢復可能已被接管的伺服器，以及 erpc 絕不會做的事。"
canonical: "https://erpc.global/zh-tw/doc/erpc-cli/worker-troubleshooting/"
locale: "zh-tw"
---

# 解決 erpc worker 的故障

找到 `erpc worker` 所輸出訊息的開頭，並依照該列的說明處理。

本頁說明 ERPC CLI `v0.1.0-rc.4`，這是發行前版本。

## 錯誤訊息與處理方式

worker 的故障使用 erpc 的代碼與退出狀態：請參閱[錯誤與退出碼](https://erpc.global/zh-tw/doc/erpc-cli/commands/#錯誤與退出碼)。

| 訊息（開頭部分） | 原因 | 處理方式 |
| --- | --- | --- |
| `<app> cannot start without <SETTING>` | `run.requires` 指定了一個沒有任何地方設定的設定項 | `erpc worker secret put <SETTING>`、在 `[vars]` 中設定它，或使用會設定它的線路部署（`--grpc`、`--unlimited`） |
| `your key was added but does not get in` | SSH agent 沒有簽署：1Password 處於鎖定狀態，或其請求未被允許 | 解鎖 1Password、允許該請求，然後再次執行同一命令。它會接著執行 |
| `1Password could not …: authorization timeout` | 1Password 要求核准，但沒有人回應 | 在 1Password 中允許該請求，然後再次執行 |
| `<NAME> is empty; nothing was kept` | `secret put` 讀到空的標準輸入：shell 不是終端機 | 在終端機中執行，或以管道傳入值 |
| `the keystore is locked, and nobody is at a terminal …` | 沒有終端機的命令需要金鑰庫，而且沒有保留解鎖狀態 | 在終端機中執行 `erpc worker secret unlock`，然後再次執行該命令 |
| `nothing is kept under keystore:… on this machine` | 該值保存在另一台機器的金鑰庫中 | 在本機執行 `erpc worker secret put <NAME> --replace`；若是金鑰，請帶來那台機器的整個 `keystore` 目錄及其通行片語 |
| `release <id> failed: …; the server went back to <previous>` | 新的 release 未通過健康檢查 | 查看 `erpc worker logs`。上一個 release 仍在執行 |
| `… is locked: the trading key has not been handed over` | 伺服器已重啟、agent 失敗或被終止後由 systemd 再次啟動，或執行了 `stop --lock` | `erpc worker start` |
| `port <n> is taken: …` | 另一個保持執行的 worker 使用相同的健康檢查連接埠，或有其他程式在該連接埠上監聽 | 在 `erpc.toml` 中為應用指定專屬的連接埠，然後再次部署 |
| `release <id> runs, and its WAF did not come up: …` | WAF 沒有開始監聽。最常見的情況是另一個程式佔用了 `waf.port` | 執行 `erpc worker logs --waf`，然後釋放該連接埠或變更 `waf.port`，再次部署。在此期間應用仍在執行 |
| `waf.<key> …`（來自 `check`、`deploy`） | 某個 `[waf]` 鍵超出其範圍，或 `waf.port` 低於 1024，或是 `run.port`、SSH 或健康檢查所用的連接埠 | 修正 `erpc.toml`。`erpc worker check` 會一次列出所有問題 |
| `the WAF's port <port> was not opened to …`（來自 `firewall allow`、`deny`、`sync`） | 此變更會讓新的對象在伺服器尚未執行的 WAF 規則下連入 | `erpc worker deploy`：它會使新規則就位，然後開放連接埠 |
| `<kind> line <id> did not become active in <n> minutes` | 線路仍在設定中 | 再次部署以繼續等待 |
| `OUT_OF_STOCK` | 該區域沒有該方案的可用伺服器 | 使用 `--region <another>` 部署 |
| `the start may or may not have gone through: …` | 請求已送出但沒有收到回應，或回應為 5xx、408 或 429 | 再次執行同一命令：它會傳送同一個請求 |
| `this purchase, or another of the account's, is still being made …` | 第一個請求仍在處理中，或帳戶的另一筆購買持有其鎖定 | 稍後再次執行同一命令：它會傳送同一個請求 |
| `… changed in 1Password since this command read it` | 另一台機器在此期間寫入了清單項目 | 再次執行該命令 |
| `the shared RPC takes none of the account's API keys from this machine (<n> tried)`（來自 `secret put --from-account`、`erpc rpc call`、`erpc webhook run`） | 帳戶的每一組金鑰從本機送出時都被拒絕：金鑰已到期、帳戶沒有有效的共享 RPC 方案，或金鑰被限制只能從其他位址使用，例如伺服器的位址 | [ERPC Web Dashboard](https://dashboard.erpc.global/zh-tw) 會顯示金鑰的到期日與方案，並可建立新的金鑰。對於限制只能從伺服器位址使用的金鑰：`erpc worker secret put ERPC_API_KEY`，以手動輸入或管道傳入 |
| `shared: … HTTP 401`（bench） | 共享 RPC 拒絕了該金鑰：沒有有效的共享 RPC 方案，或金鑰錯誤 | 在儀表板上檢查方案，或設定 `ERPC_API_KEY` |
| `shared: … HTTP 429`（bench） | 方案的限速 | 使用 `--interval 150` 或更大的值 |

### erpc 無法記錄的購買

當伺服器或線路可能已由 erpc 無法記錄的較早請求啟動時，請在儀表板中查看您帳戶的伺服器與線路。使用 `erpc worker deploy --vps <ID>` 接手伺服器，或結束不需要的項目。然後手動從 `erpc.toml` 的 `[env.<name>.starting]` 中移除該項目：erpc 沒有可移除它的旗標，在移除之前，同一命令會傳送同一個請求。

## 如果伺服器可能已被接管

1. 先執行 `erpc worker backup off`，撤銷伺服器的備份存取金鑰。`off` 不會撤回伺服器已經讀取的內容。
2. 將其交易金鑰中的資金轉走，並更換其 Secret。
3. 從 [ERPC Web Dashboard](https://dashboard.erpc.global/zh-tw) 重新建置伺服器，然後再次部署。

如果重新建置變更了伺服器的 SSH 主機金鑰，在您更新已固定的金鑰之前，erpc 會拒絕該伺服器。部署帶回的是程式碼，而不是應用的狀態資料；狀態資料只有備份才能恢復（[備份應用的狀態資料](https://erpc.global/zh-tw/doc/erpc-cli/worker-status-and-billing/#備份應用的狀態資料)）。

## erpc 絕不會做的事

- 將金鑰、Secret 或含有它們的 URL 放在命令列上。
- 將交易金鑰或應用的 Secret 寫入檔案，只有一個例外：您機器上的金鑰庫，其中每一項都以您的通行片語加密。在伺服器上，`erpc worker backup on` 會將伺服器自己的備份金鑰留在僅限 root 的檔案中。
- 在未顯示價格的情況下啟動任何項目。
- 讓伺服器處於開放狀態：防火牆在應用首次啟動之前就已生效。
- 連線到主機金鑰與已固定金鑰不符的伺服器。

[worker 指南](https://github.com/elsoul/erpc-cli/blob/v0.1.0-rc.4/docs/worker.md)列出了所有訊息，包括 WAF 的訊息。
