腾讯云轻量服务器每日自动快照备份脚本(PHP + 宝塔计划任务)部署笔记

      发布在:前端技术      评论:0 条评论

给腾讯云轻量服务器(Lighthouse)做每日快照。快照这玩意说白了就是整机备份,哪天手贱改坏了配置、被入侵了、或者数据库误删,直接回滚快照就完事,比啥都省心。


手动拍快照很简单,控制台点两下。但人总会忘,所以搞个脚本每天凌晨 3 点自动创建快照,同时管着数量——快照太多了占空间也费钱,超过上限就把最老的删掉。创建失败还实现发邮件告警,不然脚本挂了都不知道。

image


自动创建快照脚本目录结构


autobackup/
├── auto_snapshot.php    # 主脚本
├── .env                 # 所有配置(密钥也在里面)
├── composer.json        # 依赖声明
├── snapshot.lock        # 锁文件,防止任务重跑
├── snapshot.log         # 运行日志


.env 配置


密钥在腾讯云控制台 CAM 里申请https://console.cloud.tencent.com/cam/capi(建议用子账号,只给轻量服务器权限,别拿主账号密钥跑)。

imageimage

然后:


TENCENTCLOUD_SECRET_ID=AKID你自己的
TENCENTCLOUD_SECRET_KEY=你的密钥
# 服务器配置
TENCENTCLOUD_REGION=ap-shanghai # 服务器地域ID https://cloud.tencent.com/document/product/213/6091  我的服务器是上海的  所以对应的地域ID是ap-shanghai
INSTANCE_ID=lhins-你的实例ID      # 控制台实例详情页能看
# 快照策略
MAX_SNAPSHOTS=2                   # 最多保留几个快照 ,免费快照配额最多2个
# 邮件通知(仅失败时发送)
SMTP_HOST=ssl://smtp.163.com
SMTP_PORT=465
SMTP_USER=发件邮箱
SMTP_PASS=授权码                   # 163/QQ邮箱要用授权码,不是登录密码
NOTIFY_EMAIL=收告警的邮箱


脚本思路


流程就三步,代码不长:


  1. 查现有快照(按实例 ID 过滤)

  2. 超了就删:按创建时间排序,删掉最老的 数量 - 上限 + 1

  3. 拍新的,名字带时间戳


核心删除逻辑:


if (count($snapshotSet) >= $maxSnapshots) {
    // 按创建时间从小到大排,最老的在前面
    usort($snapshotSet, fn($a, $b) => strtotime($a->CreatedTime) - strtotime($b->CreatedTime));

    // 比如上限2个、现在有3个,就删 3-2+1=2 个最老的
    $deleteIds = array_map(
        fn($snap) => $snap->SnapshotId,
        array_slice($snapshotSet, 0, count($snapshotSet) - $maxSnapshots + 1)
    );
    // 调 DeleteSnapshots 删掉
}


另外两个重要设计:


  • flock 文件锁:开头抢 snapshot.lock 的非阻塞排他锁,抢不到说明上一个任务还没跑完,直接退出。防止手动跑的时候和计划任务撞车。

  • try-catch 兜底:任何一步抛异常都会拼出错误信息,走 PHPMailer 发邮件到 NOTIFY_EMAIL,然后 exit(1),方便宝塔的计划任务监控退出码。


先测试再上定时任务


php -l auto_snapshot.php        # 先检查语法
php get.php                     # 能列出当前快照,说明密钥和网络没问题
php auto_snapshot.php           # 手动跑一次,看输出和 snapshot.log


宝塔计划任务


宝塔面板 → 计划任务 → Shell 脚本,执行周期每天 3:00:


cd /www/wwwroot/autobackup
/usr/bin/php auto_snapshot.php >> /www/wwwlogs/snapshot_cron.log 2>&1

执行成功后可以在快照栏看到效果了

image

相关文章

记录在宝塔服务器上给Python 3.12安装Playwright时踩到的各种坑,包括语法错误、依赖缺失、参数写错,最后成功截图。纯笔记,供日后翻查。

详细讲解如何使用PHP实现ZIP文件自动解压、安全验证及文件列表遍历功能,并提供完整的代码实现与异常处理方案。

兼容 PHP 5.3~5.6 的老牌二维码生成库,不依赖扩展和 Composer。含参数说明、纠错级别、尺寸计算及常见场景示例。

Nginx 启动时没有任何错误日志就悄悄退出?本文通过宝塔面板的真实案例,详解如何使用 strace 命令追踪系统调用,精准定位因缺少 cjson.so 库导致的 Nginx 启动失败。

CentOS 7 停止维护后,宝塔面板安装 PHP fileinfo 扩展报错 “C compiler cannot create executables”。本文详细分析原因,并提供一套完整、安全的解决方法,包括切换阿里云 Vault 源、修复 GPG 密钥缺失、安装编译器,最终成功安装扩展。

本文详细介绍两种让 PhpStudy 在 Windows 开机后自动启动的方法,包括使用启动文件夹批处理脚本和直接注册 Apache、MySQL 为系统服务,助你减少重复操作,提高开发效率。

热门推荐