群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理
创作立场声明:在什么值得买潜水多年,学习了很多经验,也希望把自己的一些经验分享给大家
真是年纪越大越发现时间的宝贵,在我乐此不彼的折腾了好几年Gen 8之后,终于入手了群晖218+,除了私有云不是很习惯以外,一切都变得如此简单,如此美好。
但是偶尔还是会怀念Nextcloud的好,于是当我在值得买发现一篇文章《储存小白教你手把手在群晖的docker里安装自己的私有云》时,折腾的心又蠢蠢欲动了。这几天粗浅的学习了一下Docker,在群晖的Docker套件下配置了nextcloud,并实现了反向代理加以及SSL访问。本来这篇文章是想写nextcloud的,但是涉及的内容实在是太多,所以就先写如何实现泛域名证书和反向代理吧! 如果有很多值友想了解在docker里搭建nextcloud的话,我再写下一篇文章,跟之前那位值友的方法会有一些区别。
首先跟大家简单的说明一下我有的东西:
公网IP 外网能直接访问 (没有IPv4 用IPv6)
自己的域名
群晖DS218+ 其实能装docker的系统都行
AC68U 能装梅林的路由
这篇文章的主要内容包括
在docker申请let’s encrypt泛域名证书
在docker创建nginx反向代理
事实上,群晖做的非常人性化,上面这些东西可以在群晖里不使用docker操作,完全没有任何问题。
上述的
可以使用acme.sh 申请证书再给群晖挂上证书。可以参考值友的文章《WIN10+VMware Workstation 14 +DSM6.2详解(二):安装Let's Encrypt证书实现泛域名SSL》
nginx反向代理 群晖本来就有这个功能,在控制面板->应用程序门户->反向代理就可以完成。
那么为什么要使用Docker 而不是直接搭建呢?纯属于脱裤子放屁的行为。第一,上面的方法都有一些小限制,比如说证书三个月的有效期后,需要重新下载证书然后再导入到群晖中。这篇文章中,你只需要重启一下nginx容器就可以了。群晖自带的反向代理还有些限制。其次,我希望群晖能稳定,靠谱的运行,不希望我的改动对这群晖造成什么影响。那么Docker是最合适不过的了。由于涉及的内容太多了,我尽量的详细,但不能完全step by step的写下来,还请谅解。还有借用一句话,玩Docker的大多数有洁癖!!
Step 1 设置路由
域名解析DDNS
这部分大家可以参考一下《小白瞎折腾 篇十:玩转群晖NAS:公网IP下,群晖NAS的远程访问》,这位小哥使用的是阿里云解析,我用的是DNSPOD解析。你需要在域名解析中这样设置两条记录。
并在梅林改版固件的软件中心中,安装DDNSPOD
填入你的API Token, 假设我的API Token和域名分别为, 那么我应该这么填
ID = 123456
Key = abcdefghijklmnopqrstuvwxyzwww.example.com
提交后,登陆DNSPOD 你应该能看到你的公网IP了。如果IP地址还是你输入的168.168.168.168 说明DDNS解析失败
端口转发
登录你的梅林,高级设置->外部网络-> 端口转发, 按以下配置完后按应用本页面设置。
PS. 如果你的443端口被封了就用别的端口吧,访问的时候加上端口号就是了(https://example.com:your_port
说明:可不可以直接在群晖里做DDNS呢??? 当然可以,这只是我的方法,而我还有别的用途。
Step 2 申请泛域名证书
泛域名是什么鬼? *.example.com
泛域名证书呢? *.example.com 都有ssl证书 比如(photo.example.com,video.example.com等等)
准备工作:
API Token
使用ssh登录到你的群晖
申请证书的工具是acme.sh,小巧高效,可以Let's Encrypt生成免费的证书,而且是由国人开发的。为了保证此文章的内容不出错,专门咨询此脚本的作者。有兴趣的值友可以访问他的github
自定义镜像
使用 ssh 登录你的群晖。为了方便,我使用的是root 权限,登录后就在root的目录下。关于如何使用ssh登录和取得root权限,请阅读这篇文章《To小白:获取root权限,去除群晖登陆自动更新提示——星际蜗牛安装黑裙(群晖)制作家用nas的折腾日记NO.7》
创建所需目录
mkdir -p /root/docker-acme/out
创建并编辑docker-compose.yml
vi /root/docker-acme/docker-compose.yml
键盘按 i 然后输入以下内容,输入完后按esc,再输入:wq并回车 粘贴完要检查一下格式,yml的格式要求非常严格,特别是不能用tab缩进的。完事后可以用docker-compose config检查一下语法格式
version: '3'
services:
acme:
image: neilpang/acme.sh
restart: always
environment:
- DP_Id=123456
- DP_Key=abcdefghijklmnopqrstuvwxyz
volumes:
- ./out:/acme.sh
container_name: my-acme
command: daemon
然后命令行输入以下命令使容器运行起来
docker-compose up -d
输入以下命令申请发行证书
docker exec my-acme --issue --dns dns_dp -d example.com -d *.example.com
如果你看到下面的画面,恭喜!!!说明你成功搞掂了泛域名证书
Step 3 配置 nginx 容器
创建所需目录
mkdir -p /root/docker-nginx-alpine/nginx
编辑nginx 配置文件
vi /root/docker-nginx-alpine/nginx/nginx.conf
粘贴以下内容 192.168.1.xxx 指的是你的群晖IP地址
worker_processes 1;
events { worker_connections 1024; }
http {
upstream default {
server 192.168.1.xxx:5001;
}
upstream photo {
server 192.168.1.xxx443;
}
server {
listen 443 ssl;
server_name "example.com";
## send https request back to DSM
ssl_certificate /etc/nginx/cert/fullchain.cer;
ssl_certificate_key /etc/nginx/cert/example.com.key;
location /photo {
root html;
index index.html index.htm;
proxy_pass https://photo;
client_max_body_size 3000m;
#proxy_set_header Host $host;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header X-Frame-Options SAMEORIGIN;
access_log off;
}
location / {
root html;
index index.html index.htm;
proxy_pass https://photo;
client_max_body_size 3000m;
#proxy_set_header Host $host;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header X-Frame-Options SAMEORIGIN;
access_log off;
}
}
}
自定义镜像
vi /root/docker-nginx-alpine/Dockerfile
粘贴以下内容
FROM nginx:alpine
RUN mkdir -p /etc/nginx/cert
编辑 docker-compose.yml
vi /root/docker-nginx-alpine/docker-compose.yml
粘贴以下内容。格式一定要主要 不能有tab 缩进
version: '3'
services:
nginx:
build: .
restart: always
ports:
- 12345:443
volumes:
- /root/docker-acme/out/example.com:/etc/nginx/cert:ro
- /etc/localtime:/etc/localtime:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
container_name: my-proxy
使用容器跑起来
docker-compose up -d
当你输入 docker ps 命令时 应该能看到以下的画面,不然就是失败啦
或者直接访问你的域名 和相册 如果你希望能用photostation.也可以,但这里不做展开。
另外你可以配置 router.example.com直接访问你的路由, cam.example.com来访问你的家庭摄像头等等。
以下是cpu和内存的使用情况
到这里你已经搞掂了泛域名证书的申请和自动更新,以及反向代理。而这些全部都是通过docker完成的,对你的群晖不会构成任何影响。这也是我喜欢的原因,等于在你的服务器里面隔离出来一块区域来运行你的需求而不会影响其他的东西,觉得不够清爽可以直接通过群晖的Docker界面把他们删除即可。另外还有一个小问题,根据acme.sh的作者neilpang交代,acme.sh容器可以自动更新你的证书,但是你的nginx需要重新加载证书,也就是重启一下nginx容器。到Docker的界面重新启动一下就好。如果你嫌不够优雅,可以把本机的Docker socket映射给acme.sh容器,使得他能重启nginx 容器。但是可能会有些安全隐患,可以参考这篇文章Don't expose the Docker socket (not even to a container)。

叫兽_sk
校验提示文案
Huzour
校验提示文案
IITATII
校验提示文案
Lucen
1.域名我是用的阿里的,然后直接阿里申请了1年的证书,免费
2.导入了这个证书到群晖里。
3.DDNS我用了群晖自带的,就是域名后缀Synology.me的那个
3.在阿里云的解析里面添加一个cname,指向我Synology.me的那个域名
Done,访问阿里域名的时候可以实现https安全。同时不需要路由器或者nas计划任务自己去做ddns,交给群晖做了,其实就等于中间多了一个中转的域名。
校验提示文案
likecho
校验提示文案
iAMAX
校验提示文案
tlancs
校验提示文案
dcdf
校验提示文案
白白白白白白咩
校验提示文案
叫兽_sk
校验提示文案
incarnate
校验提示文案
lee_smile520
校验提示文案
上帝也忙着数钱
校验提示文案
越小郡
校验提示文案
无形之刃
校验提示文案
方得始终
校验提示文案
疯狂的蜂鸟
校验提示文案
东皓雪
校验提示文案
东皓雪
校验提示文案
疯狂的蜂鸟
校验提示文案
方得始终
校验提示文案
无形之刃
校验提示文案
越小郡
校验提示文案
上帝也忙着数钱
校验提示文案
lee_smile520
校验提示文案
叫兽_sk
校验提示文案
incarnate
校验提示文案
叫兽_sk
校验提示文案
白白白白白白咩
校验提示文案
tlancs
校验提示文案
dcdf
校验提示文案
iAMAX
校验提示文案
likecho
校验提示文案
Lucen
1.域名我是用的阿里的,然后直接阿里申请了1年的证书,免费
2.导入了这个证书到群晖里。
3.DDNS我用了群晖自带的,就是域名后缀Synology.me的那个
3.在阿里云的解析里面添加一个cname,指向我Synology.me的那个域名
Done,访问阿里域名的时候可以实现https安全。同时不需要路由器或者nas计划任务自己去做ddns,交给群晖做了,其实就等于中间多了一个中转的域名。
校验提示文案
IITATII
校验提示文案
Huzour
校验提示文案