refactor: 简化Docker部署,使用环境变量替代.env文件映射

- 移除 docker-compose.yml 中的 .env 文件映射
- 添加所有必要的环境变量到 docker-compose.yml
- 简化 docker-entrypoint.sh,直接使用环境变量
- 更新 README,说明通过环境变量配置的方式
- 删除不再需要的初始化脚本
- 解决了 sed -i 在某些 Docker 环境下的 'Resource busy' 错误
This commit is contained in:
shaw
2025-07-24 15:50:33 +08:00
parent 232c276c8c
commit 2e511fa6f8
5 changed files with 112 additions and 210 deletions

View File

@@ -3,25 +3,20 @@ set -e
echo "🚀 Claude Relay Service 启动中..."
# 检查 .env 文件
if [ ! -f "/app/.env" ]; then
echo "📋 检测到 .env 不存在,从模板创建..."
if [ -f "/app/.env.example" ]; then
cp /app/.env.example /app/.env
echo "✅ .env 已从模板创建"
echo "⚠️ 注意:.env 文件将在容器内生成,请确保已映射到宿主机以持久化"
else
echo "❌ 错误: .env.example 不存在"
exit 1
fi
# 检查关键环境变量
if [ -z "$JWT_SECRET" ]; then
echo "❌ 错误: JWT_SECRET 环境变量未设置"
echo " 请在 docker-compose.yml 中设置 JWT_SECRET"
echo " 例如: JWT_SECRET=your-random-secret-key-at-least-32-chars"
exit 1
fi
# 生成随机字符串的函数
generate_random_string() {
length=$1
# 使用 /dev/urandom 生成随机字符串
tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c $length
}
if [ -z "$ENCRYPTION_KEY" ]; then
echo "❌ 错误: ENCRYPTION_KEY 环境变量未设置"
echo " 请在 docker-compose.yml 中设置 ENCRYPTION_KEY"
echo " 例如: ENCRYPTION_KEY=your-32-character-encryption-key"
exit 1
fi
# 检查并复制配置文件
if [ ! -f "/app/config/config.js" ]; then
@@ -35,54 +30,17 @@ if [ ! -f "/app/config/config.js" ]; then
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"
# 更新 .env 文件
sed -i "s/JWT_SECRET=.*/JWT_SECRET=${JWT_SECRET}/" /app/.env
else
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"
# 更新 .env 文件
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" /app/.env
else
echo "✅ 使用现有的 ENCRYPTION_KEY"
fi
fi
# 更新 Redis 主机配置
sed -i "s/REDIS_HOST=.*/REDIS_HOST=redis/" /app/.env
echo "✅ .env 已配置"
else
echo "❌ 错误: .env 文件处理失败"
exit 1
fi
# 导出环境变量
export JWT_SECRET
export ENCRYPTION_KEY
# 显示配置信息
echo "✅ 环境配置已就绪"
echo " JWT_SECRET: [已设置]"
echo " ENCRYPTION_KEY: [已设置]"
echo " REDIS_HOST: ${REDIS_HOST:-localhost}"
echo " PORT: ${PORT:-3000}"
# 检查是否需要初始化
if [ ! -f "/app/data/init.json" ]; then
echo "📋 首次启动,执行初始化设置..."
# 如果设置了环境变量,显示提示
if [ -n "$ADMIN_USERNAME" ] || [ -n "$ADMIN_PASSWORD" ]; then
echo "📌 检测到预设的管理员凭据"