Files

iBoard 0.2.1 生产部署 (单端口, 无独立同步端口)

pg (内网) ← app (3001 对外, /sync 反代) → powersync (内网)

对外只有 3001 一个端口,域名 https://iboard.honor3.com 由 NPM 反代到这里; 同步服务不再单独暴露端口(客户端拿到的 POWERSYNC_URL 是域名本身,请求经 app 的 /sync、/socket 反代进入内网 powersync)。

首次部署顺序 (关键: publication 要在建表之后)

# 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 快照)

# 只读源库; 目标必须是空库 (有数据会跳过, 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 让它重新快照:

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