记我群晖上的Docker项目:ddns-go和acme.sh

由于在用的云服务器即将到期,续费的价格实在难以接受。蹲守了几个促销活动都未能买到自己满意的产品,故产生了使用回静态博客并托管在免费的 Github Pages 上。众所周知,在国内使用 Github 其实是挺难受的,速度慢点还能忍受,间歇性抽风就有点离谱了。测试套上 Cloudflare 后有明显的改善,这也是我现在使用的方案。当然啦,一些地区连接 Cloudflare 依然会很慢,但是免费的东西也不能有太过的要求对吧,走一步是一步吧。

使用 Cloudflare 就要将域名的 DNS 解析到 Cloudflare 上,方法很简单,设置好大概几分钟就能生效。但将域名的 DNS 更改成 Cloudflare 就会引出一个新的问题,一直以来我都是通过群晖自带的 DDNS 这个功能将家里的公网 IP 解析到域名上,这样当我不在家时就可以方便地通过域名访问到家里的设备了。这时问题来了,群晖上的 DDNS 服务供用商列表上并没有 Cloudflare,好在网上有很多给群晖上的 DDNS 添加服务供应商的教程,我也曾实际操作过,不过后来有一次我重装了群晖系统,自然而然上次添加的列表就失效了。

现在的我已完全中了 Docker 的毒,哪怕明知道使用 Docker 会产生一点点点性能上的损失,但实在是架不住其灵活易用的优势。所以这次折腾我不想再改群晖系统上的东西了,能在 Docker 上解决的直接在 Docker 上跑。

DDNS-GO

https://github.com/jeessy2/ddns-go

简单好用的 DDNS。自动更新域名解析到公网 IP(支持阿里云、腾讯云 dnspod、Cloudflare、Callback、华为云、百度云、porkbun、GoDaddy、Google Domains)。

作者是国人,使用说明是中文的,看着真舒服。真叫一看就懂,当然啦,这跟作者表达得清晰有很大关系。

群晖安装方法:

  • 套件中心下载 docker 并打开
  • 注册表中搜索ddns-go并下载
  • 映像 -> 选择jeessy/ddns-go -> 启动 -> 高级设置 -> 网络中勾选使用与 Docker Host 相同的网络,高级设置中勾选启动自动重新启动
  • 在浏览器中打开http://群晖IP:9876,修改你的配置,成功

以上是作者大大在 Github 上给出的安装方法,很简单。第三步时可以将 Docker 容器里的 root 目录映射到 Nas 的某个目录上,简单地备份一下 DDNS 的设置,但是其实该项目真的很简单,要设置的地方也就两三个地方,所以按照作者给的安装方法足够。

群晖 7.1 系统 Docker 部署 DDNS-GO 的简易过程截图:

选择使用与 Docker Host 相同的网络,这样可以使用 IPV6!

截屏2023-02-16 15.32.33

勾选启用自动重新启动,如果群晖上安装了 Web Station 的话可以也将此项勾选,方便修改访问的端口。

截屏2023-02-16 15.23.00

添加文件夹

截屏2023-02-16 15.23.43

将/docker/ddns-go 目录映射到容器里的/root 目录

截屏2023-02-16 15.24.32

相关设置

DDNS-GO 的设置也十分的简单,以 Cloudflare 为例,勾选 Cloudflare,点击服务商列表下面的创建令牌->编辑区域 DNS (使用模板)跳转到 Cloudflare 并创建一个新的令牌(参考)。在 API 令牌里找到新建的令牌,点击右边的三个点,选择投放(参考),将得到的 Token 复制到 DDNS-GO 即可。至于其他设置,其实每一项都有提示,根据自己的实际情况进行相应的设置即可(参考)

acme.sh

用作自动申请与续期 SSL 证书的工具,由于 80/443 这两个端口无法使用,所以群晖自带的申请与续期证书是无法使用的,这时就要用到 acme.sh 这个工具了。在群晖上可以选择直接安装或者 Docker 部署,直接安装可参考官方的 Wiki 文档:

