|
|
|
|
# ============================================================
|
|
|
|
|
# 测试环境自包含部署(复用 verify compose + nginx 转发)
|
|
|
|
|
# crm-app 不直接暴露端口,全部经 nginx 80 转发访问。
|
|
|
|
|
#
|
|
|
|
|
# docker compose -f docker-compose-test.yml up -d --build
|
|
|
|
|
# docker compose -f docker-compose-test.yml down -v
|
|
|
|
|
# ============================================================
|
|
|
|
|
services:
|
|
|
|
|
mysql:
|
|
|
|
|
image: mysql:8.4.8
|
|
|
|
|
environment:
|
|
|
|
|
MYSQL_ROOT_PASSWORD: verify123
|
|
|
|
|
MYSQL_DATABASE: crm # 空库,表结构由 crm-app 的 ddl-auto:update 自动建
|
|
|
|
|
TZ: Asia/Shanghai
|
|
|
|
|
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
|
|
|
|
ports:
|
|
|
|
|
- "13306:3306" # 对外暴露给本机数据库工具(避开宿主机可能已占用的 3306)
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pverify123"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 20
|
|
|
|
|
volumes:
|
|
|
|
|
- mysql-data:/var/lib/mysql
|
|
|
|
|
|
|
|
|
|
redis:
|
|
|
|
|
image: redis:7-alpine
|
|
|
|
|
command: ["redis-server", "--requirepass", "verify123"]
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "redis-cli", "-a", "verify123", "ping"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 20
|
|
|
|
|
volumes:
|
|
|
|
|
- redis-data:/data
|
|
|
|
|
|
|
|
|
|
minio:
|
|
|
|
|
image: minio/minio:RELEASE.2025-04-08T15-41-24Z
|
|
|
|
|
command: server /data --console-address ":9001"
|
|
|
|
|
environment:
|
|
|
|
|
MINIO_ROOT_USER: minioadmin
|
|
|
|
|
MINIO_ROOT_PASSWORD: minioadmin
|
|
|
|
|
ports:
|
|
|
|
|
- "9001:9001" # 控制台(可选,浏览器看缩略图对象是否落地)
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "mc", "ready", "local"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 20
|
|
|
|
|
volumes:
|
|
|
|
|
- minio-data:/data
|
|
|
|
|
|
|
|
|
|
# 一次性任务:等 minio 就绪后创建 crm bucket(对齐 application.yml 的 crm.file.minio.bucket=crm)
|
|
|
|
|
minio-init:
|
|
|
|
|
image: minio/mc:latest
|
|
|
|
|
depends_on:
|
|
|
|
|
minio:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
entrypoint: >
|
|
|
|
|
/bin/sh -c "
|
|
|
|
|
mc alias set local http://minio:9000 minioadmin minioadmin &&
|
|
|
|
|
mc mb --ignore-existing local/crm &&
|
|
|
|
|
echo 'bucket crm ready';
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
crm-app:
|
|
|
|
|
# 服务器上只有 jar(无源码):用含 LibreOffice 的基础镜像 crm-runtime + 挂载 jar
|
|
|
|
|
# 基础镜像一次性构建:docker build -f deploy/Dockerfile.base -t crm-runtime:latest .
|
|
|
|
|
# 更新流程:覆盖 crm-app-1.0.0-SNAPSHOT.jar → deploy/restart.sh(只重启 crm-app)
|
|
|
|
|
image: crm-runtime:latest
|
|
|
|
|
volumes:
|
|
|
|
|
- ./crm-app-1.0.0-SNAPSHOT.jar:/app/crm-app-1.0.0-SNAPSHOT.jar:ro
|
|
|
|
|
# 日志映射到宿主机:应用写 logs/crm-app.log(相对 WORKDIR /app)→ 宿主机 ./logs/
|
|
|
|
|
- ./logs:/app/logs
|
|
|
|
|
depends_on:
|
|
|
|
|
mysql:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
redis:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
minio:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
environment:
|
|
|
|
|
SPRING_PROFILES_ACTIVE: verify
|
|
|
|
|
CRM_DB_URL: "jdbc:mysql://mysql:3306/crm?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true"
|
|
|
|
|
CRM_DB_USERNAME: root
|
|
|
|
|
CRM_DB_PASSWORD: verify123
|
|
|
|
|
CRM_REDIS_HOST: redis
|
|
|
|
|
CRM_REDIS_PORT: "6379"
|
|
|
|
|
CRM_REDIS_DATABASE: "0"
|
|
|
|
|
CRM_REDIS_PASSWORD: verify123
|
|
|
|
|
CRM_MINIO_ENDPOINT: http://minio:9000
|
|
|
|
|
CRM_MINIO_AK: minioadmin
|
|
|
|
|
CRM_MINIO_SK: minioadmin
|
|
|
|
|
CRM_KKFILEVIEW_URL: ""
|
|
|
|
|
# 不直接暴露 8080,由 nginx 转发
|
|
|
|
|
expose:
|
|
|
|
|
- "8080"
|
|
|
|
|
|
|
|
|
|
nginx:
|
|
|
|
|
image: nginx:stable-alpine
|
|
|
|
|
depends_on:
|
|
|
|
|
- crm-app
|
|
|
|
|
ports:
|
|
|
|
|
- "80:80" # 对外只开 nginx 80,crm-app 8080 不可达
|
|
|
|
|
volumes:
|
|
|
|
|
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
|
|
|
- ./nginx/docs:/usr/share/nginx/docs:ro # API 文档静态页
|
|
|
|
|
- ./nginx/html:/usr/share/nginx/html:ro # 前端构建产物(dist 内容),更新只需替换该目录
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
mysql-data:
|
|
|
|
|
redis-data:
|
|
|
|
|
minio-data:
|