# 环境变量配置文档 ## 概述 君鸿卡管系统使用嵌入式配置机制,默认配置编译在二进制文件中,通过环境变量进行覆盖。 **环境变量前缀**: `JUNHONG_` **格式规则**: 配置路径中的 `.` 替换为 `_`,全部大写 ## 必填配置 以下配置没有合理的默认值,必须通过环境变量设置: ### 数据库配置 | 环境变量 | 说明 | 示例 | |---------|------|------| | `JUNHONG_DATABASE_HOST` | 数据库主机地址 | `localhost` | | `JUNHONG_DATABASE_PORT` | 数据库端口 | `5432` | | `JUNHONG_DATABASE_USER` | 数据库用户名 | `postgres` | | `JUNHONG_DATABASE_PASSWORD` | 数据库密码 | `your_password` | | `JUNHONG_DATABASE_DBNAME` | 数据库名称 | `junhong_cmp` | ### Redis 配置 | 环境变量 | 说明 | 示例 | |---------|------|------| | `JUNHONG_REDIS_ADDRESS` | Redis 主机地址 | `localhost` | ### JWT 配置 | 环境变量 | 说明 | 示例 | |---------|------|------| | `JUNHONG_JWT_SECRET_KEY` | JWT 签名密钥(生产环境必须修改) | `your-secret-key` | ### 微信配置 #### 微信公众号 | 环境变量 | 说明 | 示例 | |---------|------|------| | `JUNHONG_WECHAT_OFFICIAL_ACCOUNT_APP_ID` | 公众号 AppID(必填) | `wxabcdef1234567890` | | `JUNHONG_WECHAT_OFFICIAL_ACCOUNT_APP_SECRET` | 公众号 AppSecret(必填) | `abcdef1234567890` | | `JUNHONG_WECHAT_OFFICIAL_ACCOUNT_TOKEN` | 服务器配置Token(可选) | `your_token` | | `JUNHONG_WECHAT_OFFICIAL_ACCOUNT_AES_KEY` | 消息加解密Key(可选) | `` | | `JUNHONG_WECHAT_OFFICIAL_ACCOUNT_OAUTH_REDIRECT_URL` | OAuth回调URL(可选) | `https://your-domain.com/callback` | #### 微信支付 | 环境变量 | 说明 | 示例 | |---------|------|------| | `JUNHONG_WECHAT_PAYMENT_APP_ID` | 支付 AppID(必填,通常与公众号相同) | `wxabcdef1234567890` | | `JUNHONG_WECHAT_PAYMENT_MCH_ID` | 商户号(必填) | `1234567890` | | `JUNHONG_WECHAT_PAYMENT_API_V3_KEY` | APIv3 密钥(必填,32位字符串) | `your_apiv3_key_32_chars_here` | | `JUNHONG_WECHAT_PAYMENT_API_V2_KEY` | APIv2 密钥(可选,部分接口需要) | `` | | `JUNHONG_WECHAT_PAYMENT_CERT_PATH` | 商户证书路径(必填) | `/app/certs/apiclient_cert.pem` | | `JUNHONG_WECHAT_PAYMENT_KEY_PATH` | 商户私钥路径(必填) | `/app/certs/apiclient_key.pem` | | `JUNHONG_WECHAT_PAYMENT_SERIAL_NO` | 证书序列号(必填) | `1234567890ABCDEF` | | `JUNHONG_WECHAT_PAYMENT_NOTIFY_URL` | 支付回调URL(必填) | `https://api.your-domain.com/api/callback/wechat-pay` | | `JUNHONG_WECHAT_PAYMENT_HTTP_DEBUG` | HTTP调试日志(可选) | `false` | | `JUNHONG_WECHAT_PAYMENT_TIMEOUT` | HTTP请求超时(可选) | `30s` | **配置说明**: - 微信公众号和支付配置缺失时,服务启动会失败(FATAL 错误) - 证书文件必须可读(权限 600 或 644) - APIv3 密钥必须是 32 位字符串 - 证书序列号可通过 `openssl x509 -in apiclient_cert.pem -noout -serial` 获取 - 详细配置指南参见 [微信集成使用指南](wechat-integration/使用指南.md) ## 可选配置 以下配置有合理的默认值,可按需覆盖: ### 服务器配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_SERVER_ADDRESS` | `:3000` | 服务监听地址 | | `JUNHONG_SERVER_READ_TIMEOUT` | `30s` | 读取超时时间 | | `JUNHONG_SERVER_WRITE_TIMEOUT` | `30s` | 写入超时时间 | | `JUNHONG_SERVER_SHUTDOWN_TIMEOUT` | `30s` | 优雅关闭超时 | | `JUNHONG_SERVER_PREFORK` | `false` | 是否启用预分叉模式 | ### 数据库连接池 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_DATABASE_SSLMODE` | `disable` | SSL 模式 | | `JUNHONG_DATABASE_MAX_OPEN_CONNS` | `25` | 最大打开连接数 | | `JUNHONG_DATABASE_MAX_IDLE_CONNS` | `10` | 最大空闲连接数 | | `JUNHONG_DATABASE_CONN_MAX_LIFETIME` | `1h` | 连接最大生命周期 | ### Redis 配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_REDIS_PORT` | `6379` | Redis 端口 | | `JUNHONG_REDIS_PASSWORD` | `""` | Redis 密码 | | `JUNHONG_REDIS_DB` | `0` | Redis 数据库编号 | | `JUNHONG_REDIS_POOL_SIZE` | `100` | 连接池大小 | | `JUNHONG_REDIS_MIN_IDLE_CONNS` | `10` | 最小空闲连接数 | | `JUNHONG_REDIS_DIAL_TIMEOUT` | `5s` | 连接超时 | | `JUNHONG_REDIS_READ_TIMEOUT` | `3s` | 读取超时 | | `JUNHONG_REDIS_WRITE_TIMEOUT` | `3s` | 写入超时 | ### 日志配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_LOGGING_LEVEL` | `info` | 日志级别 (debug/info/warn/error) | | `JUNHONG_LOGGING_DEVELOPMENT` | `false` | 开发模式(启用彩色输出) | | `JUNHONG_LOGGING_APP_LOG_FILENAME` | `logs/app.log` | 应用日志文件路径 | | `JUNHONG_LOGGING_APP_LOG_MAX_SIZE` | `100` | 日志文件最大大小 (MB) | | `JUNHONG_LOGGING_APP_LOG_MAX_BACKUPS` | `7` | 最大备份文件数 | | `JUNHONG_LOGGING_APP_LOG_MAX_AGE` | `30` | 日志保留天数 | | `JUNHONG_LOGGING_APP_LOG_COMPRESS` | `true` | 是否压缩旧日志 | | `JUNHONG_LOGGING_ACCESS_LOG_FILENAME` | `logs/access.log` | 访问日志文件路径 | ### JWT 配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_JWT_TOKEN_DURATION` | `24h` | Token 有效期 | | `JUNHONG_JWT_ACCESS_TOKEN_TTL` | `24h` | Access Token TTL | | `JUNHONG_JWT_REFRESH_TOKEN_TTL` | `168h` | Refresh Token TTL (7天) | ### 队列配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_QUEUE_CONCURRENCY` | `10` | 并发 Worker 数量 | | `JUNHONG_QUEUE_RETRY_MAX` | `3` | 最大重试次数 | | `JUNHONG_QUEUE_TIMEOUT` | `30m` | 任务超时时间 | ### 限流中间件 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_MIDDLEWARE_ENABLE_RATE_LIMITER` | `false` | 启用限流 | | `JUNHONG_MIDDLEWARE_RATE_LIMITER_MAX` | `100` | 最大请求数 | | `JUNHONG_MIDDLEWARE_RATE_LIMITER_EXPIRATION` | `1m` | 时间窗口 | | `JUNHONG_MIDDLEWARE_RATE_LIMITER_STORAGE` | `memory` | 存储后端 (memory/redis) | ### 对象存储配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_STORAGE_PROVIDER` | `""` | 存储提供商 (s3) | | `JUNHONG_STORAGE_TEMP_DIR` | `/tmp/junhong` | 临时文件目录 | | `JUNHONG_STORAGE_S3_ENDPOINT` | `""` | S3 端点 | | `JUNHONG_STORAGE_S3_REGION` | `""` | S3 区域 | | `JUNHONG_STORAGE_S3_BUCKET` | `""` | S3 存储桶 | | `JUNHONG_STORAGE_S3_ACCESS_KEY_ID` | `""` | S3 访问密钥 ID | | `JUNHONG_STORAGE_S3_SECRET_ACCESS_KEY` | `""` | S3 访问密钥 | | `JUNHONG_STORAGE_S3_USE_SSL` | `true` | 是否使用 SSL | | `JUNHONG_STORAGE_S3_PATH_STYLE` | `true` | 是否使用路径风格 | | `JUNHONG_STORAGE_PRESIGN_UPLOAD_EXPIRES` | `1h` | 预签名上传 URL 有效期 | | `JUNHONG_STORAGE_PRESIGN_DOWNLOAD_EXPIRES` | `1h` | 预签名下载 URL 有效期 | ### 短信配置 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_SMS_GATEWAY_URL` | `""` | 短信网关 URL | | `JUNHONG_SMS_USERNAME` | `""` | 短信账号 | | `JUNHONG_SMS_PASSWORD` | `""` | 短信密码 | | `JUNHONG_SMS_SIGNATURE` | `""` | 短信签名 | | `JUNHONG_SMS_TIMEOUT` | `10s` | 请求超时 | ### 默认管理员 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `JUNHONG_DEFAULT_ADMIN_USERNAME` | `admin` | 默认管理员用户名 | | `JUNHONG_DEFAULT_ADMIN_PASSWORD` | `Admin@123456` | 默认管理员密码 | | `JUNHONG_DEFAULT_ADMIN_PHONE` | `13800000000` | 默认管理员手机号 | ## Docker Compose 示例 ```yaml version: '3.8' services: api: image: registry.boss160.cn/junhong/cmp-fiber-api:latest environment: - JUNHONG_DATABASE_HOST=postgres - JUNHONG_DATABASE_PORT=5432 - JUNHONG_DATABASE_USER=junhong - JUNHONG_DATABASE_PASSWORD=secret123 - JUNHONG_DATABASE_DBNAME=junhong_cmp - JUNHONG_REDIS_ADDRESS=redis - JUNHONG_JWT_SECRET_KEY=your-production-secret-key - JUNHONG_LOGGING_LEVEL=info volumes: - ./logs:/app/logs ports: - "3000:3000" worker: image: registry.boss160.cn/junhong/cmp-fiber-worker:latest environment: - JUNHONG_DATABASE_HOST=postgres - JUNHONG_DATABASE_PORT=5432 - JUNHONG_DATABASE_USER=junhong - JUNHONG_DATABASE_PASSWORD=secret123 - JUNHONG_DATABASE_DBNAME=junhong_cmp - JUNHONG_REDIS_ADDRESS=redis - JUNHONG_JWT_SECRET_KEY=your-production-secret-key volumes: - ./logs:/app/logs postgres: image: postgres:14 environment: - POSTGRES_USER=junhong - POSTGRES_PASSWORD=secret123 - POSTGRES_DB=junhong_cmp redis: image: redis:6 ``` ## 本地开发 本地开发可以创建 `.env` 文件(不要提交到 Git): ```bash # .env JUNHONG_DATABASE_HOST=localhost JUNHONG_DATABASE_PORT=5432 JUNHONG_DATABASE_USER=postgres JUNHONG_DATABASE_PASSWORD=postgres JUNHONG_DATABASE_DBNAME=junhong_cmp_dev JUNHONG_REDIS_ADDRESS=localhost JUNHONG_JWT_SECRET_KEY=dev-secret-key JUNHONG_LOGGING_LEVEL=debug JUNHONG_LOGGING_DEVELOPMENT=true ``` 然后使用 `source .env` 加载环境变量后运行: ```bash source .env go run cmd/api/main.go ```