From f4e51165a7fba35ebae273d36aac7bb1cca0034d Mon Sep 17 00:00:00 2001 From: whm <973418690@qq.com> Date: Sat, 21 Mar 2026 21:28:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(deploy):=20compose=20up=20=E5=90=8E?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=20promotion-import=EF=BC=88YH=5FIMPORT=5FPRO?= =?UTF-8?q?MOTION=5FSITE=5FID=20+=20Docker=20go=20run=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- README.md | 2 + pull-and-restart.sh | 3 + restart.sh | 2 + scripts/import-promotion-to-api.sh | 3 +- scripts/run-promotion-import-on-deploy.sh | 75 +++++++++++++++++++++++ server/.env.example | 6 +- 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 scripts/run-promotion-import-on-deploy.sh diff --git a/README.md b/README.md index ce0a193..dda01b6 100644 --- a/README.md +++ b/README.md @@ -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//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(所有请求均通过该域名,见下) diff --git a/pull-and-restart.sh b/pull-and-restart.sh index db3dada..1b9c1ce 100755 --- a/pull-and-restart.sh +++ b/pull-and-restart.sh @@ -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" diff --git a/restart.sh b/restart.sh index f464825..3be6c77 100755 --- a/restart.sh +++ b/restart.sh @@ -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 diff --git a/scripts/import-promotion-to-api.sh b/scripts/import-promotion-to-api.sh index 777c73e..798ce5a 100644 --- a/scripts/import-promotion-to-api.sh +++ b/scripts/import-promotion-to-api.sh @@ -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 diff --git a/scripts/run-promotion-import-on-deploy.sh b/scripts/run-promotion-import-on-deploy.sh new file mode 100644 index 0000000..e519db9 --- /dev/null +++ b/scripts/run-promotion-import-on-deploy.sh @@ -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 diff --git a/server/.env.example b/server/.env.example index 9fa2d66..6b0672d 100644 --- a/server/.env.example +++ b/server/.env.example @@ -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_assets(pull-and-restart / restart 在 compose up 后执行) +# 填官网站点 MongoDB _id(与 /api/web/routes 返回的 site_id 一致);留空则跳过 +# YH_IMPORT_PROMOTION_SITE_ID=