feat(deploy): compose up 后自动 promotion-import(YH_IMPORT_PROMOTION_SITE_ID + Docker go run)

Made-with: Cursor
This commit is contained in:
whm
2026-03-21 21:28:56 +08:00
parent c1fb5f3440
commit f4e51165a7
6 changed files with 89 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env bash
# 将 web/promotion/视频发布 导入到 data/uploads + MongoDB site_assets无需后台手动上传
# 依赖:server/.env 中 MONGODB_URI、MONGODB_DB与 API 一致);本机可连 Mongo
# 部署时若已在 server/.env 设置 YH_IMPORT_PROMOTION_SITE_IDpull-and-restart/restart 会在 compose up 后自动执行等效逻辑Docker 内 go run见 run-promotion-import-on-deploy.sh
# 本脚本:在宿主机直接 go run依赖 server/.env 中 MONGODB_URI 能连上 Mongo若 Mongo 仅在 compose 内网,请用自动导入或 docker 网络)
#
# 用法:
# ./scripts/import-promotion-to-api.sh -site=你的站点MongoID

View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# 在部署compose up之后执行将 web/promotion/视频发布 导入 data/uploads + MongoDB site_assets。
# 触发条件:环境变量或 server/.env 中设置了 YH_IMPORT_PROMOTION_SITE_IDMongo 站点 _id
# 使用 Docker 内 golang 执行 go run与 compose 内 mongo 同网mongodb://mongo:27017宿主机无需安装 Go。
# 用法:由 pull-and-restart.sh / restart.sh 调用;勿单独在 compose 未启动时依赖 mongo 网络。
set +e
ROOT="${1:-}"
if [ -z "$ROOT" ] || [ ! -d "$ROOT/server" ]; then
echo "run-promotion-import-on-deploy.sh: 无效项目根目录" >&2
exit 0
fi
ROOT="$(cd "$ROOT" && pwd)"
SITE="${YH_IMPORT_PROMOTION_SITE_ID:-}"
if [ -z "$SITE" ] && [ -f "$ROOT/server/.env" ]; then
SITE="$(grep -E '^[[:space:]]*YH_IMPORT_PROMOTION_SITE_ID=' "$ROOT/server/.env" 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '\r' | sed "s/^[\"']//;s/[\"']$//" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
fi
if [ -z "$SITE" ]; then
echo "跳过 promotion-import未设置 YH_IMPORT_PROMOTION_SITE_ID可在 server/.env 中配置)。"
exit 0
fi
SRC_DIR="$ROOT/web/promotion/视频发布"
if [ ! -d "$SRC_DIR" ]; then
echo "跳过 promotion-import无源目录 $SRC_DIR"
exit 0
fi
DOCKER="docker"
if ! docker info >/dev/null 2>&1; then
if sudo docker info >/dev/null 2>&1; then
DOCKER="sudo docker"
else
echo "警告: 无法使用 docker跳过 promotion-import" >&2
exit 0
fi
fi
PROJECT_NAME="${COMPOSE_PROJECT_NAME:-$(basename "$ROOT")}"
NET="${PROJECT_NAME}_yh_net"
if ! $DOCKER network inspect "$NET" >/dev/null 2>&1; then
echo "警告: 未找到 Docker 网络 $NETCOMPOSE_PROJECT_NAME 是否一致?),跳过 promotion-import" >&2
exit 0
fi
REGISTRY_MIRROR="${REGISTRY_MIRROR:-docker.m.daocloud.io/library/}"
GOIMAGE="${REGISTRY_MIRROR}golang:1.21-alpine"
GOPROXY="${GOPROXY:-https://goproxy.cn,direct}"
ENV_FILE_ARG=()
if [ -f "$ROOT/server/.env" ]; then
ENV_FILE_ARG=(--env-file "$ROOT/server/.env")
fi
echo ""
echo "promotion-importsite=$SITE(源=$SRC_DIR -> uploads=/uploads..."
mkdir -p "$ROOT/data/uploads"
if ! $DOCKER run --rm \
--network "$NET" \
-v "$ROOT/server:/src" \
-v "$ROOT/data/uploads:/uploads" \
-v "$SRC_DIR:/import-src:ro" \
"${ENV_FILE_ARG[@]}" \
-e MONGODB_URI=mongodb://mongo:27017 \
-e GOPROXY="$GOPROXY" \
-e YH_PI_SITE="$SITE" \
"$GOIMAGE" \
sh -c 'cd /src && go run -mod=vendor ./cmd/promotion-import/ -site="$YH_PI_SITE" -src=/import-src -upload=/uploads'; then
echo "警告: promotion-import 未成功,可手动执行: ./scripts/import-promotion-to-api.sh -site=$SITE" >&2
fi
chmod -R a+rX "$ROOT/data/uploads" 2>/dev/null || sudo chmod -R a+rX "$ROOT/data/uploads" 2>/dev/null || true
exit 0