feat(0.2.1): 单端口生产架构 —— /sync 同域反代 (去掉 13002 独立同步端口), 新增 deploy/prod 生产编排
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
name: iboard-prod
|
||||
|
||||
# iBoard 0.2.1 生产栈 (单端口对外)
|
||||
# - app : 3001 对外 (唯一入口), 内部把 /sync 反代到 powersync
|
||||
# - pg : PostgreSQL 16, 仅容器内网 (逻辑复制供同步服务消费)
|
||||
# - powersync : 同步服务, 仅容器内网 (不对外暴露端口)
|
||||
#
|
||||
# 与旧的生产方式区别: 不再依赖宿主 MySQL, 数据库与同步服务都在栈内;
|
||||
# 对外只有 3001 一个端口, 域名 https://iboard.honor3.com (NPM 反代) 即可。
|
||||
#
|
||||
# 用法 (baihu:/app/iboard-prod):
|
||||
# cp deploy/prod/.env.example deploy/prod/.env # 填密钥
|
||||
# docker compose --env-file deploy/prod/.env -f deploy/prod/docker-compose.yml up -d
|
||||
|
||||
services:
|
||||
pg:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
command: ["postgres", "-c", "wal_level=logical"]
|
||||
environment:
|
||||
POSTGRES_USER: iboard
|
||||
POSTGRES_PASSWORD: ${PG_PASSWORD:?PG_PASSWORD missing}
|
||||
POSTGRES_DB: iboard
|
||||
PS_STORAGE_PASSWORD: ${PS_STORAGE_PASSWORD:?PS_STORAGE_PASSWORD missing}
|
||||
volumes:
|
||||
- ./data/pg:/var/lib/postgresql/data
|
||||
- ./initdb:/docker-entrypoint-initdb.d:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U iboard -d iboard"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 12
|
||||
|
||||
app:
|
||||
image: iboard:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
pg:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
DATABASE_URL: postgresql://iboard:${PG_PASSWORD}@pg:5432/iboard
|
||||
PORT: "3001"
|
||||
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET missing}
|
||||
POWERSYNC_JWT_SECRET: ${POWERSYNC_JWT_SECRET:?POWERSYNC_JWT_SECRET missing}
|
||||
# 客户端拿到的同步地址 = 同域 (经由 app 的 /sync 反代)
|
||||
POWERSYNC_URL: ${PUBLIC_URL:-https://iboard.honor3.com}
|
||||
# app 内部转发同步请求到内网 powersync
|
||||
POWERSYNC_UPSTREAM: http://powersync:8080
|
||||
OTA_PUBLIC_BASE: ${PUBLIC_URL:-https://iboard.honor3.com}
|
||||
OTA_PACKAGE_DIR: /app/ota-package
|
||||
MIHOME_CACHE_DIR: /app/cache
|
||||
volumes:
|
||||
- ./data/cache:/app/cache
|
||||
ports:
|
||||
- "3001:3001"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3001/api/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 20s
|
||||
|
||||
powersync:
|
||||
image: journeyapps/powersync-service:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
pg:
|
||||
condition: service_healthy
|
||||
command: ["start", "-r", "unified"]
|
||||
volumes:
|
||||
- ./powersync/service.yaml:/config/service.yaml:ro
|
||||
- ./powersync/sync-config.yaml:/config/sync-config.yaml:ro
|
||||
environment:
|
||||
POWERSYNC_CONFIG_PATH: /config/service.yaml
|
||||
PS_SOURCE_URI: postgresql://iboard:${PG_PASSWORD}@pg:5432/iboard?sslmode=disable
|
||||
PS_STORAGE_URI: postgresql://powersync_storage:${PS_STORAGE_PASSWORD}@pg:5432/iboard?sslmode=disable
|
||||
PS_JWT_KEY_B64: ${POWERSYNC_JWT_KEY_B64:?POWERSYNC_JWT_KEY_B64 missing}
|
||||
Reference in New Issue
Block a user