# Docker容器化部署指南 ## 支付证书问题解决方案 本项目已经解决了Docker容器中支付证书路径失效的问题,支持多种证书加载方式。 ## 目录结构 ``` project-root/ ├── Dockerfile ├── docker-compose.yml ├── certs/ # 证书目录(需要手动创建) │ ├── wechat/ # 微信支付证书 │ │ ├── apiclient_key.pem │ │ ├── apiclient_cert.pem │ │ └── wechatpay_cert.pem │ └── alipay/ # 支付宝证书 │ ├── app_private_key.pem │ ├── appCertPublicKey.crt │ ├── alipayCertPublicKey.crt │ └── alipayRootCert.crt ├── logs/ # 日志目录 ├── uploads/ # 上传文件目录 └── src/ ``` ## 部署步骤 ### 1. 准备证书文件 创建证书目录并放置证书文件: ```bash # 创建证书目录 mkdir -p certs/wechat mkdir -p certs/alipay # 复制微信支付证书到对应目录 cp /path/to/your/apiclient_key.pem certs/wechat/ cp /path/to/your/apiclient_cert.pem certs/wechat/ cp /path/to/your/wechatpay_cert.pem certs/wechat/ # 复制支付宝证书到对应目录 cp /path/to/your/app_private_key.pem certs/alipay/ cp /path/to/your/appCertPublicKey.crt certs/alipay/ cp /path/to/your/alipayCertPublicKey.crt certs/alipay/ cp /path/to/your/alipayRootCert.crt certs/alipay/ # 设置证书文件权限(只读) chmod -R 444 certs/ ``` ### 2. 配置环境变量 创建 `.env` 文件(可选): ```bash # 应用配置 SPRING_PROFILES_ACTIVE=prod JAVA_OPTS=-Xms512m -Xmx1024m # 数据库配置 MYSQL_ROOT_PASSWORD=root123456 MYSQL_DATABASE=modules MYSQL_USER=modules MYSQL_PASSWORD=8YdLnk7KsPAyDXGA # Redis配置 REDIS_PASSWORD=redis_WSDb88 ``` ### 3. 构建和启动 ```bash # 构建应用 mvn clean package -DskipTests # 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看应用日志 docker-compose logs -f cms-app ``` ### 4. 验证部署 ```bash # 检查应用健康状态 curl http://localhost:9200/actuator/health # 检查证书是否正确加载 docker exec cms-java-app ls -la /app/certs/ ``` ## 证书加载模式 ### 开发环境 (CLASSPATH) - 证书文件放在 `src/main/resources/certs/` 目录下 - 打包时会包含在jar包中 - 适合开发和测试环境 ### 生产环境 (VOLUME) - 证书文件通过Docker挂载卷加载 - 证书文件在宿主机上,挂载到容器的 `/app/certs` 目录 - 支持证书文件的动态更新(重启容器后生效) ### 文件系统模式 (FILESYSTEM) - 直接从文件系统路径加载证书 - 适合传统部署方式 ## 配置说明 ### application.yml 配置 ```yaml certificate: load-mode: VOLUME # 证书加载模式 cert-root-path: /app/certs # 证书根目录 wechat-pay: dev: api-v3-key: "your-api-v3-key" private-key-file: "apiclient_key.pem" apiclient-cert-file: "apiclient_cert.pem" wechatpay-cert-file: "wechatpay_cert.pem" ``` ### 环境特定配置 - **开发环境**: `application-dev.yml` - 使用CLASSPATH模式 - **生产环境**: `application-prod.yml` - 使用VOLUME模式 ## 故障排除 ### 1. 证书文件找不到 ```bash # 检查证书文件是否存在 docker exec cms-java-app ls -la /app/certs/ # 检查文件权限 docker exec cms-java-app ls -la /app/certs/wechat/ ``` ### 2. 支付接口调用失败 ```bash # 查看应用日志 docker-compose logs cms-app | grep -i cert # 检查证书配置 docker exec cms-java-app cat /app/application.yml | grep -A 10 certificate ``` ### 3. 容器启动失败 ```bash # 查看详细错误信息 docker-compose logs cms-app # 检查容器状态 docker-compose ps ``` ## 安全建议 1. **证书文件权限**: 设置为只读权限 (444) 2. **证书目录权限**: 限制访问权限 3. **敏感信息**: 使用环境变量或Docker secrets管理敏感配置 4. **网络安全**: 使用内部网络,限制端口暴露 ## 更新证书 1. 停止应用容器:`docker-compose stop cms-app` 2. 更新证书文件到 `certs/` 目录 3. 重启应用容器:`docker-compose start cms-app` ## 监控和日志 - 应用日志:`./logs/` 目录 - 容器日志:`docker-compose logs` - 健康检查:访问 `/actuator/health` 端点 通过以上配置,你的应用在Docker容器中就能正确加载支付证书了!