Files
airz-uniapp/docs/私有照片存储与备份方案-20261013.md
hujun c95482a0f3 feat: 实现协议全文与同意记录功能
新增协议全文后台管理、版本化发布及本人同意记录功能,支持可撤销授权;完善资料与授权相关边界提示,调整评估提交时的资料与授权校验逻辑,同步更新相关页面文案与路由。
2026-10-14 14:53:13 +08:00

83 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 私有照片存储与备份方案
2026-10-13。用户已确认在线照片长期保存、备份副本滚动保留7天,并授权继续配置现有唯一服务器。私有目录、每日04:20照片备份及本机受控密钥副本已落实,最终10:55:12核对通过,详见[落地记录](照片存储配置落地-20261013.md)。照片/短信仍关闭,正式协议未发布;主体和申请联系方式暂无,物理删除完成后元数据30天仍只是未确认建议。用户暂缓验收,小程序仍由用户发行。
下方只读核对保留10:03—10:10时点的历史证据,不能用其中“尚不存在”推断当前状态;配置实施结果以落地记录为准,原回执未覆盖。
## 配置前只读核对结论
生产后端仍为 `20261012-agreement-documents-r1`。10:03:51(Asia/Shanghai)查询到协议版本、本人同意、私有资料三表均为0行;照片 `enabled=false`、`directory=''`,短信关闭。活动评估、活动模型调用及 ready/delayed/reserved 队列均为0,这是检查时点的快照,不是整个时段的模型用量统计。
10:10:47最终检查中 `airz-analysis`、`php-fpm-74`、`redis` 均为 active;`.env`、本站Nginx、`.user.ini`、PHP全局及FPM配置摘要与本轮初次读取一致。未创建服务器目录、修改权限/配置/定时任务、执行DDL或业务写入,也未发起模型或短信请求。
| 项目 | 只读证据及含义 |
| --- | --- |
| 公开目录 | Nginx root 为 `/www/wwwroot/xctai.cn/public`;核对本站7个配置/包含文件及现有vhost的字面量 root/alias,没有发现覆盖推荐照片目录的映射。此结论依赖当前配置,后续改变root或新增alias要重新检查 |
| PHP身份 | PHP 7.4.33;FPM worker 实际为 `www:www`,UID/GID均1001,umask为0022;照片目录应归该运行用户,不能按发布归档的root属主设置 |
| PHP路径限制 | `public/.user.ini` 设置 `open_basedir=/www/wwwroot/xctai.cn/:/tmp/`,文件有immutable属性;`.user.ini`启用、缓存300秒。CLI的空open_basedir不能代表Web进程。推荐目录在现有允许范围内,无需修改此文件或扩大允许范围 |
| 推荐目录 | `/www/wwwroot/xctai.cn/private-documents` 尚不存在;既有父目录及祖先无symlink,父目录为 `www:www` / 0755;它是public的同级目录,符合当前PrivateDocuments对Web目录不重叠的约束 |
| 容量 | 检查时剩余约166 GiB、约9389万可用inode;站点、候选父目录及本机备份位于同一文件系统。没有预留专用配额,不能把当前空闲量视为长期容量承诺 |
| 加密 | 现有共享 `security.data_key` 是有效32字节密钥,AES-256-GCM可用;使用现有Secret对内存固定字符串加密/解密通过。未读取照片、解密真实业务内容或下载密钥;指纹只保存于私密回执 |
| 环境文件权限 | `.env` 为 `root:www` / 0640,ACL无额外用户授权。本轮只在服务端内存解析必要配置,不保存或传回明文凭据 |
这轮没有创建目录或以FPM上传/下载实际文件;权限和open_basedir符合配置条件,真实Web读写仍应在具体配置落地时做最小技术检查,不能写成已验收。0700/0600保护其他系统身份,但不区分共享 `www` 身份的进程;目前沿用现有FPM和本人API鉴权,不增设专用进程体系。
## 配置前既有备份范围
宝塔实际数据在 `data/db/` 分库中;旧 `data/default.db` 空表不能用来判断“没有备份”。已读取真实计划任务及备份记录,并核对相应root crontab和脚本类型,没有输出脚本正文、数据库密码或其他凭据。
| 项目 | 实际状态 |
| --- | --- |
| 日常数据库备份 | 启用的MySQL任务,每天04:00,目标ALL,当前包含airz;保存本机,保留3份,不是已确认的照片备份7天规则 |
| 现存airz备份 | 2026-10-11、12、13共3份,路径为 `/www/backup/database/mysql/crontab_backup/airz/`;最新为2026-10-13 04:00:01,大小76713字节 |
| 可读性 | 三个gzip在内存完整解压成功,未超过读取上限;最新包含 `fa_agreement_revision`、`fa_user_consent`、`fa_private_document`,前两份早于该批部署、不包含新表。只核对表结构标记,不输出行内容,未执行恢复 |
| 照片文件 | 该数据库任务不打包本地照片目录;已核对的宝塔任务没有站点或照片目录备份,`/www/backup/site`为空,推荐照片备份目录尚不存在 |
| 发布回退归档 | 已知 `/root/airz-agreement-documents-release-1791794619319` 包含一次性的 `database.before.private.sql.gz` 和定向源码备份;不含 `.env`,不是每天照片备份或独立密钥托管 |
| 密钥恢复 | 已核对的发布归档及 `/www/backup` 没有匹配名称的独立key备份文件,也没有已核对的密钥备份任务。仅能结论为“尚无独立密钥恢复证据”,不能据此断言其他位置绝无副本 |
| 备份权限 | 既有 `/www/backup`、`database`及`site`目录为root / 0600、无扩展ACL;root维护通道可访问,普通身份无父目录遍历权限。最新SQL文件是0644,较早两份0600;不把它描述为已公开可读,也不批量改动旧目录 |
| 主机故障保护 | 已核对的日常任务为localhost,数据和备份同盘。云快照、异地副本、存储地域及供应商未获证据,不能从IP或现有模型供应商推断 |
“gzip可读且有表”只证明备份文件的基本完整性,不能代替实际恢复、数据库与照片的一致性验证或灾难恢复验收。现有3份整库备份的期限独立于照片备份期限;启用照片后,它也会保存资料元数据和同意证据,需要在正式说明中分别列明。
## 已执行的最小配置
本节已在现有服务器实施,照片enabled保持false。只使用本地私有文件和现有技术栈,不添加对象存储、OCR、评估附件绑定或在线清理worker;完整操作及验证见[落地记录](照片存储配置落地-20261013.md)。
| 对象 | 目标值与操作边界 |
| --- | --- |
| 在线目录 | 已创建 `/www/wwwroot/xctai.cn/private-documents`;owner `www:www`、mode `0700`,目前为空,实际FPM合成读写通过,临时文件已清理;没有新增公开链接或Nginx映射 |
| 在线文件 | 原代码继续使用随机32hex `.bin` 和Secret加密,文件最终0600;不保留上传原名或原图,不放入公开附件表 |
| 未开放配置 | 既有.env仅追加private_documents:enabled=false、directory为上述路径;其他原字节保持,不轮换原密钥。before副本只留服务器root-only归档,不下载.env |
| 照片备份目录 | 已创建 `/www/backup/airz-private-documents`,root:root / 0700;root任务采用umask077,档案及日志0600;独立cron每天04:20,不修改旧备份父目录或04:00数据库任务 |
| 备份最小内容 | 加密 `.bin`、同一恢复点的资料元数据及对应协议/同意证据、文件摘要与备份时点/密钥指纹;记录所依赖的账户及数据库恢复点。证据和清单也属于受控资料,不能公开共享 |
| 排除内容 | 不把`.env`、数据库/面板/Redis/模型凭据、明文照片、public/uploads、运行缓存和无关发布归档打进照片包;不把解密密钥和密文一起归档 |
| 独立密钥保管 | 已保存到 `D:/AAdesk/202609/airz-backups/key-escrow/production-data-key.dpapi.json`,DPAPI CurrentUser、ACL仅当前Windows用户/SYSTEM;独立进程指纹及合成GCM恢复校验通过,无明文密钥文件。DPAPI依赖原Windows用户配置,换机/重装需受控迁移,不能宣称灾难恢复全面完成 |
密钥是现有业务共用密钥,不能因为旧照片备份到期就删掉或随意重新生成,否则会影响其他加密数据。本轮以临时RSA公钥封装传回本机,在内存转换为DPAPI副本并核对恢复能力;没有持久RSA私钥,不把密钥放进代码、日志或本文。
5MiB处理后图片经过当前Base64密文封装,最大约6.67MiB,容量估算需按密文及备份副本计算。用户已确认7天滚动备份;每次成功备份后按归档创建时间清理超过7天且完整校验通过的本工具旧包,不是仅保留7份。未知文件保持,损坏包拒绝自动清理;停机或失败可能延迟清理,需查看受控日志及时处理。
实际备份每天04:20(Asia/Shanghai),与既有04:00数据库备份错开。工具用独立PDO、显式REPEATABLE READ只读事务取得资料元数据、对应同意/撤销证据、document-use版本及依赖账户标识,再复制清单中的不可变活动密文。缺文件、链接、并发变更或校验异常则本次失败;不暂停业务或写库,不将另一时点SQL直接配成一致恢复集。删除墓碑保留但其文件不打包,孤立密文不备份也不删除。首份手动执行的是空资料快照,尚未等待下一次计划触发或验收真实照片恢复。
## 删除与恢复保护
沿用[照片规则草案](协议草案/照片保存与删除规则.md),在线长期保存及备份7天已确认,不安排按上传年龄删除照片。最小安排由授权运维核对本人删除、用途结束、撤销和注销申请及删除失败清单,逐项按现有业务顺序执行:先不可读标记,物理文件确认不存在后才记完成;失败保留同ID处理。元数据及其他证据期限仍待确认,没有照片数据时不执行空泛批量清理。
资料表的 `deleted_at` 代表不可读标记时间,不保证物理删除完成,不能直接用它计算“完成删除后30天”。若采用该建议期限,要在受控运维结果记录中保存实际确认时间;再按已确认规则清理最小元数据。同意/撤销证据和整库备份分别定期限,不随着照片元数据一起删除。
备份恢复前保留备份之后的删除、撤销及用途结束/注销处理结果,最小记录只需资料ID、随机storage_key、处理类型/时间及完成状态,按其必要期限受控保存。恢复在Web外的隔离目录进行,先校验摘要/密钥、资料归属及数据库恢复点,再排除已经删除或依相关申请应处理删除的照片;仍在正常使用的长期保存照片不因上传时间较早而被排除。若无法取得最新保护记录,先隔离并保持不可读,不恢复为用户可查看状态。不能用旧备份直接覆盖运行中的整库、同意记录或删除状态,也不能因为有密文文件就补造用户资料行。
孤立密文要与完整资料表、在途上传及安全时间边界一起核对,未知提交结果的文件不得因暂时无行而直接删除。退场前先落实本人删除/申请处理与必要密钥保管,当前关闭开关会同时禁本人读取和删除,不能把关开关当成清理完成。
同盘照片备份只能用于有限误操作恢复。若需要覆盖服务器/磁盘损坏,应另外确定受控的异地副本目的地、访问权限及删除期限;可以使用用户现有设备,不要求增加测试服务器,本轮没有创建或承诺任何异地传输。
## 接续与证据
配置准备已完成,后续待主体、有效申请渠道、其余期限及删除处理责任具备后定稿协议,再按明确范围开放照片;不增加在线照片固定到期任务。主体和联系方式用户已说暂无,保留待填,不重复追问或发布占位正文。用户暂缓功能和正式验收,小程序仍自行发行。
本机私密检查归档:[20261013-01](D:/AAdesk/202609/airz-backups/private-storage-preflight/20261013-01)。只读结果分别保存为 `storage-inventory.json`、`backup-discovery.json`、`backup-php-detail.json`、`preferred-storage.json`、`final-guards.json`;`panel-cleanup.json`记录面板已退出、专用浏览器已关闭、临时凭据和命令脚本已删除。初轮FPM master补充组解析跨行的问题在preferred-storage探针中修正,实际worker UID/GID结果一致,不使用初轮master字段推导权限。
后续落地私密归档:[20261013-01](D:/AAdesk/202609/airz-backups/private-storage-setup/20261013-01)。最终以final-verification-retry.json为准,isolation-hardening.json记录最终工具摘要,panel-cleanup.json证实退出面板和清理临时脚本。Windows合成文件测试6通过/1跳过,服务器7项通过,独立密钥恢复及实际FPM读写检查通过;这些不计正式验收。
本轮新增Web外备份工具与测试,同步隐私/资料协议中的已确认备份说明;用户协议、数据授权和14前端运行摘要保持。格式核对及草案摘要重新生成,原回执不覆盖。进度2.32/1.42、开发文档v2.00/1.13,29页面、63任务和融资28项保持;照片/短信仍关闭,未提交、推送或创建PR。