部署清单 — 国内云服务器(Ubuntu 24.04 / 8C8G / 50GB)
场景:阿里云/腾讯云国内节点,域名未备案。 关键约束:未备案域名在国内云上访问 80/443 会被拦截,过渡期用 IP + 8080 直连; 备案下来后再切 80/443 + HTTPS(见文末「备案后切换」)。
1. 安全组(云控制台)
| 端口 | 用途 | 说明 |
|---|---|---|
| 22 | SSH | 建议限自己 IP |
| 8080 | Web(过渡期) | 对 0.0.0.0/0 开放 |
| 80/443 | 备案后再开 | 先不开 |
未备案期间不要把域名解析到这台服务器(会被拦截,还可能影响后续备案)。
2. 装 Docker(Ubuntu 24.04)
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl git
curl -fsSL https://get.docker.com | sudo bash
sudo usermod -aG docker $USER && newgrp docker
docker version && docker compose version配镜像加速(国内必做)——/etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.net"
]
}sudo systemctl restart docker3. 拉代码
sudo mkdir -p /opt/psb && sudo chown $USER /opt/psb
# 二选一:
git clone <你的仓库地址> /opt/psb
# 或本地打包上传:
# tar czf psb.tar.gz --exclude=node_modules --exclude=.venv --exclude=dist --exclude=release . (在 E:/Molore-源码包 下)
# scp psb.tar.gz user@服务器IP:/opt/psb/ 然后 tar xzf psb.tar.gz -C /opt/psb --strip-components=14. 配置 backend/.env(服务器上新建/修改)
ENV=production
DEBUG=false
# 三个密钥:用 openssl rand -hex 32 各生成一个
SECRET_KEY=
ADMIN_SECRET_KEY=
DATABASE_ENCRYPT_KEY=
# 对外地址(决定虎皮椒回调、邮件链接里的地址)
API_BASE_URL=http://服务器IP:8080
FRONTEND_URL=http://服务器IP:8080
ALLOWED_ORIGINS=http://服务器IP:8080
# 邮箱验证码不读取 SMTP_HOST/SMTP_PORT/SMTP_FROM 环境变量。
# 启动后在管理后台“系统配置 → 邮件配置”填写 SMTP 主机、端口、账号、授权码和发件人,
# 并发送测试邮件验证。监控 Alertmanager 的 SMTP_USER/SMTP_PASSWORD 是独立配置,见下文。
# 虎皮椒(迅虎支付)
XUNHUPAY_APP_ID=your-xunhupay-app-id
XUNHUPAY_APP_SECRET=your-xunhupay-app-secret
# 云端模型 Key(按需)
DEEPSEEK_API_KEY=
KIMI_API_KEY=
OPENCODE_API_KEY=注意:虎皮椒回调地址不用手填——API_BASE_URL 设好后自动拼出 http://服务器IP:8080/api/v1/billing/webhook/xunhupay。 如果以后把本地 psb.db 拷到服务器,system_configs 表里的 localhost 回调要改,全新库则没这问题。
5. 端口过渡调整
docker-compose.yml 里 frontend 的端口改成 8080(备案后再改回 80):
frontend:
ports:
- "8080:80"6. 启动
cd /opt/psb
docker compose up -d --build
docker compose ps
curl http://127.0.0.1:8080/health # 应返回 {"status":"ok"}
curl http://127.0.0.1:8080/ # 应返回前端 HTML浏览器访问 http://服务器IP:8080,注册第一个账号,登录后台 /admin(用 admin 账号体系另建管理员)。
7. Ollama 本地模型(可选,8G 内存跑得动)
两种装法,二选一:
- prod compose 栈内起(推荐,离线交付用):
docker-compose.prod.yml已带ollama服务(backend 自动指OLLAMA_BASE_URL=http://ollama:11434)。首次启动后拉模型:
docker exec psb-ollama ollama pull qwen3.5:0.8b # 对话,~1GB
docker exec psb-ollama ollama pull bge-m3 # 嵌入,~1.2GB- 宿主机直装:
curl -fsSL https://ollama.com/install.sh | bash
ollama pull qwen3.5:0.8b
ollama pull bge-m3宿主机直装时后端默认连 http://localhost:11434,同机即通,无需改配置。 完全不用本地模型(走外部 API/BYOK):docker compose ... up -d --scale ollama=0。
8. 备份(每天一次,留 14 天)
先确认你的部署形态再选对应段落:基础 compose(docker-compose.yml 单用)= SQLite;prod 叠加(-f docker-compose.yml -f docker-compose.prod.yml)= Postgres。
8a. SQLite 形态
sudo mkdir -p /opt/psb-backups
cat > /opt/psb/backup.sh <<'EOF'
#!/bin/bash
set -e
TS=$(date +%Y%m%d-%H%M%S)
DEST=/opt/psb-backups/$TS
mkdir -p "$DEST"
docker exec psb-backend-1 python -c "import sqlite3; c=sqlite3.connect('/data/psb.db'); sqlite3.connect('/data/backup-tmp.db').close(); c.backup(sqlite3.connect('/data/backup-tmp.db'))" 2>/dev/null || true
tar czf "$DEST/server-data.tar.gz" -C /opt/psb server-data
docker compose -f /opt/psb/docker-compose.yml exec -T minio tar czf - -C /data . > "$DEST/minio-data.tar.gz"
find /opt/psb-backups -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
echo "backup done: $DEST"
EOF
chmod +x /opt/psb/backup.sh
( crontab -l 2>/dev/null; echo "17 3 * * * /opt/psb/backup.sh >> /var/log/psb-backup.log 2>&1" ) | crontab -完整恢复点包含 server-data/(含 uploads/)和 minio-data.tar.gz;Postgres 形态还必须有 psb.dump。恢复后应实际打开文档、恢复数据包并下载同步快照验证。
8b. Postgres 形态(prod 叠加)
sudo mkdir -p /opt/psb-backups
cat > /opt/psb/backup-pg.sh <<'EOF'
#!/bin/bash
set -e
TS=$(date +%Y%m%d-%H%M%S)
DEST=/opt/psb-backups/$TS
mkdir -p "$DEST"
docker exec psb-postgres pg_dump -U psb -Fc psb > "$DEST/psb.dump"
tar czf "$DEST/server-data.tar.gz" -C /opt/psb server-data 2>/dev/null || true
docker compose -f /opt/psb/docker-compose.yml -f /opt/psb/docker-compose.prod.yml exec -T minio tar czf - -C /data . > "$DEST/minio-data.tar.gz"
find /opt/psb-backups -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
echo "backup done: $DEST"
EOF
chmod +x /opt/psb/backup-pg.sh
( crontab -l 2>/dev/null; echo "23 3 * * * /opt/psb/backup-pg.sh >> /var/log/psb-backup.log 2>&1" ) | crontab -恢复:先还原 server-data/ 与 psb.dump(cat psb.dump | docker exec -i psb-postgres pg_restore -U psb -d psb --clean --if-exists),再用 docker compose exec -T minio tar xzf - -C /data < minio-data.tar.gz 还原同步对象。 ollama 模型卷(ollama-data)不必备份——模型可随时重新 pull。
9. 备案后切换
- 域名 A 记录解析到服务器 IP;
docker-compose.yml端口改回"80:80";- 用 certbot 签证书(参考
docker-compose.prod.yml的 certbot 服务,443/SSL 反代参考nginx/grzhishiku.conf),或先apt install certbot python3-certbot-nginx -y && certbot --nginx一把梭; backend/.env把API_BASE_URL/FRONTEND_URL/ALLOWED_ORIGINS改成https://域名,docker compose up -d重启;- 虎皮椒后台把回调域名也换 https(回调地址由
API_BASE_URL自动拼接,改 env 即可)。
常见坑
- 502 Bad Gateway:后端没起来,
docker compose logs backend --tail 50;多半是密钥没配(production 会校验三个 KEY 必须改) - 注册收不到验证码:到管理后台检查业务 SMTP 配置与授权码,并发送测试邮件;生产不会把验证码写进日志
- 支付成功没到账:查回调可达性
curl http://服务器IP:8080/api/v1/billing/webhook/xunhupay -X POST(应 400 而不是超时) - 镜像拉不动:确认第 2 步加速器已重启 docker