# 生产部署 compose(放在前端仓库根,服务器结构见 DEPLOY.md) # 前端仓: /opt/fashion/test (本文件所在) # 后端仓: /opt/fashion/backend (注意:已对齐到当前活跃开发的后端,原 admin/backend 为旧扁平版) services: # ---- 数据库 ---- db: image: mysql:8.0 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root} MYSQL_DATABASE: ${DB_NAME:-fashionadmin} volumes: - db_data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${DB_PASSWORD:-root}"] 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} DB_HOST: db DB_PORT: 3306 DB_USER: ${DB_USER:-root} DB_PASSWORD: ${DB_PASSWORD:-root} DB_NAME: ${DB_NAME:-fashionadmin} 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/public/brands?size=1"] interval: 10s timeout: 5s retries: 10 # ---- 前端 (Astro 静态 + nginx) ---- frontend: build: context: . args: SSG_API: http://localhost:8091 # 构建期 SSG 拉数据:指向 backend 的 SSG 内部端口(配合 network: host 访问回环绑定的 8091) API_SSR: http://localhost:8091 # 兼容旧命名(效果同 SSG_API) 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: