支持两种部署模式,兼容新建 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>
90 lines
3.4 KiB
YAML
90 lines
3.4 KiB
YAML
# ═══════════════════════════════════════════════════════════════
|
||
# 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
|