#!/bin/sh set -e echo "🚀 Claude Relay Service 启动中..." # 生成随机字符串的函数 generate_random_string() { length=$1 # 使用 /dev/urandom 生成随机字符串 tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c $length } # 检查并复制配置文件 if [ ! -f "/app/config/config.js" ]; then echo "📋 检测到 config.js 不存在,从模板创建..." if [ -f "/app/config/config.example.js" ]; then cp /app/config/config.example.js /app/config/config.js echo "✅ config.js 已创建" else echo "❌ 错误: config.example.js 不存在" exit 1 fi fi # 检查并配置 .env 文件(文件已在构建时创建) if [ -f "/app/.env" ]; then echo "📋 配置 .env 文件..." # 生成随机的 JWT_SECRET (64字符) if [ -z "$JWT_SECRET" ]; then JWT_SECRET=$(grep "^JWT_SECRET=" /app/.env | cut -d'=' -f2) if [ -z "$JWT_SECRET" ] || [ "$JWT_SECRET" = "your-jwt-secret-here" ]; then JWT_SECRET=$(generate_random_string 64) echo "🔑 生成 JWT_SECRET" fi fi # 生成随机的 ENCRYPTION_KEY (32字符) if [ -z "$ENCRYPTION_KEY" ]; then ENCRYPTION_KEY=$(grep "^ENCRYPTION_KEY=" /app/.env | cut -d'=' -f2) if [ -z "$ENCRYPTION_KEY" ] || [ "$ENCRYPTION_KEY" = "your-encryption-key-here" ]; then ENCRYPTION_KEY=$(generate_random_string 32) echo "🔑 生成 ENCRYPTION_KEY" fi fi # 使用更安全的方式更新 .env 文件 - 创建临时文件避免sed权限问题 ENV_TEMP="/tmp/env_temp_$$" # 替换JWT_SECRET awk -v new_secret="$JWT_SECRET" ' /^JWT_SECRET=/ { print "JWT_SECRET=" new_secret; next } { print } ' /app/.env > "$ENV_TEMP" # 替换ENCRYPTION_KEY awk -v new_key="$ENCRYPTION_KEY" ' /^ENCRYPTION_KEY=/ { print "ENCRYPTION_KEY=" new_key; next } { print } ' "$ENV_TEMP" > "$ENV_TEMP.2" # 替换REDIS_HOST awk ' /^REDIS_HOST=/ { print "REDIS_HOST=redis"; next } { print } ' "$ENV_TEMP.2" > "$ENV_TEMP.3" # 复制回原文件 cp "$ENV_TEMP.3" /app/.env # 清理临时文件 rm -f "$ENV_TEMP" "$ENV_TEMP.2" "$ENV_TEMP.3" echo "✅ .env 已配置" else echo "❌ 错误: .env 文件不存在" exit 1 fi # 导出环境变量 export JWT_SECRET export ENCRYPTION_KEY # 检查是否需要初始化 if [ ! -f "/app/data/init.json" ]; then echo "📋 首次启动,执行初始化设置..." # 调试权限信息 echo "🔍 当前用户: $(whoami)" echo "🔍 data 目录权限: $(ls -ld /app/data 2>/dev/null || echo 'directory not found')" echo "🔍 data 目录内容: $(ls -la /app/data 2>/dev/null || echo 'directory empty or not accessible')" # 如果设置了环境变量,显示提示 if [ -n "$ADMIN_USERNAME" ] || [ -n "$ADMIN_PASSWORD" ]; then echo "📌 检测到预设的管理员凭据" fi # 执行初始化脚本 node /app/scripts/setup.js echo "✅ 初始化完成" else echo "✅ 检测到已有配置,跳过初始化" # 如果 init.json 存在但环境变量也设置了,显示警告 if [ -n "$ADMIN_USERNAME" ] || [ -n "$ADMIN_PASSWORD" ]; then echo "⚠️ 警告: 检测到环境变量 ADMIN_USERNAME/ADMIN_PASSWORD,但系统已初始化" echo " 如需使用新凭据,请删除 data/init.json 文件后重启容器" fi fi # 启动应用 echo "🌐 启动 Claude Relay Service..." exec "$@"