群晖docker部署acme.sh自动续签DNSPOD证书

前言

目前腾讯云免费证书有效期只有短短90天,本记录以腾讯云DNSPOD为例,使用群晖docker部署 acme.sh 的方式免费申请泛域名证书以及配置自动续签,保证证书不会到期中断。

一、腾讯云DNS Token申请

  1. 打开DNSPod 控制台
    腾讯云DNSPod: DNSPod

  2. 获取 DNSPod Token
    点击右上角头像 > 点击API密钥 > 选择DNSPod Token > 创建密钥

  3. 记录并保存Token,忘记需重新创建密钥

二、群晖创建acme.sh容器并配置环境

无法正常访问Docker注册表的请参考使用:Docker/DockerHub 国内镜像源/加速列表

  1. 在共享文件夹docker里建一个acme.sh的文件夹
  2. 拉取acme.sh docker镜像
  • 打开群晖docker,在注册表里搜索acme.sh,找到并下载neilpang/acme.sh
  1. 创建容器
  • 容器名为:acme-sh
  • 高级设置 > 存储空间:添加文件夹docker/acme.sh,装载路径到 /acme.sh
  • 网络为host
  • 添加环境变量(如果开启了两步验证,需要繁琐一些,也可以为acme.sh专门新建一个账号)

DP_Id : 填入第一步获取的 DNSPod ID
DP_Key :填入第一步获取的 DNSPod Token
SYNO_Username :登录群晖的用户名
SYNO_Password : 登录群晖的密码
SYNO_Certificate :空字符串("")为替换默认证书
SYNO_Create:填域名
SYNO_Port : 填入群晖内网的端口号(我用的默认端口5000未修改)

  • 命令处添加:daemon
  1. 点击下一步,运行容器。
    此时容器搭建完毕,但证书还没有获取,也没有部署,必须要一个脚本文件来启动它。

三、创建脚本文件

  1. 在群晖用文本编辑器,创建一个新文本,粘贴如下代码,修改 '你的域名' ,然后保存,修改文件名为cert.sh
#!/bin/bash
 
# 域名
 
DOMAIN='你的域名'
 
# DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,CloudFlare就是dns_cf
 
DNS=dns_dp
 
# DNS API 生效等待时间 值(单位:秒),一般120即可
 
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
 
DNS_SLEEP=120
 
# 证书服务商,letsencrypt
 
CERT_SERVER=letsencrypt
 
generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}""
 
installCrtCommand="acme.sh --deploy -d "${DOMAIN}" -d "*.${DOMAIN}" --deploy-hook synology_dsm"
 
docker exec acme-sh $generateCrtCommand
 
docker exec acme-sh $installCrtCommand
  1. 将此脚本文件放到 /volume1/docker/acme.sh 文件夹下,然后右键属性,复制好路径位置,一会要用

四、获取证书

  1. 首先确认群晖的ssh端口是打开的,然后运行终端,连接群晖。并使用sudo -i 提升账号权限为root权限
  2. 然后执行脚本运行命令,路径就用刚才复制的脚本文件路径
bash /volume1/docker/acme.sh/cert.sh
  1. 看到最后的Success,就是成功了。
    然后我们可以在 /volume1/docker/acme.sh/ 文件夹下看到有个以我们域名命名的文件夹,里面就是新保存的证书了
  2. 然后控制面板 > 安全性 > 证书 检查下证书是否已更新
  3. 以上步骤成功之后,我们就可以去部署自动更新的脚本了

五、自动获取更新证书脚本

  1. 打开群晖控制面板 > 任务计划 > 新增,用户账号选root
  2. 计划:可设置为每3个月运行一次
  3. 然后任务设置 > 运行命令(用户定义的脚本),粘贴如下代码,目录名称以实际为准:
bash  /volume1/docker/acme.sh/cert.sh >> /volume1/docker/acme.sh/log.txt 2>&1

END