fix: #26 deploy-ai.sh LLDAP 密码注入逻辑优化

This commit is contained in:
aiyimickey 2026-07-15 16:00:23 +08:00
parent 3a4600ce5b
commit 9e88e65757
1 changed files with 48 additions and 27 deletions

View File

@ -384,6 +384,35 @@ sync_shared() {
ssh txjp "cd ${SHARED_REMOTE} && [ -f package.json ] && npm install --prefer-offline 2>&1 | tail -3" || warn "shared 依赖安装失败,部分站点可能构建异常" ssh txjp "cd ${SHARED_REMOTE} && [ -f package.json ] && npm install --prefer-offline 2>&1 | tail -3" || warn "shared 依赖安装失败,部分站点可能构建异常"
} }
# JWT_SECRET 一致性检查(所有 .tlyq.ai 子站点必须共用同一个密钥)
# 从共享文件读取权威值,校验站点 .env不一致时自动修正
check_jwt_secret_consistency() {
local remote_dir="$1"
local jwt_secret
jwt_secret=$(ssh txjp "cat /root/docker/.shared_jwt_secret 2>/dev/null" 2>/dev/null || echo "")
if [[ -z "$jwt_secret" ]]; then
jwt_secret=$(openssl rand -hex 32)
ssh txjp "cat > /root/docker/.shared_jwt_secret && chmod 600 /root/docker/.shared_jwt_secret" << EOF
${jwt_secret}
EOF
info "已生成共享 JWT_SECRET所有站点共用"
fi
local current_jwt
current_jwt=$(ssh txjp "grep '^JWT_SECRET=' ${remote_dir}/.env 2>/dev/null | cut -d= -f2" 2>/dev/null || echo "")
if [[ -z "$current_jwt" ]]; then
ssh txjp "cat >> ${remote_dir}/.env" << EOF
JWT_SECRET=${jwt_secret}
EOF
info "已为站点写入 JWT_SECRET"
elif [[ "$current_jwt" != "$jwt_secret" ]]; then
warn "检测到 JWT_SECRET 与共享密钥不一致,已自动修正"
ssh txjp "sed -i '/^JWT_SECRET=/d' ${remote_dir}/.env"
ssh txjp "cat >> ${remote_dir}/.env" << EOF
JWT_SECRET=${jwt_secret}
EOF
fi
}
build_on_server() { build_on_server() {
local extra_env="${1:-}" local extra_env="${1:-}"
@ -578,33 +607,8 @@ build_on_server() {
# 先确保 .env 文件存在且权限为 600防止后续写入期间权限暴露 # 先确保 .env 文件存在且权限为 600防止后续写入期间权限暴露
ssh txjp "touch $REMOTE_DIR/.env && chmod 600 $REMOTE_DIR/.env" 2>/dev/null ssh txjp "touch $REMOTE_DIR/.env && chmod 600 $REMOTE_DIR/.env" 2>/dev/null
# JWT_SECRET所有 .tlyq.ai 子站点必须共用同一个密钥(方案 B校验+按需修复) # JWT_SECRET 一致性检查(所有 .tlyq.ai 子站点必须共用同一个密钥)
# 从服务器共享位置读取权威值(首次自动生成并持久化) check_jwt_secret_consistency "$REMOTE_DIR"
JWT_SECRET=$(ssh txjp "cat /root/docker/.shared_jwt_secret 2>/dev/null" 2>/dev/null || echo "")
if [[ -z "$JWT_SECRET" ]]; then
JWT_SECRET=$(openssl rand -hex 32)
# 部署前备份旧共享文件(如存在)
ssh txjp "cp /root/docker/.shared_jwt_secret /root/docker/.shared_jwt_secret.bak.\$(date +%Y%m%d) 2>/dev/null || true"
ssh txjp "cat > /root/docker/.shared_jwt_secret && chmod 600 /root/docker/.shared_jwt_secret" << EOF
${JWT_SECRET}
EOF
info "已生成共享 JWT_SECRET所有站点共用"
fi
# 校验站点 .env 中的 JWT_SECRET不一致时自动修正防御手动修改
local current_jwt
current_jwt=$(ssh txjp "grep '^JWT_SECRET=' $REMOTE_DIR/.env 2>/dev/null | cut -d= -f2" 2>/dev/null || echo "")
if [[ -z "$current_jwt" ]]; then
ssh txjp "cat >> $REMOTE_DIR/.env" << EOF
JWT_SECRET=${JWT_SECRET}
EOF
elif [[ "$current_jwt" != "$JWT_SECRET" ]]; then
warn "检测到 JWT_SECRET 与共享密钥不一致,已自动修正"
ssh txjp "sed -i '/^JWT_SECRET=/d' $REMOTE_DIR/.env" # 删旧行(命令不含密钥)
ssh txjp "cat >> $REMOTE_DIR/.env" << EOF # heredoc 写新行
JWT_SECRET=${JWT_SECRET}
EOF
fi
# OIDC_CLIENT_SECRET从服务器现有 .env 读取Authelia 配置存储的是 bcrypt 哈希,不可逆用) # OIDC_CLIENT_SECRET从服务器现有 .env 读取Authelia 配置存储的是 bcrypt 哈希,不可逆用)
# 全程在服务器侧执行,避免 secret 跨 SSH 边界传输 # 全程在服务器侧执行,避免 secret 跨 SSH 边界传输
if [[ "$SITE" == "oa" || "$SITE" == "assets" || "$SITE" == "issue" || "$SITE" == "monitor" ]]; then if [[ "$SITE" == "oa" || "$SITE" == "assets" || "$SITE" == "issue" || "$SITE" == "monitor" ]]; then
@ -642,6 +646,23 @@ EOF
fi fi
fi fi
# INTERNAL_API_KEY所有 .tlyq.ai 子站点必须共用同一个密钥
if ! ssh txjp "grep -q '^INTERNAL_API_KEY=' $REMOTE_DIR/.env 2>/dev/null"; then
local shared_key
shared_key=$(ssh txjp "cat /root/docker/.shared_internal_key 2>/dev/null" 2>/dev/null || echo "")
if [[ -z "$shared_key" ]]; then
shared_key=$(openssl rand -hex 16)
ssh txjp "cat > /root/docker/.shared_internal_key" << EOF
${shared_key}
EOF
info "已生成共享 INTERNAL_API_KEY"
fi
ssh txjp "cat >> $REMOTE_DIR/.env" << EOF
INTERNAL_API_KEY=${shared_key}
EOF
info "已为站点写入 INTERNAL_API_KEY"
fi
# 清理可能被上传的本地环境变量文件(.env.local 等会覆盖 .env 中的生产配置) # 清理可能被上传的本地环境变量文件(.env.local 等会覆盖 .env 中的生产配置)
ssh txjp "rm -f $REMOTE_DIR/.env.local $REMOTE_DIR/.env.development $REMOTE_DIR/.env.production 2>/dev/null; echo '已清理本地环境文件'" ssh txjp "rm -f $REMOTE_DIR/.env.local $REMOTE_DIR/.env.development $REMOTE_DIR/.env.production 2>/dev/null; echo '已清理本地环境文件'"