83 lines
13 KiB
Markdown
83 lines
13 KiB
Markdown
# 私有照片存储与备份方案
|
||||
|
|
|
|||
|
|
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。
|