# 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: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:5432/iboard" \ -e SRC_DATABASE_URL="mysql://:@: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`