☰
项目被悄悄卸载怎么办?从定位到防御的完整恢复指南
2026/10/1 10:50:06 网站建设 项目流程

1. 从"项目被卸载"的几种真实场景说起

上个月项目协作群里有人问:"项目被卸载了怎么办?"乍一听有点没头没尾。结果细问才知道,是在客户设备上安装的桌面客户端,用着用着就从系统里消失了。这其实是一大类问题的统称。我做了多年开发和运维,接手过的"项目被卸载"相关工单,远不止这一个形态。

下面是我经常遇到的几种真实场景:

  • 用户设备里的应用被卸载:客户端应用在用户电脑或手机上"消失"了,要么是系统优化工具顺手删掉了,要么是安全软件隔离了主程序,要么是系统自带的存储清理把它当垃圾处理了。
  • 开发目录里的项目文件被清理:开发机上的项目文件夹突然少了关键目录,node_modules、dist、.git被清空,甚至整个工程目录被移动到了回收站。
  • 服务器上的部署项目被移除:运维执行自动化任务时,rsync 同步带了--delete,把目标目录里"多出来"的项目文件全清了;脚本里的rm -rf变量展开成根路径,直接把部署目录干没了。

"项目被卸载"是一个结果,不是一个原因。同样是"项目不见了",被卸载、被删除、被覆盖、被隔离这四件事,修复路径完全不同。我用一个表格先把它们区分开:

现象常见机制关键特征
被卸载卸载程序、包管理器移除软件包有详细的卸载日志,注册表或数据目录残留痕迹
被删除系统命令、清理工具直接删除文件文件可能进回收站,也可能被直接清除,没有卸载流程
被覆盖安装包覆盖安装、部署脚本同步旧文件还在,但内容被新版本替换,目录名没变
被隔离安全软件隔离可疑文件原路径文件消失,但隔离区里有副本,可以手动找回

如果你遇到的"项目被卸载"是指开发中的某个软件项目,那大多数时候根子不在用户主动点了卸载按钮,而在于你的项目在没人操作的情况下,被某个自动化机制当成了"可以清理的垃圾"。

为什么这个问题值得专门写一篇?因为它有一个共同特点:没有人为删除的意图,却发生在常规流程里,而且往往过了一段时间才被发现。一旦时间窗口过去,恢复难度就会指数级上升。对开发者、运维人员、技术负责人来说,掌握一套"先定位、再恢复、最后防御"的处理思路,比记住某个具体命令值钱得多。这篇文章就是从定位到防御的完整做法,我会尽量把每一步都讲成可以直接照着抄的操作。个人用户遇到应用莫名消失,也能用同一套思路自救;团队里负责发布和部署的人,更能从防御章节里直接拿走方案。

2. 为什么项目会被"悄悄"卸载:常见根因排查

要防住一个东西,先要知道它通常是从哪条路上溜走的。我把这几年的排查结果归纳成四类,每一类都有高频翻车点。

2.1 包管理器互相打架,是出现频次最高的一种

如果你的项目是开发项目,依赖管理器或者系统包管理器往往是第一嫌疑。这类问题最典型的特征,是你根本不记得自己执行过卸载操作,但某个组件就是不见了。

比如 Python 环境下面,pip 在解析一组依赖时,如果发现某个包"不再被任何项目依赖",在部分工具链配置下会自动把它当成多余依赖清理掉。npm 那边更典型:npm ci会先完整删除node_modules再重新安装,如果安装过程失败或者网络不稳定,你在本机跑的项目确实会处于一种"依赖全都没了"的状态。apt 系的系统里,apt autoremove自动移除非必要软件包,它的本意是清理过时依赖,但经常把项目依赖的.so库、SDK 组件一起带走。

这类问题的判断线索非常明确:卸载行为一定发生在你执行了某个安装、更新、依赖整理操作之后。你回想一下时间线,基本能对上。如果你在 CI 里看到构建失败,报错信息是"module not found"、"command not found",那大概率就是依赖管理器顺手把项目依赖卸载了。

2.2 清理类工具按"规则"删文件,误伤比你想的常见

第二类根因,是各种"清理优化"工具。不管是手机端的"手机管家"、电脑端的清理软件,还是 Windows 自带的存储感知、macOS 的"优化储存空间",它们的工作方式都差不多:按一套规则扫描文件系统,把符合条件的文件标记为可清理,再批量删除。

