feat: 门户页卡片可配置 + 升级前域名校验 + 清理明文门户口令
按用户选择实施三件事:
1) 门户页服务卡片可配置(不再写死真实域名)
- portal/index.html 卡片区加 <!--NAVI_CARDS_START/END--> 标记,内置卡片改为通用示例
- renderPortalPage 支持数据卷 <data>/portal/cards.html 覆盖标记区间(清空即回落内置)
- 新增 GET/POST /api/portal-cards 读写该片段
- 测试:覆盖替换成功、空白片段回落内置
- 仓库内真实域名由此清零
2) 升级前必须提供跨子域单点登录变量(防止"去掉写死默认值"造成 SSO 静默失效)
- zd-host.sh 在切换前检查 PORTAL_COOKIE_DOMAIN:缺失且未传 NAVI_COOKIE_DOMAIN
时直接拒绝升级(退出码 2)并给出正确命令;PORTAL_HOME_URL 可用 NAVI_HOME_URL 补
- README 新增「升级已有部署前必须确认的两个变量」含失败表现与正确命令
3) 清理明文门户口令
- 迁移旧容器 env 时丢弃 PORTAL_PASSWORD(docker inspect 可见 = 泄露面)
- 升级后写入强随机口令并通过接口生效,部署日志只打印一次;失败不阻断升级并提示后台可改
This commit is contained in:
@ -94,6 +94,30 @@ OLD_ID=$(docker inspect navi --format '{{.Id}}')
|
||||
docker inspect navi --format '{{range .Config.Env}}{{println .}}{{end}}' \
|
||||
| grep -E '^(NAVI_ADMIN_TOKEN|NAVI_SYNC_TOKEN|SEARXNG_BASE_URL|PORTAL_|DEBIAN_FRONTEND)' > "/tmp/navi-host-${STAMP}.env" || true
|
||||
chmod 600 "/tmp/navi-host-${STAMP}.env"
|
||||
|
||||
# ① 不再把明文门户口令带进新容器(docker inspect 就能看到它)。
|
||||
# 实际生效的是数据卷里的加盐哈希,所以丢掉 env 不影响登录;
|
||||
# 稍后会在新容器里写入一个强度更高的随机口令并打印一次。
|
||||
CLEAN_PORTAL_PW=0
|
||||
if grep -q '^PORTAL_PASSWORD=' "/tmp/navi-host-${STAMP}.env"; then
|
||||
grep -v '^PORTAL_PASSWORD=' "/tmp/navi-host-${STAMP}.env" > "/tmp/navi-host-${STAMP}.env.new" && mv "/tmp/navi-host-${STAMP}.env.new" "/tmp/navi-host-${STAMP}.env"
|
||||
CLEAN_PORTAL_PW=1
|
||||
fi
|
||||
|
||||
# ② 跨子域单点登录所需变量:新版已移除代码里的写死默认值,
|
||||
# 不显式提供的话登录 cookie 会退化成 host-only(登录后换子域就掉线)。
|
||||
if ! grep -q '^PORTAL_COOKIE_DOMAIN=' "/tmp/navi-host-${STAMP}.env"; then
|
||||
if [ -n "${NAVI_COOKIE_DOMAIN:-}" ]; then
|
||||
echo "PORTAL_COOKIE_DOMAIN=${NAVI_COOKIE_DOMAIN}" >> "/tmp/navi-host-${STAMP}.env"
|
||||
else
|
||||
echo "!! 缺少 PORTAL_COOKIE_DOMAIN:新版已删除代码默认值,直接升级会让跨子域单点登录失效。" >&2
|
||||
echo " 执行方式:NAVI_COOKIE_DOMAIN=.你的域名 NAVI_HOME_URL=https://你的门户/ NAVI_SSH_PASS=... bash deploy/zd-host.sh $VER" >&2
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
if ! grep -q '^PORTAL_HOME_URL=' "/tmp/navi-host-${STAMP}.env" && [ -n "${NAVI_HOME_URL:-}" ]; then
|
||||
echo "PORTAL_HOME_URL=${NAVI_HOME_URL}" >> "/tmp/navi-host-${STAMP}.env"
|
||||
fi
|
||||
OLD_IMAGE=$(docker inspect navi --format '{{.Config.Image}}')
|
||||
|
||||
PREV="navi-prev-${STAMP}"
|
||||
@ -145,6 +169,16 @@ if [ -n "$ADMIN_TOK" ]; then
|
||||
APPLY=$(curl -s -X POST -H "Authorization: Bearer $ADMIN_TOK" http://127.0.0.1:3005/api/gateway/apply || true)
|
||||
echo " 已重新生成网关配置: ${APPLY}"
|
||||
case "$APPLY" in *applied*) ;; *) echo "!! 网关配置重新生成失败" >&2; false ;; esac
|
||||
|
||||
# ③ 旧容器用过明文 PORTAL_PASSWORD 时,换成强随机口令并只打印一次
|
||||
# (失败不影响升级:可在后台「统一登录账号」自行设置)
|
||||
if [ "${CLEAN_PORTAL_PW:-0}" = "1" ]; then
|
||||
NEWPW="$( (openssl rand -base64 24 2>/dev/null || head -c 24 /dev/urandom | base64) | tr -d '/+=' | cut -c1-20)"
|
||||
RESP=$(curl -s -X POST -H "Authorization: Bearer $ADMIN_TOK" -H 'Content-Type: application/json' \
|
||||
-d "{\"username\":\"admin\",\"password\":\"$NEWPW\"}" http://127.0.0.1:3005/api/portal-auth || true)
|
||||
case "$RESP" in *error*|*Error*) echo " ! 门户口令重置失败(可在后台改):$RESP" >&2 ;;
|
||||
*) echo " 已清除明文 env 并重置门户口令 → admin / $NEWPW(请立即记录)" ;; esac
|
||||
fi
|
||||
fi
|
||||
|
||||
HIST=$(curl -s "http://127.0.0.1:18080/admin/api/history" | grep -o '"url"' | wc -l)
|
||||
|
||||
Reference in New Issue
Block a user