Files
multica/apps/docs/content/docs/troubleshooting.zh.mdx
devv-eve 6ef711cd35 fix: gate dev verification code behind explicit env (#1773)
* fix: gate dev verification code behind explicit env

* docs: fold dev verification code into env table

* docs: clarify fixed verification code opt-in

---------

Co-authored-by: Eve <eve@multica.ai>
2026-04-28 15:14:07 +08:00

169 lines
8.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 故障排查
description: self-host Multica 遇到的 Top 7 常见问题——症状、原因、怎么查、怎么修。
---
import { Callout } from "fumadocs-ui/components/callout";
按症状查问题。每条问题都给**症状 / 可能原因 / 怎么查 / 怎么修**四段。如果你的情况不在下面,到 [GitHub](https://github.com/multica-ai/multica/issues) 提 issue。
## 守护进程连不上服务器
**症状**[`multica daemon`](/cli) 的 `status` 命令显示 `offline` 或 `connection refused`;服务器日志里没有 `/api/daemon/register` 或 `/api/daemon/heartbeat` 的请求。守护进程机制详见 [守护进程与运行时](/daemon-runtimes)。
**可能原因**
1. **`MULTICA_SERVER_URL` 指错地址** —— 默认是 `ws://localhost:8080/ws`self-host 要改成你自己的 server 地址
2. **网络 / 防火墙阻挡** —— daemon 和 server 不在同一网络,或出站被 block
3. **Token 过期或无效** —— 你从来没跑过 `multica login`,或 PAT 被撤销
4. **服务器拒绝注册** —— 你登录的账号不在目标工作区register 返 403
5. **DNS 解析失败** —— hostname 在 daemon 机器上解不出来
**怎么查**
```bash
multica daemon logs --lines 100 # 看 daemon 侧错误
echo $MULTICA_SERVER_URL # 确认地址配对
curl -i http://<server-host>:8080/health # 直接戳 server
curl -i http://<server-host>:8080/readyz # 连同 DB + migration readiness 一起检查
cat ~/.multica/config.json # 看 api_token 是否存在
multica workspace list # 确认你是目标工作区成员
```
**怎么修**:按上面原因对症处理。最常见的两个是**改 `MULTICA_SERVER_URL` 重启 daemon**`multica daemon restart`)和**重新登录**`multica logout && multica login`)。
## 任务一直卡在 queued
**症状**:把 issue 分给 agent 后issue 状态立刻变 `in_progress`,但过了很久页面没有 agent 执行的迹象;`multica daemon status` 显示 daemon `online`。
**可能原因**(按触发概率排):
1. **智能体并发上限已满** —— 该 agent 的 `max_concurrent_tasks`(默认 6已经被其他正在跑的任务占满
2. **同一 issue 上有另一个同 agent 的任务还没结束** —— 同 agent × 同 issue 强制串行(防止重复执行)
3. **智能体已经被 archive** —— 被归档后新任务仍能入队,但无法被 claim会卡到 5 分钟超时code-issue G-01
4. **Daemon 没在当前工作区注册该 runtime** —— 重启 daemon 或在 UI 重新选一次 runtime
5. **守护进程失联** —— 最近 45 秒没心跳。`daemon status` 看起来 `online` 也可能是刚失联
**怎么查**
```bash
multica daemon status --output json # runtime 列表 + last_seen_at
multica agent list # 查 agent 的 archived 状态
multica issue show <issue-id> # 看 task 历史
```
服务器侧self-host可以 grep `"no_tasks"` / `"no_capacity"` 看 claim 的结果。
**怎么修**
- 并发打满 → 等现有任务跑完,或 `multica agent update <id> --max-concurrent-tasks 10` 提升上限
- 同 issue 串行 → 等前一个任务结束,或改分给不同 agent
- Agent 被 archive → `multica agent restore <id>`
- Runtime 未注册 → `multica daemon restart`daemon 会重新注册
## WebSocket 连不上
**症状**:浏览器控制台报 `WebSocket is closed`页面不显示实时更新任务进度、评论、inbox刷新才能看到但后台任务仍在执行。
**可能原因**
1. **Origin 校验失败** —— 你的前端域名不在 server 的 CORS 白名单里。默认白名单只包含 `localhost:3000/5173/5174`self-host 到公网必须配 `FRONTEND_ORIGIN`
2. **协议不匹配** —— 前端用 `https://` 需要 `wss://`HTTP 用 `ws://`
3. **反向代理没开 WebSocket upgrade** —— Nginx / Envoy / HAProxy 默认不转发 `Upgrade` header
4. **JWT cookie 过期或丢失** —— 30 天过期后没重登
**怎么查**
- 浏览器 DevTools → Network → 筛选 "WS",看连接状态和状态码
- Server 日志里 grep `"rejected origin"` / `"websocket"` —— 如果是 origin 问题会明确写出来
- `curl -i http://<server-host>:8080/ws` 应该返回 `101 Switching Protocols`(需要带 `Upgrade` header
**怎么修**
- Origin 错 → 在 server 的 `.env` 设 `FRONTEND_ORIGIN=https://multica.yourdomain.com`(或逗号分隔的 `CORS_ALLOWED_ORIGINS`),重启 server
- 协议不匹配 → 确保 `FRONTEND_ORIGIN` 的协议和前端一致
- 反向代理 → 在 Nginx 加 `proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";`
- Cookie 过期 → 刷新页面重新登录
## 邮件没收到
**症状**:登录或邀请时提交邮箱后,收件箱(和垃圾邮件)里都没有验证码邮件。
**可能原因**
1. **`RESEND_API_KEY` 没配** —— server 会静默回落,**把验证码打到自己的 stdout 里**,不报错。生产部署很容易踩
2. **Resend API key 无效 / 余额不足** —— server 日志会有 `"failed to send verification code"`
3. **`RESEND_FROM_EMAIL` 的域名没在 Resend 验证** —— Resend 会拒发
4. **邮件发出去了但被收件人 ISP 判垃圾** —— 查 Resend dashboard 和 spam 目录
**怎么查**
- Server 日志里搜 `"[DEV] Verification code for"` —— 如果有,说明 Resend 没配,验证码被打到 stdout
- [Resend dashboard](https://resend.com/) → Emails 看发送记录
- 确认 `RESEND_FROM_EMAIL` 的域名在 Resend console 的 "Verified Domains" 列表里
**怎么修**
- 没配 API key → 照 [登录与注册配置 → 怎么配 Email](/auth-setup#email--验证码登录怎么工作) 的步骤配完重启 server
- 域名没验证 → Resend console 里走 DNS 验证流程(加 SPF / DKIM 记录)
- 紧急情况下(如内部测试)→ 从 server 日志里抄 `[DEV]` 打印出的验证码
## 固定本地测试验证码登不进去
**症状**:自部署实例,想用 `888888` 这类固定本地测试验证码登录,但被拒 `invalid or expired code`。
**可能原因**(互斥):
1. **`MULTICA_DEV_VERIFICATION_CODE` 为空** —— 固定验证码默认关闭
2. **`APP_ENV=production`** —— 这是正确的生产配置;固定本地测试验证码在 production 中会被忽略
3. **配置的验证码不是 6 位数字** —— 这个快捷码只接受 6 位数字
**怎么查**
```bash
cat .env | grep -E 'APP_ENV|MULTICA_DEV_VERIFICATION_CODE'
docker exec <container> env | grep -E 'APP_ENV|MULTICA_DEV_VERIFICATION_CODE'
```
检查邮箱(含 spam看有没有收到真实验证码。
**怎么修**
- 生产环境保持 `MULTICA_DEV_VERIFICATION_CODE` 为空,配好 Resend 后使用真实验证码
- 本地开发或内网测试可以从 server 日志抄生成的验证码;如果需要 `888888`,设置 `APP_ENV=development` 和 `MULTICA_DEV_VERIFICATION_CODE=888888`。不要在公网实例启用固定验证码(详见 [登录与注册配置 → 固定本地测试验证码](/auth-setup#固定本地测试验证码)
## 端口冲突
**症状**`multica server` 或 `multica daemon start` 启动失败,报 `address already in use`。
**可能原因**
1. **Server 端口被占用**(默认 `8080`
2. **Daemon health 端口被占用**(默认 `19514`,每个 profile 偏移一个 hash 值)
3. **Web dev server 端口冲突**`3000` / `5173`
4. **端口权限不足**(绑 `< 1024` 的 privileged port 需要 sudo
**怎么查**
```bash
lsof -i :8080 # macOS / Linux
netstat -ano | findstr :8080 # Windows
```
**怎么修**
- 杀占用进程(`kill -9 <PID>`),或改环境变量 `PORT=9000` 换端口
- 要用 80 / 443 → 别直接绑用反向代理Nginx / Caddy转发到高位端口
## 在哪看日志
| 组件 | 位置 | 命令 |
|---|---|---|
| **守护进程** | `~/.multica/daemon.log`(后台模式)或前台 stdout | `multica daemon logs -f --lines 100` |
| **服务器Docker** | container stdout | `docker logs -f <container>` |
| **服务器systemd** | journal | `journalctl -u multica-server -f` |
| **前端dev** | `pnpm dev` 所在终端 | 直接看 |
| **前端browser** | DevTools → Console | 按 `F12` |
需要更详细的 daemon 日志,把它从后台挪到前台跑:`multica daemon stop && multica daemon start --foreground`。