# ============================================================= # 智价云(药店版) - Docker Compose 部署(生产/预发布) # 使用方式: # 1. cp .env.example .env && vim .env # 填写真实密码 # 2. docker compose up -d # 启动所有服务 # 3. docker compose logs -f app # 查看应用日志 # ============================================================= services: # ---- MySQL 8.0 ---- mysql: image: mysql:8.0 container_name: zhijiayun-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-请修改ROOT密码} MYSQL_DATABASE: ${DB_NAME:-zhijiayun_pharmacy} MYSQL_USER: ${DB_USERNAME:-zhijiayun} MYSQL_PASSWORD: ${DB_PASSWORD} TZ: Asia/Shanghai ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro - ./mysql/init:/docker-entrypoint-initdb.d:ro # 首次建库脚本 command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time-zone=+08:00 --max-connections=500 --innodb-buffer-pool-size=512M healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-请修改ROOT密码}"] interval: 10s timeout: 5s retries: 10 start_period: 30s networks: - zhijiayun-net # ---- Redis 7 ---- redis: image: redis:7-alpine container_name: zhijiayun-redis restart: unless-stopped command: > redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes --appendfsync everysec ports: - "6379:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 10s timeout: 5s retries: 5 networks: - zhijiayun-net # ---- 应用服务 ---- app: image: eclipse-temurin:17-jre-alpine container_name: zhijiayun-app restart: unless-stopped depends_on: mysql: condition: service_healthy redis: condition: service_healthy ports: - "8001:8001" volumes: - ./zhijiayun-gateway-1.0.0.jar:/app/app.jar:ro - app-logs:/var/log/zhijiayun-pharmacy - ./certs:/app/certs:ro working_dir: /app environment: TZ: Asia/Shanghai SPRING_PROFILES_ACTIVE: prod # 数据库 DB_HOST: mysql DB_PORT: 3306 DB_NAME: ${DB_NAME:-zhijiayun_pharmacy} DB_USERNAME: ${DB_USERNAME:-zhijiayun} DB_PASSWORD: ${DB_PASSWORD} # Redis REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: ${REDIS_PASSWORD} REDIS_DATABASE: ${REDIS_DATABASE:-1} # JWT JWT_SECRET: ${JWT_SECRET} # 阿里云短信 ALIBABA_CLOUD_ACCESS_KEY_ID: ${ALIBABA_CLOUD_ACCESS_KEY_ID} ALIBABA_CLOUD_ACCESS_KEY_SECRET: ${ALIBABA_CLOUD_ACCESS_KEY_SECRET} SMS_SIGN_NAME: ${SMS_SIGN_NAME:-开邻} SMS_TEMPLATE_CODE: ${SMS_TEMPLATE_CODE:-SMS_483305249} # 微信 WECHAT_APP_ID: ${WECHAT_APP_ID} WECHAT_APP_SECRET: ${WECHAT_APP_SECRET} WECHAT_REDIRECT_URI: ${WECHAT_REDIRECT_URI} # 邀请链接 INVITE_BASE_URL: ${INVITE_BASE_URL:-https://your-domain.com} # 支付宝(电脑网站支付) ALIPAY_APP_ID: ${ALIPAY_APP_ID:-} ALIPAY_NOTIFY_URL: ${ALIPAY_NOTIFY_URL:-https://priceapi.kailin.com.cn/api/payment/callback/alipay} ALIPAY_RETURN_URL: ${ALIPAY_RETURN_URL:-https://priceapi.kailin.com.cn/payment/success} ALIPAY_APP_PRIVATE_KEY_PATH: ${ALIPAY_APP_PRIVATE_KEY_PATH:-} ALIPAY_APP_CERT_PATH: ${ALIPAY_APP_CERT_PATH:-} ALIPAY_CERT_PATH: ${ALIPAY_CERT_PATH:-} ALIPAY_ROOT_CERT_PATH: ${ALIPAY_ROOT_CERT_PATH:-} # 支付宝公钥模式(备选) ALIPAY_APP_PRIVATE_KEY: ${ALIPAY_APP_PRIVATE_KEY:-} ALIPAY_PUBLIC_KEY: ${ALIPAY_PUBLIC_KEY:-} # 微信支付 WECHAT_PAY_APP_ID: ${WECHAT_PAY_APP_ID:-} WECHAT_PAY_MCH_ID: ${WECHAT_PAY_MCH_ID:-} WECHAT_PAY_API_V3_KEY: ${WECHAT_PAY_API_V3_KEY:-} WECHAT_PAY_PRIVATE_KEY_PATH: ${WECHAT_PAY_PRIVATE_KEY_PATH:-certs/prod/wechat/apiclient_key.pem} WECHAT_PAY_PRIVATE_CERT_PATH: ${WECHAT_PAY_PRIVATE_CERT_PATH:-certs/prod/wechat/apiclient_cert.pem} WECHAT_PAY_KEY_PATH: ${WECHAT_PAY_KEY_PATH:-certs/prod/wechat/apiclient_cert.p12} WECHAT_PAY_SERIAL_NO: ${WECHAT_PAY_SERIAL_NO:-} WECHAT_PAY_NOTIFY_URL: ${WECHAT_PAY_NOTIFY_URL:-https://priceapi.kailin.com.cn/api/payment/callback/wechat} command: > java -server -Xms512m -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/zhijiayun-pharmacy/heapdump.hprof -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -jar app.jar healthcheck: test: ["CMD-SHELL", "wget -qO- http://localhost:8001/actuator/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 60s networks: - zhijiayun-net logging: driver: json-file options: max-size: "100m" max-file: "5" # ---- 数据卷 ---- volumes: mysql-data: driver: local redis-data: driver: local app-logs: driver: local # ---- 网络 ---- networks: zhijiayun-net: driver: bridge