ERPNext 主机与系统维护

ERPNext 主机与系统维护

你的 ERPNext 跑在 Ubuntu 上(无论是物理机还是 VirtualBox 虚拟机)。Ubuntu 本身也需要定期维护,就像汽车需要换机油。不维护的结果:安全漏洞、磁盘写满、系统崩溃。


1. 为什么主机维护跟 ERPNext 业务相关?

故事:某公司 ERPNext 跑了 8 个月一直正常。某天突然所有人登不进去。
原因:Docker 日志和旧镜像悄悄攒了 60GB,磁盘满了 → MariaDB 无法写入 → 系统瘫痪。
教训:主机维护不是"IT 的事",是"你的生意能不能继续运转"的事。

2. 每周维护(5 分钟)

2.1 检查磁盘空间

df -h /
# 看 Use% 列。超过 80% 就该清理了。

# 看看谁占的最多
du -sh /var/lib/docker/* 2>/dev/null | sort -h
# du = 查看磁盘使用
# sort -h = 按大小从小到大排
# 最大的几个目录就是需要关注的

2.2 清理没用的 Docker 垃圾

# 清理悬空镜像(没打标签的、旧版本不要了的)
docker image prune -f
# 清理停止的容器
docker container prune -f
# 清理未使用的 volume(⚠ 确认没有重要数据再执行)
docker volume prune -f
# 一键清理以上所有(推荐每月一次)
docker system prune -f

这些命令安全吗? docker system prune 只删"当前没在使用"的东西。正在运行的容器、正在使用的 volume 不受影响。但 docker volume prune 会删除所有没被任何容器挂载的 volume,如果你手动创建过 volume 可能被误删。不确定时只执行前两个。

2.3 检查自动备份是否在正常运行

# 如果用了 backup-cron,检查最近的备份文件
docker compose exec backend ls -la /home/frappe/frappe-bench/sites/mysite/private/backups/ | tail -5
# 应该看到最近几天的备份文件。如果最新的是一周前的,说明备份没在跑。

3. 每月维护(15 分钟)

3.1 给 Ubuntu 打安全补丁

# 更新软件包列表
sudo apt update

# 安装所有安全更新
sudo apt upgrade -y

# 如果更新了内核,可能需要重启
# 检查是否需要重启:
ls /var/run/reboot-required 2>/dev/null && echo "需要重启" || echo "不需要重启"

建议: 每月选一个业务低峰时段(如周六晚上),执行更新后重启。重启前先确保有最新的备份。

3.2 检查 Docker 版本

docker --version
# 如果版本落后太多(比如一年以上),考虑更新 Docker

3.3 做一次恢复演习(每 3 个月一次)

按上线清单第 8 节的步骤,在备用机上恢复备份,确认备份文件有效。


4. VirtualBox 虚拟机特别注意事项

如果你用 VirtualBox 方案(Windows 宿主机 + Ubuntu 虚拟机),额外注意:

4.1 防止 Windows 更新自动重启

Windows 默认会在半夜自动更新并重启。重启 → VirtualBox 关闭 → 虚拟机被强制关闭 → MariaDB 可能损坏。

解决办法:
  控制面板 → Windows 更新 → 高级选项 → 把"活跃时段"设为你公司的营业时间
  → 关闭"在重启应用时自动重启"
  → 或者直接改成"手动检查更新"

4.2 设置虚拟机开机自启

如果 Windows 重启了,虚拟机不会自动启动。你需要配置:

方法一(简单):Windows 计划任务
  1. 打开"任务计划程序"
  2. 创建任务 → 触发器:系统启动时
  3. 操作:启动程序 "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
  4. 参数:startvm "你的虚拟机名称" --type headless
     (headless = 无界面模式,在后台运行)

方法二(更可靠):写一个 .bat 脚本,放到 Windows 的启动文件夹
  "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "ERPNext" --type headless

4.3 监控宿主机磁盘空间

虚拟机的虚拟磁盘文件(.vdi)会随着时间增长。Windows 上检查:

打开"此电脑" → 看 C 盘剩余空间。如果小于 20GB,需要:
  1. 在 Ubuntu 虚拟机里清理(按第 2 节做)
  2. 压缩虚拟磁盘:
     VBoxManage modifymedium disk "你的磁盘.vdi" --compact
     (这个操作需要在虚拟机停止后执行)

5. 数据库维护(每季度)

# 1. 检查各表大小(找出异常增长的表)
docker compose exec db mysql -u root -p你的密码 -e "
  SELECT table_name,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
  FROM information_schema.tables
  WHERE table_schema = '你的数据库名'
  ORDER BY (data_length + index_length) DESC LIMIT 20;
"

# 2. 如果某些日志表异常大(比如 tabError Log 占了好几 GB)
#    在运维指南 7.2 节有清理脚本

# 3. 优化数据库表(重建索引,提升查询速度)
docker compose exec db mysqlcheck -u root -p你的密码 --optimize --all-databases
# mysqlcheck --optimize = 整理数据库碎片,就像磁盘碎片整理
# 建议在业务低峰期执行,因为大表优化时会锁表

6. 安全维护清单

每月必做:
  □ sudo apt update && sudo apt upgrade     (系统安全更新)
  □ 检查 /var/log/auth.log 有没有可疑登录尝试
  □ 确认防火墙规则正确

每季度做:
  □ docker system prune                      (清理 Docker 垃圾)
  □ 数据库优化                                (第 5 节)
  □ 恢复演习                                  (上线清单第 8 节)

每半年做:
  □ 检查所有密码(数据库、管理员、用户)是否需要更新
  □ 更新 Docker 版本
  □ 检查 SSL 证书有效期(如果用了 Let's Encrypt,会自动续约)

最后更新:2026-05-10 适用版本:Ubuntu 22.04/24.04 + Docker + ERPNext v16.x