Files
2026-09-21 17:11:35 +08:00

89 lines
2.6 KiB
YAML

# ============================================================
# 学生管理系统 - 一键部署编排文件
# 服务组成: mysql(数据库) + backend(FastAPI:9090) + frontend(Nginx:80)
#
# 启动: docker compose up -d --build
# 停止: docker compose down
# 日志: docker compose logs -f backend
# ============================================================
services:
# ---------------- MySQL 8.0 数据库 ----------------
mysql:
image: mysql:8.0
restart: unless-stopped
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
# 使用 mysql_native_password,兼容 aiomysql/PyMySQL 连接
- --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-123456}
# 容器首次启动时自动创建该数据库(Tortoise 只建表,不会建库)
MYSQL_DATABASE: ${DB_NAME:-student_system}
TZ: Asia/Shanghai
ports:
# 若本机 3306 已被占用,把 .env 中 MYSQL_HOST_PORT 改为 13306
- "${MYSQL_HOST_PORT:-3306}:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"]
interval: 10s
timeout: 5s
retries: 12
start_period: 40s
networks:
- student-net
# ---------------- FastAPI 后端 ----------------
backend:
build:
context: ./fastapi-app
dockerfile: Dockerfile
image: student-system-backend:latest
restart: unless-stopped
environment:
# 注意:host 用 compose 服务名 mysql,而不是 localhost
DB_HOST: mysql
DB_PORT: 3306
DB_NAME: ${DB_NAME:-student_system}
DB_USER: ${DB_USER:-root}
DB_PASSWORD: ${DB_PASSWORD:-123456}
TZ: Asia/Shanghai
volumes:
# 上传文件持久化到宿主机 fastapi-app/files
- ./fastapi-app/files:/app/files
ports:
- "${BACKEND_HOST_PORT:-9090}:9090"
depends_on:
mysql:
condition: service_healthy
networks:
- student-net
# ---------------- Vue 前端 + Nginx ----------------
frontend:
build:
context: ./vue
dockerfile: Dockerfile
image: student-system-frontend:latest
restart: unless-stopped
ports:
- "${FRONTEND_HOST_PORT:-80}:80"
depends_on:
- backend
networks:
# nginx.conf 中反向代理目标为 http://backend:9090,二者必须在同一网络
- student-net
volumes:
mysql_data:
name: student_mysql_data
networks:
student-net:
name: student-net
driver: bridge