Files
kefu_cloud/docker-compose.prod.yml
yml2213 0d3543fd4b 部署默认端口改为 18080,支持与宿主机 Caddy 共存
避免与已有 80/443 服务冲突;补充端口检测、Caddyfile 示例与文档说明。
2026-07-15 15:38:07 +08:00

160 lines
5.0 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 客服云 — 生产 Docker Compose(适合腾讯云 CVM 单机)
# 使用:./deploy/scripts/deploy.sh
# 或:docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build
name: kefu-cloud
services:
postgres:
image: postgres:16-alpine
container_name: kefu-cloud-db
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER:-kefu}
POSTGRES_PASSWORD: ${DB_PASSWORD:?请在 deploy/.env.prod 设置 DB_PASSWORD}
POSTGRES_DB: ${DB_NAME:-kefu_cloud}
volumes:
- kefu_cloud_pgdata:/var/lib/postgresql/data
networks:
- kefu_cloud_net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-kefu} -d ${DB_NAME:-kefu_cloud}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
minio:
image: minio/minio:latest
container_name: kefu-cloud-minio
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${STORAGE_ACCESS_KEY:?请设置 STORAGE_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${STORAGE_SECRET_KEY:?请设置 STORAGE_SECRET_KEY}
volumes:
- kefu_cloud_miniodata:/data
networks:
- kefu_cloud_net
# 官方镜像极简,无 curl/bash;由 minio-init 重试建桶保证就绪
minio-init:
image: minio/mc:latest
container_name: kefu-cloud-minio-init
depends_on:
minio:
condition: service_started
restart: "no"
networks:
- kefu_cloud_net
entrypoint: >
/bin/sh -c "
set -e;
i=0;
until mc alias set local http://minio:9000 \"$$MINIO_ROOT_USER\" \"$$MINIO_ROOT_PASSWORD\" 2>/dev/null; do
i=$$((i+1));
if [ $$i -gt 30 ]; then echo 'minio not ready'; exit 1; fi;
echo waiting minio...;
sleep 2;
done;
mc mb -p local/$${STORAGE_BUCKET:-kefu} || true;
mc anonymous set download local/$${STORAGE_BUCKET:-kefu};
echo 'MinIO bucket ready';
"
environment:
MINIO_ROOT_USER: ${STORAGE_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${STORAGE_SECRET_KEY}
STORAGE_BUCKET: ${STORAGE_BUCKET:-kefu}
api:
build:
context: .
dockerfile: deploy/docker/Dockerfile.api
image: kefu-cloud-api:${IMAGE_TAG:-latest}
container_name: kefu-cloud-api
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
minio-init:
condition: service_completed_successfully
environment:
SERVER_PORT: "8080"
GIN_MODE: ${GIN_MODE:-release}
DB_HOST: postgres
DB_PORT: "5432"
DB_USER: ${DB_USER:-kefu}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME:-kefu_cloud}
DB_SSLMODE: ${DB_SSLMODE:-disable}
JWT_SECRET: ${JWT_SECRET:?请设置 JWT_SECRET}
STORAGE_ENDPOINT: minio:9000
STORAGE_ACCESS_KEY: ${STORAGE_ACCESS_KEY}
STORAGE_SECRET_KEY: ${STORAGE_SECRET_KEY}
STORAGE_BUCKET: ${STORAGE_BUCKET:-kefu}
STORAGE_USE_SSL: "false"
STORAGE_REGION: ${STORAGE_REGION:-us-east-1}
# 浏览器访问图片的公网前缀(经 Nginx /files 反代)
STORAGE_PUBLIC_BASE_URL: ${STORAGE_PUBLIC_BASE_URL:?请设置 STORAGE_PUBLIC_BASE_URL,如 https://你的域名/files}
STORAGE_MAX_UPLOAD_MB: ${STORAGE_MAX_UPLOAD_MB:-10}
STORAGE_MAX_IMAGE_EDGE: ${STORAGE_MAX_IMAGE_EDGE:-1920}
STORAGE_WEBP_QUALITY: ${STORAGE_WEBP_QUALITY:-80}
networks:
- kefu_cloud_net
# 不对外暴露 8080,统一走 nginx
web:
build:
context: .
dockerfile: deploy/docker/Dockerfile.web
image: kefu-cloud-web:${IMAGE_TAG:-latest}
container_name: kefu-cloud-web
restart: unless-stopped
depends_on:
api:
condition: service_healthy
minio:
condition: service_started
# 默认 18080:避免与宿主机已有 Caddy/其它服务抢 80
# 独占机器可在 .env.prod 设 HTTP_PORT=80;有 Caddy 时保持 18080 并由其反代
ports:
- "${HTTP_PORT:-18080}:80"
networks:
- kefu_cloud_net
# 可选:导入演示数据(profile seed
# docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile seed run --rm seed
seed:
image: kefu-cloud-api:${IMAGE_TAG:-latest}
container_name: kefu-cloud-seed
profiles: ["seed"]
depends_on:
api:
condition: service_healthy
environment:
DB_HOST: postgres
DB_PORT: "5432"
DB_USER: ${DB_USER:-kefu}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME:-kefu_cloud}
DB_SSLMODE: ${DB_SSLMODE:-disable}
JWT_SECRET: ${JWT_SECRET}
STORAGE_ENDPOINT: minio:9000
STORAGE_ACCESS_KEY: ${STORAGE_ACCESS_KEY}
STORAGE_SECRET_KEY: ${STORAGE_SECRET_KEY}
STORAGE_BUCKET: ${STORAGE_BUCKET:-kefu}
STORAGE_USE_SSL: "false"
STORAGE_PUBLIC_BASE_URL: ${STORAGE_PUBLIC_BASE_URL}
entrypoint: ["/app/seed"]
networks:
- kefu_cloud_net
restart: "no"
networks:
kefu_cloud_net:
driver: bridge
volumes:
kefu_cloud_pgdata:
kefu_cloud_miniodata: