首页
/ 零停机升级!Jackett SSL证书自动更新全攻略

零停机升级!Jackett SSL证书自动更新全攻略

2026-02-05 05:44:49作者:郦嵘贵Just

你是否曾因SSL证书过期导致Jackett服务中断?手动更新证书不仅繁琐,还可能因遗忘造成隐私泄露风险。本文将带你通过Certbot与系统任务调度,实现SSL证书的全自动更新与Jackett服务无缝重载,让你的种子索引服务永远在线。

为什么需要自动更新SSL证书

Jackett作为Torrent Tracker(种子追踪器)的代理服务器,需要通过HTTPS协议确保数据传输安全。根据Mozilla SSL配置指南,现代浏览器和应用已不再信任有效期超过398天的证书,而Let's Encrypt提供的免费证书仅有90天有效期。手动维护证书不仅耗时,还存在以下风险:

  • 服务中断:证书过期导致Jackett无法被Sonarr、Radarr等应用访问
  • 安全风险:临时关闭SSL验证(如使用--IgnoreSslErrors参数)会暴露数据传输
  • 合规问题:未正确配置的证书可能违反数据保护法规

项目中已内置SSL错误处理机制,可通过命令行参数临时规避证书问题:

./jackett --IgnoreSslErrors=true

但该参数仅建议用于调试,生产环境应通过src/Jackett.Common/Utils/Clients/中的代码实现完整的证书验证逻辑。

准备工作:安装Certbot与依赖

Certbot是Let's Encrypt官方推荐的证书管理工具,支持自动签发和续期SSL证书。以下是不同系统的安装方法:

Debian/Ubuntu系统

sudo apt update && sudo apt install certbot python3-certbot-nginx -y

CentOS/RHEL系统

sudo dnf install certbot python3-certbot-nginx -y

macOS系统(通过Homebrew)

brew install certbot

安装完成后,通过certbot --version验证安装是否成功。建议同时安装证书自动更新所需的系统组件:

# 对于使用systemd的系统
sudo apt install cronie -y  # Debian/Ubuntu
# 对于macOS
brew install cron

签发SSL证书

使用Certbot为Jackett域名签发证书,这里以Nginx服务器为例(其他Web服务器可替换为对应插件):

sudo certbot --nginx -d your-jackett-domain.com

执行过程中需要完成:

  1. 输入邮箱地址(用于证书过期通知)
  2. 同意服务条款
  3. 选择是否共享邮箱地址
  4. 确认域名验证方式(自动配置Nginx)

证书文件默认存储在/etc/letsencrypt/live/your-jackett-domain.com/目录,包含以下关键文件:

  • fullchain.pem:完整证书链
  • privkey.pem:私钥文件
  • cert.pem:服务器证书

配置Jackett使用SSL证书

修改Jackett配置文件

