疑難排解
遇到問題時,從這裡開始。前幾節是幾乎適用於所有情況的檢查。之後的表格會從你看到的現象,帶你找到有解法的頁面。那些頁面大多以各自的疑難排解章節結尾;本頁不會重複它們的內容。
第一步 #
在中繼所在的機器上,於終端機中執行:
oar status
oar doctor
oar status會說明中繼是否有回應。請對照下方的表格閱讀它的前幾行。oar doctor會印出它找到的安裝、設定檔和供應商 CLI。它不會變更任何東西,而且一律以 0 結束,所以請逐行閱讀它的輸出。- 查看瀏覽器。 狀態點和橫幅會告訴你,問題出在瀏覽器與中繼之間,還是在中繼後面。
- 閱讀與問題相關的記錄(記錄)。
- 重新啟動可能有幫助的最小範圍(重新啟動)。
這兩個指令在 oar 指令中說明。
解讀 oar status #
| 輸出行 | 指向的問題 |
|---|---|
Not set up yet — run: oar setup |
這個安裝中沒有設定檔。請執行 oar setup。首次執行 |
The relay is running on port <port> (<access>): <url> |
中繼正常。開啟該 URL;oar url 會印出含 token 的 URL。這時問題出在瀏覽器、登入或某個 session |
The relay is stopped (port <port>, <access>). Start it with: oar start |
連接埠上沒有任何東西回應。請執行 oar start,如果失敗,請閱讀安裝與啟動 |
Port <port> is held by another program, or by a relay with another token. |
其他程式正在使用這個連接埠,或使用先前 token 的舊中繼仍在執行。見無法啟動時 |
The relay runs with its earlier settings; restart it to apply the new ones. |
你用 oar setup 變更了連接埠、token 或存取範圍。請執行 oar restart |
Service: <state> |
登入時啟動的服務。見自動啟動中繼 |
Tunnel: <state> |
內建的 Cloudflare tunnel。見 Cloudflare tunnel |
結束代碼 3 表示中繼沒有在執行、連接埠被其他東西占用,或沒有設定檔。結束代碼 0 表示中繼正在執行。
解讀 oar doctor #
| 輸出行 | 告訴你什麼 |
|---|---|
OAR <version> 和 node |
OAR 的版本,以及執行 oar 的 Node.js。回報問題時請附上兩者 |
mode |
git checkout(git 檢出):oar update 和 oar service 在那裡會拒絕執行。global install(全域安裝)是一般情況 |
state root 和 config |
指令查看的是哪個安裝。同一台機器上的兩個安裝各有一組。設定檔路徑後面出現 (missing — run: oar setup),表示沒有設定檔;此時會省略 port、auth token 和 tunnel |
port |
連接埠,以及誰能連到它。localhost 表示只有這台機器;其他裝置需要 oar setup --lan 或 tunnel |
auth token |
MISSING 表示沒有設定 token。請執行 oar setup |
tunnel |
disabled、managed (cloudflared: <path>) 或 managed, cannot start: <reason>。原因會指出哪裡出錯,例如缺少 cloudflared |
database |
這個安裝使用的資料庫及其大小。(not created yet) 表示中繼從未從這個安裝執行過。如果你的對話不見了,或訊息一直處於待處理狀態,請確認這是你預期的資料庫(每個資料目錄一個中繼) |
provider CLIs |
gh (Copilot)、claude 和 grok 會顯示版本,或顯示 not found。doctor 以你終端機的 PATH 尋找;服務使用的則是它安裝當時的 PATH(自動啟動中繼)。cursor 一律顯示 bundled (@cursor/,不論是否已儲存金鑰 |
warning |
在 WSL 中,Windows 占用了中繼的連接埠。請用 oar setup --port <port> 選擇另一個 |
doctor 印出的是狀態資料夾,而不是記錄資料夾,它也不會說明中繼是否在執行:那是 oar status 的工作。記錄在哪裡,請見檔案與資料夾。
記錄 #
| 問題 | 閱讀 |
|---|---|
| 中繼無法啟動,或會自行停止 | 記錄資料夾中的 server-,但只限於 oar start 自己在背景啟動中繼的情況。在 Linux 服務下,啟動錯誤在 journal 中(journalctl --user -u oar),而不在 server- 中;見狀態與記錄 |
| 中繼做過的任何事:預覽、tunnel、更新、重新啟動 | relay-。它會把你的存取 token 顯示為 [token] |
| 某個對話沒有回應,或它的 agent 停止 | worker-<session>.,即該對話的 worker。Copilot 擴充功能引擎沒有這個記錄;請見 ext- 和 Copilot 終端機 |
| 服務無法啟動 | systemctl --user status oar,然後 journalctl --user -u oar |
所有記錄檔、它們的輪替方式,以及 git checkout 中的記錄資料夾,都在檔案與資料夾中說明。
在瀏覽器中 #
- 狀態點位於對話清單頂端:灰色是 Web relay unreachable(無法連到網頁中繼),表示瀏覽器連不到中繼;綠色是 Web relay reachable(可連到網頁中繼);琥珀色表示透過已連線的 Cloudflare tunnel 連到中繼。工具提示會說明更多,例如有多少個 worker 正在忙碌。狀態點
- 橫幅
CLI is offline — messages will queue until it reconnects(CLI 離線 — 訊息會排入佇列,直到它重新連線)以及側邊欄中的 CLI offline(CLI 離線),表示 10 秒內沒有任何 session worker 回報。在閒置的中繼上,這是正常的:傳送一則訊息,橫幅就會消失。如果它一直存在,請閱讀 worker 記錄。無法連到 agent 時
重新啟動 #
| 對象 | 時機 | 方法 |
|---|---|---|
| 某個對話的 agent | 對話卡住、Stop(停止)沒有作用,或 agent 應該載入新的設定 | ⋯ 選單中的 ☠️ Kill session(強制結束 session)。歷史記錄和佇列會保留;下一則訊息會啟動新的 worker。Kill session |
| 中繼 | 新版本、變更過的設定檔、新安裝的供應商 CLI | 在中繼的機器上執行 oar restart,或使用 ⋯ 選單中的 🌄 Restart web relay(重新啟動網頁中繼)。兩者都會等待執行中的回合,但 Linux 服務例外,在那裡 oar restart 會結束它們。重新啟動中繼 |
症狀 #
安裝與啟動 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
npm install -g @oar- 因 EACCES 而失敗 |
npm 的全域資料夾需要 root 權限 | 使用安裝程式,不要用 sudo。安裝 |
Node.js 太舊或找不到;oar: command not found;oar 在 PowerShell 中被封鎖 |
Node.js 低於 22.13,或 PATH 沒有重新載入 |
安裝 |
| 安裝因 node-gyp 或 prebuild 錯誤而失敗 | 沒有適用於你平台的預先建置 better- |
安裝 |
用 npm 12 安裝後中繼無法啟動,並出現 better- 錯誤 |
npm 12 略過了安裝腳本 | 用 --allow- 重新安裝,絕不要用 --ignore-。安裝。如果是 oar start 啟動了中繼,錯誤在 server- 中,否則在 journal 中 |
Port 3333 is in use by another program ... |
其他程式或舊的中繼占用了連接埠 | 無法啟動時 |
The relay did not come up — see …/ |
中繼啟動後又結束了 | 無法啟動時 |
Relay already running(中繼已在執行)或 Relay appears to be owned by another live process(中繼似乎屬於另一個執行中的程序),結束代碼 78 |
同一個資料目錄上有第二個中繼 | 依照該行結尾的提示操作(oar stop, or end process <pid>)。每個資料目錄一個中繼 |
[data] Not starting: each database has changes newer than the other's |
0.9.14 新增 中繼找到它先前執行時使用的資料庫,而兩者都存有工作內容 | 保留其中一個,把另一個的 copilot.、-wal 和 -shm 移到你自己的資料夾中,然後執行 oar start。0.9.14 的升級說明 |
[oar] The relay … is bringing over the database it ran on until now … |
0.9.14 新增 更新後第一次啟動時會複製大型資料庫 | 請等待;完成後它就會回應。不要啟動第二個中繼。0.9.14 的升級說明 |
更新後,Windows 自動啟動或 gh copilot 中繼的對話不見了 |
0.9.14 之前,那種中繼把資料放在套件內 | 0.9.14 的升級說明 |
[startup] Cannot create … 或 … is a file, not a folder,結束代碼 78 |
0.9.14 新增 無法建立資料資料夾或上傳資料夾,例如它所在的磁碟機不存在 | 讓該磁碟機或資料夾可供使用。等待 TEMP 和資料磁碟機 |
No systemd user session here、Could not enable lingering,重新開機後中繼不見了 |
沒有 systemd 使用者 session,或 lingering 已關閉 | 自動啟動中繼 |
| WSL:Windows 瀏覽器顯示另一個頁面,或拒絕 token | Windows 占用了該連接埠 | oar setup --port <port>。無法啟動時 |
在服務下,session 中找不到某個工具或 node |
服務會沿用安裝時的 PATH |
自動啟動中繼 |
Nothing changed: OAR does not delete or overwrite an autostart entry it did not make.(Windows) |
0.9.15 新增 手動建立或編輯過的「啟動」資料夾項目、開機任務或啟動器擋住了切換 | 自己移除它,或用 --replace 執行切換,這會保留一份副本。非 OAR 建立的項目 |
Nothing changed: the boot task could not be read (…)(Windows) |
0.9.15 新增 任務存在,但 OAR 無法讀取它,通常是 Access is denied(拒絕存取),因為它儲存了另一個帳戶的密碼 | 以系統管理員身分在工作排程器中查看它。非 OAR 建立的項目 |
oar uninstall 停在 Not done: … |
0.9.15 新增 某個步驟失敗了:中繼沒有停止、系統管理員提示被拒絕、某個資料夾無法刪除 | 先處理它前面那一行所說的問題,然後再執行一次相同的指令。oar uninstall |
已移除的套件旁邊留下一個隱藏的 . 資料夾 |
0.9.15 新增 npm 移除套件時,仍有 session worker 從該套件執行 | 等那些程式結束後再刪除該資料夾,最晚在重新開機後。oar uninstall |
登入與連到中繼 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| 登入框中出現 Invalid token(token 無效) | 舊的或錯誤的 token | 使用 oar url 提供的 token。無法啟動時 |
| Too many failed sign-in attempts. Try again in … seconds.(登入失敗次數過多。請在 … 秒後重試。) | 一分鐘內從這個位址輸入了十次錯誤的 token | 等這一分鐘過去,再使用正確的 token。如果在另一台機器上的 proxy 後面,請設定 trust,否則所有訪客會共用同一個鎖定。登入的防護 |
腳本存取帶有 ?token= 的 API 或檔案位址時得到 401 |
從 0.9.11 起,?token= 只會讓頁面登入 |
傳送 Authorization: Bearer <token>。出示 token 的方式 |
| 每個裝置都再次要求輸入 token | oar setup --new- 會讓所有裝置登出 |
如果你遺失了 token |
| 狀態點是灰色:Web relay unreachable | 中繼已停止,或位址錯誤 | 在中繼的機器上執行 oar status。狀態點 |
| 手機無法開啟該位址 | 存取範圍是 this machine only(僅限本機) | oar setup --lan,或使用 tunnel。從手機連線 |
tunnel 已關閉(cloudflared is not installed)或不斷重新連線 |
缺少 cloudflared、token 錯誤,或 SSH 登入失敗 |
Cloudflare tunnel、SSH tunnel |
| 訊息一直留在佇列中,而且佇列已暫停 | tunnel 設為 required,但沒有連線 |
同上兩個章節 |
| 在 Caddy 或 nginx 後面,頁面不斷重新連線、在前綴路徑下一片空白,或一再要求輸入 token | proxy 封鎖了 WebSocket、移除了前綴,或需要更多設定 | 反向 proxy |
在 proxy 後面,頁面能載入,但沒有任何即時更新,而中繼記錄顯示 Refused a handshake from origin |
proxy 改寫了 Host 標頭 |
在 allowed 中列出公開的 origin。allowed |
對話無法開始或 agent 沒有回應 #
每個供應商頁面的結尾都列出該供應商可能發生的失敗。失敗的回覆通常會指出原因,而且常附有一個可以修正問題的按鈕。
| 供應商 | 典型的失敗 | 解決方式 |
|---|---|---|
| GitHub Copilot | 儲存 SDK 遭拒並顯示 COPILOT_SDK_PATH did not resolve(COPILOT_SDK_PATH 無法解析)、runtime 無法驗證、沒有剩餘的 AI 點數、oar copilot 說缺少 GitHub CLI |
GitHub Copilot、儲存 SDK 遭拒時 |
| OpenAI | Open、模型探索失敗、Open |
OpenAI |
| Claude | New Chat(新對話)中沒有它、Not logged in、指向計費問題的回覆、0.9.18 新增 relay. |
Claude |
| Claude API | 0.9.18 新增 金鑰不在 workspace 中(HTTP 400)、已達到每月上限,即出現 relay. 或 New Chat 提供 Start on subscription(以訂閱開始)、金鑰不被接受(relay.)、帳戶的點數或花費上限(relay.、relay.)、卡片對某個模型顯示 no price known |
Claude API、錯誤碼 |
| Claude Cloud | 登入已過期、GitHub 未連接、沒有雲端環境 | Claude Cloud |
| Cursor | Cursor API key is not configured、Cursor model "…" is not available |
Cursor |
| Grok | Grok CLI was not found on PATH、Grok authentication failed |
Grok |
| DeepSeek | 0.9.17 新增 餘額用完(relay.)、金鑰不被接受(relay.)、同時發出太多請求(relay.);其他失敗會顯示為 relay.,例如 relay. |
DeepSeek、錯誤碼 |
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| New Chat 中缺少某個供應商 | 它已關閉,或沒有金鑰或登入 | 上方該供應商的頁面;已關閉的供應商 |
| 第一個畫面上出現 Set up a provider(設定供應商) | 沒有任何供應商已就緒 | 第一眼看到的畫面 |
| 模型清單過舊或有誤 | 需要重新執行模型探索 | 🤗 Select Models → Refresh(選擇模型 → 重新整理);各供應商的方式見上方它的頁面 |
| 回覆下方沒有用量行 | 只有 Copilot 回合會記錄方案用量 | GitHub Copilot |
| Check Usage(檢查用量)卡片顯示 Error(錯誤)、Unavailable(無法使用)或只有估算值 | 即時讀取失敗;卡片會退回使用它已有的資料 | 重新整理,以及數字有多新 |
回合卡住、失敗或重新啟動 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
橫幅 CLI is offline |
沒有 worker 回報 | 無法連到 agent 時 |
| 長回合回到佇列並重新開始 | Max turn duration(回合最長時間)已到(預設 60 分鐘),或閒置時間窗(10 分鐘)已用完 | 在 Settings → General(設定 → 一般)中調高或清除 Max turn duration。回合卡住時 |
System note: the … runtime sent nothing for Ns ... |
Copilot SDK 引擎、Cursor 或 Grok 的靜默監看結束了回合 | 再傳送一次訊息。回合失敗時 |
Relay timeout after 5 attempts 或 Relay recovery limit reached |
回合一再重新排入佇列,直到嘗試次數用完 | 回合失敗時 |
| 對話似乎卡死了;Stop 沒有任何作用 | worker 停止回應 | ☠️ Kill session,然後再傳送一次訊息。Kill session |
| 訊息一直處於待處理狀態 | 重新啟動已排入佇列並擋住新訊息,或另一個中繼正在使用該資料庫 | 重新啟動會等待執行中的回合、每個資料目錄一個中繼 |
| 新訊息一直留在佇列中,橫幅顯示 Relay restart queued — waiting for N sessions(中繼重新啟動已排隊 — 正在等待 N 個 session) | 重新啟動已排入佇列,正在等待它所連結的 session 中執行中的回合;在那之前,不會有任何訊息交給 session | 等待,或按橫幅中的 Restart now(立即重新啟動)或 Cancel restart(取消重新啟動)。經過 Ask after a queued relay restart has waited(排入佇列的中繼重新啟動等待多久後詢問)所設定的時間(預設 30 分鐘)後,橫幅會改為詢問你,而不是繼續等待。重新啟動會等待執行中的回合 |
| 中繼重新啟動後,送往某個對話的訊息一直留在佇列中 | 它的 worker 尚未重新連線。它會自行重試,間隔最多 8 秒;從 0.9.13 起,連線卡住時也會重試 | 它的 worker-<session>. 中,每次失敗的嘗試都有一行 worker ws disconnected(前三次,之後每分鐘一次),說明原因。☠️ Kill session 會啟動新的 worker。無法連到 agent 時 |
| 中繼重新啟動後,某個 session 在回合中途停下,之後就沒有再做任何事 | 它的回合無法再次執行:agent 已經取走了訊息 | 傳送一則簡短的「繼續」,或在 Settings → General 中開啟 After a relay restart, tell interrupted sessions to carry on(中繼重新啟動後,讓中斷的 session 繼續)。說明中繼已重新啟動的 relay(中繼)列就是那則註記。告訴中斷的 session 繼續 |
| 傳送失敗,並顯示 This conversation's model "…" is no longer available. Choose a model and send again.(此對話的模型「…」已無法使用。請選擇模型後重新傳送。) | 這次傳送沒有指定模型,而對話所設定的 Copilot 模型已從目錄中移除。從 0.9.13 起,中繼不再自行切換到其他模型 | 在輸入區中選擇模型,然後再傳送一次。模型與推理 |
| Restart web relay 或 Empty queue(清空佇列)顯示錯誤 | 中繼拒絕了請求並說明原因,或沒有回應 | Restart web relay、Empty queue |
| 為中繼設定的變數對 agent 沒有作用 | 在 tmux 下,只有固定清單中的變數會傳到 agent | 哪些變數會傳到 agent |
| 回覆因 Paused(已暫停)註記而停止 | 用量上限 | 達到用量上限時 |
| 背景 agent 或 shell 自行停止了 | 它達到了 Background task timeout(背景任務逾時),預設為 4 小時 | 背景任務逾時 |
任務列以琥珀色顯示 no output for N min |
指令沒有寫出任何東西的時間,超過了 Mark a background task as quiet after(背景任務多久無輸出後標記為靜默),預設為 10 分鐘 | 開啟它的主控台查看最後幾行。有些步驟會長時間沒有輸出;請調高這個設定,或在任務卡住時用 Stop 停止它。靜默任務 |
| 指令的主控台顯示 This session did not report an output file for this task.(此 session 未回報此任務的輸出檔案。) | agent 在更新到 0.9.12 之前就已啟動的 session,或 Copilot SDK 引擎上沒有 Stop 的 shell | 第二種情況,請在閒置的 session 上使用 ☠️ Kill session;之後的指令就會有主控台。依供應商 |
| 主控台顯示 This task's output is no longer available.(此任務的輸出已無法使用。) | 任務在一個多小時前就已結束,或它在更新到 0.9.13 之前執行,而中繼之後重新啟動過 | 已結束的指令、中繼重新啟動之後 |
| 主控台停在 Output stops here: this command pipes into tail(輸出到此為止:此命令以管線傳給 tail) | 以管線接到 tail 的指令在結束前不會寫出任何東西;輸出會在那時才到 |
若要即時追蹤這類執行,請讓它把記錄寫入檔案(> run.),然後追蹤那個檔案。管線接到 tail 的指令 |
| 中繼重新啟動後,主控台顯示正在等待它的 worker,而且沒有 Stop | 中繼保留了指令的輸出,但只有它的 worker 能說明它是否仍在執行 | 等幾秒鐘。worker 沒有回來的指令,會在大約一分半鐘後被標記為已結束。中繼重新啟動之後 |
| 切回很長的對話時,你先前載入的較舊訊息沒有全部回來 | 只會在你所在位置周圍保留 Messages kept per conversation for switching back(每個對話保留的訊息數,用於切回)所設定的數量,預設為 200,且只限最近八個對話 | 在 Settings → General 中調高它。重新載入、切換、旋轉 |
| 對話無法刪除或封存 | 仍有回合或背景任務在執行 | 刪除 |
| 失敗的回覆顯示一個按鈕 | 中繼知道解法 | 失敗回覆上的按鈕 |
| 中繼停止或重新啟動了,記錄中寫著 JavaScript heap out of memory | 0.9.19 新增 中繼的記憶體達到了堆積上限 | 中繼會自行重新啟動。中繼記憶體耗盡 |
提問與核准 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| agent 在等待,卻什麼事都沒發生 | 有提問卡片或核准卡片開著,可能在另一個裝置上。等待卡片的回合絕不會被視為卡住 | 回答卡片,或按 Stop。卡片開啟期間 |
| 核准卡片不接受你輸入的回答 | 輸入文字不能用來表示同意 | 使用 Allow(允許)或 Deny(拒絕)。核准卡片 |
| 卡片消失了,agent 繼續執行 | 8 小時內沒有人回答(在 Copilot 擴充功能引擎上是 2 小時),或 Stop 關閉了它 | 卡片開啟期間 |
| 傳送按鈕顯示 Queue(加入佇列) | 有卡片開著;訊息會在你回答後送出 | 卡片開啟期間 |
You are offline. Answer queued |
你回答時沒有連線 | 從其他地方回答 |
| Grok agent 提出問題,但沒有出現卡片 | Grok 沒有卡片 | 在輸入區中回答。Grok |
| 通知中缺少回答按鈕 | 問題沒有選項,或選項太長 | 通知 |
與其他 session 和中繼協作的 agent #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
agent 沒有 session 工具,或回報 REMOTE_、REMOTE_ 或 REMOTE_ |
開關已關閉,或受到某個限制 | Agent session |
REMOTE_ |
你還沒有在這個對話中提及該中繼 | 配對的中繼 |
| 中繼顯示 Offline(離線)或 Token not accepted(Token 未被接受) | 另一個中繼已停止,或它的 token 已變更 | 配對的中繼 |
其他中繼的 agent 無法在這裡傳送提示(REMOTE_) |
Accept prompts from other relays' agents(接受其他中繼 agent 的提示)已關閉 | 配對的中繼 |
| 監看配對中繼上的 session 時,顯示它需要更新 | 另一個中繼執行的是較舊的 OAR | 配對中繼上的 session |
REMOTE_ |
agent 指定了目標中繼沒有為該供應商列出的模型,例如把 gpt- 寫成 gpt- |
回答會列出相近的符合項目和有效的 id。接受哪些模型 |
| shell 指令結束時,監看中的 agent 不再被喚醒 | 從 0.9.13 起,預設事件不包含順利結束的 shell 指令;失敗仍會喚醒它 | 在 events 中加入 task_ 來訂閱。預設事件 |
任何其他 REMOTE_ 代碼 |
錯誤 |
檔案、預覽與分享 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| 點選回覆中的路徑時出現 File not found(找不到檔案) | workspace 外的絕對路徑被當成 workspace 路徑讀取 | 回覆中的連結會開啟什麼、檢視器能開啟哪些檔案 |
| 檔案連結失敗,或檔案打不開 | 檔案在檢視器可讀取的範圍之外 | 檢視器能開啟哪些檔案 |
| 檔案瀏覽器中的資料夾開啟後是空的 | 中繼無法讀取它 | 限制 |
| agent 應該提交、復原或推送,但 Git changes(Git 變更)沒有按鈕 | 那個檢視只顯示變更 | 它不做什麼 |
preview 連結打不開、顯示 No such preview 或 Preview upstream unreachable,或頁面一片空白 |
預覽通道已關閉、dev server 已停止,或 App 寫出了絕對路徑 | 預覽 |
Preview lane is disabled 或 Preview lane failed its startup checks |
預覽通道已關閉,或某項檢查失敗 | 預覽通道拒絕啟動時 |
Too many live previews (max 8) |
達到上限 | 預覽 |
| 分享連結要求觀看者登入、顯示舊的狀態,或其他人都打不開 | Cloudflare Access、快取規則,或只在這台機器上監聽的中繼 | 連到中繼 |
分享連結回應 404 |
分享已停止、連結已更新,或對話已刪除 | Settings → Sharing(設定 → 分享)會列出仍有效的連結。你的分享連結 |
| 分享檢視中仍顯示某個路徑 | 相對路徑,或圖片中的路徑 | 路徑和檔名 |
| Settings → Previews(設定 → 預覽)中某個預覽顯示為未提供服務 | 中繼啟動時無法檢查它 | 每 15 秒會再檢查一次。重新啟動後的預覽 |
通知與已安裝的 App #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| 通知開關呈灰色 | 頁面不是透過 HTTPS 或 localhost 開啟 |
通知 |
| 通知停止,或只送到一個裝置 | 在瀏覽器中被封鎖、裝置已停用,或另一個裝置在前景開著 OAR | 通知 |
| 瀏覽器沒有提供安裝 | 中繼不是透過 HTTPS 或 localhost 提供 |
所需條件 |
| App 顯示 Enter your access token to connect(輸入你的存取 token 以連線) | App 中沒有有效的登入 | 在 App 中登入 |
| Suspend host(讓主機休眠)不見了或沒有作用 | 它的設定已關閉、中繼不在 Windows 上,或仍有東西在執行 | 讓主機休眠 |
更新 #
| 你看到的現象 | 常見原因 | 解決方式 |
|---|---|---|
| Update(更新)不見了,或檢查沒有找到任何東西 | git checkout、已略過的版本,或不知道有更新的版本 | 無法正常運作時 |
| Check for updates(檢查更新)呈灰色 | 中繼上設定了 OAR_ |
無法正常運作時 |
oar update 以 1 結束並顯示 Could not fetch …,或指向 --to |
無法取得 manifest,或檢查已關閉 | oar update --to X. 仍然可用。無法正常運作時 |
oar update --to= 安裝了最新版本 |
--to= 會被忽略 |
請寫成 --to 0.,中間用空格。oar update |
更新因 EACCES 而失敗 |
npm 無法寫入套件的資料夾 | 無法正常運作時 |
| 更新後仍在執行舊版本 | 重新啟動在等待執行中的回合,或更新沒有套用 | 重新啟動會等待執行中的回合、無法正常運作時 |
| 已安裝的 App 顯示舊頁面 | 它會在啟動時切換到新版本 | 更新 |
中繼記憶體耗盡 0.9.19 新增 #
中繼啟動時帶有固定的堆積上限:機器 RAM 的 60%,以 64 MB 為單位,最少 2,048 MB,最多 8,192 MB,且絕不低於 Node.js 本身的預設值,但也絕不超過可用記憶體;在有記憶體限制的容器中,以該限制代替 RAM。在 4 GB 記憶體的機器上約為 2.3 GB。每次啟動都會在記錄中寫下上限及其來源:
[relay] heap limit 2368 MB (default: 60% of 3.9 GB RAM)
啟動時以及之後每 10 分鐘,記錄會多一行類似 [relay] memory rss= 的內容;使用中的堆積超過上限的 80% 時,還會多寫一行 [relay] memory high: …。
中繼記憶體耗盡時,會像任何當機之後一樣自行重新啟動:最多連續 2 次,連續第 3 次當機會讓它以結束代碼 1 停止,之後由 Linux 上的 systemd 服務再次啟動它。執行 10 分鐘以上會讓計數重新開始。在 0.9.19 之前,記憶體耗盡的中繼會一直停著。從較早的版本更新後,只有在 oar 本身停止並重新啟動一次之後,堆積上限和這種自動重新啟動才會生效(0.9.19 的升級說明)。
要自己設定上限,請在 config. 中寫入 heap(整數 MB,至少 512),然後重新啟動中繼。NODE_ 中的 --max-,或啟動 server. 的 node 指令列上的該參數,優先於 heap。與 heap 不同,在 shell 中設定的 NODE_ 會在其他程式重新啟動中繼時遺失。
堆積快照 #
堆積接近上限時,Node.js 會把一個堆積快照(Heap.<date>.<time>.<pid>.)寫入中繼資料目錄中的 diagnostics 資料夾(檔案與資料夾)。中繼在啟動時建立該資料夾,並在記錄中寫下它的路徑;在 Linux 和 macOS 上只有你能開啟它。
- 磁碟:快照大約與使用中的堆積一樣大,最多到上限。資料目錄所在磁碟機的可用空間不足堆積上限的兩倍時,中繼會不寫快照就啟動,並在記錄中說明原因。
- 記憶體:寫入快照最多可能需要約兩倍於使用中堆積的記憶體,寫入期間中繼不會回應。在小型機器上,寫入可能失敗,或讓處理程序被結束;這時中繼會像沒有快照時那樣結束。
- 檢視:把它複製到別的機器上,在 Chrome DevTools 中透過 Memory → Load(記憶體 → 載入)開啟,依 Retained size(保留大小)排序,就能看出是什麼佔著記憶體。與之前一次正常執行的快照比較,可以看出什麼變大了。
快照中有你的機密資訊
堆積快照包含中繼記憶體中的所有內容,包括存取 token 和各供應商的 API 金鑰。絕不要原樣分享,讀完後請刪除:中繼從不刪除快照。
回報問題 #
如果上面的內容都沒有幫助,請在 github.com/oar-sh/oar/issues 提出 issue。請附上:
oar --version的輸出;oar doctor的輸出,以及oar status的輸出;- 你做了什麼、預期會發生什麼、實際發生了什麼,並附上確切的訊息;
- 與問題相符的記錄中的相關行(記錄),而不是整個檔案。
先移除機密資訊
張貼之前,請移除存取 token(包括位址中的 ?token= 部分)、API 金鑰和 tunnel token,並替換個人路徑、主機名稱和帳戶名稱。issue 是公開的。