--- title: 关键技术选型与取舍 type: decision permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/关键技术选型与取舍 stable_id: ae318134-8651-4563-bc22-491c51f87af4 scope: project project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a memory_type: decision status: active revision: 1 restored_from_commit: 6a6a895eafcca6052e81a14fca103a42635dd1c2 created_at: '2026-09-23T15:07:19.579757+00:00' updated_at: '2026-09-23T15:07:19.579829+00:00' tags: - architecture - decision - security - config --- - **UserKey 明文存库、AppKey 加密存库**:UserKey 是全系统唯一无外部恢复途径的凭据(天河链不留存),明文使备份跨重装可恢复、不依赖 `SETTING_ENCRYPTION_KEY`;单有 UserKey 无 AppKey(仍加密、可向天河重取)用不了钱包。UI 掩码,揭示/复制/轮换二次确认且记操作日志。 - **单一根 `.env` + 安装向导**(取代早期 `config/` JSON 方案):消除 JSON+.env+config 三套并存;Prisma CLI 自动读 cwd .env、compose 自动读同级 .env,根 .env 最兼容。Docker 因 compose 约束必须有 .env。 - **安装向导并入 admin**(删除独立 `apps/install`):减少一个工程;admin 路由守卫探测 `/api/install/status` 未安装强制进 `/install`。 - **核心部署 = 单 Node 服务 + 安装向导**,Docker/SSH 为可选自动化;本地 dev 不引入 PM2(前台阻塞 + Windows Job Object 整树清理)。 - **追溯码链接动态生成不固化 DB**:换域名全部自动跟随;`/t/:code` 302 保留兼容历史二维码。 - **预览用类 TOTP 无状态令牌**:不落库、外泄最长 2 窗口失效;预览 URL 仅点击瞬间拼接,不进行数据/导出。 - **防伪状态模块可排序隐藏但副作用后端固定**:页面配置不能关闭激活/计数/日志。 - **历史 revision 快照持旧存储 key**:媒体归位后历史审核详情旧图可能 404,开发期无线上数据已确认不处理。 - **选型**:PhotoSwipe v5(MIT,用户确认)替代自写查看器;NestJS 11 + Express 5 + Node 24(Node 20 已 EOL);Vite 6;echarts 6;`archiver`/`unzipper` 流式备份;`@aws-sdk/lib-storage` multipart。根 `pnpm.overrides`:multer 2.2.0、exceljs>uuid 11、qs 6.15.3;不要跨主版本覆盖 file-type/path-to-regexp。 - **明确不做**:NFC、多机构隔离、主动预警、C 端骨架屏、查询日志地区解析(已移除)、父子树状时间轴节点。证书:C 端水印图、后台原件。查询日志 IP/UA 不脱敏仅后台可见。