编辑Jackett的配置文件config.xml(通常位于~/.config/Jackett//var/lib/jackett/),添加或修改以下SSL相关配置:

<ServerSettings>
  <Port>9117</Port>
  <SslPort>9118</SslPort>
  <SslCertPath>/etc/letsencrypt/live/your-jackett-domain.com/fullchain.pem</SslCertPath>
  <SslKeyPath>/etc/letsencrypt/live/your-jackett-domain.com/privkey.pem</SslKeyPath>
  <AllowExternal>true</AllowExternal>
  <!-- 其他配置项 -->
</ServerSettings>

验证证书配置

重启Jackett服务并验证SSL配置是否生效:

# systemd系统
sudo systemctl restart jackett.service
# 查看服务状态
sudo systemctl status jackett.service

通过浏览器访问https://your-jackett-domain.com:9118,检查地址栏是否显示安全锁图标。也可使用curl命令测试:

curl -v https://your-jackett-domain.com:9118/api/v2.0/indexers/all/results/torznab

编写证书更新后自动重载脚本

创建/usr/local/bin/jackett-cert-reload.sh脚本,实现证书更新后自动重启Jackett服务:

#!/bin/bash
# 证书更新后重载Jackett服务

# 检查证书文件是否存在
if [ -f "/etc/letsencrypt/live/your-jackett-domain.com/fullchain.pem" ]; then
    # 设置正确的文件权限
    sudo chown jackett:jackett /etc/letsencrypt/live/your-jackett-domain.com/*
    sudo chmod 600 /etc/letsencrypt/live/your-jackett-domain.com/privkey.pem
    
    # 重启Jackett服务
    sudo systemctl restart jackett.service
    
    # 记录日志
    echo "[$(date)] Jackett SSL certificate reloaded successfully" >> /var/log/jackett-cert-reload.log
else
    echo "[$(date)] SSL certificate files not found" >> /var/log/jackett-cert-reload.log
    exit 1
fi

添加执行权限:

sudo chmod +x /usr/local/bin/jackett-cert-reload.sh

配置Certbot自动更新钩子

Certbot支持通过--deploy-hook参数在证书成功更新后执行指定命令。编辑Certbot的更新命令:

sudo certbot renew --deploy-hook "/usr/local/bin/jackett-cert-reload.sh"

测试自动更新流程:

sudo certbot renew --dry-run

如果看到类似以下输出,说明配置成功:

** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/your-jackett-domain.com/fullchain.pem (success)
** DRY RUN: simulating renewal success for /etc/letsencrypt/live/your-jackett-domain.com/fullchain.pem

设置定期任务调度

尽管Certbot会自动创建cron任务(通常位于/etc/cron.d/certbot),但为确保万无一失,建议手动创建监控任务:

使用crontab设置定期检查

# 编辑当前用户的crontab
crontab -e

# 添加以下内容(每天凌晨3点执行证书检查)
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "/usr/local/bin/jackett-cert-reload.sh"

使用systemd timer(推荐)

对于使用systemd的系统,创建/etc/systemd/system/certbot-renew.timer

[Unit]
Description=Daily renewal of Certbot certificates

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

然后启用并启动timer:

sudo systemctl enable --now certbot-renew.timer
# 检查timer状态
sudo systemctl list-timers | grep certbot

错误处理与日志监控

日志文件位置

  • Certbot更新日志:/var/log/letsencrypt/letsencrypt.log
  • Jackett服务日志:~/.config/Jackett/log.txt 或通过journalctl -u jackett.service查看
  • 证书重载脚本日志:/var/log/jackett-cert-reload.log

常见问题排查

  1. 权限问题:确保Jackett用户(通常是jackett)对证书文件有读取权限
  2. 防火墙设置:Let's Encrypt验证需要开放80/443端口
  3. SELinux/AppArmor限制:可能需要调整安全策略以允许Jackett访问证书文件

可使用项目内置的SSL错误忽略参数进行临时调试(不建议生产环境使用):

./jackett --IgnoreSslErrors=true

该参数通过src/Jackett.Server/Program.cs中的命令行解析逻辑实现,相关代码位于参数处理模块。

完整自动化流程图

graph TD
    A[Certbot定时任务] -->|每天执行| B{证书是否需要更新}
    B -->|否| C[结束]
    B -->|是| D[自动更新证书]
    D --> E[执行部署钩子脚本]
    E --> F[设置证书文件权限]
    F --> G[重启Jackett服务]
    G --> H[记录成功日志]
    G --> I{服务是否启动成功}
    I -->|是| J[更新完成]
    I -->|否| K[记录错误日志并告警]

总结与最佳实践

通过本文的步骤,你已实现:

  1. 使用Certbot自动签发和更新Let's Encrypt SSL证书
  2. 通过部署钩子脚本实现证书更新后Jackett服务自动重载
  3. 配置系统任务调度确保更新过程全自动执行

建议定期检查日志文件,并考虑以下增强措施:

  • 添加邮件告警功能,当证书更新失败时通知管理员
  • 使用Prometheus+Grafana监控证书有效期
  • 实现双机热备,避免单点故障

完整的Jackett使用文档可参考项目README.md,SSL配置相关代码可在src/Jackett.Common/Utils/Clients/目录下查看。

希望本文能帮助你构建更稳定、更安全的Jackett服务。如有任何问题,欢迎通过项目CONTRIBUTING.md中的指引提交Issue或Pull Request。

登录后查看全文
热门项目推荐
相关项目推荐