Linux的timer的使用以及部署指南,Cerbot的案例
非常好。下面是一份标准、带详细注释的 Certbot 自动续期 + Podman Nginx reload 定时任务模板,专为你当前环境(AlmaLinux / CentOS Stream 9 + Podman)设计。
分为两个文件:
-
/etc/systemd/system/certbot-renew.service
-
/etc/systemd/system/certbot-renew.timer
✅ ①
/etc/systemd/system/certbot-renew.service
# ===============================
# File: /etc/systemd/system/certbot-renew.service
# Purpose: 自动续期 Let's Encrypt 证书,并在续期后 reload Podman 内的 Nginx
# ===============================
[Unit]
Description=Renew Let's Encrypt certificates and reload nginx (Podman)
# 在网络完全上线后再执行(避免 DNS/ACME 解析失败)
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
# 指定工作目录(避免默认 / 导致相对路径问题)
WorkingDirectory=/root
# 环境变量:确保命令可被正确找到
# 若 certbot/podman 不在此 PATH 内,请写绝对路径或扩展 PATH
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
# 实际执行命令:
# --quiet : 静默模式,输出最少
# --post-hook ... : 若证书成功续期,则执行 reload(nginx 容器名请按实际修改)
ExecStart=/usr/bin/certbot renew --quiet --post-hook "/usr/bin/podman exec nginx nginx -s reload"
# 若续期失败,不重启服务(因为 Type=oneshot)
# systemd 会自动捕获 stdout/stderr 日志,可通过 journalctl 查看
[Install]
# 不直接由 systemd 启动,而是由 timer 触发
WantedBy=multi-user.target
✅ ②
/etc/systemd/system/certbot-renew.timer
# ===============================
# File: /etc/systemd/system/certbot-renew.timer
# Purpose: 每天定时触发 certbot-renew.service
# ===============================
[Unit]
Description=Daily renewal of Let's Encrypt certificates (for sidian.top)
[Timer]
# 执行时间设定:
# 每天凌晨 03:30 固定执行,可按需修改(例如 02:00)
OnCalendar=03:30
# 如果上次错过(关机期间),开机后立即补跑一次
Persistent=true
# 延迟设定:
# 若设为 >0 可在指定时间基础上随机延迟执行(避免多台机器同时更新)
RandomizedDelaySec=0
# 若想改为固定间隔而非固定时间:
# OnUnitActiveSec=12h
# OnBootSec=15min
[Install]
WantedBy=timers.target
✅ ③ 启用与检查命令
# 重新加载 systemd 配置
systemctl daemon-reload
# 启用并立即启动定时器
systemctl enable --now certbot-renew.timer
# 查看定时器状态
systemctl list-timers | grep certbot
# 查看执行日志
journalctl -u certbot-renew.service -n 50
✅ ④ 常见自定义项
|
需求 |
修改位置 |
示例 |
|---|---|---|
|
改执行时间 |
certbot-renew.timer |
OnCalendar=02:00 |
|
随机延迟 |
RandomizedDelaySec=30m |
避免并发更新 |
|
容器名不同 |
ExecStart= 行 |
/usr/bin/podman exec my-nginx nginx -s reload |
|
使用非 root 用户 |
添加 User=certbot、Group=certbot |
确保权限足够 |
|
调试日志模式 |
去掉 --quiet 参数 |
输出详细续期信息 |
✅ ⑤ 验证续期是否正常
certbot renew --dry-run
确保返回 “Congratulations! Your certificate and chain have been saved successfully” 即代表测试成功。
是否希望我再帮你把这两份文件内容打包成一份“可直接复制部署”的最终版本(例如容器名写成 nginx-hysteria,每天 02:30 执行)?
浙公网安备 33010602011771号