# 生产部署 compose(放在前端仓库根;服务器结构见仓库 README) # 前端仓: /opt/fashion/test (本文件所在) # 后端仓: /opt/fashion/backend (已对齐到当前活跃开发的后端,仅支持 PostgreSQL + pgvector) services: # ---- 数据库 (PostgreSQL + pgvector) ---- # 注意:后端代码仅支持 PostgreSQL + pgvector(gorm pgx 驱动),切勿换回 MySQL。 db: image: ankane/pgvector:latest # 预编译好 pgvector 的 PG 镜像(latest 当前底层为 PG17) restart: unless-stopped environment: POSTGRES_USER: fashion POSTGRES_PASSWORD: ${DB_PASSWORD:-fashion_dev_2026} # 生产务必换强密码 POSTGRES_DB: fashion volumes: - db_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U fashion -d fashion"] interval: 10s timeout: 5s retries: 10 # ---- 后端 (Go) ---- backend: build: context: ../backend restart: unless-stopped environment: SERVER_PORT: 8090 SSG_PORT: 8091 # SSG 内部端口(见下 ports 绑定) SSG_TOKEN: ${SSG_TOKEN:-} # 可选:非空则 SSG 接口需带 token(防御纵深) HASHID_SECRET: ${HASHID_SECRET:-} # 公开 ID 混淆盐值:生产务必注入随机串(改值会使旧链接失效,谨慎变更) GIN_MODE: release JWT_SECRET: ${JWT_SECRET:-change-me-in-prod} CORS_ALLOW_ORIGINS: ${CORS_ALLOW_ORIGINS:-https://xisoa.com,https://www.xisoa.com} RATE_LIMIT_ENABLED: ${RATE_LIMIT_ENABLED:-false} RATE_LIMIT_RPS: ${RATE_LIMIT_RPS:-20} RATE_LIMIT_BURST: ${RATE_LIMIT_BURST:-40} DB_HOST: db DB_PORT: 5432 DB_USER: ${DB_USER:-fashion} DB_PASSWORD: ${DB_PASSWORD:-fashion_dev_2026} DB_NAME: ${DB_NAME:-fashion} ports: - "8090:8090" # 对外公开 API(运行期由 nginx 反代);生产可去掉此发布,改由前端 nginx 直接反代 backend:8090 - "127.0.0.1:8091:8091" # ⚠️ SSG 内部端口:只绑宿主回环,外部网络不可达;nginx 也绝不反代它 depends_on: db: condition: service_healthy healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:8090/api/v1/public/brands?size=1"] interval: 10s timeout: 5s retries: 10 # ---- 前端 (Astro node server + nginx 反代) ---- frontend: build: context: . args: BASE_API_SSG: http://localhost:8091 # 构建期 SSG 拉数据:指向 backend 的 SSG 内部端口(配合 network: host 访问回环绑定的 8091) SSG_TOKEN: ${SSG_TOKEN:-} # 与 backend 的 SSG_TOKEN 保持一致;为空则构建期无需携带 token network: host restart: unless-stopped ports: - "80:80" depends_on: backend: condition: service_healthy volumes: db_data: