刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh
# cx-web 启动时把部署环境的地址写进前端运行时配置 _app.config.js(nginx 官方镜像按文件名顺序
# 执行 /docker-entrypoint.d/*.sh,本脚本排在 20-envsubst 之后、nginx 启动之前)。
#
# 为什么:OnlyOffice 地址原先是前端编译期写死(VITE_GLOB_ONLYOFFICE_URL),每台构建机都得有
# gitignored 的 .env.production.local,漏了就发出空地址(2026-09-23 实踩)。改为运行时注入后,
# 同一份前端产物可用于任何环境,换地址只改服务器 .env 的 ONLYOFFICE_DS_PUBLIC_URL。
# 前端读取侧:loadDocsApi.ts 的 getDocumentServerUrl() 优先读 window._JNPF_ADMIN_PRO_APP_CONF_。
#
# 未设该变量 = 不改 _app.config.js(保持构建期的值),与改造前行为一致。
set -eu
 
CONF=/usr/share/nginx/html/_app.config.js
KEY=VITE_GLOB_ONLYOFFICE_URL
VALUE="${ONLYOFFICE_DS_PUBLIC_URL:-}"
 
[ -n "$VALUE" ] || { echo "40-runtime-app-config: ONLYOFFICE_DS_PUBLIC_URL 未设置,保留构建期配置"; exit 0; }
[ -f "$CONF" ] || { echo "40-runtime-app-config: 缺 $CONF,跳过"; exit 0; }
 
if ! grep -q "\"$KEY\":\"" "$CONF"; then
  # 前端过旧(_app.config.js 里没有该键):不硬塞,提示后照常启动
  echo "40-runtime-app-config: ⚠️ $CONF 中没有 $KEY,前端版本过旧,未注入"
  exit 0
fi
 
# sed 替换串里转义 | & \ 三个特殊字符
ESCAPED=$(printf '%s' "$VALUE" | sed 's/[|&\\]/\\&/g')
sed -i "s|\"$KEY\":\"[^\"]*\"|\"$KEY\":\"$ESCAPED\"|" "$CONF"
grep -qF "\"$KEY\":\"$VALUE\"" "$CONF" || { echo "40-runtime-app-config: ❌ 写入校验失败" >&2; exit 1; }
echo "40-runtime-app-config: $KEY=$VALUE"