跳到主要内容

基础设施部署

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_openclawMac 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]