From 9e88e65757482c3c9e0652d9bec092f95aac06a3 Mon Sep 17 00:00:00 2001 From: aiyimickey <39365912+aiyimickey@users.noreply.github.com> Date: Wed, 15 Jul 2026 16:00:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20#26=20deploy-ai.sh=20LLDAP=20=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E6=B3=A8=E5=85=A5=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy-ai.sh | 75 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/deploy-ai.sh b/deploy-ai.sh index 5c6c5c0..d2b3632 100755 --- a/deploy-ai.sh +++ b/deploy-ai.sh @@ -384,6 +384,35 @@ sync_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() { local extra_env="${1:-}" @@ -578,33 +607,8 @@ build_on_server() { # 先确保 .env 文件存在且权限为 600(防止后续写入期间权限暴露) ssh txjp "touch $REMOTE_DIR/.env && chmod 600 $REMOTE_DIR/.env" 2>/dev/null - # JWT_SECRET:所有 .tlyq.ai 子站点必须共用同一个密钥(方案 B:校验+按需修复) - # 从服务器共享位置读取权威值(首次自动生成并持久化) - 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 + # JWT_SECRET 一致性检查(所有 .tlyq.ai 子站点必须共用同一个密钥) + check_jwt_secret_consistency "$REMOTE_DIR" # OIDC_CLIENT_SECRET:从服务器现有 .env 读取(Authelia 配置存储的是 bcrypt 哈希,不可逆用) # 全程在服务器侧执行,避免 secret 跨 SSH 边界传输 if [[ "$SITE" == "oa" || "$SITE" == "assets" || "$SITE" == "issue" || "$SITE" == "monitor" ]]; then @@ -642,6 +646,23 @@ EOF 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 中的生产配置) ssh txjp "rm -f $REMOTE_DIR/.env.local $REMOTE_DIR/.env.development $REMOTE_DIR/.env.production 2>/dev/null; echo '已清理本地环境文件'"