跳到主要内容

运维手册

服务管理速查

小龙 (35.243.76.69)

# 查看所有 SayClaw 服务状态
systemctl status sayclaw-admin-api sayclaw-portal-api openclaw nginx

# 重启单个服务
systemctl restart sayclaw-admin-api
systemctl restart sayclaw-portal-api
systemctl restart openclaw # 主OC实例(⚠️ 已交付客户,慎重)
systemctl restart nginx

# Docker 容器
docker ps # 查看运行中的容器
docker restart sayclaw-mysql # 重启 MySQL
docker restart sayclaw-postgres # 重启 PostgreSQL
docker restart gitlab # 重启 GitLab
docker restart sayclaw-oneapi # 重启 One-API

# 日志
journalctl -u sayclaw-admin-api -f --since "10 min ago"
journalctl -u sayclaw-portal-api -f --since "10 min ago"
tail -f /var/log/openclaw-gw.log # 主OC实例日志
docker logs -f sayclaw-mysql # MySQL 日志
docker logs -f gitlab # GitLab 日志

小二 (34.85.76.114)

# 从小龙跳转
ssh [email protected]

# 查看所有 OC 实例
for svc in openclaw openclaw-{02..10}; do
echo "$svc: $(systemctl is-active $svc)"
done

# 重启单个实例
systemctl restart openclaw-02

# 查看实例日志
journalctl -u openclaw-02 -f

# 批量重启所有实例
for svc in openclaw openclaw-{02..10}; do
systemctl restart $svc
done

小三 (34.180.81.148)

# 直连
ssh -i ~/.ssh/id_ed25519_openclaw [email protected]

# 查看所有 OC 实例
for i in 01 02 03 04 05 06 07 08; do
echo "openclaw-$i: $(systemctl is-active openclaw-$i)"
done

# 重启单个实例
systemctl restart openclaw-08

# 查看日志
tail -f /var/log/openclaw-jp3-08.log

部署更新流程

后端更新(admin-api / portal-api)

# 1. 在小龙上拉取最新代码
cd /opt/sayclaw-backend-repo
git pull origin main

# 2. 编译
cd admin-api && go build -o /opt/sayclaw-admin-api/admin-api .
cd ../portal-api && go build -o /opt/sayclaw-portal-api/portal-api .

# 3. 重启
systemctl restart sayclaw-admin-api sayclaw-portal-api

# 4. 验证
curl -s https://api.sayclaw.ai/api/v1/health
curl -s https://portal-api.sayclaw.ai/api/v1/health

Admin 前端更新

# 1. Mac mini 本地构建
cd ~/sayclaw-admin
git pull && npm install && npm run build

# 2. 打包上传
tar czf dist.tar.gz -C dist .
scp -i ~/.ssh/id_ed25519_openclaw dist.tar.gz [email protected]:/tmp/

# 3. 服务器部署
ssh [email protected]
cd /var/www/sayclaw-admin && rm -rf assets *.js *.css
tar xzf /tmp/dist.tar.gz
chown -R www-data:www-data .

# 4. ⚠️ 必须重建 auth-callback.html(见前端部署章节)

Portal 前端更新

# 直接在服务器上
cd /opt/sayclaw-repo
git pull
rsync -av portal/ /var/www/sayclaw-app/portal/
chown -R www-data:www-data /var/www/sayclaw-app

文档站更新

# Mac mini 本地构建 + rsync(推荐,避免服务器 OOM)
cd ~/sayclaw-docs
git pull && npm install && npm run build
rsync -avz --delete build/ [email protected]:/var/www/sayclaw-docs/build/
ssh [email protected] "chown -R www-data:www-data /var/www/sayclaw-docs/build"

Nginx 操作

# 测试配置
nginx -t

# 重新加载(不中断连接)
nginx -s reload

# 新增站点
cp /etc/nginx/sites-available/template /etc/nginx/sites-available/new-site
ln -s /etc/nginx/sites-available/new-site /etc/nginx/sites-enabled/
nginx -t && nginx -s reload

# SSL 证书续期
certbot renew --dry-run # 测试
certbot renew # 正式续期

数据库操作

# 连接 MySQL
docker exec -it sayclaw-mysql mysql -uroot -p'SayClaw_MySQL_2026!' --default-character-set=utf8mb4

# 备份
docker exec sayclaw-mysql mysqldump -uroot -p'SayClaw_MySQL_2026!' --all-databases > /srv/backup/mysql_$(date +%Y%m%d).sql

# 恢复
docker exec -i sayclaw-mysql mysql -uroot -p'SayClaw_MySQL_2026!' < backup.sql

故障排查 Checklist

服务不响应

# 1. 检查服务状态
systemctl status SERVICE_NAME

# 2. 查看最近日志
journalctl -u SERVICE_NAME --since "5 min ago" --no-pager

# 3. 检查端口
ss -tlnp | grep PORT

# 4. 检查 Nginx
nginx -t
tail -20 /var/log/nginx/error.log

OC 实例不回复

# 1. 实例是否运行
systemctl is-active openclaw-NN

# 2. Gateway 是否健康
curl -s http://INSTANCE_IP:PORT/health

# 3. 模型是否配置
cat /opt/oc-home-NN/.openclaw/openclaw.json | grep model

# 4. One API 是否可达
curl -s http://35.243.76.69:3001/health

# 5. 检查日志
journalctl -u openclaw-NN --since "5 min ago"

WebChat 连不上

WebChat WS 链路 故障排查表逐项检查。

OC 实例发消息但 One API 无 LLM 日志

症状:向 OC 实例发消息,实例有回复,但小龙 One API 后台的请求日志没有记录。

根因:实例的 primary model 配置为 anthropic/claude-xxx(直连 Anthropic API),绕过了 One API 网关。只有 litellm/xxx 模型才会经过小龙的 One API。

# 检查实例当前模型
cat /opt/oc-home-NN/.openclaw/openclaw.json | python3 -c "
import json,sys
d=json.load(sys.stdin)
print(d[agents][defaults][model][primary])
"
# 如果输出是 anthropic/claude-... → 需要修改
# 正确应该是 litellm/claude-sonnet-4-6 等

# 修复:改为走 One API 的模型
python3 -c "
import json
path = /opt/oc-home-NN/.openclaw/openclaw.json
d = json.load(open(path))
d[agents][defaults][model][primary] = litellm/claude-sonnet-4-6
json.dump(d, open(path,w), indent=2, ensure_ascii=False)
print(done)
"
# 重启实例
systemctl restart openclaw-NN

可用的 litellm 模型名(需与 One API 渠道名一致):

模型 key说明
litellm/claude-sonnet-4-6Claude Sonnet(推荐默认)
litellm/claude-opus-4-6Claude Opus(高质量,贵)
litellm/claude-haiku-3-5Claude Haiku(轻量快速)
litellm/gpt-4oGPT-4o
litellm/gemini-2.5-flashGemini Flash

⚠️ 使用 anthropic/ 前缀的模型走直连,费用不经过 One API 统计,无法在管理后台追踪用量。


GCP OAuth 配置

用途Client ID
Admin204916387190-f1so9ookndhe8t4k60s3bf221f9lkqha.apps.googleusercontent.com
Portal204916387190-28sfgijlhhddhgb93hafouvkct1m3hm8.apps.googleusercontent.com

Redirect URIs:

  • Admin: https://api.sayclaw.ai/api/v1/auth/google/callback
  • Portal: https://portal-api.sayclaw.ai/api/v1/auth/google/callback

修改 OAuth 配置:GCP Console → APIs & Services → Credentials