问题就出在"符合条件"这几个字上。很多清理工具会把以下几种路径误判为垃圾:

  • 超过一定时间没有访问的项目目录,被当作"不常用"数据;
  • 名字里带tmp、temp、cache、dist的目录,被直接归为缓存;
  • 体积特别大的文件夹,被当作下载缓存;
  • 用户目录下的文件,被当作"旧文件"处理。

我亲历过一台 Windows 开发机,某次"磁盘清理"之后,整个D:\work\client-project目录被挪进了回收站,原因是这个目录很久没动,而且里面有个巨大的build文件夹。清理工具不知道它是一个正在维护的项目,它只知道"这里有大文件,很久没访问,可以回收"。

手机端也一样。安卓系统的一些"自动清理"、iOS 的"卸载未使用的 App"功能,都可能基于"长期未使用"来卸载应用。你在开发环境装了一个测试 App,半个月没打开,它就可能被系统自动卸载——账面数据还在,但程序本体被清理了,这在小团队的手工测试流程里是踩坑重灾区。

2.3 部署与自动化脚本里隐藏的删除命令

服务端的"项目被卸载",十次里有八次和运维脚本有关。一个最常见的翻车现场是 rsync:

rsync -av --delete ./dist/ user@server:/srv/my-project/

--delete的意思是"让目标目录和源目录保持一致,目标目录里多出来的文件全部删除"。源目录里如果暂时缺少某个目录、或者构建产物不完整,服务端就会把对应的项目文件删掉。再加上 shell 脚本变量的问题,可以直接升级成灾难:

#!/bin/bash target_dir=${SOME_ENV_PATH} rm -rf "$target_dir"/*

