docker-compose.yml 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # =============================================================
  2. # 智价云药店系统 - Docker Compose 部署(生产/预发布)
  3. # 使用方式:
  4. # 1. cp .env.example .env && vim .env # 填写真实密码
  5. # 2. docker compose up -d # 启动所有服务
  6. # 3. docker compose logs -f app # 查看应用日志
  7. # =============================================================
  8. services:
  9. # ---- MySQL 8.0 ----
  10. mysql:
  11. image: mysql:8.0
  12. container_name: zhijiayun-mysql
  13. restart: unless-stopped
  14. environment:
  15. MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-请修改ROOT密码}
  16. MYSQL_DATABASE: ${DB_NAME:-zhijiayun_pharmacy}
  17. MYSQL_USER: ${DB_USERNAME:-zhijiayun}
  18. MYSQL_PASSWORD: ${DB_PASSWORD}
  19. TZ: Asia/Shanghai
  20. ports:
  21. - "3306:3306"
  22. volumes:
  23. - mysql-data:/var/lib/mysql
  24. - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro
  25. - ./mysql/init:/docker-entrypoint-initdb.d:ro # 首次建库脚本
  26. command: >
  27. --character-set-server=utf8mb4
  28. --collation-server=utf8mb4_unicode_ci
  29. --default-time-zone=+08:00
  30. --max-connections=500
  31. --innodb-buffer-pool-size=512M
  32. healthcheck:
  33. test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-请修改ROOT密码}"]
  34. interval: 10s
  35. timeout: 5s
  36. retries: 10
  37. start_period: 30s
  38. networks:
  39. - zhijiayun-net
  40. # ---- Redis 7 ----
  41. redis:
  42. image: redis:7-alpine
  43. container_name: zhijiayun-redis
  44. restart: unless-stopped
  45. command: >
  46. redis-server
  47. --requirepass ${REDIS_PASSWORD}
  48. --maxmemory 256mb
  49. --maxmemory-policy allkeys-lru
  50. --appendonly yes
  51. --appendfsync everysec
  52. ports:
  53. - "6379:6379"
  54. volumes:
  55. - redis-data:/data
  56. healthcheck:
  57. test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
  58. interval: 10s
  59. timeout: 5s
  60. retries: 5
  61. networks:
  62. - zhijiayun-net
  63. # ---- 应用服务 ----
  64. app:
  65. image: eclipse-temurin:17-jre-alpine
  66. container_name: zhijiayun-app
  67. restart: unless-stopped
  68. depends_on:
  69. mysql:
  70. condition: service_healthy
  71. redis:
  72. condition: service_healthy
  73. ports:
  74. - "8001:8001"
  75. volumes:
  76. - ./zhijiayun-gateway-1.0.0.jar:/app/app.jar:ro
  77. - app-logs:/var/log/zhijiayun-pharmacy
  78. - ./certs:/app/certs:ro
  79. working_dir: /app
  80. environment:
  81. TZ: Asia/Shanghai
  82. SPRING_PROFILES_ACTIVE: prod
  83. # 数据库
  84. DB_HOST: mysql
  85. DB_PORT: 3306
  86. DB_NAME: ${DB_NAME:-zhijiayun_pharmacy}
  87. DB_USERNAME: ${DB_USERNAME:-zhijiayun}
  88. DB_PASSWORD: ${DB_PASSWORD}
  89. # Redis
  90. REDIS_HOST: redis
  91. REDIS_PORT: 6379
  92. REDIS_PASSWORD: ${REDIS_PASSWORD}
  93. REDIS_DATABASE: ${REDIS_DATABASE:-1}
  94. # JWT
  95. JWT_SECRET: ${JWT_SECRET}
  96. # 阿里云短信
  97. ALIBABA_CLOUD_ACCESS_KEY_ID: ${ALIBABA_CLOUD_ACCESS_KEY_ID}
  98. ALIBABA_CLOUD_ACCESS_KEY_SECRET: ${ALIBABA_CLOUD_ACCESS_KEY_SECRET}
  99. SMS_SIGN_NAME: ${SMS_SIGN_NAME:-开邻}
  100. SMS_TEMPLATE_CODE: ${SMS_TEMPLATE_CODE:-SMS_483305249}
  101. # 微信
  102. WECHAT_APP_ID: ${WECHAT_APP_ID}
  103. WECHAT_APP_SECRET: ${WECHAT_APP_SECRET}
  104. WECHAT_REDIRECT_URI: ${WECHAT_REDIRECT_URI}
  105. # 邀请链接
  106. INVITE_BASE_URL: ${INVITE_BASE_URL:-https://your-domain.com}
  107. # 支付宝(电脑网站支付)
  108. ALIPAY_APP_ID: ${ALIPAY_APP_ID:-}
  109. ALIPAY_NOTIFY_URL: ${ALIPAY_NOTIFY_URL:-https://priceapi.kailin.com.cn/api/payment/callback/alipay}
  110. ALIPAY_RETURN_URL: ${ALIPAY_RETURN_URL:-https://priceapi.kailin.com.cn/payment/success}
  111. ALIPAY_APP_PRIVATE_KEY_PATH: ${ALIPAY_APP_PRIVATE_KEY_PATH:-}
  112. ALIPAY_APP_CERT_PATH: ${ALIPAY_APP_CERT_PATH:-}
  113. ALIPAY_CERT_PATH: ${ALIPAY_CERT_PATH:-}
  114. ALIPAY_ROOT_CERT_PATH: ${ALIPAY_ROOT_CERT_PATH:-}
  115. # 支付宝公钥模式(备选)
  116. ALIPAY_APP_PRIVATE_KEY: ${ALIPAY_APP_PRIVATE_KEY:-}
  117. ALIPAY_PUBLIC_KEY: ${ALIPAY_PUBLIC_KEY:-}
  118. # 微信支付
  119. WECHAT_PAY_APP_ID: ${WECHAT_PAY_APP_ID:-}
  120. WECHAT_PAY_MCH_ID: ${WECHAT_PAY_MCH_ID:-}
  121. WECHAT_PAY_API_V3_KEY: ${WECHAT_PAY_API_V3_KEY:-}
  122. WECHAT_PAY_PRIVATE_KEY_PATH: ${WECHAT_PAY_PRIVATE_KEY_PATH:-certs/prod/wechat/apiclient_key.pem}
  123. WECHAT_PAY_PRIVATE_CERT_PATH: ${WECHAT_PAY_PRIVATE_CERT_PATH:-certs/prod/wechat/apiclient_cert.pem}
  124. WECHAT_PAY_KEY_PATH: ${WECHAT_PAY_KEY_PATH:-certs/prod/wechat/apiclient_cert.p12}
  125. WECHAT_PAY_SERIAL_NO: ${WECHAT_PAY_SERIAL_NO:-}
  126. WECHAT_PAY_NOTIFY_URL: ${WECHAT_PAY_NOTIFY_URL:-https://priceapi.kailin.com.cn/api/payment/callback/wechat}
  127. command: >
  128. java
  129. -server
  130. -Xms512m -Xmx1g
  131. -XX:+UseG1GC
  132. -XX:MaxGCPauseMillis=200
  133. -XX:+HeapDumpOnOutOfMemoryError
  134. -XX:HeapDumpPath=/var/log/zhijiayun-pharmacy/heapdump.hprof
  135. -Dfile.encoding=UTF-8
  136. -Duser.timezone=Asia/Shanghai
  137. -jar app.jar
  138. healthcheck:
  139. test: ["CMD-SHELL", "wget -qO- http://localhost:8001/actuator/health || exit 1"]
  140. interval: 30s
  141. timeout: 10s
  142. retries: 3
  143. start_period: 60s
  144. networks:
  145. - zhijiayun-net
  146. logging:
  147. driver: json-file
  148. options:
  149. max-size: "100m"
  150. max-file: "5"
  151. # ---- 数据卷 ----
  152. volumes:
  153. mysql-data:
  154. driver: local
  155. redis-data:
  156. driver: local
  157. app-logs:
  158. driver: local
  159. # ---- 网络 ----
  160. networks:
  161. zhijiayun-net:
  162. driver: bridge