方式1:部署脚本自动生成并写入 .env(推荐生产使用)
创建一个部署脚本 deploy.sh,在服务器上运行时自动生成强密码并创建 .env.prod。
bash
#!/bin/bash
set -e
echo "正在生成生产环境 .env.prod 文件..."
# 如果已经存在,备份
[ -f .env.prod ] && cp .env.prod .env.prod.bak.$(date +%Y%m%d%H%M%S)
cat > .env.prod << EOF
# ==================== 自动生成的生产配置 ====================
TZ=Asia/Shanghai
SPRING_PROFILES_ACTIVE=prod
# MySQL
MYSQL_MASTER_PORT=13306
MYSQL_SLAVE_PORT=13307
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
MYSQL_DATABASE=tour-mate-platform
MYSQL_REPL_USER=repl
MYSQL_REPL_PASSWORD=$(openssl rand -base64 32)
# Redis(生产必须有密码)
REDIS_PORT=6379
REDIS_PASSWORD=$(openssl rand -base64 32)
# RabbitMQ
RABBITMQ_AMQP_PORT=5672
RABBITMQ_MANAGEMENT_PORT=15672
RABBITMQ_USERNAME=tourmate
RABBITMQ_PASSWORD=$(openssl rand -base64 32)
RABBITMQ_VHOST=/tour-mate
# WuKongIM
WUKONGIM_API_PORT=5001
WUKONGIM_TCP_PORT=5100
WUKONGIM_WS_PORT=5200
WUKONGIM_ADMIN_PORT=5300
WUKONGIM_METRICS_PORT=5172
WUKONGIM_EXTERNAL_IP=$(curl -s ifconfig.me) # 自动获取公网IP,或改成你的域名
WUKONGIM_TOKEN_SECRET=$(openssl rand -base64 64)
# Grafana
GRAFANA_PORT=3000
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=$(openssl rand -base64 24)
# JWT
JWT_SECRET=$(openssl rand -base64 64)
# 微信相关等敏感信息需要手动填入(脚本不自动生成)
WECHAT_MINI_APP_ID=your_real_app_id
WECHAT_MINI_APP_SECRET=your_real_secret
WECHAT_PAY_MCH_ID=your_mch_id
# ... 其他微信配置手动补充
EOF
echo ".env.prod 已生成(敏感密码已自动随机)"
echo "请手动补充微信支付等第三方密钥后执行:"
echo "docker-compose --env-file .env.prod up -d"纯手动完成密码生成
下面我作为高级开发和运维专家,给你推荐几种常用、可靠的方式来生成强密码和密钥,并按场景分类说明该用多长、什么字符集。
1. 推荐生成工具(从最方便到最专业)
| 工具/方式 | 适用场景 | 优点 | 生成示例命令/链接 |
|---|---|---|---|
| 命令行 openssl | 服务器上快速生成(推荐首选) | 无需安装额外工具,随机性极高 | openssl rand -base64 32 |
| 命令行 /dev/urandom | Linux/Mac 服务器 | 系统自带,纯本地 | `cat /dev/urandom |
| pwgen | 服务器上生成易读密码 | 可生成易记但仍安全的密码 | pwgen -sy 32 1 |
| 1Password / Bitwarden | 个人/团队密码管理 | 内置强密码生成器,可安全存储 | 内置生成器,长度 32+ |
| LastPass Generator | 在线快速生成 | 方便,但不要用于最高敏感密钥 | https://www.lastpass.com/password-generator |
| Docker 内置生成 | 部署时自动生成 | 可在启动脚本中自动生成并注入 | - |
2. 各配置项推荐长度和生成方式
| 配置项 | 推荐长度 | 字符集要求 | 生成命令示例(推荐) |
|---|---|---|---|
| REDIS_PASSWORD | 32 字符 | 大小写字母 + 数字 + 符号 | openssl rand -base64 32 |
| RABBITMQ_PASSWORD | 32 字符 | 同上 | openssl rand -base64 32 |
| MYSQL_ROOT_PASSWORD | 32 字符 | 同上 | openssl rand -base64 32 |
| MYSQL_REPL_PASSWORD | 32 字符 | 同上 | 同上 |
| GRAFANA_ADMIN_PASSWORD | 24~32 字符 | 同上 | pwgen -sy 32 1(更易手动输入) |
| JWT_SECRET | 至少 256 bit(32 字节),推荐 512 bit(64 字节) | 必须纯 Base64 编码(避免特殊字符问题) | openssl rand -base64 64 |
| WUKONGIM_TOKEN_SECRET | 64 字符 | 同 JWT | openssl rand -base64 64 |
| WECHAT_PAY_API_V3_KEY | 固定 32 字符 | 微信要求正好 32 位大小写字母+数字 | `openssl rand -base64 32 |
| 微信 AppSecret 等 | 微信分配的原值,不可自生成 | - | - |