feat: deploy-ai.sh 新增 sso-ai 部署支持 + sites-manage-local.sh 新增 gitea

- deploy-ai.sh: 新增选项 9 sso-ai 部署、deploy_sso 函数、密钥生成、LDAP 密码注入
- sites-manage-local.sh: 新增 gitea 支持、localhost → 127.0.0.1
This commit is contained in:
aiyimickey 2026-06-29 18:40:02 +08:00
parent 4b65bfa850
commit 952706055a
3 changed files with 98 additions and 34 deletions

View File

@ -68,8 +68,9 @@ echo " 5) assets.tlyq.ai (资产管理系统)"
echo " 6) oa.tlyq.ai (OA 统一门户 — 含 nginx 配置)" echo " 6) oa.tlyq.ai (OA 统一门户 — 含 nginx 配置)"
echo " 7) ldap.tlyq.ai (LLDAP 用户目录服务)" echo " 7) ldap.tlyq.ai (LLDAP 用户目录服务)"
echo " 8) git.tlyq.ai (Gitea 代码托管)" echo " 8) git.tlyq.ai (Gitea 代码托管)"
echo " 9) sso.tlyq.ai (Authelia SSO — 统一认证中心)"
echo "" echo ""
printf "请输入编号 (1/2/3/4/5/6/7/8): " printf "请输入编号 (1/2/3/4/5/6/7/8/9): "
read choice read choice
SITE=""; LOCAL_DIR=""; REMOTE_DIR=""; CONTAINER="" SITE=""; LOCAL_DIR=""; REMOTE_DIR=""; CONTAINER=""
@ -82,6 +83,7 @@ case "$choice" in
6) SITE="oa"; LOCAL_DIR="/Users/niuniu/programs/docker/oa-ai"; REMOTE_DIR="/root/docker/oa-ai"; CONTAINER="oa-ai" ;; 6) SITE="oa"; LOCAL_DIR="/Users/niuniu/programs/docker/oa-ai"; REMOTE_DIR="/root/docker/oa-ai"; CONTAINER="oa-ai" ;;
7) SITE="ldap"; LOCAL_DIR="/Users/niuniu/programs/docker/ldap-ai"; REMOTE_DIR="/root/docker/ldap-ai"; CONTAINER="lldap" ;; 7) SITE="ldap"; LOCAL_DIR="/Users/niuniu/programs/docker/ldap-ai"; REMOTE_DIR="/root/docker/ldap-ai"; CONTAINER="lldap" ;;
8) SITE="gitea"; LOCAL_DIR="/Users/niuniu/programs/docker/gitea-ai"; REMOTE_DIR="/root/docker/gitea-ai"; CONTAINER="gitea-ai" ;; 8) SITE="gitea"; LOCAL_DIR="/Users/niuniu/programs/docker/gitea-ai"; REMOTE_DIR="/root/docker/gitea-ai"; CONTAINER="gitea-ai" ;;
9) SITE="sso"; LOCAL_DIR="/Users/niuniu/programs/docker/sso-ai"; REMOTE_DIR="/root/docker/sso-ai"; CONTAINER="authelia" ;;
*) echo "无效选择"; exit 1 ;; *) echo "无效选择"; exit 1 ;;
esac esac
@ -163,6 +165,61 @@ trap 'to_local; [[ "$SITE" == "oa" ]] && replace_oa_urls local' EXIT
[[ "$SITE" == "oa" ]] && replace_oa_urls prod [[ "$SITE" == "oa" ]] && replace_oa_urls prod
[[ "$SITE" != "issue" && "$SITE" != "assets" && "$SITE" != "oa" ]] && to_prod [[ "$SITE" != "issue" && "$SITE" != "assets" && "$SITE" != "oa" ]] && to_prod
# ============================================================
# sso-ai 部署Docker 容器,无 npm 构建)
# ============================================================
deploy_sso() {
log "部署 sso-ai (Authelia SSO)..."
# 1. 上传 docker-compose.yml 和 config/
log "上传配置文件..."
scp /Users/niuniu/programs/docker/sso-ai/docker-compose.yml txjp:/root/docker/sso-ai/docker-compose.yml
scp -r /Users/niuniu/programs/docker/sso-ai/config txjp:/root/docker/sso-ai/config
# 2. 首次部署:生成密钥
ssh txjp "if [ ! -f /root/docker/sso-ai/.env ]; then
echo '首次部署,生成密钥...'
REDIS_PASSWORD=\$(openssl rand -hex 16)
AUTHELIA_JWT_SECRET=\$(openssl rand -hex 32)
AUTHELIA_SESSION_SECRET=\$(openssl rand -hex 32)
AUTHELIA_STORAGE_ENCRYPTION_KEY=\$(openssl rand -hex 32)
LLDAP_PASSWORD=\$(docker exec lldap printenv LLDAP_ADMIN_PASSWORD)
cat > /root/docker/sso-ai/.env << ENVEOF
REDIS_PASSWORD=\$REDIS_PASSWORD
AUTHELIA_JWT_SECRET=\$AUTHELIA_JWT_SECRET
AUTHELIA_SESSION_SECRET=\$AUTHELIA_SESSION_SECRET
AUTHELIA_STORAGE_ENCRYPTION_KEY=\$AUTHELIA_STORAGE_ENCRYPTION_KEY
LLDAP_PASSWORD=\$LLDAP_PASSWORD
ENVEOF
echo '密钥已生成'
else
echo '已存在 .env跳过密钥生成'
fi"
# 3. 注入 LDAP 密码到 configuration.yml
log "注入 LDAP 密码..."
ssh txjp "cd /root/docker/sso-ai && \
LLDAP_PASSWORD=\$(docker exec lldap printenv LLDAP_ADMIN_PASSWORD) && \
sed -i \"s/password: 'placeholder'/password: '\$LLDAP_PASSWORD'/\" config/authelia/configuration.yml 2>/dev/null || true"
# 4. 部署 nginx sso-ai.conf
log "部署 nginx 配置..."
scp /Users/niuniu/programs/docker/nginx-proxy-ai/conf.d/sso-ai.conf txjp:/root/docker/nginx-proxy-ai/conf.d/sso-ai.conf
# 5. 启动容器
log "启动 Authelia..."
ssh txjp "cd /root/docker/sso-ai && docker compose up -d"
# 6. 验证
sleep 5
ssh txjp "curl -sk https://127.0.0.1:9091/api/health" && log "Authelia 健康检查通过" || warn "Authelia 可能未就绪"
# 7. 重载 nginx
ssh txjp "docker exec nginx-ai nginx -t && docker exec nginx-ai nginx -s reload" && log "nginx 已重载" || warn "nginx 重载失败"
log "sso-ai 部署完成"
}
# ============================================================ # ============================================================
# 核心构建函数(服务器上直接 npm run build # 核心构建函数(服务器上直接 npm run build
# ============================================================ # ============================================================
@ -469,6 +526,8 @@ CHECKEOF
scp "$LOCAL_DIR/docker-compose.yml" txjp:$REMOTE_DIR/docker-compose.yml scp "$LOCAL_DIR/docker-compose.yml" txjp:$REMOTE_DIR/docker-compose.yml
ssh txjp "cd $REMOTE_DIR && docker compose up -d && docker restart nginx-ai" ssh txjp "cd $REMOTE_DIR && docker compose up -d && docker restart nginx-ai"
log "Gitea 已部署" ;; log "Gitea 已部署" ;;
sso)
deploy_sso ;;
esac esac
# ============================================================ # ============================================================
@ -489,6 +548,7 @@ case "$SITE" in
oa) URL="https://oa.tlyq.ai" ;; oa) URL="https://oa.tlyq.ai" ;;
ldap) URL="http://localhost:6178" ;; ldap) URL="http://localhost:6178" ;;
gitea) URL="https://git.tlyq.ai" ;; gitea) URL="https://git.tlyq.ai" ;;
sso) URL="https://sso.tlyq.ai" ;;
esac esac
if [[ "$SITE" == "ldap" ]]; then if [[ "$SITE" == "ldap" ]]; then

