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

13 KiB
Raw Blame History

私有照片存储与备份方案

2026-10-13。用户已确认在线照片长期保存、备份副本滚动保留7天,并授权继续配置现有唯一服务器。私有目录、每日04:20照片备份及本机受控密钥副本已落实,最终10:55:12核对通过,详见落地记录。照片/短信仍关闭,正式协议未发布;主体和申请联系方式暂无,物理删除完成后元数据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;完整操作及验证见落地记录。

对象 目标值与操作边界
在线目录 已创建 /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直接配成一致恢复集。删除墓碑保留但其文件不打包,孤立密文不备份也不删除。首份手动执行的是空资料快照,尚未等待下一次计划触发或验收真实照片恢复。

删除与恢复保护

沿用照片规则草案,在线长期保存及备份7天已确认,不安排按上传年龄删除照片。最小安排由授权运维核对本人删除、用途结束、撤销和注销申请及删除失败清单,逐项按现有业务顺序执行:先不可读标记,物理文件确认不存在后才记完成;失败保留同ID处理。元数据及其他证据期限仍待确认,没有照片数据时不执行空泛批量清理。

资料表的 deleted_at 代表不可读标记时间,不保证物理删除完成,不能直接用它计算“完成删除后30天”。若采用该建议期限,要在受控运维结果记录中保存实际确认时间;再按已确认规则清理最小元数据。同意/撤销证据和整库备份分别定期限,不随着照片元数据一起删除。

备份恢复前保留备份之后的删除、撤销及用途结束/注销处理结果,最小记录只需资料ID、随机storage_key、处理类型/时间及完成状态,按其必要期限受控保存。恢复在Web外的隔离目录进行,先校验摘要/密钥、资料归属及数据库恢复点,再排除已经删除或依相关申请应处理删除的照片;仍在正常使用的长期保存照片不因上传时间较早而被排除。若无法取得最新保护记录,先隔离并保持不可读,不恢复为用户可查看状态。不能用旧备份直接覆盖运行中的整库、同意记录或删除状态,也不能因为有密文文件就补造用户资料行。

孤立密文要与完整资料表、在途上传及安全时间边界一起核对,未知提交结果的文件不得因暂时无行而直接删除。退场前先落实本人删除/申请处理与必要密钥保管,当前关闭开关会同时禁本人读取和删除,不能把关开关当成清理完成。

同盘照片备份只能用于有限误操作恢复。若需要覆盖服务器/磁盘损坏,应另外确定受控的异地副本目的地、访问权限及删除期限;可以使用用户现有设备,不要求增加测试服务器,本轮没有创建或承诺任何异地传输。

接续与证据

配置准备已完成,后续待主体、有效申请渠道、其余期限及删除处理责任具备后定稿协议,再按明确范围开放照片;不增加在线照片固定到期任务。主体和联系方式用户已说暂无,保留待填,不重复追问或发布占位正文。用户暂缓功能和正式验收,小程序仍自行发行。

本机私密检查归档: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。最终以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。