#!/usr/bin/env bash set -Eeuo pipefail # 修改这三个值即可。 REGION="EUR" UNIVERSE="TOP2500" DELAY="1" PROJECT_NAME="${COMPOSE_PROJECT_NAME:-wq-alpha-production}" BACKEND_PYTHON="/app/.venv/bin/python" if ! docker info >/dev/null; then echo "ERROR: 无法连接 Docker,请检查 1Panel 任务的 Docker 访问权限" >&2 exit 1 fi # 先检查 docker ps 的退出状态;进程替换会掩盖查询失败。 if ! CONTAINER_NAMES="$( docker ps \ --filter "status=running" \ --filter "label=com.docker.compose.project=${PROJECT_NAME}" \ --filter "label=com.docker.compose.service=backend" \ --format '{{.Names}}' )"; then echo "ERROR: 查询 production backend 容器失败" >&2 exit 1 fi BACKEND_CONTAINERS=() while IFS= read -r container; do if [ -n "$container" ]; then BACKEND_CONTAINERS+=("$container") fi done <<< "$CONTAINER_NAMES" if [ "${#BACKEND_CONTAINERS[@]}" -eq 0 ]; then echo "ERROR: 没有找到 production backend 容器,Compose 项目名:${PROJECT_NAME}" >&2 exit 1 fi if [ "${#BACKEND_CONTAINERS[@]}" -gt 1 ]; then echo "ERROR: 找到多个 production backend 容器,拒绝选择:" >&2 printf ' %s\n' "${BACKEND_CONTAINERS[@]}" >&2 exit 1 fi BACKEND_CONTAINER="${BACKEND_CONTAINERS[0]}" HEALTH_STATUS="$( docker inspect \ --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' \ "$BACKEND_CONTAINER" )" if [ "$HEALTH_STATUS" != "healthy" ]; then echo "ERROR: backend 容器当前不健康,状态:${HEALTH_STATUS}" >&2 exit 1 fi if ! docker exec "$BACKEND_CONTAINER" test -x "$BACKEND_PYTHON"; then echo "ERROR: 容器中不存在可执行命令:${BACKEND_PYTHON}" >&2 exit 1 fi if ! docker exec --workdir /app "$BACKEND_CONTAINER" \ "$BACKEND_PYTHON" -m app.cli catalog-sync --help >/dev/null; then echo "ERROR: catalog-sync CLI 不可用,请确认已部署包含全量目录同步的镜像" >&2 exit 1 fi if ! docker exec "$BACKEND_CONTAINER" sh -c \ 'test -n "${DATABASE_URL:-}" && test -n "${ENCRYPTION_KEY:-}" && test -n "${ADMIN_PASSWORD:-}"'; then echo "ERROR: 容器缺少 DATABASE_URL、ENCRYPTION_KEY 或 ADMIN_PASSWORD" >&2 exit 1 fi echo "使用容器:${BACKEND_CONTAINER}" echo "开始全量同步:${REGION} / ${UNIVERSE} / Delay ${DELAY}" # 沿用容器环境和现有后台执行器,不创建另一套同步进程。 # 保留 CLI 退出码;等待超时不取消后台任务。 exec docker exec --workdir /app \ "$BACKEND_CONTAINER" \ "$BACKEND_PYTHON" -u -m app.cli catalog-sync \ --region "$REGION" --universe "$UNIVERSE" --delay "$DELAY"