View File

@ -4,7 +4,8 @@
# 本地 Mac 运行 → 通过 SSH 操作 txjp 服务器 # 本地 Mac 运行 → 通过 SSH 操作 txjp 服务器
# 云服务器运行 → 直接操作本地 Docker # 云服务器运行 → 直接操作本地 Docker
# #
# 用法bash sites-manage-cloud.sh <命令> [站点名...] # 用法bash sites-manage-cloud.sh [命令] [站点名...]
# 不加命令默认 status
# 站点名ldap www cloud token gitea issue assets oa nginx # 站点名ldap www cloud token gitea issue assets oa nginx
# ai上述全部、all同 ai # ai上述全部、all同 ai
@ -157,7 +158,7 @@ remote_status() {
show_help() { show_help() {
echo "" echo ""
printf "${CYAN}用法:${NC} bash sites-manage-cloud.sh <命令> [站点名...]\n" printf "${CYAN}用法:${NC} bash sites-manage-cloud.sh [命令] [站点名...]\n"
echo "" echo ""
echo " 当前环境: ${LABEL}" echo " 当前环境: ${LABEL}"
echo "" echo ""
@ -190,14 +191,9 @@ show_help() {
# ============================================================ # ============================================================
# 入口 # 入口
# ============================================================ # ============================================================
ACTION=${1:-} ACTION=${1:-status}
shift || true shift || true
if [ -z "$ACTION" ]; then
show_help
exit 0
fi
mapfile -t TARGETS < <(expand_sites "$@") mapfile -t TARGETS < <(expand_sites "$@")
if [ ${#TARGETS[@]} -eq 0 ]; then if [ ${#TARGETS[@]} -eq 0 ]; then
mapfile -t TARGETS < <(expand_sites ai) mapfile -t TARGETS < <(expand_sites ai)

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# 本地站点管理:启动 / 停止 / 重启 / 状态 # 本地站点管理:启动 / 停止 / 重启 / 状态
# 用法bash sites-manage-local.sh [start|stop|restart|status] [站点名...] # 用法bash sites-manage-local.sh [start|stop|restart|status] [站点名...]
# 不加参数则交互选择 # 不加参数默认 status
# #
# 站点名: # 站点名:
# cc: www-cc cloud-cc token-cc # cc: www-cc cloud-cc token-cc
@ -15,6 +15,7 @@ ISSUE_DIR="$BASE_DIR/issue-ai"
ASSETS_DIR="$BASE_DIR/assets-ai" ASSETS_DIR="$BASE_DIR/assets-ai"
LDAP_DIR="$BASE_DIR/ldap-ai" LDAP_DIR="$BASE_DIR/ldap-ai"
OA_DIR="$BASE_DIR/oa-ai" OA_DIR="$BASE_DIR/oa-ai"
GITEA_DIR="$BASE_DIR/gitea-ai"
OA_PORT=6179 OA_PORT=6179
# 颜色 # 颜色
@ -27,6 +28,7 @@ err() { printf "${RED}[✗]${NC} %s\n" "$1"; }
ISSUE_PORT=6176 ISSUE_PORT=6176
ASSETS_PORT=6177 ASSETS_PORT=6177
LDAP_WEB_PORT=6178 LDAP_WEB_PORT=6178
GITEA_PORT=3000
is_port() { lsof -i :"$1" >/dev/null 2>&1; } is_port() { lsof -i :"$1" >/dev/null 2>&1; }
is_running() { docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^$1$"; } is_running() { docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^$1$"; }
@ -104,11 +106,12 @@ start_all() {
assets) node_start assets-ai "$ASSETS_DIR" $ASSETS_PORT "/tmp/assets-ai-dev.log" ;; assets) node_start assets-ai "$ASSETS_DIR" $ASSETS_PORT "/tmp/assets-ai-dev.log" ;;
ldap) docker_start lldap "$LDAP_DIR" ldap) docker_start lldap "$LDAP_DIR"
if is_port $LDAP_WEB_PORT; then if is_port $LDAP_WEB_PORT; then
log "LLDAP Web UI: http://localhost:$LDAP_WEB_PORT" log "LLDAP Web UI: http://127.0.0.1:$LDAP_WEB_PORT"
fi ;; fi ;;
oa) node_start oa-ai "$OA_DIR" $OA_PORT "/tmp/oa-ai-dev.log" ;; oa) node_start oa-ai "$OA_DIR" $OA_PORT "/tmp/oa-ai-dev.log" ;;
gitea) docker_start gitea-ai "$GITEA_DIR" ;;
cc) start_all www-cc cloud-cc token-cc ;; cc) start_all www-cc cloud-cc token-cc ;;
ai) start_all ldap www-ai cloud-ai token-ai issue assets oa ;; ai) start_all ldap www-ai cloud-ai token-ai issue assets oa gitea ;;
all) start_all cc ai ;; all) start_all cc ai ;;
*) err "未知站点: $name" ;; *) err "未知站点: $name" ;;
esac esac
@ -128,8 +131,9 @@ stop_all() {
assets) node_stop assets-ai $ASSETS_PORT ;; assets) node_stop assets-ai $ASSETS_PORT ;;
ldap) docker_stop lldap "$LDAP_DIR" ;; ldap) docker_stop lldap "$LDAP_DIR" ;;
oa) node_stop oa-ai $OA_PORT ;; oa) node_stop oa-ai $OA_PORT ;;
gitea) docker_stop gitea-ai "$GITEA_DIR" ;;
cc) stop_all www-cc cloud-cc token-cc ;; cc) stop_all www-cc cloud-cc token-cc ;;
ai) stop_all ldap www-ai cloud-ai token-ai issue assets oa ;; ai) stop_all ldap www-ai cloud-ai token-ai issue assets oa gitea ;;
all) stop_all cc ai ;; all) stop_all cc ai ;;
*) err "未知站点: $name" ;; *) err "未知站点: $name" ;;
esac esac
@ -152,9 +156,9 @@ show_status() {
local expanded=() local expanded=()
for t in "${targets[@]}"; do for t in "${targets[@]}"; do
case $t in case $t in
all) eval "expanded=(www-cc cloud-cc token-cc ldap www-ai cloud-ai token-ai issue assets oa)" ;; all) eval "expanded=(www-cc cloud-cc token-cc ldap www-ai cloud-ai token-ai issue assets oa gitea)" ;;
cc) eval "expanded=(\${expanded[@]} www-cc cloud-cc token-cc)" ;; cc) eval "expanded=(\${expanded[@]} www-cc cloud-cc token-cc)" ;;
ai) eval "expanded=(\${expanded[@]} ldap www-ai cloud-ai token-ai issue assets oa)" ;; ai) eval "expanded=(\${expanded[@]} ldap www-ai cloud-ai token-ai issue assets oa gitea)" ;;
*) expanded+=($t) ;; *) expanded+=($t) ;;
esac esac
done done
@ -216,6 +220,14 @@ show_status() {
printf " ${RED}${NC} %-12s 未运行\n" "$name" printf " ${RED}${NC} %-12s 未运行\n" "$name"
fi fi
;; ;;
gitea)
if is_running gitea-ai; then
printf " ${GREEN}${NC} %-12s 运行中 (port %d)\n" "$name" $GITEA_PORT
running=$((running + 1))
else
printf " ${RED}${NC} %-12s 未运行\n" "$name"
fi
;;
esac esac
done done
echo "" echo ""
@ -225,18 +237,19 @@ show_status() {
printf "${CYAN}=========================================${NC}\n" printf "${CYAN}=========================================${NC}\n"
echo "" echo ""
echo " cc 站点:" echo " cc 站点:"
echo " www-cc http://localhost:5173" echo " www-cc http://127.0.0.1:5173"
echo " cloud-cc http://localhost:5174" echo " cloud-cc http://127.0.0.1:5174"
echo " token-cc http://localhost:5175" echo " token-cc http://127.0.0.1:5175"
echo "" echo ""
echo " ai 站点:" echo " ai 站点:"
echo " www-ai http://localhost:6173" echo " www-ai http://127.0.0.1:6173"
echo " cloud-ai http://localhost:6174" echo " cloud-ai http://127.0.0.1:6174"
echo " token-ai http://localhost:6175" echo " token-ai http://127.0.0.1:6175"
echo " ldap http://localhost:$LDAP_WEB_PORT (LLDAP Web UI)" echo " ldap http://127.0.0.1:$LDAP_WEB_PORT (LLDAP Web UI)"
echo " oa http://localhost:$OA_PORT" echo " oa http://127.0.0.1:$OA_PORT"
echo " issue http://localhost:$ISSUE_PORT" echo " issue http://127.0.0.1:$ISSUE_PORT"
echo " assets http://localhost:$ASSETS_PORT" echo " assets http://127.0.0.1:$ASSETS_PORT"
echo " gitea http://127.0.0.1:$GITEA_PORT"
echo "" echo ""
} }
@ -245,7 +258,7 @@ show_status() {
# ============================================================ # ============================================================
show_help() { show_help() {
echo "" echo ""
printf "${CYAN}用法:${NC} bash sites-manage-local.sh <命令> [站点名...]\n" printf "${CYAN}用法:${NC} bash sites-manage-local.sh [命令] [站点名...]\n"
echo "" echo ""
echo " 命令:" echo " 命令:"
echo " start 启动站点" echo " start 启动站点"
@ -255,9 +268,9 @@ show_help() {
echo "" echo ""
echo " 站点名(可指定多个,空格分隔):" echo " 站点名(可指定多个,空格分隔):"
echo " www-cc cloud-cc token-cc" echo " www-cc cloud-cc token-cc"
echo " ldap www-ai cloud-ai token-ai issue assets oa" echo " ldap www-ai cloud-ai token-ai issue assets oa gitea"
echo " cc — tlyq.cc 全部 (www-cc cloud-cc token-cc)" echo " cc — tlyq.cc 全部 (www-cc cloud-cc token-cc)"
echo " ai — tlyq.ai 全部 (ldap www-ai cloud-ai token-ai issue assets oa)" echo " ai — tlyq.ai 全部 (ldap www-ai cloud-ai token-ai issue assets oa gitea)"
echo " all — 全部站点" echo " all — 全部站点"
echo "" echo ""
echo "示例:" echo "示例:"
@ -275,14 +288,9 @@ show_help() {
# 检查 Docker 服务 # 检查 Docker 服务
check_docker check_docker
ACTION=${1:-} ACTION=${1:-status}
shift || true shift || true
if [ -z "$ACTION" ]; then
show_help
exit 0
fi
# 解析站点列表 # 解析站点列表
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
case $ACTION in case $ACTION in