#!/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"