https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide

官方这个文档写得很全面,可根据自己的环境搜索相关的字眼就可以找到对应该的安装方法与要求。

Docker 部署

以群晖的 Docker 部署为例,因与部署 DDNS- GO 时的界面几乎一样,因此以下只用文字描述。

  • 注册表中搜索neilpang/acme.sh并下载
  • 映像 -> 选择neilpang/acme.sh-> 启动 -> 网络中勾选使用与 Docker Host 相同的网络 -> 下一步 -> 将容器名称修改为:acme.sh(后面的脚本要用到这个容器名称) -> 勾选启动自动重新启动 -> 高级设置 -> 新增下面的环境变量 -> 执行命令 -> 在命令栏添加 -> daemon(打开容器的守护进程) -> 下一步 -> 下一步(不用设置端口) -> 添加文件夹 -> 将/docker/acme 目录映射到容器里的/acme.sh 目录 -> 完成。

截屏2023-02-18 11.05.22

注:

  • CF_Key查看方法,登陆Cloudflare -> 右上角的用户按钮 -> 我的个人资料 -> API 令牌 -> Global API Key;
  • CF_Email为你的邮箱;
  • SYNO_Port群晖的http的端口,如若修改则改为相对应的端口号;
  • SYNO_Username群晖用户名;
  • SYNO_Password群晖密码;
  • SYNO_Certificate证书名字,用作多个证书之间的区分,可设置为空字符串""
  • SYNO_Create证书不存在时就自动创建,如果SYNO_Certificate""时可不用新增此变量;
  • ACME_EAB_KID为 Zerossl 邮箱;
  • ACME_EAB_HMAC_KEY查看方法,登陆ZeroSSL -> Developer -> ZeroSSL API Key;

证书服务商我选择的是 ZeroSSL,这个服务需要注册,得到上面变量里的 API Key。如果使用 Let’s Encrypt 的话最后两个变量不用新增,但是 Let’s Encrypt 有申请限制(详情可查看),建议还是使用 ZeroSSL,注册很简单的。

关于群晖的更多变量请查阅:https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-cert-into-synology-dsm

脚本文件

在本地新建run.sh,内容为:

#!/bin/bash

# docker exec 容器名称 运行命令;
# 第一个acme.sh是容器的名称,上文新建容器时有提到,如果不一样,请修改为对应的容器名称;
# 第二个acme.sh是运行命令;

# 注册ZeroSSL
# 邮箱更改成你注册ZeroSSL时的邮箱账号;
# 如果证书服务商选择Let's Encrypt,下面这行代码请注释掉;
docker exec acme.sh acme.sh  --register-account  -m webmaster@laomai.org --server zerossl

# 生成证书
# 根据证书服务商修改--server,如选择Let's Encrypt的话,对应的值为--server letsencrypt;
# 域名更改为自己的域名;
# 其他设置请参考:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide
docker exec acme.sh acme.sh --force --log --issue --server zerossl --dns dns_cf --dnssleep 120 -d "laomai.org" -d "*.laomai.org"

# 部署证书到群晖上
# 域名更改为自己的域名;
docker exec acme.sh acme.sh --deploy -d "laomai.org" -d "*.laomai.org" --deploy-hook synology_dsm

将脚本文件上传到上面部署时用作映射的新建目录/docker/acme 里,成功后右键查看脚本文件的路径,创建计划任务时需要用到此路径。

计划任务

控制面板 -> 计划任务 -> 新增 -> 计划的任务 -> 用户自定义的脚本 -> 常规,任务名称:acme.sh;用户账号:root; -> 计划,勾选在以下日期运行;选择每月重复; -> 任务设置,用户定义的脚本,bash /volume1/docker/acme/run.sh >>/volume1/docker/acme/log.txt 2>&1

最后

实现的方法有很多,但原理都是一样的,比如说域名的 DNS 解析在阿里、腾讯或者其他,只要在对应的参数进行修改即可。