# 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容器中就能正确加载支付证书了！
