基础设施部署
1. Docker 容器
MySQL 8.0
docker run -d \
--name sayclaw-mysql \
--restart always \
-p 127.0.0.1:3306:3306 \
-v /srv/mysql/data:/var/lib/mysql \
-v /srv/mysql/init:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD='SayClaw_MySQL_2026!' \
-e MYSQL_CHARACTER_SET_SERVER=utf8mb4 \
-e MYSQL_COLLATION_SERVER=utf8mb4_unicode_ci \
mysql:8.0
初始化数据库:
CREATE DATABASE IF NOT EXISTS sayclaw_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS sayclaw_portal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
PostgreSQL 15
docker run -d \
--name sayclaw-postgres \
--restart always \
-p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD='SayClaw_PG_2026!' \
-v pgdata:/var/lib/postgresql/data \
postgres:15-alpine
PostgreSQL 用于 One API / One-API 的内部数据存储。
GitLab CE
docker run -d \
--name gitlab \
--restart always \
-p 8929:80 \
-p 2222:22 \
-v /srv/gitlab/config:/etc/gitlab \
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
注意
GitLab 首次启动需要 3-5 分钟初始化。用 docker logs -f gitlab 查看进度。
One-API (模型网关)
docker run -d \
--name sayclaw-oneapi \
--restart always \
-p 3001:3000 \
-e SQL_DSN='root:SayClaw_MySQL_2026!@tcp(172.17.0.1:3306)/oneapi' \
justsong/one-api:latest
One-API 替代了早期的 One API,统一代理 Claude / GPT / Gemini 请求。
2. Nginx
安装
apt update && apt install -y nginx certbot python3-certbot-nginx
站点配置文件
所有配置放在 /etc/nginx/sites-available/,软链到 /etc/nginx/sites-enabled/:
/etc/nginx/sites-enabled/
├── gitlab # git.sayclaw.ai → :8929
├── sayclaw # api.sayclaw.ai → :8081 + /oc-ws WS代理
├── sayclaw-admin # admin.sayclaw.ai → /var/www/sayclaw-admin
├── sayclaw-app # app.sayclaw.ai → /var/www/sayclaw-app
├── sayclaw-design # design.sayclaw.ai → /var/www/sayclaw-design
├── sayclaw-docs # doc.sayclaw.ai → /var/www/sayclaw-docs/build
├── sayclaw-llm # llm.sayclaw.ai → :3001
├── sayclaw-m # m.sayclaw.ai → /var/www/sayclaw-app
├── sayclaw-portal-api # portal-api.sayclaw.ai → :8082
└── seven.sayclaw.ai # seven.sayclaw.ai → :18789
/etc/nginx/conf.d/
└── oc-ws-map.conf # WebSocket 实例路由映射
SSL 证书
使用 Certbot 自动申请 Let's Encrypt 证书:
certbot --nginx -d api.sayclaw.ai
certbot --nginx -d admin.sayclaw.ai
certbot --nginx -d doc.sayclaw.ai
certbot --nginx -d git.sayclaw.ai
certbot --nginx -d llm.sayclaw.ai
certbot --nginx -d m.sayclaw.ai
certbot --nginx -d seven.sayclaw.ai
certbot --nginx -d design.sayclaw.ai
自动续期已由 Certbot 的 systemd timer 管理。
3. Cloudflare DNS
Zone ID: 425a1cc1a4abfa59192c66bc1add61c3
所有子域名 A 记录指向 35.243.76.69(小龙),默认开启 Proxy(橙色云朵)。
提示
m.sayclaw.ai 是例外——DNS-only(灰色云朵),直接解析到小龙 IP,因为 Cloudflare Proxy 会干扰 WebSocket。
4. SSH 密钥
| 密钥 | 位置 | 用途 |
|---|---|---|
| id_ed25519_openclaw | Mac mini ~/.ssh/ | Mac → 小龙/小三 直连 |
| id_ed25519 | 小龙 /root/.ssh/ | 小龙 → 小二 跳板 |
# Mac → 小龙
ssh -i ~/.ssh/id_ed25519_openclaw [email protected]
# Mac → 小三
ssh -i ~/.ssh/id_ed25519_openclaw [email protected]
# 小龙 → 小二(从小龙内部执行)
ssh [email protected]