From 5d4b39b7a7c013f62d35dc37e9e14e1cb057b8e8 Mon Sep 17 00:00:00 2001 From: shaw Date: Sat, 19 Jul 2025 01:54:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=87=AA=E5=8A=A8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=A4=8D=E5=88=B6=E5=92=8C?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改docker-entrypoint.sh自动从模板复制config.js和.env文件 - 自动生成JWT_SECRET(64字符)和ENCRYPTION_KEY(32字符) - 自动配置Redis连接到容器内的redis服务 - 添加sed工具到Dockerfile确保脚本正常运行 - 解决Docker镜像部署时找不到配置文件的问题 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- Dockerfile | 1 + docker-entrypoint.sh | 78 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/Dockerfile b/Dockerfile index 63c60a39..c636ed37 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,7 @@ LABEL version="1.0.0" RUN apk add --no-cache \ curl \ dumb-init \ + sed \ && rm -rf /var/cache/apk/* # 👤 创建应用用户 diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 96748011..b7749b65 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -3,6 +3,84 @@ 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 不存在,从模板创建..." + if [ -f "/app/.env.example" ]; then + cp /app/.env.example /app/.env + + # 生成随机的 JWT_SECRET (64字符) + if [ -z "$JWT_SECRET" ]; then + JWT_SECRET=$(generate_random_string 64) + echo "🔑 生成 JWT_SECRET" + fi + + # 生成随机的 ENCRYPTION_KEY (32字符) + if [ -z "$ENCRYPTION_KEY" ]; then + ENCRYPTION_KEY=$(generate_random_string 32) + echo "🔑 生成 ENCRYPTION_KEY" + fi + + # 更新 .env 文件中的密钥 + sed -i "s/JWT_SECRET=.*/JWT_SECRET=${JWT_SECRET}/" /app/.env + sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" /app/.env + + # 设置 Redis 配置以连接到容器内的 Redis + sed -i "s/REDIS_HOST=.*/REDIS_HOST=redis/" /app/.env + + echo "✅ .env 已创建并配置" + else + echo "❌ 错误: .env.example 不存在" + exit 1 + fi +else + echo "✅ 检测到已有 .env 文件" + + # 确保环境变量中有必要的密钥 + if [ -z "$JWT_SECRET" ]; then + # 从 .env 文件读取 + 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) + sed -i "s/JWT_SECRET=.*/JWT_SECRET=${JWT_SECRET}/" /app/.env + echo "🔑 更新 JWT_SECRET" + fi + fi + + if [ -z "$ENCRYPTION_KEY" ]; then + # 从 .env 文件读取 + 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) + sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" /app/.env + echo "🔑 更新 ENCRYPTION_KEY" + fi + fi +fi + +# 导出环境变量 +export JWT_SECRET +export ENCRYPTION_KEY + # 检查是否需要初始化 if [ ! -f "/app/data/init.json" ]; then echo "📋 首次启动,执行初始化设置..."