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 执行)?

posted @ 2025-11-10 15:53  就是想学习  阅读(9)  评论(0)    收藏  举报