81 lines
2.6 KiB
Bash
Executable File
81 lines
2.6 KiB
Bash
Executable File
#!/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"
|