60 lines
2.0 KiB
Markdown
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`
|