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

@@ -117,6 +117,8 @@ bash pull-and-restart.sh
若报错 `bash\r`,先执行 `sed -i 's/\r$//' pull-and-restart.sh restart.sh`。
首次部署若目录为空,可先放入两个脚本,设置 `export GIT_REPO_URL='https://用户:Token@gitea.../web.git'` 后执行 `./pull-and-restart.sh` 完成克隆与启动。配置好 `server/.env` 后再次运行即可。
**产品视频自动导入(可选)**:在 `server/.env` 中设置 `YH_IMPORT_PROMOTION_SITE_ID=<官网 Mongo 站点 _id>` 后,每次 `./pull-and-restart.sh` / `./restart.sh` 在 `docker compose up` 后会自动将 `web/promotion/视频发布/` 导入到 `data/uploads/sites/<site_id>/promotion/social/` 并写入 `site_assets`(与 [官网](https://yuheng.yuxindazhineng.com/) `promotion-media` API 一致)。不设该变量则跳过。详见 `server/.env.example`。
- **拉取并重启**`cd ~/project/yh_web && ./pull-and-restart.sh`
- **仅重启**`cd ~/project/yh_web && ./restart.sh`
- **对外域名**https://yuheng.yuxindazhineng.com所有请求均通过该域名见下

View File

@@ -350,6 +350,9 @@ fi
compose_cmd down 2>/dev/null || true
compose_cmd up -d --force-recreate
# 可选web/promotion/视频发布 -> data/uploads + MongoDB须 server/.env 中 YH_IMPORT_PROMOTION_SITE_ID
bash "$ROOT/scripts/run-promotion-import-on-deploy.sh" "$ROOT"
echo ""
echo "[3/3] 证书与宿主机 Nginx可选..."
NGINX_CONF_NAME="${NGINX_DOMAIN}.conf"

View File

@@ -251,6 +251,8 @@ fi
compose_cmd down 2>/dev/null || true
compose_cmd up -d --force-recreate
bash "$ROOT/scripts/run-promotion-import-on-deploy.sh" "$ROOT"
if [ -f "$ROOT/nginx/$NGINX_CONF_NAME" ]; then
run_sudo cp -f "$ROOT/nginx/$NGINX_CONF_NAME" /etc/nginx/conf.d/ 2>/dev/null || true
if run_sudo nginx -t 2>/dev/null; then

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

View File

@@ -6,5 +6,9 @@ MONGODB_URI=mongodb://mongo:27017
MONGODB_DB=yxd-agent-testing
PORT=8088
GIN_MODE=release
# 对外域名CORS、日志与 nginx 反代域名一致
# 对外域名CORS、日志与 nginx 反代域名一致(官网 https://yuheng.yuxindazhineng.com/
ALLOWED_ORIGINS=https://yuheng.yuxindazhineng.com
# 部署时自动导入「视频发布」到 data/uploads + site_assetspull-and-restart / restart 在 compose up 后执行)
# 填官网站点 MongoDB _id与 /api/web/routes 返回的 site_id 一致);留空则跳过
# YH_IMPORT_PROMOTION_SITE_ID=