feat(deploy): compose up 后自动 promotion-import(YH_IMPORT_PROMOTION_SITE_ID + Docker go run)
Made-with: Cursor
This commit is contained in:
@@ -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_ID,pull-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
|
||||
|
||||
75
scripts/run-promotion-import-on-deploy.sh
Normal file
75
scripts/run-promotion-import-on-deploy.sh
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
# 在部署(compose up)之后执行:将 web/promotion/视频发布 导入 data/uploads + MongoDB site_assets。
|
||||
# 触发条件:环境变量或 server/.env 中设置了 YH_IMPORT_PROMOTION_SITE_ID(Mongo 站点 _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 网络 $NET(COMPOSE_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-import:site=$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
|
||||
Reference in New Issue
Block a user