AMH 面板无法自动删除远程 FTP 上的备份?

前言

  • AMH 提供了多种远程备份方式

    • amdata:本地备份和 SSH/FTP 远程备份
    • ammail:备份到邮件地址
    • amqcloud:备份到腾讯云 COS
    • amqiniu:备份到七牛云
    • amoss:备份到阿里云 OSS
  • 本文主要讲 amdata 的远程备份,但请注意

    • 只是记录自己折腾的过程,也许并不严谨,仅供参考
    • 适用的软件版本:AMH-6.2(主服务器)、amdata-2.7(主服务器)、AMH-6.2(备份服务器)、PureFTPd-1.0.49(备份服务器)

问题起因

之前一直用 OSS 存储备份,后来手里有多余的 VPS,于是打算换掉。
在 amdata 里做了配置,走 FTP 协议,设置保留七天,就扔着没管。过了一段时间才发现,备份 VPS 上的备份文件只增不删,都快把硬盘塞满了

问题解决

省流:简单粗暴,如果 FTP 不行,用 SSH,别折腾

如果不想用 SSH 或者就想较真儿,可以继续往下看

枯燥又失败的排查过程

明明设置了仅保留 7 天的备份规则,为什么远程 FTP 目录上的文件却不会被删除呢?

下面是我的排查过程

  1. 检查 FTP 账号的账号、密码、权限是否正常

    • 使用 FileZilla 测试一切正常
  2. 检查备份服务器上的备份文件夹,权限是否正确设置,一切正常
  3. 检查主服务期的远程连接配置是否正常,看起来正常
  4. 手动触发计划任务:amh amdata cron_del 7 day,日志打印出的待删除文件列表是正常的
  5. 猜测可能是执行删除阶段的问题,找到 cron_del 对应的文件

    • 文件位置:/root/amh/modules/amdata-2.7/admin-script/cron_del
  6. 粗看代码没发现问题,找到执行阶段的日志存放在:${amh_www}/logs/ftp_cron_del.log

    • 也就是:/usr/local/amh-6.2/logs/ftp_cron_del.log
  7. 看日志,发现报错: 550 Can't change directory to /a/b/backup/: No such file or directory
  8. 恍然大悟,第一个坑:绝对路径还是相对路径

    • 在备份服务器上,给备份的 FTP 账号赋予的根路径是 “/a/b/backup”
    • 在主服务器上,配置存储备份文件的远程路径,不能写成 “/a/b/backup”,而应该是 “/”
    • 如果配置成 “/a/b/backup”,实际对应的是 “/a/b/backup/a/b/backup”
  9. 修改后再次尝试,依然失败,继续看日志,报错为 550 Can't check for file existence
  10. 回去看 /root/amh/modules/amdata-2.7/admin-script/cron_del,文件删除的代码段如
if [ "$ftp_del" != '' ]; then
    echo "[Notice] FTP-Delete File: $ftp_del";
    ftp -n -v $ftp_passive_s $ftp_host $ftp_port > ${amh_www}/logs/ftp_cron_del.log <<- amh_ftp
    user $ftp_user $ftp_pass
    type binary
    cd $ftp_path
    prompt
    mdelete $ftp_del
    amh_ftp
fi;
  1. 看起来是 mdelete 的问题,手动执行 mdelete 命令,确实有问题
  2. 以 “mdelete Can't check for file existence” Google,未果,主要有以下两个方向的结果

    • PureFTPd 1.0.49 版本取消了对通配符的支持
    • Windows 的锅
  3. 换 FTP 客户端,分别用 Windows、Debian、MacOS 连接备份服务器,均无法正常进行 medelete 操作,定位为服务端问题
  4. 继续 Google 资料,至今未果,一些可能有帮助的内容如下

结论:没有结论

排查到这里放弃,先用 SSH 吧,改天更换一个 FTP Server 试试