diff --git a/Dockerfile b/Dockerfile index c636ed37..b6bb0e3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,9 +34,20 @@ COPY --chown=claude:nodejs . . COPY --chown=claude:nodejs docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh -# 📁 创建必要目录 +# 📁 创建必要目录并设置权限 RUN mkdir -p logs data temp && \ - chown -R claude:nodejs logs data temp + chown -R claude:nodejs /app logs data temp && \ + chmod -R 755 /app && \ + chmod -R 775 logs data temp + +# 🔧 预先创建配置文件避免权限问题 +RUN if [ ! -f "/app/config/config.js" ] && [ -f "/app/config/config.example.js" ]; then \ + cp /app/config/config.example.js /app/config/config.js; \ + fi && \ + if [ ! -f "/app/.env" ] && [ -f "/app/.env.example" ]; then \ + cp /app/.env.example /app/.env; \ + fi && \ + chown claude:nodejs /app/config/config.js /app/.env 2>/dev/null || true # 🔐 切换到非 root 用户 USER claude diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index b7749b65..49ca3b16 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -22,59 +22,39 @@ if [ ! -f "/app/config/config.js" ]; then 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 文件" +# 检查并配置 .env 文件(文件已在构建时创建) +if [ -f "/app/.env" ]; then + echo "📋 配置 .env 文件..." - # 确保环境变量中有必要的密钥 + # 生成随机的 JWT_SECRET (64字符) 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" + echo "🔑 生成 JWT_SECRET" fi fi + # 生成随机的 ENCRYPTION_KEY (32字符) 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" + echo "🔑 生成 ENCRYPTION_KEY" fi 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 文件不存在" + exit 1 fi # 导出环境变量