feat(deploy): 拉取后自动合并 server/.env.example 缺失键,服务器只跑 pull-and-restart

Made-with: Cursor
This commit is contained in:
whm
2026-03-21 21:35:11 +08:00
parent 0896bd3bab
commit 1710a11dad
5 changed files with 39 additions and 3 deletions

View File

@@ -117,7 +117,7 @@ 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`。
**产品视频自动导入**`server/.env.example` 已含默认 `YH_IMPORT_PROMOTION_SITE_ID`;首次或拉代码后脚本会把 **`.env.example` 里尚未出现在 `server/.env` 的键自动追加**到 `server/.env`**服务器只需执行 `./pull-and-restart.sh`**,无需手改配置。每次部署在 `compose up` 后会将 `web/promotion/视频发布/` 导入 `data/uploads` + `site_assets`(与 [官网](https://yuheng.yuxindazhineng.com/) `promotion-media` 一致)。多站点请改仓库内 `server/.env.example` 后再部署
- **拉取并重启**`cd ~/project/yh_web && ./pull-and-restart.sh`
- **仅重启**`cd ~/project/yh_web && ./restart.sh`

View File

@@ -269,6 +269,11 @@ else
rm -rf "$tmp_backup"
fi
# 拉取后把 .env.example 里新增的键自动追加到 server/.env无需手改如 YH_IMPORT_PROMOTION_SITE_ID
bash "$ROOT/scripts/merge-server-env-from-example.sh" "$ROOT" || true
[ -f server/.env ] && sed -i 's/\r$//' server/.env
[ -f server/.env ] && set -a && source server/.env && set +a
echo ""
echo "[2/3] 重新构建并启动..."
# 宿主机 9527 常被 sshd 占用compose 必须使用 8088 且 api 不映射宿主机端口

View File

@@ -180,6 +180,7 @@ if [ ! -f server/.env ]; then
echo "已创建默认 server/.env"
fi
fi
bash "$ROOT/scripts/merge-server-env-from-example.sh" "$ROOT" || true
[ -f server/.env ] && sed -i 's/\r$//' server/.env 2>/dev/null || true
[ -f server/.env ] && set -a && source server/.env && set +a

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
# 将 server/.env.example 中「server/.env 尚未出现的 KEY=」追加到 .env不覆盖已有配置。
# 供 pull-and-restart / restart 调用,实现服务器零手动改 .env。
set +e
ROOT="${1:-}"
if [ -z "$ROOT" ]; then
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
fi
ENVF="$ROOT/server/.env"
EX="$ROOT/server/.env.example"
[ -f "$EX" ] || exit 0
[ -f "$ENVF" ] || exit 0
while IFS= read -r raw || [ -n "$raw" ]; do
line="${raw#"${raw%%[![:space:]]*}"}"
line="${line%"${line##*[![:space:]]}"}"
case "$line" in
\#*|'') continue ;;
esac
case "$line" in
[A-Za-z_][A-Za-z0-9_]*=*)
key="${line%%=*}"
if ! grep -qE "^[[:space:]]*${key}=" "$ENVF" 2>/dev/null; then
printf '\n# auto from .env.example (%s)\n%s\n' "$(date +%Y-%m-%d)" "$line" >> "$ENVF"
echo "merge-server-env: 已追加 $key -> server/.env" >&2
fi
;;
esac
done < "$EX"
exit 0

View File

@@ -9,6 +9,6 @@ GIN_MODE=release
# 对外域名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 一致);私人仓库已填官网默认值,多站请
# 部署时自动导入「视频发布」到 data/uploads + site_assetscompose up 后执行)
# 官网站点 MongoDB _idpull-and-restart 会把本文件里「.env 缺失的键」自动追加到 server/.env一般无需手
YH_IMPORT_PROMOTION_SITE_ID=69ba1f1f41aeb82acfd609ef