Files
iboard/deploy/prod/README.md
T

60 lines
2.0 KiB
Markdown

# iBoard 0.2.1 生产部署 (单端口, 无独立同步端口)
```
pg (内网) ← app (3001 对外, /sync 反代) → powersync (内网)
```
对外只有 **3001** 一个端口,域名 `https://iboard.honor3.com` 由 NPM 反代到这里;
同步服务不再单独暴露端口(客户端拿到的 `POWERSYNC_URL` 是域名本身,请求经 app 的
`/sync`、`/socket` 反代进入内网 powersync)。
## 首次部署顺序 (关键: publication 要在建表之后)
```bash
# 0) 目录: /app/iboard-prod (源码已上传), 镜像 iboard:latest 已构建
cd /app/iboard-prod/deploy/prod
cp .env.example .env && chmod 600 .env # 填真实密钥
mkdir -p data/pg data/cache
# 1) 先只起数据库
docker compose --env-file .env up -d pg
# 2) 跑迁移建表 (一次性)
docker run --rm --network iboard-prod_default \
-e DATABASE_URL="postgresql://iboard:<PG_PASSWORD>@pg:5432/iboard" \
iboard:latest npx prisma migrate deploy
# 3) 建逻辑复制 publication (表已存在)
docker compose --env-file .env exec -T pg \
psql -U iboard -d iboard -f /dev/stdin < sql/publication.sql
# 4) 起应用与同步服务
docker compose --env-file .env up -d app powersync
# 5) 验证
curl -s http://127.0.0.1:3001/api/health
docker compose logs --tail 20 powersync # 应看到 replication 激活
```
## 数据迁移 (从现网 MySQL 快照)
```bash
# 只读源库; 目标必须是空库 (有数据会跳过, ETL_FORCE=1 强制)
docker run --rm --network iboard-prod_default \
-e DATABASE_URL="postgresql://iboard:<PG_PASSWORD>@pg:5432/iboard" \
-e SRC_DATABASE_URL="mysql://<user>:<pass>@<host>:3306/iboard" \
iboard:latest node scripts/etl-mariadb-to-pg.mjs
```
迁移后需要重启 powersync 让它重新快照:
```bash
docker compose --env-file .env restart powersync
```
## 版本与回滚
- 新版本: 构建新镜像 → `docker compose up -d app` (只重建 app, 数据卷不动)
- 回滚: 用上一次的镜像标签重新 `up -d app`
- 数据: `data/pg` 持久化; 变更前建议 `docker compose exec -T pg pg_dump -U iboard iboard > backup.sql`