fix: #26 deploy-ai.sh LLDAP 密码注入逻辑优化
This commit is contained in:
parent
3a4600ce5b
commit
9e88e65757
75
deploy-ai.sh
75
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 '已清理本地环境文件'"
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue