Files
ai-app-database/docker-compose.external-db.yml
huty 3ad430e3e3 feat: 添加 Docker 容器化部署支持
支持两种部署模式,兼容新建 MySQL 和现有 MySQL:

- Dockerfile:Python 3.12-slim 两阶段构建,非 root 运行
- docker-compose.yml:全栈模式(含 MySQL 8.0 + 可选 Nginx)
- docker-compose.external-db.yml:接入现有 MySQL 模式
- docker/entrypoint.sh:自动等待 DB 就绪 → 初始化表 → 启动 Gunicorn
- docker/nginx.conf:反向代理 + 静态文件直出 + 安全响应头
- .env.docker.example / .env.external-db.example:各模式配置示例
- .gitattributes:确保 entrypoint.sh 在 Windows 上保持 LF 换行

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 00:38:14 +09:00

90 lines
3.4 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ═══════════════════════════════════════════════════════════════
# docker-compose.external-db.yml — 模式二:使用现有 MySQL
#
# 适用场景:
# - 已有云数据库(如 RDS、本项目使用的 pma.hty1024.com:31000
# - 不想在容器内运行 MySQL
#
# 用法:
# cp .env.external-db.example .env.external-db
# # 编辑 .env.external-db 填写实际数据库连接信息
# docker compose -f docker-compose.external-db.yml \
# --env-file .env.external-db up -d
#
# 包含服务:
# app — Flask + Gunicorn
# nginx — Nginx 反向代理(可选,使用 --profile nginx 启用)
# ═══════════════════════════════════════════════════════════════
services:
# ── Flask 应用 ──────────────────────────────────────────────
app:
build:
context: .
dockerfile: Dockerfile
image: resource-library:latest
container_name: resource_library_app
restart: unless-stopped
environment:
FLASK_ENV: ${FLASK_ENV:-production}
SECRET_KEY: ${SECRET_KEY}
DATABASE_URL: ${DATABASE_URL} # 完整连接串,见 .env.external-db.example
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-Admin@123456}
ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@example.com}
GUNICORN_WORKERS: ${GUNICORN_WORKERS:-4}
GUNICORN_TIMEOUT: ${GUNICORN_TIMEOUT:-120}
MAX_UPLOAD_SIZE_MB: ${MAX_UPLOAD_SIZE_MB:-500}
LOG_LEVEL: ${LOG_LEVEL:-info}
# 外部数据库等待超时(秒)
DB_WAIT_SECONDS: ${DB_WAIT_SECONDS:-30}
volumes:
- uploads_data:/app/app/static/uploads
ports:
- "${APP_PORT:-5000}:5000"
extra_hosts:
# 将外部数据库主机名加入容器 hosts若使用域名访问外部 DB
# 格式:- "db-host:实际IP"
# 若主机名可正常解析则不需要此配置
- "host-gateway:host-gateway"
networks:
- frontend
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
# ── Nginx 反向代理(可选)──────────────────────────────────
nginx:
image: nginx:1.27-alpine
container_name: resource_library_nginx
restart: unless-stopped
profiles: ["nginx"]
depends_on:
- app
ports:
- "${NGINX_HTTP_PORT:-80}:80"
- "${NGINX_HTTPS_PORT:-443}:443"
volumes:
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- uploads_data:/app/app/static/uploads:ro
networks:
- frontend
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# ── 持久化卷 ────────────────────────────────────────────────────
volumes:
uploads_data:
name: resource_library_uploads
# ── 网络 ────────────────────────────────────────────────────────
networks:
frontend:
name: resource_library_frontend