feat(infra): 新增生产 Dockerfile 与部署 compose

- api-gateway/Dockerfile: 多阶段构建,golang:1.22-alpine → alpine:3.20,CGO_ENABLED=0 静态编译,非 root 运行

- teacher-portal/Dockerfile: 多阶段构建,node:20-alpine builder → runner,含 HEALTHCHECK

- docker-compose.prod.yml: 本地生产编排,3 服务,强制 DEV_MODE=false

- docker-compose.deploy.yml: 服务器部署用,镜像来自 Gitea Registry,通过 edu-shared 外部网络连接 MySQL/Redis

- deploy.env.example: 部署环境变量模板
This commit is contained in:
SpecialX
2026-07-08 15:12:34 +08:00
parent e5902ca2b3
commit 4a0893ef52
5 changed files with 328 additions and 8 deletions

38
infra/deploy.env.example Normal file
View File

@@ -0,0 +1,38 @@
# 服务器部署环境变量模板
# 使用方式:复制到 /opt/edu/.env 并填入生产值
# cp infra/deploy.env.example /opt/edu/.env
# vim /opt/edu/.env
#
# 安全警告:
# - 此文件含敏感信息,禁止提交到 Git
# - .gitignore 已忽略 .env
# - 仅 SRE AI 或人类决策者可编辑
# ============ 数据库(服务器已有 MySQL============
# DATABASE_URL 中的 host 需用容器名(如 edu-mysql而非 localhost
# 因为应用容器通过 edu-shared 网络访问 MySQL 容器
DATABASE_URL=mysql://edu:changeme@edu-mysql:3306/next_edu_cloud
# ============ Redis服务器已有 Redis============
# 同理用容器名
REDIS_URL=redis://edu-redis:6379
# ============ JWT生产密钥必须修改============
# 生成方式openssl rand -hex 32
JWT_SECRET=CHANGE_ME_TO_STRONG_RANDOM_SECRET
JWT_ISSUER=next-edu-cloud
JWT_AUDIENCE=next-edu-cloud
# ============ 服务端口 ============
API_GATEWAY_PORT=8080
TEACHER_PORTAL_PORT=3000
# ============ KafkaP3 阶段启用P1 留空)============
KAFKA_BROKERS=
# ============ 可观测性P6 阶段启用P1 留空)============
OTEL_EXPORTER_OTLP_ENDPOINT=
LOG_LEVEL=info
# ============ 镜像 tag由 CI 注入,手动部署时可改)============
# IMAGE_TAG=latest ← 默认 latestCI 通过 export IMAGE_TAG 覆盖