90 lines
2.8 KiB
Bash
90 lines
2.8 KiB
Bash
#!/bin/bash
|
|
# deploy-monitor.sh — 部署 monitor-ai 到云服务器
|
|
# 用法: bash deploy-monitor.sh [--remote --host <IP>] [--dev]
|
|
set -e
|
|
|
|
MODE="${1:-local}"
|
|
REMOTE_HOST=""
|
|
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
MONITOR_DIR="$PROJECT_DIR/monitor-ai"
|
|
SHARED_DIR="$PROJECT_DIR/shared"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
|
|
# 解析参数
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--remote) MODE="remote"; shift ;;
|
|
--host) REMOTE_HOST="$2"; shift 2 ;;
|
|
--dev) MODE="dev"; shift ;;
|
|
*) shift ;;
|
|
esac
|
|
done
|
|
|
|
echo "=== deploy-monitor.sh === Mode: $MODE ==="
|
|
|
|
# 打包源码
|
|
echo "[1/5] 打包源码..."
|
|
TARBALL="/tmp/monitor-ai-${TIMESTAMP}.tar.gz"
|
|
cd "$PROJECT_DIR"
|
|
tar czf "$TARBALL" --exclude='node_modules' --exclude='.next' --exclude='data/*.db' \
|
|
shared/lib/ monitor-ai/
|
|
|
|
echo "[2/5] 上传..."
|
|
if [ "$MODE" = "remote" ]; then
|
|
if [ -z "$REMOTE_HOST" ]; then
|
|
echo "Error: --remote 模式需要 --host <IP>"
|
|
exit 1
|
|
fi
|
|
ssh "$REMOTE_HOST" "mkdir -p /root/docker"
|
|
scp "$TARBALL" "$REMOTE_HOST:/root/docker/"
|
|
ssh "$REMOTE_HOST" "cd /root/docker && tar xzf monitor-ai-${TIMESTAMP}.tar.gz && rm monitor-ai-${TIMESTAMP}.tar.gz"
|
|
else
|
|
# local 模式: 部署到当前服务器的 /root/docker/
|
|
sudo mkdir -p /root/docker
|
|
sudo cp "$TARBALL" /root/docker/
|
|
cd /root/docker
|
|
sudo tar xzf "monitor-ai-${TIMESTAMP}.tar.gz"
|
|
sudo rm "monitor-ai-${TIMESTAMP}.tar.gz"
|
|
fi
|
|
|
|
echo "[3/5] 构建..."
|
|
if [ "$MODE" = "remote" ]; then
|
|
ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && npm install && npm run build"
|
|
else
|
|
cd /root/docker/monitor-ai
|
|
sudo npm install
|
|
sudo npm run build
|
|
fi
|
|
|
|
echo "[4/5] 配置首次部署..."
|
|
if [ "$MODE" = "remote" ]; then
|
|
# 生成密钥
|
|
OIDC_SECRET=$(openssl rand -hex 32)
|
|
LOCALADMIN_PWD=$(openssl rand -hex 16)
|
|
ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && \
|
|
echo 'NODE_ENV=production' > .env && \
|
|
echo 'DATABASE_PATH=/data/monitor.db' >> .env && \
|
|
echo 'MONITOR_MODE=local' >> .env && \
|
|
echo 'AUTHELIA_URL=https://sso.tlyq.ai' >> .env && \
|
|
echo 'OIDC_CLIENT_ID=monitor-oidc' >> .env && \
|
|
echo 'OIDC_CLIENT_SECRET=${OIDC_SECRET}' >> .env && \
|
|
echo 'OIDC_REDIRECT_URI=https://monitor.tlyq.ai/api/auth/callback' >> .env && \
|
|
echo 'JWT_SECRET=<与全站一致>' >> .env && \
|
|
echo 'COOKIE_DOMAIN=.tlyq.ai' >> .env && \
|
|
echo 'LDAP_URL=ldap://ldap-ai:3890' >> .env && \
|
|
echo 'LOCALADMIN_PASSWORD=${LOCALADMIN_PWD}' >> .env && \
|
|
echo 'NODE_TLS_REJECT_UNAUTHORIZED=0' >> .env"
|
|
fi
|
|
|
|
echo "[5/5] 启动容器..."
|
|
if [ "$MODE" = "remote" ]; then
|
|
ssh "$REMOTE_HOST" "cd /root/docker/monitor-ai && docker compose up -d --build"
|
|
else
|
|
cd /root/docker/monitor-ai
|
|
sudo docker compose up -d --build
|
|
fi
|
|
|
|
echo "=== 部署完成 ==="
|
|
echo "monitor-ai: https://monitor.tlyq.ai"
|
|
echo "健康检查: curl https://monitor.tlyq.ai/api/health"
|