如果SOME_ENV_PATH读出来是空字符串,且你用了rm -rf,展开之后就是rm -rf /*,整个系统的文件都可能被清掉。这不是段子,是每年都有人踩的真坑。更隐蔽的版本是find配合-delete:

find /data -name "*.log" -mtime +30 -delete

这条命令本来只想清日志,但如果路径设置错了,它会顺着目录往下把所有符合条件的文件全删掉,包括项目里有些恰好以.log结尾的配置文件,甚至项目自带的本地数据库。

还有一种情况是配置管理工具造成的。Ansible、Salt、Chef 这类工具维护的是"目标状态":如果你定义的 Playbook 里,某个目录不在状态清单中,工具执行时可能不会有动作;但如果你定义了"目录中只允许存在 A、B、C 三个文件",那么项目新增的 D 文件在下一次执行时就会被当作多余状态移除。这本质上是一种配置漂移,只是漂移的方向反了。

2.4 权限、账户和系统的"自我保护"机制

最后这一类最容易被忽略,因为它不是主动去删,而是"体系认为它不安全,于是移除了它"。

  • 安全软件和终端防护:开发的测试程序往往没有代码签名、没有数字证书,行为又很像"从网络下载的未知程序",很容易被安全软件判定为恶意程序,在扫描到之后直接隔离或删除。最典型的场景是编译出来的 exe、dll、打包脚本、自解压安装包,经常在 CI 构建完成之后被本机安全软件清掉。
  • macOS 的 Gatekeeper 与公证机制:macOS 对未公证应用的管控越来越严格,如果你的应用没有完成公证,安装后也可能被系统标记为"已损坏",在用户端表现为启动失败,有些情况会触发系统自动清理。
  • 账户切换与数据释放:使用 OneDrive、iCloud 同步的项目目录,如果开启了"释放空间",本地文件会被替换成云端占位符。你在本地看文件还在,但打开时它才从云端下载。如果断网状态下启动项目,表现和文件丢失几乎一样。
  • 容器编排的驱逐机制:Kubernetes 节点内存不足时,Pod 会被标记为Evicted,随后被清理。对开发者来说,表现为"部署在集群里的服务项目突然被移除"。每次节点资源不足,相似命名的项目就会消失。

这类根因的特点是:从业务日志里看不到"删除"记录,只能看到"隔离""驱逐""标记异常"这类动作。排查时要跳出"是谁执行了 rm"的思路,转向"系统认为它出了什么问题"。

根因类型高频发生地最直接的线索
包管理器清理开发机、CI 环境操作后立即发生,错误信息为缺失文件
清理工具误判个人电脑、开发机时间点对应系统级清理任务
自动化脚本删除服务器、部署环境shell 历史、CI 构建日志里有删除命令
安全机制隔离用户设备、生产集群安全中心或事件记录里有隔离、驱逐标记

这一节给的是方向,下面讲怎么把方向落实成证据链。定位永远比拍脑袋重要,不然你把文件恢复了,下个月同样的坑还会在原地看着你。

3. 一步步定位"被卸载"的完整排查链路

排查一个"神秘消失"的项目,最忌讳一上来就动手恢复。因为恢复动作本身就是一次写操作,很可能把关键的删除痕迹给覆盖掉。正确的顺序是:保留现场 → 找时间线 → 还原动作链 → 复现验证。我按这个顺序走一遍。

3.1 第一件事不是恢复,而是保留现场

发现项目不见之后,先把你当前的系统环境"冻结"起来:

  • 不要再往被删目录所在的分区写入任何大文件;
  • 不要在原来路径上重新创建同名目录;
  • 如果系统有快照能力(LVM、ZFS、Btrfs、磁盘快照),先打一个快照再继续排查;
  • 如果是整机系统,立刻把系统日志、用户目录里与项目有关的配置备份到另一块盘上。

原因很简单:文件被"删除"之后,数据块并没有立刻消失,只是被标记为可重用。只要你继续在同一个分区写入新数据,恢复软件能找到的数据块就会越来越少。保留现场这一步,直接决定了后面文件恢复的成功率。

如果是服务器,优先检查是不是有快照可以回滚,而不是先查日志。很多云厂商的磁盘都支持手动快照,先把快照打了,再慢慢看,压力会小很多。

3.2 从日志与事件记录里找时间线

接下来就是找"案发时间"。我一般按平台分别收集日志:

Linux 系统:

# 查看系统日志中涉及删除、卸载、清理的条目 journalctl --since "2025-06-20 00:00" --until "2025-06-21 00:00" | \ grep -iE "removed|delete|uninstall|cleanup|autoremove" # dpkg 的卸载记录(如果项目是以软件包形式安装的) grep -i "remove" /var/log/dpkg.log # apt 历史 cat /var/log/apt/history.log | grep -iA2 "remove"

Windows 系统:

  • 打开"事件查看器",在Windows 日志 → 应用程序里筛选来源为 MsiInstaller 的事件(事件 ID 1001、11707 附近),能找到软件卸载记录;
  • 在Windows 日志 → 系统里看磁盘清理、存储感知相关事件。

macOS 系统:

log show --start "2025-06-20 00:00:00" --end "2025-06-21 00:00:00" | \ grep -iE "uninstall|delete|purge|cleanup"

除了系统日志,我还要看两个容易被忽略的地方:

  • shell 历史:~/.bash_history、~/.zsh_history,看有没有人执行过删除类命令。很多时候就是为了省时间跳过日志系统,直接手敲命令导致的问题。
  • 包管理器的 debug 日志:npm 在~/.npm/_logs/下保留安装日志文件,这些文件会包含remove、uninstall、reify的动作。pip 的操作如果不加--quiet,控制台输出里也有完整执行链条。

拿到日志之后,把删除动作发生的精确时间记下来。这个时间点非常有用,后面需要和备份时间、快照时间做比对。

3.3 用文件系统痕迹串起"案发经过"

如果日志不够全,文件系统本身也是一个证据库。Linux 下我通常这样查:

# 查看回收站目录有没有项目的残留 ls -la ~/.local/share/Trash/files/ 2>/dev/null ls -la /root/.local/share/Trash/files/ 2>/dev/null # 查项目入口目录的上级,看目录名是否还在但内容为空 find /home /data /opt -maxdepth 3 -type d -name "*my-project*" 2>/dev/null # 查 .git 是否还留下了可以恢复的对象 cd /home/user/my-project 2>/dev/null || exit 1 git reflog --all

这一串命令的逻辑是:先判断项目是被整体移动、被部分删除,还是只是目录里的文件被清空。这三种情况在文件系统上的表现完全不同。

  • 整体目录还在,只是文件少了:大概率是清理工具的规则命中了部分文件类型,或者有同步任务执行了增量删除;
  • 整个目录都没了,但回收站里有:是移动到回收站的删除动作,比较好恢复;
  • 整个目录没了,回收站也没有:要么用了rm直接删除,要么磁盘发生了覆盖,这时候要进入第 4 节的数据恢复流程。

Windows 上可以看C:\$Recycle.Bin,或者用文件搜索工具按文件名搜整个分区,看有没有残留的文件头。macOS 上.Trash目录是用户级回收站,Time Machine 和本地快照是另一条恢复路径。

3.4 复现实验与最小化定位

时间线和文件痕迹都拿到之后,最重要的一步是复现。复现不只是为了证明"到底是谁干的",更是为了验证你的修复方案不会在下次运行时再次触发删除。

复现实验的要点是"最小化":

  • 在一个临时目录里复制出项目的目录结构(不要复制真实数据);
  • 按照怀疑的操作链一步一步执行,比如"先跑系统清理任务 → 再执行部署同步命令 → 看看临时副本里的文件是否被清掉";
  • 如果复现成功,说明这条操作链就是元凶;
  • 如果复现失败,说明有两个因素叠加才能触发问题,需要逐个变量试。

我处理过一个线上事故,最后复现的结果是:自动化清理脚本只删"最近 90 天未修改的文件夹",而项目本身长期通过 CI 部署,服务器上的项目目录确实 90 天没被直接修改过,于是被清理脚本当成"陈旧数据"整个拔掉。这个结论只有在完整复现"清理任务"之后才能确定,单独看任何一条日志都看不出来。

复现定位做完,你就有了一张明确的证据链:什么时间、什么命令、什么规则、删了什么。接下来就是恢复和重建了。

4. 数据恢复与项目重建的正确姿势

恢复这件事,顺序很重要。我的经验是:先走"可逆恢复",再走"文件救援",最后才考虑"重建"。下面按优先级从高到低展开。

4.1 版本控制是第一优先级的后悔药

如果项目在 Git 或者其他版本控制工具里,那么绝大多数"文件没了"的问题,其实只是"工作区文件没了",而历史提交仍然完整保留在.git里。

# 先看工作区状态 git status # 如果你的分支因为误删不见了,reflog 还能找到它 git reflog # 从某个提交重建工作区 git checkout <commit-hash> -- . # 如果整个 .git 都被人为清掉了,但远端还有仓库,直接拉取 git clone <remote-url> my-project

这里有一个很多人不知道的细节:不要只在项目根目录执行git status,还要检查.git目录本身是否完整。如果.git文件夹还在,恢复的概率非常高;如果.git也没了,但远端还有仓库,损失也只是本地未推送的那部分。

我建议任何项目从创建第一天就完成两件事:一是在远端建立仓库,二是保持"工作区允许随时丢"的心态,重要变更尽快推送。没有版本控制的项目,等于把后悔药扔了,后面只能靠第二、第三优先级。

4.2 回收站、快照、备份:三层可逆恢复

如果版本控制覆盖不到,接下来就看文件系统层的可逆机制。我按平台整理了常用恢复路径:

平台第一层第二层第三层
Windows回收站卷影副本(VSS)/系统还原点OneDrive/网盘回收站
macOS废纸篓Time Machine 本地快照iCloud/第三方同步回收站
Linux回收站(Trash)LVM/ZFS/Btrfs 快照云备份、镜像备份
云服务器手动快照自动快照策略对象存储中转副本

具体操作很容易查到,这里我想强调两个容易卡壳的点:

第一,回收站不是万能的。命令行删除(rm、del)、脚本删除、部分清理工具走的"永久删除"路径都不会进回收站。所以你在回收站里看不到项目文件,不代表它不可恢复,要往下走到快照层。

第二,快照优先于文件恢复软件。只要系统有快照,恢复成功率是从 90% 往下降的;一旦落到文件恢复软件,成功率往往只有一半甚至更低。日常给重要目录做快照,成本很低,但有些团队就是忘了在事发前做。遇到云服务器,立刻检查供应商是否开启了自动快照策略,能回滚就回滚,千万不要手动重装环境。

4.3 三层都失败,才轮到文件碎片级救援

如果版本控制、回收站、快照全部失效,最后的手段是文件恢复工具。这一步要明确一点:时间拖得越久,成功率越低,而且没有任何工具能保证恢复完整目录结构。

Linux 上常见的有:

# extundelete:基于 ext3/ext4 文件系统 # 注意:目标分区必须卸载或只读挂载 sudo systemctl stop my-project # 先停掉服务,避免写入 sudo umount /dev/sdb1 sudo extundelete /dev/sdb1 --restore-directory /my-project

Windows 上我用过 Recuva、DiskGenius,macOS 上用过 Disk Drill。它们的使用逻辑差不多:选择分区 → 深度扫描 → 把扫描结果恢复到另一块磁盘。一定要恢复到另一块盘,否则覆盖风险极大。

文件救援算是最后的救命稻草,它更像是"抢救"而不是"恢复"。你能拿回多少算多少,别指望所有文件都完整。如果项目本身拥有完整的构建脚本,那么更现实的路径是:用救援得到的配置文件 + 源码脚手架 + 文档,把项目重建出来。

4.4 从崩溃里重建项目的"最小完整思维"

一个项目被彻底删干净的时候,与其在那里对着恢复工具抱希望,不如换个思路:把重建当成一次从零搭建,但这个搭建是有底的。你往往不是真的什么都没有了,而是需要从零散的信息里把项目的核心重新组织起来。

我通常这样做:

  1. 先列出项目的"最小可运行集合":入口文件、配置文件、依赖清单、构建脚本、数据表结构。这些信息在文档、部署记录、CI 配置文件中都可能找到;
  2. 从备份的制品仓库找回依赖清单(package.json、requirements.txt、pom.xml),直接安装而不是从源码编译;
  3. 把数据层的恢复单独拎出来:数据库有备份就恢复备份,没备份就从对象存储拉最近一次导出;
  4. 用 CI 已经跑过的流水线作为重建脚本,而不是手敲。CI 配置本身记录了项目应该如何构建、测试、部署,这是最可靠的"说明书"。

很多团队在重建时会犯一个错误:凭记忆重写构建脚本,结果和原项目行为出现细微差异。正确做法是把 CI 配置、Dockerfile、部署文档当作"重建蓝图"来用,一步一步照着走。只要核心构建流程还在,项目就能像种子一样重新长出来。

5. 把"被卸载"变成不可能:设计层面的防御方案

恢复只是补救,真正有价值的是让项目根本不可能被"顺路清掉"。防御思路不是禁止所有删除操作,而是给项目加上"身份",让所有自动化机制都认得它、尊重它。

5.1 代码与配置分离,从物理上降低风险

先说最基础的一条:别把项目长期放在"临时目录""缓存目录""用户下载目录"下。很多清理规则的默认对象就是这些路径,项目放在里面等于主动报名参加"垃圾回收"。

更关键的思路是代码与配置分离。项目代码、运行期生成的数据、构建产物,建议分目录存放:

/opt/my-project/ bin/ # 可执行文件 conf/ # 配置文件 data/ # 运行期数据,独立挂载 var/ # 缓存、日志

日志和缓存放在var/下,清理工具就算删了也不会影响主程序;数据和配置放独立目录,应用升级时只需要替换bin/和lib/,不动conf/和data/。这样即使某个环节误删,影响面也被控制在一个很小的范围里。

5.2 给关键目录加上"防删"标记

对服务器上真正不能删的目录,可以做文件系统层的保护。Linux 上最常见的是 immutable 属性:

# 对关键配置文件加 immutable 属性,任何用户(包括 root)都无法删除和修改 sudo chattr +i /opt/my-project/conf/app.yml # 目录本身也可以加,这样目录内不能被创建文件,也不能被重命名 sudo chattr +i /opt/my-project/conf

注意,chattr +i是把双刃剑,它连 root 都不放行,后续你要更新配置必须先chattr -i解锁。所以一般只对"高频误删、低频修改"的文件加,比如主配置、启动脚本。不要对整个项目目录无脑加,否则自动化部署脚本会大面积报错。

Windows 上用 ACL 也可以做到类似效果:右键目录 → 安全 → 高级 → 拒绝写入和删除权限。macOS 对应的是chflags uchg。这类标记的意义不在于对抗恶意删除,而在于让清理工具、误操作脚本在碰到这些文件时直接失败退避——失败比无声无息删掉更好。

5.3 自动化脚本里面的删除命令,必须设计成"安全默认"

凡是涉及rm -rf、rsync --delete、find -delete的地方,都要遵守几条安全默认:

  • set -u必开:在 bash 脚本里,变量未定义时立即报错退出,杜绝空变量展开成/*的问题;
  • 删除前备份:能备份就先备份,备份成本远低于恢复成本;
  • 路径白名单校验:在脚本里写一段保护逻辑,目标路径必须包含明确的项目名或前缀才能继续执行:
#!/bin/bash set -u target="/srv/deploy/my-project" case "$target" in /srv/deploy/*) ;; *) echo "refusing to delete unexpected path: $target" exit 1 ;; esac rm -rf "$target"
  • rsync 不要裸用--delete:可以先加--dry-run输出差异对比,确认无误后再真正执行。CI 里如果用了 rsync,把--delete收敛成一个显式的、经过确认的步骤,不要散落在脚本深处。
  • 清理脚本默认只清理"低价值"内容:例如只清理var/cache下超过 N 天的文件,而不是按目录名猜测。

5.4 让清理工具和安全软件认识你的项目

客户端应用被卸载的场景,对应的防御方案是给应用建立"合法身份":

  • 正式发布的应用要做代码签名。即使只是一个内部工具,也该生成自签名证书并在目标机器上信任,降低安全软件误判概率;
  • 对开发机上的目录,在清理工具里配置排除清单:把项目目录、构建目录加入"受保护列表",避免被"磁盘清理"智能扫描命中;
  • 如果是 macOS 生态,正规化处理签名与公证流程,让系统不再把应用当成"来路不明"的软件;
  • 在 CI 构建完成之后,对产物做一次安全扫描自检,提前发现"哪一步产物会被拦"的问题,而不是等用户机器出问题再后悔。

5.5 定期做一次"恢复演练",这一手很多人忽略

防御的最后一项是演习。备份被删的阴影讲到底,不只是"有没有备份"的问题,更是"备份能不能恢复"的问题。

我建议每个重要项目每季度做一次恢复演练:在干净环境里,从快照或者备份恢复到一台临时机器,跑通启动流程和核心功能,用表格记录几项指标:

演练项目标是否达标
从快照恢复整机/目录总耗时小于 1 小时是
从 Git 远端恢复源码能拉取完整工程并能构建是
从制品仓库恢复依赖构建产物与线上一致是
恢复后应用功能测试通过核心用例是

演练最大的价值不在于恢复成功,而在于发现"文档根本没写重建步骤""依赖清单不完整""快照过期"这一类问题。平时不演练,出事故时第一步操作全靠现场猜,那种慌乱心态才是最大的成本。

6. 我在这类事故复盘里反复强调的几件事

最后这部分我想说点实在的。做运维和开发这些年,我复盘过太多"项目被卸载/被清理"的事故,有几条经验被反复验证,值得每一位读者记下来。

第一,发现异常的第一反应应该是"冻结现场"而不是"赶紧修复"。很多人看到项目没了,第一件事是重新创建目录、重装依赖,这一波操作基本等于跟数据恢复软件抢硬盘空间。忍住,先快照,再查日志。你多花十分钟做现场保护,可能省下后面十个小时的救援时间。

第二,时间线是排查的第一生产力。一个删除动作,背后一定有触发时间,把它找出来,就成功了一大半。无论是系统日志、shell 历史、备份时间戳,还是 CI 构建记录,只要是时间维度上的证据,都要第一时间收集。

第三,防御要落在"身份"上,而不是"禁止"上。清理工具、安全软件、自动化任务每天都会判断"什么该留、什么该删",它们是按规则行事的。你只有给项目清晰的标记——目录位置、文件属性、排除名单、代码签名——它们才能认得你的项目。单纯靠喊"别删我的项目",没有任何机器会听你的。

第四,备份必须带演练,不能只带想法。有一份"看起来存在"的备份,和一份"验证过可以恢复"的备份,中间隔着一整套操作流程。我见过太多团队,备份策略写得漂漂亮亮,真到恢复那天才发现备份文件早就损坏了、权限没配好、或者恢复流程缺了某个关键步骤。定期演练一次,成本很低,回报极高。

第五,如果是团队协作环境,把清理类操作放进变更流程里。谁执行了磁盘清理、谁动了部署目录、谁跑了强制卸载命令,都应该有记录。系统日志只能告诉你"发生了什么",流程记录才能告诉你"为什么要做这件事"。有了这两层信息,排查事故时你才不会在一堆机器的日志里大海捞针。

再分享一个我自己的小习惯:每次接一个新项目,我都会在项目根目录放一个README.recovery文件,里面写三行:项目备份在哪、如何从备份恢复、如何从零重建。花十五分钟写好这个文件,相当于提前给未来的自己留了一把备用钥匙。项目可以被人卸载,但只要有这把钥匙在,项目就永远丢不了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询