124 lines
3.2 KiB
YAML
124 lines
3.2 KiB
YAML
# ============================================
|
||
# 单体部署编排
|
||
# 中间件通过 profiles 按需启用:
|
||
# --profile mysql → Docker MySQL
|
||
# --profile redis → Docker Redis
|
||
# --profile minio → Docker MinIO
|
||
# --profile frontend → 前端 Nginx
|
||
# 启动顺序由 deploy.sh 控制,app 不写 depends_on
|
||
# ============================================
|
||
services:
|
||
mysql:
|
||
build: ../db
|
||
image: ${APP_NAME}-mysql:latest
|
||
container_name: ${APP_NAME}-mysql
|
||
restart: unless-stopped
|
||
ports:
|
||
- "${MYSQL_PORT:-3306}:3306"
|
||
environment:
|
||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||
MYSQL_DATABASE: ${DB_NAME}
|
||
TZ: Asia/Shanghai
|
||
command: --lower_case_table_names=1
|
||
volumes:
|
||
- mysql-data:/var/lib/mysql
|
||
healthcheck:
|
||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 10
|
||
start_period: 60s
|
||
profiles:
|
||
- mysql
|
||
networks:
|
||
- default
|
||
|
||
redis:
|
||
image: redis:7-alpine
|
||
container_name: ${APP_NAME}-redis
|
||
restart: unless-stopped
|
||
ports:
|
||
- "0.0.0.0:${REDIS_HOST_PORT:-6379}:6379"
|
||
command: redis-server --appendonly yes ${REDIS_PASS:+--requirepass $REDIS_PASS}
|
||
volumes:
|
||
- redis-data:/data
|
||
healthcheck:
|
||
test: ["CMD", "redis-cli", "ping"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
profiles:
|
||
- redis
|
||
networks:
|
||
- default
|
||
|
||
# MinIO 文件存储(可选,通过 --profile minio 启用)
|
||
minio:
|
||
image: minio/minio:RELEASE.2025-04-08T15-41-24Z
|
||
container_name: ${APP_NAME}-minio
|
||
restart: unless-stopped
|
||
ports:
|
||
- "${MINIO_PORT:-9000}:9000"
|
||
- "${MINIO_CONSOLE_PORT:-9001}:9001"
|
||
environment:
|
||
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
|
||
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin}
|
||
command: server /data --console-address ":9001"
|
||
volumes:
|
||
- minio-data:/data
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
profiles:
|
||
- minio
|
||
networks:
|
||
- default
|
||
|
||
app:
|
||
build:
|
||
context: ..
|
||
dockerfile: Dockerfile
|
||
image: ${APP_NAME}-backend:latest
|
||
container_name: ${APP_NAME}-backend
|
||
restart: unless-stopped
|
||
ports:
|
||
- "0.0.0.0:${APP_PORT}:8081"
|
||
env_file:
|
||
- .env
|
||
environment:
|
||
SPRING_PROFILES_ACTIVE: prod
|
||
volumes:
|
||
- ./config/application-prod.yml:/app/config/application-prod.yml:ro
|
||
- /opt/upFiles:/opt/upFiles
|
||
networks:
|
||
- default
|
||
|
||
# 前端(可选,通过 --profile frontend 启用)
|
||
# 启用前需先在 ghb-frontend 目录执行 pnpm build 生成 dist/
|
||
frontend:
|
||
build:
|
||
context: ../../ghb-frontend
|
||
dockerfile: deploy/Dockerfile
|
||
image: ${APP_NAME}-frontend:latest
|
||
container_name: ${APP_NAME}-frontend
|
||
restart: unless-stopped
|
||
ports:
|
||
- "${FRONTEND_PORT:-80}:80"
|
||
environment:
|
||
BACKEND_PROXY: http://${APP_NAME}-backend:8081/ghb
|
||
profiles:
|
||
- frontend
|
||
networks:
|
||
- default
|
||
|
||
volumes:
|
||
mysql-data:
|
||
redis-data:
|
||
minio-data:
|
||
|
||
networks:
|
||
default:
|
||
name: ${NETWORK_NAME:-ghb-net}
|