2025-11-24 11:50:15 +08:00
|
|
|
|
version: '3.8'
|
|
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
|
# MySQL数据库
|
|
|
|
|
|
mysql:
|
|
|
|
|
|
image: school-news-mysql:latest
|
|
|
|
|
|
container_name: school-news-mysql
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
environment:
|
|
|
|
|
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456}
|
|
|
|
|
|
MYSQL_DATABASE: ${MYSQL_DATABASE:-school_news}
|
|
|
|
|
|
MYSQL_USER: ${MYSQL_USER:-schoolnews}
|
|
|
|
|
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-123456}
|
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
|
ports:
|
2025-11-24 16:53:17 +08:00
|
|
|
|
- "${MYSQL_PORT:-3307}:3306"
|
2025-11-24 11:50:15 +08:00
|
|
|
|
volumes:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 数据持久化(命名卷)
|
2025-11-24 11:50:15 +08:00
|
|
|
|
- mysql-data:/var/lib/mysql
|
2025-11-24 12:59:51 +08:00
|
|
|
|
# 自定义配置文件(可选,取消注释以启用)
|
|
|
|
|
|
# 如需自定义MySQL配置,取消下面的注释并修改mysql/my.cnf
|
2025-11-24 11:50:15 +08:00
|
|
|
|
# - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
|
|
|
|
|
|
command:
|
|
|
|
|
|
- --character-set-server=utf8mb4
|
|
|
|
|
|
- --collation-server=utf8mb4_unicode_ci
|
|
|
|
|
|
- --default-authentication-plugin=mysql_native_password
|
|
|
|
|
|
- --max_connections=1000
|
|
|
|
|
|
- --max_allowed_packet=64M
|
2025-11-24 16:53:17 +08:00
|
|
|
|
- --local-infile=1
|
2025-11-24 11:50:15 +08:00
|
|
|
|
networks:
|
|
|
|
|
|
- school-news-network
|
|
|
|
|
|
healthcheck:
|
2025-11-24 16:53:17 +08:00
|
|
|
|
# 只有当 MySQL 可访问且敏感词表中至少有一条 deny 记录时,才认为 healthy
|
|
|
|
|
|
test: ["CMD-SHELL", "mysql -uroot -p${MYSQL_ROOT_PASSWORD:-123456} -D ${MYSQL_DATABASE:-school_news} -e \"SELECT 'ok' FROM tb_sensitive_word WHERE type='deny' LIMIT 1;\" 2>/dev/null | grep -q ok"]
|
2025-11-24 11:50:15 +08:00
|
|
|
|
interval: 10s
|
2025-11-24 16:53:17 +08:00
|
|
|
|
timeout: 10s
|
|
|
|
|
|
retries: 10
|
|
|
|
|
|
start_period: 60s
|
2025-11-24 11:50:15 +08:00
|
|
|
|
|
|
|
|
|
|
# Redis缓存
|
|
|
|
|
|
redis:
|
|
|
|
|
|
image: redis:7-alpine
|
|
|
|
|
|
container_name: school-news-redis
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
environment:
|
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
|
ports:
|
|
|
|
|
|
- "${REDIS_PORT:-6379}:6379"
|
|
|
|
|
|
volumes:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 数据持久化(命名卷)
|
2025-11-24 11:50:15 +08:00
|
|
|
|
- redis-data:/data
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# Redis配置文件(命名卷)
|
|
|
|
|
|
- redis-config:/usr/local/etc/redis
|
2025-11-24 11:50:15 +08:00
|
|
|
|
command: redis-server /usr/local/etc/redis/redis.conf --requirepass ${REDIS_PASSWORD:-123456}
|
|
|
|
|
|
networks:
|
|
|
|
|
|
- school-news-network
|
|
|
|
|
|
healthcheck:
|
|
|
|
|
|
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
|
|
|
|
|
|
interval: 10s
|
|
|
|
|
|
timeout: 3s
|
|
|
|
|
|
retries: 5
|
|
|
|
|
|
|
|
|
|
|
|
# 后端服务
|
|
|
|
|
|
school-news-serv:
|
|
|
|
|
|
image: school-news-serv:latest
|
|
|
|
|
|
container_name: school-news-serv
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
depends_on:
|
|
|
|
|
|
mysql:
|
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
|
redis:
|
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
|
environment:
|
|
|
|
|
|
# 数据库配置
|
|
|
|
|
|
MYSQL_HOST: mysql
|
|
|
|
|
|
MYSQL_PORT: 3306
|
|
|
|
|
|
MYSQL_DATABASE: ${MYSQL_DATABASE:-school_news}
|
|
|
|
|
|
MYSQL_USER: ${MYSQL_USER:-root}
|
|
|
|
|
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-123456}
|
|
|
|
|
|
# Redis配置
|
|
|
|
|
|
REDIS_HOST: redis
|
|
|
|
|
|
REDIS_PORT: 6379
|
|
|
|
|
|
REDIS_PASSWORD: ${REDIS_PASSWORD:-123456}
|
|
|
|
|
|
# JVM配置
|
|
|
|
|
|
JAVA_OPTS: "-Xms512m -Xmx1g -XX:+UseG1GC"
|
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
|
ports:
|
|
|
|
|
|
- "${SERV_PORT:-8081}:8081"
|
|
|
|
|
|
volumes:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 配置文件(命名卷)
|
|
|
|
|
|
- serv-config:/app/config
|
|
|
|
|
|
# 日志目录(命名卷)
|
|
|
|
|
|
- serv-logs:/app/logs
|
|
|
|
|
|
# 上传文件目录(命名卷)
|
|
|
|
|
|
- serv-uploads:/app/uploads
|
|
|
|
|
|
# 爬虫脚本目录(默认不挂载,保留在镜像内)
|
|
|
|
|
|
# 注意:挂载会覆盖镜像内容,如需运行时更新爬虫脚本可取消注释
|
|
|
|
|
|
- serv-crawler:/app/crawler
|
2025-11-24 11:50:15 +08:00
|
|
|
|
networks:
|
|
|
|
|
|
- school-news-network
|
|
|
|
|
|
healthcheck:
|
|
|
|
|
|
test: ["CMD", "curl", "-f", "http://localhost:8081/schoolNewsServ/actuator/health"]
|
|
|
|
|
|
interval: 30s
|
|
|
|
|
|
timeout: 10s
|
|
|
|
|
|
retries: 3
|
|
|
|
|
|
start_period: 60s
|
|
|
|
|
|
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 前端服务(Node + Vite Preview)
|
2025-11-24 11:50:15 +08:00
|
|
|
|
school-news-web:
|
|
|
|
|
|
image: school-news-web:latest
|
|
|
|
|
|
container_name: school-news-web
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
depends_on:
|
|
|
|
|
|
- school-news-serv
|
2025-11-24 14:33:02 +08:00
|
|
|
|
environment:
|
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
|
NODE_ENV: production
|
|
|
|
|
|
# 不直接暴露端口,通过nginx反向代理访问
|
|
|
|
|
|
expose:
|
|
|
|
|
|
- "4173"
|
|
|
|
|
|
volumes:
|
|
|
|
|
|
# 运行时配置文件(命名卷)
|
|
|
|
|
|
- web-config:/app/config
|
|
|
|
|
|
# 日志目录(命名卷)
|
|
|
|
|
|
- web-logs:/app/logs
|
|
|
|
|
|
networks:
|
|
|
|
|
|
- school-news-network
|
|
|
|
|
|
healthcheck:
|
|
|
|
|
|
test: ["CMD", "curl", "-f", "http://localhost:4173/"]
|
|
|
|
|
|
interval: 30s
|
|
|
|
|
|
timeout: 10s
|
|
|
|
|
|
retries: 3
|
|
|
|
|
|
start_period: 20s
|
|
|
|
|
|
|
|
|
|
|
|
# Nginx反向代理
|
|
|
|
|
|
nginx:
|
|
|
|
|
|
image: nginx:alpine # 直接使用官方镜像,无需自定义构建
|
|
|
|
|
|
container_name: school-news-nginx
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
depends_on:
|
|
|
|
|
|
- school-news-web
|
|
|
|
|
|
- school-news-serv
|
2025-11-24 11:50:15 +08:00
|
|
|
|
environment:
|
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
|
ports:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
- "${NGINX_PORT:-80}:80"
|
2025-11-24 11:50:15 +08:00
|
|
|
|
volumes:
|
2025-11-24 16:53:17 +08:00
|
|
|
|
# 仅挂载自定义 Nginx 主配置文件
|
|
|
|
|
|
- ./volumes/nginx/config/nginx.conf:/etc/nginx/nginx.conf
|
|
|
|
|
|
# 仅挂载站点配置目录(conf.d),保留镜像内的 mime.types 等其他文件
|
|
|
|
|
|
- nginx-conf-d:/etc/nginx/conf.d:ro
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 日志目录(命名卷)
|
|
|
|
|
|
- nginx-logs:/var/log/nginx
|
2025-11-24 11:50:15 +08:00
|
|
|
|
networks:
|
|
|
|
|
|
- school-news-network
|
|
|
|
|
|
healthcheck:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
|
2025-11-24 11:50:15 +08:00
|
|
|
|
interval: 30s
|
|
|
|
|
|
timeout: 10s
|
|
|
|
|
|
retries: 3
|
|
|
|
|
|
start_period: 10s
|
|
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
|
school-news-network:
|
|
|
|
|
|
driver: bridge
|
|
|
|
|
|
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# 命名卷定义(数据存储在当前目录下的volumes/子目录)
|
|
|
|
|
|
# 使用前请先运行初始化脚本:./init-volumes.sh 或 init-volumes.bat
|
2025-11-24 11:50:15 +08:00
|
|
|
|
volumes:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
# ===== MySQL =====
|
2025-11-24 11:50:15 +08:00
|
|
|
|
mysql-data:
|
|
|
|
|
|
driver: local
|
2025-11-24 14:33:02 +08:00
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/mysql/data
|
|
|
|
|
|
|
|
|
|
|
|
# ===== Redis =====
|
2025-11-24 11:50:15 +08:00
|
|
|
|
redis-data:
|
|
|
|
|
|
driver: local
|
2025-11-24 14:33:02 +08:00
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/redis/data
|
|
|
|
|
|
|
|
|
|
|
|
redis-config:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/redis/config
|
|
|
|
|
|
|
|
|
|
|
|
# ===== 后端服务 =====
|
|
|
|
|
|
serv-config:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/serv/config
|
|
|
|
|
|
|
|
|
|
|
|
serv-logs:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/serv/logs
|
|
|
|
|
|
|
|
|
|
|
|
serv-uploads:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/serv/uploads
|
|
|
|
|
|
|
|
|
|
|
|
# 爬虫脚本目录(可选,默认不启用)
|
|
|
|
|
|
# 注意:启用后会覆盖镜像内的爬虫脚本,需先复制镜像内容到volumes/serv/crawler
|
|
|
|
|
|
serv-crawler:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/serv/crawler
|
|
|
|
|
|
|
|
|
|
|
|
# ===== 前端服务 =====
|
|
|
|
|
|
web-config:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/web/config
|
|
|
|
|
|
|
|
|
|
|
|
web-logs:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/web/logs
|
|
|
|
|
|
|
|
|
|
|
|
# ===== Nginx =====
|
2025-11-24 16:53:17 +08:00
|
|
|
|
nginx-conf-file:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/nginx/config/nginx.conf
|
|
|
|
|
|
|
|
|
|
|
|
nginx-conf-d:
|
2025-11-24 14:33:02 +08:00
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
2025-11-24 16:53:17 +08:00
|
|
|
|
device: ./volumes/nginx/config/conf.d
|
2025-11-24 14:33:02 +08:00
|
|
|
|
|
|
|
|
|
|
nginx-logs:
|
|
|
|
|
|
driver: local
|
|
|
|
|
|
driver_opts:
|
|
|
|
|
|
type: none
|
|
|
|
|
|
o: bind
|
|
|
|
|
|
device: ./volumes/nginx/logs
|