Files
claude-relay-service/docker-entrypoint.sh
shaw 3f7234aa91 fix: 一次性解决所有权限问题
- 设置/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>
2025-07-19 02:39:18 +08:00

114 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"