# 开发与部署手册

## SSH

```bash
ssh -i ~/.ssh/id_ed25519_1390 root@13.140.229.90
# 或密码登录（过渡期）；勿关闭密码直到密钥都验证通过
```

主机指纹（重装后）：`SHA256:DcIJVHc5j1bQEWcYglciRGHnMve8104H1MLtS4iyWNU`（ED25519）

## Caddy

```bash
# 编辑
nano /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy
journalctl -u caddy -f
```

## Rakazo

```bash
cd /opt/rakazo
# 环境变量在 .env（含 OPENAI_API_KEY、RAKAZO_LOCAL_MODELS*）
docker compose --env-file .env -f docker-compose.images.yml ps
docker compose --env-file .env -f docker-compose.images.yml up -d
docker compose --env-file .env -f docker-compose.images.yml logs -f api
```

关键变量（值放 `.env`，勿提交）：

```
RAKAZO_LOCAL_MODELS=gpt-6-luna,gpt-5.6-luna
RAKAZO_LOCAL_MODELS_URL=https://api.cleanai.io/v1
OPENAI_API_KEY=...
PI_DEFAULT_MODEL=gpt-6-luna
RAKAZO_OPENAI_COMPAT_ALLOW_PUBLIC=1
BETTER_AUTH_URL / WEB_ORIGIN / API_URL / RAKAZO_HOST = 公网 HTTPS 域名
```

## OpenMausBot

```bash
cd /opt/openmausbot/deploy
docker compose ps
docker compose logs -f omb
# 配对
docker compose exec omb node dist-server/pair-cli.js
```

主机 Caddy 反代 `127.0.0.1:8081`（容器内嵌 Caddy 已改为 HTTP-only :80）。  
openai-compat 实例写在数据卷 `.openmausbot/config.json` 的 `instances` 下（已预置 `cleanai-luna` → gpt-6-luna）。

## Open Duet

```bash
cd /opt/openduets
# 密钥文件 open-dots.env（含 TOKEN_ENCRYPTION_KEYS）必须备份
docker compose -f compose.yaml build
docker compose -f compose.yaml up -d
docker compose exec open-dots python -m app.auth.cli set-passphrase
docker compose exec open-dots python -m app.server doctor
```

监听 `127.0.0.1:8000`，由主机 Caddy 提供 HTTPS。

## OpenBot

```bash
cd /opt/openbot
# compose.yaml + seccomp.json 来自上游
docker compose pull && docker compose up -d
docker compose exec openbot openbot login
docker compose exec openbot openbot status
```

无对外 HTTP 端口；落地页仅说明用途。

## Munder Difflin

桌面应用；服务器只托管静态落地页 `/var/www/munder`。可选克隆：`/opt/munder-difflin`。

## 更新流程（通用）

1. 备份 `.env` / 数据卷 / 加密密钥  
2. `git pull` 或 `docker compose pull`  
3. `up -d` / `build`  
4. 跑一次模型冒烟（发「ping」）  
5. 记入 `/home/box/shared/server-changelog.md`（或本机变更日志）
