feat(docker): 云端部署配置 — host 网络模式 + 环境变量模板

- Dockerfile: Rust 版本升级为 latest stable, 添加 curl (healthcheck),
  前端产物 VOLUME 暴露供 OpenResty 挂载
- docker-compose.cloud.yml: 仅 app 容器, host 网络直连宿主机 PG/Redis
- .env.production.example: 环境变量模板含必填/可选项注释
This commit is contained in:
iven
2026-05-17 15:06:53 +08:00
parent b8ce19f5dc
commit d5ec250184
4 changed files with 86 additions and 43 deletions

View File

@@ -1,7 +1,7 @@
# ============================== # ==============================
# Stage 1: Build Rust backend # Stage 1: Build Rust backend
# ============================== # ==============================
FROM rust:1.85-bookworm AS rust-builder FROM rust:1-bookworm AS rust-builder
WORKDIR /app WORKDIR /app
@@ -75,6 +75,7 @@ FROM debian:bookworm-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \ ca-certificates \
curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
WORKDIR /app WORKDIR /app
@@ -85,7 +86,7 @@ COPY --from=rust-builder /app/target/release/erp-server /app/erp-server
# 复制配置文件 # 复制配置文件
COPY config/ /app/config/ COPY config/ /app/config/
# 复制前端构建产物 # 复制前端构建产物(可通过 volume 暴露给 OpenResty
COPY --from=frontend-builder /app/apps/web/dist/ /app/static/ COPY --from=frontend-builder /app/apps/web/dist/ /app/static/
# 创建上传目录 # 创建上传目录
@@ -96,7 +97,7 @@ RUN useradd -r -s /bin/false appuser \
&& chown -R appuser:appuser /app && chown -R appuser:appuser /app
USER appuser USER appuser
# 环境变量(运行时通过 docker-compose 覆盖) # 环境变量(运行时通过 docker-compose / .env 覆盖)
ENV ERP__SERVER__HOST=0.0.0.0 ENV ERP__SERVER__HOST=0.0.0.0
ENV ERP__SERVER__PORT=3000 ENV ERP__SERVER__PORT=3000
ENV ERP__SERVER__METRICS_PORT=9090 ENV ERP__SERVER__METRICS_PORT=9090
@@ -104,7 +105,7 @@ ENV ERP__STORAGE__UPLOAD_DIR=/app/uploads
EXPOSE 3000 9090 EXPOSE 3000 9090
VOLUME ["/app/uploads"] VOLUME ["/app/uploads", "/app/static"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
CMD curl -f http://localhost:3000/api/v1/health || exit 1 CMD curl -f http://localhost:3000/api/v1/health || exit 1

View File

@@ -1,51 +1,52 @@
# ============================================== # HMS 云端部署环境变量
# HMS 生产环境变量模板 # 复制此文件为 .env.production 并填写实际值
# 复制为 .env.production 并填写实际值 # cp .env.production.example .env.production
# ==============================================
# ---- 应用 ---- # ===== 必填 =====
APP_PORT=3000
METRICS_PORT=9090
# ---- 数据库(必填)---- # PostgreSQL 连接host 网络模式,直连宿主机)
POSTGRES_USER=erp ERP__DATABASE__URL=postgres://erp:YOUR_PG_PASSWORD@localhost:5432/erp
POSTGRES_PASSWORD=__CHANGE_ME__
POSTGRES_DB=erp
POSTGRES_PORT=5432
# ---- Redis必填---- # Redis 连接
REDIS_PASSWORD=__CHANGE_ME__ ERP__REDIS__URL=redis://:YOUR_REDIS_PASSWORD@localhost:6379
REDIS_PORT=6379
# ---- JWT必填---- # JWT 密钥(至少 32 字符随机字符串)
ERP__JWT__SECRET=__CHANGE_ME__ ERP__JWT__SECRET=CHANGE_ME_TO_A_RANDOM_STRING_AT_LEAST_32_CHARS
ERP__JWT__ACCESS_TOKEN_TTL=15m
ERP__JWT__REFRESH_TOKEN_TTL=7d
# ---- 超级管理员(必填)---- # 超级管理员初始密码(首次启动时创建 admin 用户)
ERP__AUTH__SUPER_ADMIN_PASSWORD=__CHANGE_ME__ ERP__AUTH__SUPER_ADMIN_PASSWORD=CHANGE_ME_ADMIN_PASSWORD
# ---- PII 加密密钥(必填)---- # PII 加密密钥(AES-256 KEK64 位十六进制)
ERP__CRYPTO__KEK=__CHANGE_ME__ ERP__CRYPTO__KEK=CHANGE_ME_64_HEX_CHARS_FOR_AES256_KEY
ERP__HEALTH__AES_KEY=__CHANGE_ME__
ERP__HEALTH__HMAC_KEY=__CHANGE_ME__
# ---- CORS ---- # 健康数据加密密钥
ERP__CORS__ALLOWED_ORIGINS=["https://your-domain.com"] ERP__HEALTH__AES_KEY=CHANGE_ME_64_HEX_CHARS
ERP__HEALTH__HMAC_KEY=CHANGE_ME_64_HEX_CHARS
# ---- 微信小程序可选dev_mode=true 可跳过)---- # ===== 可选 =====
ERP__WECHAT__DEV_MODE=false
ERP__WECHAT__APPID=
ERP__WECHAT__SECRET=
# ---- AI 配置(可选)---- # 服务端口(默认 3000
ERP__AI__DEFAULT_PROVIDER=ollama ERP__SERVER__PORT=3000
ERP__AI__OLLAMA__BASE_URL=http://ollama:11434
ERP__AI__OLLAMA__MODEL=qwen3:4b
# ---- 日志 ---- # Prometheus 指标端口(默认 9090
ERP__SERVER__METRICS_PORT=9090
# CORS 允许的来源(逗号分隔)
ERP__CORS__ALLOWED_ORIGINS=https://your-domain.com,https://www.your-domain.com
# 上传目录
ERP__STORAGE__UPLOAD_DIR=/app/uploads
# 日志级别
ERP__LOG__LEVEL=info ERP__LOG__LEVEL=info
# ---- 存储 ---- # 微信小程序配置(不需要小程序功能可留空)
ERP__STORAGE__UPLOAD_DIR=/app/uploads ERP__WECHAT__APPID=
ERP__STORAGE__MAX_FILE_SIZE=10485760 ERP__WECHAT__SECRET=
ERP__WECHAT__DEV_MODE=false
# AI 模块配置(不需要 AI 功能可留空)
ERP__AI__DEFAULT_PROVIDER=ollama
ERP__AI__API_KEY=
ERP__AI__BASE_URL=http://localhost:11434
ERP__AI__MODEL=qwen2.5:7b

1
docker/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.env.production

View File

@@ -0,0 +1,40 @@
# 云端部署配置 — 仅启动应用容器PG/Redis 使用宿主机已安装的服务
# 使用方式: docker compose -f docker/docker-compose.cloud.yml up -d
#
# 前置条件:
# 1. 宿主机已安装 PostgreSQL 16 + Redis 7
# 2. PostgreSQL 已创建数据库和用户
# 3. 复制 .env.production.example 为 .env.production 并填写实际值
# 4. OpenResty 反代配置:
# - /api/* → http://localhost:3000
# - /uploads/* → http://localhost:3000
# - / → 前端静态文件 (挂载 /opt/hms/static/)
services:
app:
build:
context: ..
dockerfile: Dockerfile
container_name: hms-server
restart: unless-stopped
network_mode: host
env_file:
- .env.production
volumes:
- ../uploads:/app/uploads
- ../config:/app/config:ro
- ../static:/app/static
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1/health"]
interval: 30s
timeout: 5s
start_period: 60s
retries: 3
deploy:
resources:
limits:
cpus: "2"
memory: 1024M
reservations:
cpus: "0.5"
memory: 256M