mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:40:25 +00:00
- 设置/app目录为775权限,解决sed临时文件创建问题 - 替换sed为awk进行文件内容修改,避免权限问题 - 使用/tmp目录作为临时文件存储位置 - 确保claude用户对所有必要目录和文件都有完整读写权限 - 彻底解决"couldn't open temporary file"和"permission denied"错误 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
114 lines
3.3 KiB
Bash
114 lines
3.3 KiB
Bash
#!/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 "$@" |