diff --git a/Dockerfile b/Dockerfile index a98dc18..89d08fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -238,6 +238,10 @@ RUN addgroup --system --gid 1001 nodejs && \ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +# standalone 可能会把构建期的 prisma/engine-cache、dev.db 一起追踪进来; +# 运行镜像只保留 schema.prisma 和 migrations,避免客户每次升级重复拉无用缓存。 +RUN rm -rf ./prisma + # 复制必要的额外文件 # 1. public 目录(静态资源) COPY --from=builder --chown=nextjs:nodejs /app/public ./public diff --git a/README.md b/README.md index fde2101..2db4644 100644 --- a/README.md +++ b/README.md @@ -213,7 +213,7 @@ docker compose -f docker-compose.prod.yml up -d - `发布管理.ps1` - `license-server/deploy.ps1` -其中 `scripts/customer-install.ps1` 是客户首装分步骤入口,内部调用 `scripts/smoke-install.ps1` 做预检、启动和验收;`scripts/backup-restore.ps1` 用于客户环境备份、恢复和恢复后验收,`scripts/measure-image-size.ps1` 用于发布前记录镜像体积和分层。其它脚本执行前必须先读内容和参数,不应把内部固定服务器或固定镜像仓库当成客户默认交付配置。客户交付时要显式写入版本化 `APP_IMAGE` / `IMAGE_TAG`,`latest` 只保留给内部测试或兼容场景。当前新 Registry 发布脚本是主线,旧远程部署脚本只作历史或内部维护参考。AI、钉钉、内网穿透等可选能力依赖真实外部服务和密钥,不能只凭页面入口当成客户验收已完成。 +其中 `scripts/customer-install.ps1` 是客户首装分步骤入口,内部调用 `scripts/smoke-install.ps1` 做预检、启动和验收;`scripts/backup-restore.ps1` 用于客户环境备份、恢复和恢复后验收;`scripts/measure-image-size.ps1` 用于发布前记录镜像体积和分层,也可以设置体积/层数阈值,超限时阻止发布继续。其它脚本执行前必须先读内容和参数,不应把内部固定服务器或固定镜像仓库当成客户默认交付配置。客户交付时要显式写入版本化 `APP_IMAGE` / `IMAGE_TAG`,`latest` 只保留给内部测试或兼容场景。当前新 Registry 发布脚本是主线,旧远程部署脚本只作历史或内部维护参考。AI、钉钉、内网穿透等可选能力依赖真实外部服务和密钥,不能只凭页面入口当成客户验收已完成。 ## 10. 文档入口 diff --git a/__tests__/production-build-hardening.test.ts b/__tests__/production-build-hardening.test.ts index 3e3065c..9da5784 100644 --- a/__tests__/production-build-hardening.test.ts +++ b/__tests__/production-build-hardening.test.ts @@ -20,6 +20,7 @@ describe('production build hardening', () => { }) it('生产运行镜像只复制 Prisma 运行迁移所需文件', () => { + expect(dockerfile).toContain('RUN rm -rf ./prisma') expect(dockerfile).toContain('/app/prisma/schema.prisma ./prisma/schema.prisma') expect(dockerfile).toContain('/app/prisma/migrations ./prisma/migrations') expect(dockerfile).not.toContain('/app/prisma ./prisma') diff --git a/app/admin/_components/AppearanceSettingsPanel.tsx b/app/admin/_components/AppearanceSettingsPanel.tsx index b967197..752fa2b 100644 --- a/app/admin/_components/AppearanceSettingsPanel.tsx +++ b/app/admin/_components/AppearanceSettingsPanel.tsx @@ -274,23 +274,20 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd } return ( -
- 外观 -
-- 这里集中处理品牌主题、LOGO、功能开关与对象存储。保存后会同步到后台界面与素材上传入口。 +
+ 管理站点名称、LOGO、功能开关和对象存储配置。
{lastSavedAt && (@@ -298,7 +295,7 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd
)}常用场景一键启用,也可作为自定义模板的起点
- 点击卡片仅预览示例,内容不可直接编辑,需复制为自定义模板后才可修改。 + 点击条目仅预览示例,内容不可直接编辑,需复制为自定义模板后才可修改。
{preset.name}
{preset.description}
- {canManageCustomTemplates ? '新建自定义模板' : '授权后可新建'} -
-- {canManageCustomTemplates - ? '从空白模板起步,按照业务需求配置字段' - : '当前不可新建、复制或迁移自定义模板'} -
-{tpl.name}
{tpl.description && ({tpl.description}
)}