#!/bin/bash # ============================================================================ # 君鸿卡管系统 - 本地开发环境变量设置脚本 # ============================================================================ # 使用方法: # 1. 首次设置:./scripts/setup-env.sh # 2. 加载环境:source .env.local # 3. 启动服务:go run cmd/api/main.go # ============================================================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 配置文件路径 ENV_FILE=".env.local" # 打印带颜色的消息 print_header() { echo -e "\n${BLUE}========================================${NC}" echo -e "${BLUE} $1${NC}" echo -e "${BLUE}========================================${NC}\n" } print_info() { echo -e "${CYAN}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[OK]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARN]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # 读取用户输入(带默认值) read_input() { local prompt="$1" local default="$2" local var_name="$3" local is_password="$4" if [ "$is_password" = "true" ]; then echo -n -e "${CYAN}$prompt${NC} [默认: ****]: " read -s input echo "" else echo -n -e "${CYAN}$prompt${NC} [默认: $default]: " read input fi if [ -z "$input" ]; then eval "$var_name='$default'" else eval "$var_name='$input'" fi } # 生成随机密钥 generate_secret() { if command -v openssl &> /dev/null; then openssl rand -hex 32 else # 备用方案:使用 /dev/urandom head -c 32 /dev/urandom | xxd -p fi } # 检查服务是否可用 check_service() { local host="$1" local port="$2" local name="$3" if command -v nc &> /dev/null; then if nc -z "$host" "$port" 2>/dev/null; then print_success "$name ($host:$port) 连接正常" return 0 else print_warning "$name ($host:$port) 无法连接" return 1 fi else print_info "跳过 $name 连接检查(nc 命令不可用)" return 0 fi } # 主流程 main() { print_header "君鸿卡管系统 - 环境变量配置向导" echo "本脚本将帮助您配置本地开发所需的环境变量。" echo "配置将保存到 $ENV_FILE 文件中。" echo "" # 检查是否已存在配置文件 if [ -f "$ENV_FILE" ]; then print_warning "发现已存在的配置文件: $ENV_FILE" echo -n "是否覆盖?[y/N]: " read confirm if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then print_info "已取消。如需更新配置,请手动编辑 $ENV_FILE" exit 0 fi fi # ======================================== # 数据库配置 # ======================================== print_header "数据库配置 (PostgreSQL)" read_input "数据库主机地址" "localhost" DB_HOST read_input "数据库端口" "5432" DB_PORT read_input "数据库用户名" "postgres" DB_USER read_input "数据库密码" "postgres" DB_PASSWORD "true" read_input "数据库名称" "junhong_cmp_dev" DB_NAME read_input "SSL 模式" "disable" DB_SSLMODE # 测试数据库连接 echo "" check_service "$DB_HOST" "$DB_PORT" "PostgreSQL" # ======================================== # Redis 配置 # ======================================== print_header "Redis 配置" read_input "Redis 主机地址" "localhost" REDIS_ADDRESS read_input "Redis 端口" "6379" REDIS_PORT read_input "Redis 密码(无密码直接回车)" "" REDIS_PASSWORD "true" read_input "Redis 数据库编号" "0" REDIS_DB # 测试 Redis 连接 echo "" check_service "$REDIS_ADDRESS" "$REDIS_PORT" "Redis" # ======================================== # JWT 配置 # ======================================== print_header "JWT 配置" DEFAULT_SECRET=$(generate_secret) read_input "JWT 密钥(直接回车生成随机密钥)" "$DEFAULT_SECRET" JWT_SECRET_KEY "true" # ======================================== # 服务器配置 # ======================================== print_header "服务器配置" read_input "服务监听地址" ":3000" SERVER_ADDRESS read_input "日志级别 (debug/info/warn/error)" "debug" LOGGING_LEVEL # ======================================== # 可选:对象存储配置 # ======================================== print_header "对象存储配置(可选)" echo -n "是否配置对象存储?[y/N]: " read configure_storage if [ "$configure_storage" = "y" ] || [ "$configure_storage" = "Y" ]; then read_input "S3 端点" "" STORAGE_S3_ENDPOINT read_input "S3 区域" "" STORAGE_S3_REGION read_input "S3 存储桶" "" STORAGE_S3_BUCKET read_input "S3 Access Key ID" "" STORAGE_S3_ACCESS_KEY_ID read_input "S3 Secret Access Key" "" STORAGE_S3_SECRET_ACCESS_KEY "true" STORAGE_CONFIGURED="true" else STORAGE_CONFIGURED="false" fi # ======================================== # 生成配置文件 # ======================================== print_header "生成配置文件" cat > "$ENV_FILE" << EOF # ============================================================================ # 君鸿卡管系统 - 本地开发环境变量 # 生成时间: $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================ # 使用方法: # source .env.local && go run cmd/api/main.go # 或者: # ./scripts/run-local.sh # ============================================================================ # ---------------------------------------------------------------------------- # 数据库配置(必填) # ---------------------------------------------------------------------------- export JUNHONG_DATABASE_HOST="$DB_HOST" export JUNHONG_DATABASE_PORT="$DB_PORT" export JUNHONG_DATABASE_USER="$DB_USER" export JUNHONG_DATABASE_PASSWORD="$DB_PASSWORD" export JUNHONG_DATABASE_DBNAME="$DB_NAME" export JUNHONG_DATABASE_SSLMODE="$DB_SSLMODE" # ---------------------------------------------------------------------------- # Redis 配置(必填) # ---------------------------------------------------------------------------- export JUNHONG_REDIS_ADDRESS="$REDIS_ADDRESS" export JUNHONG_REDIS_PORT="$REDIS_PORT" export JUNHONG_REDIS_PASSWORD="$REDIS_PASSWORD" export JUNHONG_REDIS_DB="$REDIS_DB" # ---------------------------------------------------------------------------- # JWT 配置(必填) # ---------------------------------------------------------------------------- export JUNHONG_JWT_SECRET_KEY="$JWT_SECRET_KEY" # ---------------------------------------------------------------------------- # 服务器配置 # ---------------------------------------------------------------------------- export JUNHONG_SERVER_ADDRESS="$SERVER_ADDRESS" # ---------------------------------------------------------------------------- # 日志配置 # ---------------------------------------------------------------------------- export JUNHONG_LOGGING_LEVEL="$LOGGING_LEVEL" export JUNHONG_LOGGING_DEVELOPMENT="true" export JUNHONG_LOGGING_APP_LOG_FILENAME="logs/app.log" export JUNHONG_LOGGING_ACCESS_LOG_FILENAME="logs/access.log" EOF # 添加对象存储配置(如果配置了) if [ "$STORAGE_CONFIGURED" = "true" ]; then cat >> "$ENV_FILE" << EOF # ---------------------------------------------------------------------------- # 对象存储配置 # ---------------------------------------------------------------------------- export JUNHONG_STORAGE_PROVIDER="s3" export JUNHONG_STORAGE_S3_ENDPOINT="$STORAGE_S3_ENDPOINT" export JUNHONG_STORAGE_S3_REGION="$STORAGE_S3_REGION" export JUNHONG_STORAGE_S3_BUCKET="$STORAGE_S3_BUCKET" export JUNHONG_STORAGE_S3_ACCESS_KEY_ID="$STORAGE_S3_ACCESS_KEY_ID" export JUNHONG_STORAGE_S3_SECRET_ACCESS_KEY="$STORAGE_S3_SECRET_ACCESS_KEY" export JUNHONG_STORAGE_S3_USE_SSL="false" export JUNHONG_STORAGE_S3_PATH_STYLE="true" EOF fi # 添加迁移工具兼容配置 cat >> "$ENV_FILE" << EOF # ---------------------------------------------------------------------------- # 迁移工具兼容配置(用于 scripts/migrate.sh) # ---------------------------------------------------------------------------- export MIGRATIONS_DIR="migrations" export DB_HOST="$DB_HOST" export DB_PORT="$DB_PORT" export DB_USER="$DB_USER" export DB_PASSWORD="$DB_PASSWORD" export DB_NAME="$DB_NAME" export DB_SSLMODE="$DB_SSLMODE" EOF print_success "配置文件已生成: $ENV_FILE" # ======================================== # 后续步骤提示 # ======================================== print_header "设置完成!" echo -e "${GREEN}环境变量已配置完成!${NC}" echo "" echo "后续步骤:" echo "" echo " 1. 加载环境变量:" echo -e " ${CYAN}source .env.local${NC}" echo "" echo " 2. 运行数据库迁移(如果需要):" echo -e " ${CYAN}./scripts/migrate.sh up${NC}" echo "" echo " 3. 启动 API 服务:" echo -e " ${CYAN}go run cmd/api/main.go${NC}" echo "" echo " 4. 启动 Worker 服务(可选):" echo -e " ${CYAN}go run cmd/worker/main.go${NC}" echo "" echo " 或者使用快捷脚本:" echo -e " ${CYAN}./scripts/run-local.sh${NC}" echo "" print_warning "注意:.env.local 包含敏感信息,请勿提交到 Git!" # 确保 .env.local 在 .gitignore 中 if [ -f ".gitignore" ]; then if ! grep -q "^\.env\.local$" .gitignore; then echo ".env.local" >> .gitignore print_info "已将 .env.local 添加到 .gitignore" fi fi } # 运行主流程 main