生产环境部署指南:Docker Compose与Traefik配置
本文详细介绍了Full Stack FastAPI PostgreSQL项目在生产环境中的完整部署方案。文章涵盖了多环境Docker Compose配置管理、Traefik反向代理与HTTPS证书自动化、环境变量管理与安全密钥配置,以及GitHub Actions自动化部署流程四个核心部分。通过环境变量驱动的架构设计、多Docker Compose文件策略、自动化的HTTPS证书管理、安全密钥验证机制和CI/CD自动化流水线,为生产环境提供了企业级的部署解决方案和安全保障。
多环境Docker Compose配置管理
在现代应用部署中,多环境配置管理是确保应用在不同阶段(开发、测试、生产)能够正确运行的关键。Full Stack FastAPI PostgreSQL项目通过精心设计的Docker Compose配置体系,实现了优雅的多环境管理方案。
环境变量驱动的配置架构
项目采用环境变量作为配置管理的核心机制,通过.env文件和环境变量注入实现多环境适配:
# backend/app/core/config.py 中的配置类
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file="../.env", # 使用上级目录的.env文件
env_ignore_empty=True,
extra="ignore",
)
ENVIRONMENT: Literal["local", "staging", "production"] = "local"
这种设计允许通过单个.env文件控制所有环境的配置,同时保持代码的一致性。
多Docker Compose文件策略
项目采用Docker Compose的多文件特性来实现环境差异化配置:
| 文件名称 | 用途 | 适用环境 |
|---|---|---|
docker-compose.yml |
基础服务定义 | 所有环境 |
docker-compose.override.yml |
本地开发配置 | 开发环境 |
docker-compose.traefik.yml |
生产环境Traefik配置 | 生产环境 |
# docker-compose.yml - 基础配置
services:
backend:
image: '${DOCKER_IMAGE_BACKEND?Variable not set}:${TAG-latest}'
environment:
- ENVIRONMENT=${ENVIRONMENT}
- DOMAIN=${DOMAIN}
# docker-compose.override.yml - 开发环境特定配置
services:
backend:
restart: "no"
ports:
- "8000:8000"
command:
- fastapi
- run
- --reload
- "app/main.py"
develop:
watch:
- path: ./backend
action: sync
环境特定的变量配置
通过ENVIRONMENT环境变量,应用可以识别当前运行环境并调整行为:
graph TD
A[环境变量 ENVIRONMENT] --> B{环境判断}
B -->|local| C[开发环境配置]
B -->|staging| D[预发布环境配置]
B -->|production| E[生产环境配置]
C --> F[启用热重载]
C --> G[本地数据库端口映射]
C --> H[禁用HTTPS重定向]
D --> I[预发布特定配置]
D --> J[测试数据初始化]
E --> K[生产级安全配置]
E --> L[HTTPS强制启用]
E --> M[性能优化参数]
组合使用示例
根据不同环境组合使用Docker Compose文件:
开发环境:
# 使用基础配置 + 开发覆盖配置
docker-compose -f docker-compose.yml -f docker-compose.override.yml up
生产环境:
# 使用基础配置 + Traefik生产配置
docker-compose -f docker-compose.yml -f docker-compose.traefik.yml up
环境敏感的配置验证
项目实现了环境感知的配置验证机制,确保生产环境的安全性:
def _check_default_secret(self, var_name: str, value: str | None) -> None:
if value == "changethis":
message = f'The value of {var_name} is "changethis"'
if self.ENVIRONMENT == "local":
warnings.warn(message, stacklevel=1) # 开发环境仅警告
else:
raise ValueError(message) # 生产环境直接报错
端口和服务发现配置
不同环境下的服务发现和端口配置:
| 环境 | API URL | 前端URL | 数据库端口 | 管理界面 |
|---|---|---|---|---|
| 开发 | http://localhost:8000 | http://localhost:5173 | 5432 | 本地访问 |
| 生产 | https://api.example.com | https://dashboard.example.com | 内部网络 | 域名访问 |
# 开发环境前端配置
frontend:
build:
args:
- VITE_API_URL=http://localhost:8000
- NODE_ENV=development
# 生产环境前端配置
frontend:
build:
args:
- VITE_API_URL=https://api.${DOMAIN?Variable not set}
- NODE_ENV=production
网络配置差异化
不同环境下的网络配置策略:
flowchart LR
subgraph Development [开发环境]
A[外部网络访问]
B[端口直接映射]
C[本地Traefik代理]
end
subgraph Production [生产环境]
D[内部网络隔离]
E[Traefik入口控制]
F[HTTPS证书管理]
end
A -->|用户直接访问| B
C -->|本地域名代理| A
E -->|生产域名路由| D
F -->|SSL终止| E
环境变量继承和覆盖机制
项目采用灵活的变量继承机制:
# .env 文件示例
ENVIRONMENT=production
DOMAIN=example.com
POSTGRES_PASSWORD=secure_password_123
# 开发环境覆盖
# 在开发时设置 ENVIRONMENT=local
这种多环境Docker Compose配置管理方案确保了从开发到生产的平滑过渡,同时保持了配置的一致性和环境隔离性。通过环境变量驱动和文件组合的策略,实现了配置的灵活性和可维护性。
Traefik反向代理与HTTPS证书自动化
在现代Web应用部署中,安全可靠的网络通信是至关重要的。Full Stack FastAPI Template项目采用了Traefik作为反向代理解决方案,并结合Let's Encrypt实现了全自动的HTTPS证书管理,为生产环境提供了企业级的网络安全保障。
Traefik架构设计与工作原理
Traefik是一个现代化的反向代理和负载均衡器,专为容器化环境设计。在该项目中,Traefik承担着关键的网关角色,负责处理所有入站请求、SSL/TLS终止以及服务路由。
flowchart TD
A[客户端请求] --> B[Traefik反向代理]
B --> C{HTTP/HTTPS判断}
C -->|HTTP| D[重定向到HTTPS]
C -->|HTTPS| E[TLS终止]
E --> F[路由到对应服务]
F --> G[前端应用]
F --> H[后端API]
F --> I[Adminer数据库管理]
F --> J[Traefik仪表板]
HTTPS证书自动化配置
项目通过Let's Encrypt实现了完全自动化的SSL证书管理。以下是核心配置的实现细节:
Traefik Docker Compose配置
services:
traefik:
image: traefik:3.0
ports:
- 80:80 # HTTP端口
- 443:443 # HTTPS端口
command:
- --providers.docker
- --providers.docker.exposedbydefault=false
- --entrypoints.http.address=:80
- --entrypoints.https.address=:443
- --certificatesresolvers.le.acme.email=${EMAIL?Variable not set}
- --certificatesresolvers.le.acme.storage=/certificates/acme.json
- --certificatesresolvers.le.acme.tlschallenge=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-public-certificates:/certificates
服务标签配置示例
每个需要HTTPS的服务都通过Docker标签进行配置:
labels:
- traefik.enable=true
- traefik.docker.network=traefik-public
- traefik.http.services.${STACK_NAME}-backend.loadbalancer.server.port=8000
- traefik.http.routers.${STACK_NAME}-backend-https.rule=Host(`api.${DOMAIN}`)
- traefik.http.routers.${STACK_NAME}-backend-https.entrypoints=https
- traefik.http.routers.${STACK_NAME}-backend-https.tls=true
- traefik.http.routers.${STACK_NAME}-backend-https.tls.certresolver=le
- traefik.http.routers.${STACK_NAME}-backend-http.middlewares=https-redirect
证书解析器与ACME配置
项目使用TLS Challenge方式进行证书验证,这是最可靠的ACME验证方式之一:
| 配置项 | 值 | 说明 |
|---|---|---|
| 证书解析器 | le | Let's Encrypt解析器名称 |
| ACME邮箱 | ${EMAIL} | 证书通知和续期邮件 |
| 存储位置 | /certificates/acme.json | 证书存储文件 |
| 挑战类型 | tlschallenge | TLS挑战验证方式 |
| 证书类型 | RSA | 默认证书类型 |
| 密钥类型 | EC256 | 私钥类型 |
自动重定向机制
为了实现HTTP到HTTPS的无缝重定向,项目配置了专门的中间件:
# HTTPS重定向中间件
- traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
# 应用到HTTP路由器
- traefik.http.routers.${STACK_NAME}-backend-http.middlewares=https-redirect
多服务路由配置
项目支持多个子域名的HTTPS访问,每个服务都有独立的路由配置:
| 服务 | 子域名 | 端口 | 功能 |
|---|---|---|---|
| 前端应用 | dashboard.${DOMAIN} | 80 | React用户界面 |
| 后端API | api.${DOMAIN} | 8000 | FastAPI REST接口 |
| Adminer | adminer.${DOMAIN} | 8080 | 数据库管理工具 |
| Traefik仪表板 | traefik.${DOMAIN} | 8080 | 代理监控界面 |
证书生命周期管理
Traefik自动处理证书的整个生命周期:
sequenceDiagram
participant C as Client
participant T as Traefik
participant LE as Let's Encrypt
participant S as Service
C->>T: HTTPS请求(新域名)
T->>LE: 证书申请(TLS Challenge)
LE->>T: 验证请求
T->>LE: 验证响应
LE->>T: 签发证书
T->>S: 代理请求(使用新证书)
S->>T: 响应数据
T->>C: 加密响应
loop 证书续期
T->>LE: 定期检查证书有效期
LE->>T: 自动续期证书
end
安全最佳实践
项目实现了多项安全最佳实践:
- HTTP严格传输安全(HSTS):通过永久重定向强制使用HTTPS
- 证书自动续期:Traefik自动监控和续期即将过期的证书
- 安全密钥存储:证书存储在Docker卷中,确保容器重启后不丢失
- 最小权限原则:Traefik以只读方式访问Docker socket
- 访问控制:Traefik仪表板受HTTP Basic认证保护
环境变量配置
部署前需要设置的关键环境变量:
# Traefik基础认证
export USERNAME=admin
export PASSWORD=securepassword
export HASHED_PASSWORD=$(openssl passwd -apr1 $PASSWORD)
# 域名和证书配置
export DOMAIN=your-domain.com
export EMAIL=admin@your-domain.com
# 应用栈配置
export STACK_NAME=production-stack
export ENVIRONMENT=production
故障排除与监控
当证书相关问题时,可以通过以下方式排查:
- 检查证书状态:访问Traefik仪表板查看证书信息
- 查看日志:
docker logs traefik查看详细错误信息 - 验证DNS配置:确保域名正确解析到服务器IP
- 检查端口开放:确认80和443端口在防火墙中开放
- 验证ACME挑战:检查TLS挑战是否能正常完成
性能优化建议
对于高流量场景,可以考虑以下优化措施:
- 启用证书缓存和预加载
- 配置OCSP Stapling减少证书验证延迟
- 使用ECDSA证书提升握手性能
- 调整TLS版本和密码套件
- 启用HTTP/2协议支持
通过这套完整的Traefik和HTTPS自动化解决方案,Full Stack FastAPI Template项目确保了生产环境的安全性和可靠性,同时大大简化了运维复杂度。证书的自动管理和续期功能让开发者可以专注于业务逻辑,而无需担心SSL证书的维护工作。
环境变量管理与安全密钥配置
在生产环境部署中,环境变量的管理和安全密钥的配置是确保系统安全性的关键环节。Full Stack FastAPI PostgreSQL 项目采用了基于 Pydantic 的配置管理系统,通过环境变量注入敏感信息,实现了开发、测试和生产环境的安全隔离。
环境变量架构设计
项目采用分层环境变量管理架构,通过 .env 文件集中管理所有配置参数。这种设计确保了配置的一致性和安全性:
flowchart TD
A[环境变量源] --> B[.env 文件]
A --> C[系统环境变量]
A --> D[Docker Compose 注入]
B --> E[Pydantic Settings 配置类]
C --> E
D --> E
E --> F[应用配置验证]
F --> G[安全密钥检查]
G --> H[配置生效]
subgraph SecurityCheck[安全检查]
I[默认值检测]
J[生产环境强制验证]
K[敏感信息加密]
end
G --> SecurityCheck
SecurityCheck --> H
核心安全环境变量
项目定义了多个关键安全环境变量,每个变量都有特定的安全要求:
| 环境变量 | 默认值 | 安全要求 | 生成方法 | 用途 |
|---|---|---|---|---|
SECRET_KEY |
changethis |
32字节随机字符串 | secrets.token_urlsafe(32) |
JWT令牌签名密钥 |
POSTGRES_PASSWORD |
changethis |
强密码 | 随机生成 | 数据库访问密码 |
FIRST_SUPERUSER_PASSWORD |
changethis |
强密码 | 随机生成 | 初始管理员密码 |
SMTP_PASSWORD |
空 | 邮箱服务密码 | 手动配置 | 邮件服务认证 |
安全密钥生成与验证机制
项目内置了安全密钥生成和验证机制,确保生产环境不会使用默认的测试密钥:
# 安全密钥生成命令
python -c "import secrets; print(secrets.token_urlsafe(32))"
# Pydantic 配置验证逻辑
def _check_default_secret(self, var_name: str, value: str | None) -> None:
if value == "changethis":
message = (
f'The value of {var_name} is "changethis", '
"for security, please change it, at least for deployments."
)
if self.ENVIRONMENT == "local":
warnings.warn(message, stacklevel=1)
else:
raise ValueError(message)
环境变量分类管理
根据敏感程度和使用场景,环境变量分为三类:
pie title 环境变量分类
"高度敏感密钥" : 4
"服务配置信息" : 6
"应用运行参数" : 8
高度敏感密钥(必须加密存储):
SECRET_KEY- JWT签名密钥POSTGRES_PASSWORD- 数据库密码FIRST_SUPERUSER_PASSWORD- 管理员密码SMTP_PASSWORD- 邮件服务密码
服务配置信息:
SMTP_HOST- 邮件服务器地址SMTP_USER- 邮件服务用户名EMAILS_FROM_EMAIL- 发件邮箱地址POSTGRES_SERVER- 数据库服务器POSTGRES_USER- 数据库用户名SENTRY_DSN- 错误监控服务地址
应用运行参数:
ENVIRONMENT- 运行环境标识DOMAIN- 服务域名FRONTEND_HOST- 前端地址BACKEND_CORS_ORIGINS- CORS允许来源
生产环境部署最佳实践
1. 密钥生成与替换
在生产部署前,必须生成并替换所有默认密钥:
# 生成安全的随机密钥
SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
POSTGRES_PASSWORD=$(python -c "import secrets; print(secrets.token_urlsafe(16))")
FIRST_SUPERUSER_PASSWORD=$(python -c "import secrets; print(secrets.token_urlsafe(16))")
# 更新 .env 文件
sed -i "s/SECRET_KEY=changethis/SECRET_KEY=$SECRET_KEY/" .env
sed -i "s/POSTGRES_PASSWORD=changethis/POSTGRES_PASSWORD=$POSTGRES_PASSWORD/" .env
sed -i "s/FIRST_SUPERUSER_PASSWORD=changethis/FIRST_SUPERUSER_PASSWORD=$FIRST_SUPERUSER_PASSWORD/" .env
2. 环境特定的配置管理
针对不同环境,应采用不同的配置策略:
stateDiagram-v2
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00