
后端前端社交人工智能【免费下载链接】NewsBlurNewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.项目地址https://gitcode.com/gh_mirrors/ne/NewsBlur点击查看免费下载导读本文围绕 NewsBlur 仓库中ansible/roles/letsencrypt/角色及其 CHANGELOG.md 展开系统讲解该角色如何通过 Ansible Docker 化的 certbot 为站点签发、存储并自动续期 Lets Encrypt 证书覆盖普通域名与通配符wildcard域名两种签发路径。读者读完可以掌握该角色的全部变量含义、两种签发流程的任务编排、cron 自动续期与 HAProxy 热加载机制并能在自己的生产部署中直接复用这套方案。一、角色概览一个 Ansible 角色如何管理证书全生命周期letsencrypt角色位于 ansible/roles/letsencrypt/其定位是为特定域名/子域名生成 Lets Encrypt 证书核心能力包括为单域名/多子域名生成证书通过对应 DNS 提供商的插件生成通配符证书每月自动续期cron证书统一存放在/etc/letsencrypt/live/{{app_domain}}可直接被任意 HTTP 服务器NewsBlur 中即 HAProxy使用。该角色基于 Docker 运行 certbot因此依赖宿主机安装 Docker。从 meta/main.yml 可以看到角色声明的最低 Ansible 版本为 2.4平台为 Ubuntutrusty并以letsencrypt作为 galaxy tag。角色采用 MIT 协议作者为 Auxilin。在 NewsBlur 的实际部署中该角色被编排进两个核心 playbooksetup_www.yml生产 www 节点和 setup_staging.ymlstaging 节点它们都以{ role: letsencrypt, tags: letsencrypt }方式在 HAProxy 之前调用保证证书先于反向代理就绪- { role: letsencrypt, tags: letsencrypt } - { role: haproxy, tags: haproxy } - { role: web, tags: web }二、从 CHANGELOG 看角色演进每个版本对应一项关键能力角色的 CHANGELOG.md 虽然行文简洁却完整记录了角色的功能演进史每一项变更都能在源码中找到对应实现是理解设计意图的最佳入口版本日期变更内容对应源码实现v0.1.02018-09-27初始化角色角色骨架v0.1.12018-09-28更新角色名与文档role_name: letsencryptmeta/main.ymlv0.1.22018-10-01修复运行 certbot DNS 容器certbot-dns.yml 中docker_container任务v0.1.32018-10-03修复为多个子域名创建证书使用domains_list \| join( -d )拼接多域名参数v0.1.42019-04-06将续期流程固定到周日cron 任务weekday: 0v0.1.5 / v0.1.62019-04-06修复 Ansible Galaxy 行宽告警变量与任务注释规范化v0.2.02019-07-11修复 cron 任务启动、在 cron 中增加拉取 Docker 镜像步骤、修复 Ansible 2.8 告警续期任务以docker pull开头见下文其中两个关键演进值得展开v0.1.3 的多子域名支持对应 certbot 命令行用-d domain1 -d domain2追加域名Ansible 中通过 Jinja2 的domains_list | join( -d )实现v0.2.0 的cron 中先拉镜像是因为容器镜像持续更新续期前必须先docker pull最新 certbot否则可能沿用过期镜像导致续期失败。三、角色变量全解通用变量与 DNS 提供商专属变量角色全部变量定义在 defaults/main.yml可分为通用变量与 DNS 提供商变量两大类。3.1 通用变量变量名默认值说明use_dns_pluginyes是否使用 certbot DNS 插件通配符证书需要设为no则使用 certbot 自带的 standalone 模式certbot_versionlatestcertbot 或 DNS 插件镜像版本对应certbot/certbot:version或certbot/dns-plugin:versiondns_plugindnsimpleDNS 插件名如 cloudflare、dnsimple、route53 等emailsamuelnewsblur.com证书通知邮箱NewsBlur 中即运维邮箱domains_listnewsblur.com、*.newsblur.com、popular.global.newsblur.com需要签发证书的域名列表可混搭普通域名与通配符域名NewsBlur 实际配置的三项证书域名非常典型主域名newsblur.com、通配符域名*.newsblur.com以及一个子域名popular.global.newsblur.com三者通过同一张证书签发这正是 v0.1.3 修复的多子域名能力。此外还有三个 NewsBlur 特有的路径变量ssl_certificate: /srv/newsblur/config/certificates/newsblur.com.pem ssl_certificate_key: /srv/newsblur/config/certificates/newsblur.com.pem.key dnsimple_credentials_path: /srv/newsblur/config/certificates/certbot.conf它们分别指定最终证书/私钥的落地位置以及 DNS 插件所需的凭据文件位置。3.2 DNS 提供商专属变量当use_dns_plugin: yes时还需按所选dns_plugin提供对应凭据全部默认空字符串DNS 提供商所需变量Cloudflaredns_email、dns_api_keyCloudXNSdns_api_key、dns_secret_keyDigitalOceandns_tokenDNSimpledns_tokenNewsBlur 使用DNS Made Easydns_api_key、dns_secret_keyLinodedns_keyLuaDNSdns_email、dns_tokenNS1dns_api_keyOVHdns_endpoint、dns_application_key、dns_application_secret、dns_consumer_keyRFC 2136dns_server、dns_port、dns_name、dns_secret、dns_algorithmRoute 53dns_access_key_id、dns_secret_access_key需要注意凭据属于敏感信息实际部署时不应写死在角色 defaults 里。NewsBlur 的做法是从/srv/secrets-newsblur/configs/certbot.conf将 DNSimple API token 拷贝到目标路径见 certbot-dns.yml 的copy任务即证书凭据统一由独立的 secrets 目录管理。四、两种签发路径的任务编排角色入口 tasks/main.yml 只有两行- include_tasks: certbot.yml - include_tasks: certbot-dns.yml两个任务文件各自带when: not use_dns_plugin|bool/when: use_dns_plugin|bool条件从而形成互斥的两种签发流程。4.1 路径一standalone 模式无 DNS 插件当use_dns_plugin: no时执行 certbot.yml流程如下创建基础目录/etc/letsencrypt、/var/lib/letsencrypt、/var/log/letsencrypt拉取镜像docker_image强制拉取certbot/certbot:{{ certbot_version }}前台运行 certbotdocker_container以detach: no、auto_remove: yes方式运行映射上述三个目录并开放 80/443 端口执行certonly --standalone --agree-tos -m {{ letsencrypt_email }} -d {{ domains_list | join( -d ) }}standalone 模式需要 certbot 自己占用 80/443 端口完成 HTTP-01 挑战因此该流程对端口占用敏感适合无 Web 服务抢占端口的初始部署场景。4.2 路径二DNS 插件模式通配符证书当use_dns_plugin: yes时执行 certbot-dns.yml流程更完整准备凭据目录与文件创建dnsimple_credentials_path所在目录并从/srv/secrets-newsblur/configs/certbot.conf拷贝 DNSimple token拉取 DNS 插件镜像certbot/dns-{{ dns_plugin }}:{{ certbot_version }}前台运行插件容器container_default_behavior: no_defaults除挂载三个 letsencrypt 目录外还额外挂载/srv/newsblur/config/certificates执行certonly --agree-tos -m {{ email }} -d {{ domains_list | join( -d ) }} --dns-{{ dns_plugin }} --dns-{{ dns_plugin }}-propagation-seconds 60 --dns-{{ dns_plugin }}-credentials {{ dnsimple_credentials_path }} --server https://acme-v02.api.letsencrypt.org/directory这里的关键参数是--dns-plugin启用 DNS-01 挑战通过 DNS 记录验证域名所有权从而支持通配符证书--dns-plugin-propagation-seconds 60等待 DNS 记录全球生效 60 秒后再请求签发--server https://acme-v02.api.letsencrypt.org/directory显式使用 ACME v2 协议端点v2 才支持通配符证书该任务完成后通过notify: reload haproxy触发 handlers/main.yml 中的 HAProxy 热重载docker kill --signal HUP haproxy。4.3 证书落盘与权限收尾DNS 插件模式签发成功后角色会完成证书的落地闭环创建ssl_certificate/ssl_certificate_key所在目录将/etc/letsencrypt目录属主递归改为nb:nbNewsBlur 的运行用户把/etc/letsencrypt/live/{{ domains_list[0] }}/fullchain.pem与privkey.pem软链到 NewsBlur 配置目录下的证书文件若软链失败即 letsencrypt 签发失败rescue 块会从/srv/secrets-newsblur/certificates/拷贝上一份有效证书作为兜底保证服务不因签发失败而断线最后用fetch模块把新证书回传到本地/srv/secrets-newsblur/certificates/newsblur.com.crt/.key实现本地留档 失败可回滚的双保险。五、自动续期cron 模板脚本5.1 续期窗口NewsBlur 部署还通过lineinfile将续期窗口显式调整为renew_before_expiry 40 days写回/etc/letsencrypt/renewal/{{ domains_list[0] }}.conf即证书剩余有效期不足 40 天时即触发续期早于 certbot 默认的 30 天窗口为续期失败留出回滚余量。5.2 续期脚本DNS 插件模式会通过template渲染 renew-letsencrypt.sh.j2 到/usr/local/bin/renew-letsencrypt.shmode: 0755属主 root脚本要点如下set -e任一环节失败即退出并向外层 cron 报错先docker pull certbot/dns-{{ dns_plugin }}:{{ certbot_version }}拉取最新镜像对应 CHANGELOG v0.2.0 的修复docker run --rm挂载 letsencrypt 三目录与凭据目录后执行certbot renew——注意刻意不加-it因为 cron 环境没有 TTY续期成功后通过find $CERT_FILE -mmin -5判断证书是否在最近 5 分钟内被实际更新只有确实更新才向 haproxy 容器发送HUP信号热加载新证书避免无意义重启整个脚本输出追加到/var/log/letsencrypt/renewal-cron.log便于排查。5.3 两条 cron 线路两种模式各注册一条名为letsencrypt_renewal的 cron同为minute0 hour0 weekday0即每周日零点对应 CHANGELOG v0.1.4 的设定standalone 模式certbot.yml内联命令先判断当月日期[ $(date \%d) -le 07 ]每月 1–7 日才执行随后docker pull→service nginx stop→certbot renew→service nginx start即通过重启 nginx 应用新证书DNS 插件模式certbot-dns.yml直接调用/usr/local/bin/renew-letsencrypt.sh续期全程无需停止任何服务DNS-01 挑战不占用端口这也是生产环境选择 DNS 插件模式的核心原因之一。六、与 NewsBlur 基础设施的集成该角色并非孤立运行而是与 NewsBlur 的 HAProxy、nginx 与密钥管理体系深度联动HAProxy 消费证书HAProxy 容器通过 haproxy/tasks/main.yml 挂载/etc/letsencryptTLS 终结直接读取角色产出的 live 证书续期后reload haproxyhandler 执行docker kill --signal HUP haproxy实现热加载playbook 级集成deploy_app.yml、deploy_mcp.yml、deploy_www.yml 均通过vars_files引入roles/letsencrypt/defaults/main.yml确保证书路径与域名配置在部署时保持一致密钥外置DNS 凭据与历史证书存于/srv/secrets-newsblur/与代码仓库隔离符合生产敏感信息管理惯例。七、使用建议与注意事项综合 CHANGELOG 演进与 NewsBlur 实际配置可总结出以下可复用经验通配符证书必须走 DNS 插件use_dns_plugin: yes并显式指定 ACME v2 端点同时为每个 DNS 提供商配齐专属凭据变量多域名合并签发将主域名、通配符与子域名放入同一domains_list用一张证书覆盖减少续期次数与成本续期脚本要处理是否真的更新像模板脚本那样比较证书文件 mtime 后再决定是否 reload避免空转签发失败要有兜底参考角色的 rescue 块与fetch回传保留上一份有效证书并本地留档保障高可用敏感信息绝不入仓凭据从/srv/secrets-newsblur/拷贝证书回传到 secrets 目录仓库内仅保留变量占位符版本约束角色依赖 DockerAnsible 版本需不低于 2.4若使用 Ansible 2.8 需注意 v0.2.0 对告警的修复项。结语NewsBlur 的letsencrypt角色是一个小而完整的证书生命周期管理范例从 CHANGELOG 中每一次版本修复到 certbot.yml 与 certbot-dns.yml 的双路径编排再到 renew-letsencrypt.sh.j2 的幂等续期层层体现了生产级证书管理的工程细节。对于希望在自建基础设施中自动化 HTTPS 证书的团队这套Ansible Docker certbot cron 续期 反向代理热加载的组合是一份可以直接借鉴的落地蓝图。赞分享后端前端社交人工智能【免费下载链接】NewsBlurNewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.项目地址https://gitcode.com/gh_mirrors/ne/NewsBlur点击查看免费下载相关推荐jsproxy 自动申请 Lets Encrypt 证书acme.sh nginx 配置实战jsproxy 自动申请 Lets Encrypt 证书acme.sh nginx 配置实战 本篇指南讲解 jsproxy一个基于浏览器 Servic后端网络通信letsencrypt-win-simple完全指南从零开始配置Lets Encrypt证书letsencrypt win simple完全指南从零开始配置Lets Encrypt证书 Lets Encrypt证书配置 从未如此简单letsen后端CLI应用安全终极Vito SSL证书自动化管理指南Lets Encrypt与自定义证书实战攻略终极Vito SSL证书自动化管理指南Lets Encrypt与自定义证书实战攻略 Vito作为一款免费的自托管服务器管理工具提供了强大的SSL证书自动化上一篇MicroK8s集群管理终极指南join/leave/reset命令详解下一篇Pokedex核心技术揭秘如何用Ktor网络请求与SqlDelight本地存储构建跨平台应用 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考