#!/bin/bash set -e # ============================================================================= # CloudSearch 一键部署脚本 # 用法: # curl -sS https://gitea.timxx.cn/admin/CloudSearch/raw/branch/master/source_clean/deploy.sh | bash # # 可选环境变量(部署前设置): # CORS_ORIGIN - 网站域名,必填 (如 https://your-domain.com) # JWT_SECRET - JWT 签名密钥 (留空自动生成) # ADMIN_PASSWORD - 管理员密码 (留空自动生成) # REDIS_URL - Redis 连接 (默认: redis://redis:6379) # LOG_LEVEL - 日志级别 (默认: info) # DEPLOY_DIR - 部署目录 (默认: /opt/cloudsearch) # ============================================================================= REPO_URL="https://gitea.timxx.cn/admin/CloudSearch.git" IMAGE="gitea.timxx.cn/admin/cloudsearch:latest" DEPLOY_DIR="${DEPLOY_DIR:-/opt/cloudsearch}" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } err() { echo -e "${RED}[ERROR]${NC} $*"; } command -v docker &>/dev/null || { err "Docker 未安装,请先安装 Docker"; exit 1; } # ── 检查必填参数 ────────────────────────────────────────────────────────── if [ -z "$CORS_ORIGIN" ]; then PUBLIC_IP=$(curl -s --connect-timeout 3 ifconfig.me 2>/dev/null || curl -s --connect-timeout 3 ip.sb 2>/dev/null || echo "") if [ -n "$PUBLIC_IP" ]; then CORS_ORIGIN="http://${PUBLIC_IP}:9527" warn "未设置 CORS_ORIGIN,自动检测为: ${CORS_ORIGIN}" warn "如需自定义网域名,请: CORS_ORIGIN=https://your.domain.com curl ... | bash" else CORS_ORIGIN="http://localhost:9527" warn "未觮 CORS_ORIGIN,使用默认: ${CORS_ORIGIN}" fi fi # ── 拉取仓库 ────────────────────────────────────────────────────────────── info "拉取仓库..." if [ -d "$DEPLOY_DIR/.git" ]; then cd "$DEPLOY_DIR" && git pull --ff-only origin master 2>/dev/null || true else rm -rf "$DEPLOY_DIR" git clone --depth 1 "$REPO_URL" "$DEPLOY_DIR" fi cd "$DEPLOY_DIR/source_clean" # ── 切换到镜像模式 ──────────────────────────────────────────────────────── if grep -q '^ build:' docker-compose.yml 2>/dev/null; then info "配置镜像模式..." sed -i 's/^ build:/ # build:/' docker-compose.yml sed -i 's/^ context:/ # context:/' docker-compose.yml sed -i 's/^ dockerfile:/ # dockerfile:/' docker-compose.yml sed -i 's|^ # image: gitea.timxx.cn/admin/cloudsearch:latest| image: gitea.timxx.cn/admin/cloudsearch:latest|' docker-compose.yml fi # ── 生成密钥 ────────────────────────────────────────────────────────────── JWT_SECRET="${JWT_SECRET:-$(openssl rand -hex 32)}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-$(openssl rand -base64 12 | tr -d '=+/' | head -c 16)}" # ── 生成 .env ───────────────────────────────────────────────────────────── cat > .env </dev/null || true info "停止旧服务..." docker compose down --remove-orphans 2>/dev/null || true info "启动服务..." docker compose up -d # ── 等待就绪 ────────────────────────────────────────────────────────────── info "等待服务就绪..." for i in $(seq 1 15); do if curl -s -o /dev/null -w '%{http_code}' http://localhost:9527/health 2>/dev/null | grep -q '200'; then break fi sleep 2 done # ── 强制写入管理员密码(及同时备目录到没是发重启,直接更新数据库) ───────────)"w/2[BFc)ͱ)ȁᕌ ՑMɍ})ЁЀɕեɔѩ̜)Ёх͔ɕեɔѕȵűє̜)Ё􁹕܁х͔фх͔űє)Ё͠􁉍й͡M幌5%9}AMM]=I)Ёѥ􁑈ɕɔM1 PI=4́]!I͕ɹР)ѥ(ɕɔUAQ́MPݽɑ}͠]!I͕ɹո͠)􁕱͔(ɕɔ%9MIP%9Q<͕̀ɹݽɑ}͠Y1ULո͠))͔(ؽձBFc˖B3VÚ6O"w/2[ⷾ37B;*3"@((RR3RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR)`docker compose ps 2>/dev/null | grep -q 'Up'; then echo "" echo "=============================================" echo -e " \033[0;32m✅ CloudSearch 部署完成\033[0m" echo "=============================================" docker compose ps echo "" echo " 管理后台: ${CORS_ORIGIN}/admin/login" echo " 用户名: admin" echo " 密码: ${ADMIN_PASSWORD}" else err "服务启动失败: docker compose logs" exit 1 fi