feat: deploy-ai.sh 新增 monitor 部署支持 + .env.prod 模板处理
- 新增菜单选项 10) monitor.tlyq.ai - monitor 使用 build_on_server + nginx 部署 - OIDC 环境变量注入支持 monitor - 部署时从 .env.prod 模板补充缺失变量 - SSO 部署改用 configuration.prod.yml
This commit is contained in:
parent
f1ababe5be
commit
2bda66bd64
47
deploy-ai.sh
47
deploy-ai.sh
|
|
@ -69,8 +69,9 @@ 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 " 9) sso.tlyq.ai (Authelia SSO — 统一认证中心)"
|
||||||
|
echo " 10) monitor.tlyq.ai (告警监控中心)"
|
||||||
echo ""
|
echo ""
|
||||||
printf "请输入编号 (1/2/3/4/5/6/7/8/9): "
|
printf "请输入编号 (1/2/3/4/5/6/7/8/9/10): "
|
||||||
read choice
|
read choice
|
||||||
|
|
||||||
SITE=""; LOCAL_DIR=""; REMOTE_DIR=""; CONTAINER=""
|
SITE=""; LOCAL_DIR=""; REMOTE_DIR=""; CONTAINER=""
|
||||||
|
|
@ -84,6 +85,7 @@ case "$choice" in
|
||||||
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" ;;
|
9) SITE="sso"; LOCAL_DIR="/Users/niuniu/programs/docker/sso-ai"; REMOTE_DIR="/root/docker/sso-ai"; CONTAINER="authelia" ;;
|
||||||
|
10) SITE="monitor"; LOCAL_DIR="/Users/niuniu/programs/docker/monitor-ai"; REMOTE_DIR="/root/docker/monitor-ai"; CONTAINER="monitor-ai" ;;
|
||||||
*) echo "无效选择"; exit 1 ;;
|
*) echo "无效选择"; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
@ -174,7 +176,10 @@ deploy_sso() {
|
||||||
# 1. 上传 docker-compose.yml 和 config/
|
# 1. 上传 docker-compose.yml 和 config/
|
||||||
log "上传配置文件..."
|
log "上传配置文件..."
|
||||||
scp /Users/niuniu/programs/docker/sso-ai/docker-compose.yml txjp:/root/docker/sso-ai/docker-compose.yml
|
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
|
# 使用生产配置(configuration.prod.yml → configuration.yml)
|
||||||
|
scp /Users/niuniu/programs/docker/sso-ai/config/authelia/configuration.prod.yml txjp:/root/docker/sso-ai/config/authelia/configuration.yml
|
||||||
|
# 上传其他 config 文件(如 notifications.yml)
|
||||||
|
scp /Users/niuniu/programs/docker/sso-ai/config/authelia/notifications.yml txjp:/root/docker/sso-ai/config/authelia/notifications.yml 2>/dev/null || true
|
||||||
|
|
||||||
# 2. 首次部署:生成密钥
|
# 2. 首次部署:生成密钥
|
||||||
ssh txjp "if [ ! -f /root/docker/sso-ai/.env ]; then
|
ssh txjp "if [ ! -f /root/docker/sso-ai/.env ]; then
|
||||||
|
|
@ -196,11 +201,11 @@ ENVEOF
|
||||||
echo '已存在 .env,跳过密钥生成'
|
echo '已存在 .env,跳过密钥生成'
|
||||||
fi"
|
fi"
|
||||||
|
|
||||||
# 3. 注入 LDAP 密码到 configuration.yml
|
# 3. 注入 LDAP 密码到 configuration.yml(占位符 → 真实密码)
|
||||||
log "注入 LDAP 密码..."
|
log "注入 LDAP 密码..."
|
||||||
ssh txjp "cd /root/docker/sso-ai && \
|
ssh txjp "cd /root/docker/sso-ai && \
|
||||||
LLDAP_PASSWORD=\$(docker exec lldap printenv LLDAP_ADMIN_PASSWORD) && \
|
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"
|
sed -i \"s/PRODUCTION_LDAP_PASSWORD/\$LLDAP_PASSWORD/\" config/authelia/configuration.yml 2>/dev/null || true"
|
||||||
|
|
||||||
# 4. 部署 nginx sso-ai.conf
|
# 4. 部署 nginx sso-ai.conf
|
||||||
log "部署 nginx 配置..."
|
log "部署 nginx 配置..."
|
||||||
|
|
@ -407,13 +412,14 @@ build_on_server() {
|
||||||
&& sed -i 's|AUTHELIA_URL=.*|AUTHELIA_URL=https://sso.tlyq.ai|' $REMOTE_DIR/.env 2>/dev/null \
|
&& sed -i 's|AUTHELIA_URL=.*|AUTHELIA_URL=https://sso.tlyq.ai|' $REMOTE_DIR/.env 2>/dev/null \
|
||||||
|| echo 'AUTHELIA_URL=https://sso.tlyq.ai' >> $REMOTE_DIR/.env"
|
|| echo 'AUTHELIA_URL=https://sso.tlyq.ai' >> $REMOTE_DIR/.env"
|
||||||
|
|
||||||
# OIDC 环境变量配置(oa/assets/issue 站点)
|
# OIDC 环境变量配置(oa/assets/issue/monitor 站点)
|
||||||
if [[ "$SITE" == "oa" || "$SITE" == "assets" || "$SITE" == "issue" ]]; then
|
if [[ "$SITE" == "oa" || "$SITE" == "assets" || "$SITE" == "issue" || "$SITE" == "monitor" ]]; then
|
||||||
# 根据站点设置 OIDC 变量
|
# 根据站点设置 OIDC 变量
|
||||||
case "$SITE" in
|
case "$SITE" in
|
||||||
oa) OIDC_ID="oa-oidc"; OIDC_URI="https://oa.tlyq.ai/api/auth/callback" ;;
|
oa) OIDC_ID="oa-oidc"; OIDC_URI="https://oa.tlyq.ai/api/auth/callback" ;;
|
||||||
assets) OIDC_ID="assets-oidc"; OIDC_URI="https://assets.tlyq.ai/api/auth/callback" ;;
|
assets) OIDC_ID="assets-oidc"; OIDC_URI="https://assets.tlyq.ai/api/auth/callback" ;;
|
||||||
issue) OIDC_ID="issue-oidc"; OIDC_URI="https://issue.tlyq.ai/api/auth/callback" ;;
|
issue) OIDC_ID="issue-oidc"; OIDC_URI="https://issue.tlyq.ai/api/auth/callback" ;;
|
||||||
|
monitor) OIDC_ID="monitor-oidc"; OIDC_URI="https://monitor.tlyq.ai/api/auth/callback" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# 确保 OIDC_CLIENT_ID 已设置
|
# 确保 OIDC_CLIENT_ID 已设置
|
||||||
|
|
@ -432,6 +438,29 @@ build_on_server() {
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 使用 .env.prod 模板补充缺失的环境变量
|
||||||
|
ENV_PROD="$LOCAL_DIR/config/.env.prod"
|
||||||
|
if [[ -f "$ENV_PROD" ]]; then
|
||||||
|
info "使用 .env.prod 模板补充缺失变量..."
|
||||||
|
# 上传模板到服务器临时目录
|
||||||
|
scp "$ENV_PROD" txjp:/tmp/.env.prod.template
|
||||||
|
# 逐行检查:模板中有但 .env 中没有的变量,追加到 .env
|
||||||
|
ssh txjp "while IFS= read -r line; do
|
||||||
|
# 跳过注释和空行
|
||||||
|
[[ \"\$line\" =~ ^#.*$ ]] && continue
|
||||||
|
[[ -z \"\$line\" ]] && continue
|
||||||
|
# 提取变量名
|
||||||
|
varname=\"\$(echo \"\$line\" | cut -d= -f1)\"
|
||||||
|
# 如果 .env 中没有此变量,追加(跳过占位符值)
|
||||||
|
if ! grep -q \"^\${varname}=\" $REMOTE_DIR/.env 2>/dev/null; then
|
||||||
|
# 跳过 __PLACEHOLDER__ 格式的值(需要真实密钥)
|
||||||
|
if [[ ! \"\$line\" =~ __.*__ ]]; then
|
||||||
|
echo \"\$line\" >> $REMOTE_DIR/.env
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < /tmp/.env.prod.template && rm -f /tmp/.env.prod.template"
|
||||||
|
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 '已清理本地环境文件'"
|
||||||
|
|
||||||
|
|
@ -625,6 +654,11 @@ CHECKEOF
|
||||||
log "Gitea 已部署" ;;
|
log "Gitea 已部署" ;;
|
||||||
sso)
|
sso)
|
||||||
deploy_sso ;;
|
deploy_sso ;;
|
||||||
|
monitor)
|
||||||
|
build_on_server || exit 1
|
||||||
|
info "部署 nginx 配置..."
|
||||||
|
ssh txjp "cp $REMOTE_DIR/../nginx-proxy-ai/conf.d/monitor-ai.conf /root/docker/nginx-proxy-ai/conf.d/ 2>/dev/null || true
|
||||||
|
docker exec nginx-ai nginx -s reload 2>/dev/null || true" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
@ -646,6 +680,7 @@ case "$SITE" in
|
||||||
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" ;;
|
sso) URL="https://sso.tlyq.ai" ;;
|
||||||
|
monitor) URL="https://monitor.tlyq.ai" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "$SITE" == "ldap" ]]; then
|
if [[ "$SITE" == "ldap" ]]; then
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue