群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

2019-05-31 10:45:09 28点赞 339收藏 61评论

创作立场声明:在什么值得买潜水多年,学习了很多经验,也希望把自己的一些经验分享给大家

真是年纪越大越发现时间的宝贵,在我乐此不彼的折腾了好几年Gen 8之后,终于入手了群晖218+,除了私有云不是很习惯以外,一切都变得如此简单,如此美好。

但是偶尔还是会怀念Nextcloud的好,于是当我在值得买发现一篇文章《储存小白教你手把手在群晖的docker里安装自己的私有云》时,折腾的心又蠢蠢欲动了。这几天粗浅的学习了一下Docker,在群晖的Docker套件下配置了nextcloud,并实现了反向代理加以及SSL访问。本来这篇文章是想写nextcloud的,但是涉及的内容实在是太多,所以就先写如何实现泛域名证书和反向代理吧! 如果有很多值友想了解在docker里搭建nextcloud的话,我再写下一篇文章,跟之前那位值友的方法会有一些区别。

首先跟大家简单的说明一下我有的东西:

  • 公网IP 外网能直接访问 (没有IPv4 用IPv6)

  • 自己的域名

  • 群晖DS218+ 其实能装docker的系统都行

  • AC68U 能装梅林的路由

这篇文章的主要内容包括

  1. 在docker申请let’s encrypt泛域名证书

  2. 在docker创建nginx反向代理


事实上,群晖做的非常人性化,上面这些东西可以在群晖里不使用docker操作,完全没有任何问题。

上述的

  1. 可以使用acme.sh 申请证书再给群晖挂上证书。可以参考值友的文章《WIN10+VMware Workstation 14 +DSM6.2详解(二):安装Let's Encrypt证书实现泛域名SSL

  2. nginx反向代理 群晖本来就有这个功能,在控制面板->应用程序门户->反向代理就可以完成。

那么为什么要使用Docker 而不是直接搭建呢?纯属于脱裤子放屁的行为。第一,上面的方法都有一些小限制,比如说证书三个月的有效期后,需要重新下载证书然后再导入到群晖中。这篇文章中,你只需要重启一下nginx容器就可以了。群晖自带的反向代理还有些限制。其次,我希望群晖能稳定,靠谱的运行,不希望我的改动对这群晖造成什么影响。那么Docker是最合适不过的了。由于涉及的内容太多了,我尽量的详细,但不能完全step by step的写下来,还请谅解。还有借用一句话,玩Docker的大多数有洁癖!!

Step 1 设置路由

域名解析DDNS

这部分大家可以参考一下《小白瞎折腾 篇十:玩转群晖NAS:公网IP下,群晖NAS的远程访问》,这位小哥使用的是阿里云解析,我用的是DNSPOD解析。你需要在域名解析中这样设置两条记录。

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

并在梅林改版固件的软件中心中,安装DDNSPOD

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

填入你的API Token, 假设我的API Token和域名分别为, 那么我应该这么填

ID = 123456
Key = abcdefghijklmnopqrstuvwxyz

www.example.com

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

提交后,登陆DNSPOD 你应该能看到你的公网IP了。如果IP地址还是你输入的168.168.168.168 说明DDNS解析失败

端口转发

登录你的梅林,高级设置->外部网络-> 端口转发, 按以下配置完后按应用本页面设置。
PS. 如果你的443端口被封了就用别的端口吧,访问的时候加上端口号就是了(https://example.com:your_port

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

说明:可不可以直接在群晖里做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 实现泛域名证书 Let's Encrypt 和反向代理

然后命令行输入以下命令使容器运行起来

docker-compose up -d

输入以下命令申请发行证书

docker exec my-acme --issue --dns dns_dp -d example.com -d *.example.com

如果你看到下面的画面,恭喜!!!说明你成功搞掂了泛域名证书

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理


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 命令时 应该能看到以下的画面,不然就是失败啦

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

或者直接访问你的域名相册 如果你希望能用photostation.也可以,但这里不做展开。

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

另外你可以配置 router.example.com直接访问你的路由, cam.example.com来访问你的家庭摄像头等等。

以下是cpu和内存的使用情况

群晖基于docker 实现泛域名证书 Let's Encrypt 和反向代理

到这里你已经搞掂了泛域名证书的申请和自动更新,以及反向代理。而这些全部都是通过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)



展开 收起
61评论

  • 精彩
  • 最新
  • 443屏蔽,是不是就不能用证书了?楼主

    校验提示文案

    提交
    不是,可以用dns方式申请证书几条代码搞定,具体去看作者github说明

    校验提示文案

    提交
    我意思443屏蔽,是不是想隐藏端口是不是就不行了

    校验提示文案

    提交
    还有9条回复
    收起所有回复
  • 先给个赞,楼主,我现在是梅林已经做了encrypt,泛域名,自动三个月更新,请问群晖能做到三个月自动从路由器目录下取证书,然后自己刷新吗

    校验提示文案

    提交
    当然可以,你需要设置一个计划任务 定期scp 证书文件到群晖里。但你会触碰到群晖的系统文件,重启后也可能恢复群晖的默认证书,可以参考一下这篇文章哈 去看看

    校验提示文案

    提交
    收起所有回复
  • 白裙不需要这么折腾,直接用群晖自带的ddns,也自带ssl证书注册

    校验提示文案

    提交
    直接设置路由常用的端口转发就行了

    校验提示文案

    提交
    搞得定泛域名吗??

    校验提示文案

    提交
    还有21条回复
    收起所有回复
  • 我不知道我实现的和楼主是不是一样的,但是看起来好像差不多。
    1.域名我是用的阿里的,然后直接阿里申请了1年的证书,免费
    2.导入了这个证书到群晖里。
    3.DDNS我用了群晖自带的,就是域名后缀Synology.me的那个
    3.在阿里云的解析里面添加一个cname,指向我Synology.me的那个域名

    Done,访问阿里域名的时候可以实现https安全。同时不需要路由器或者nas计划任务自己去做ddns,交给群晖做了,其实就等于中间多了一个中转的域名。

    校验提示文案

    提交
    可以的,但是没有泛域名证书。

    校验提示文案

    提交
    有一个顶级域名和一个www域名证书
    为啥要泛域名呢?泛域名证书的使用情景是什么呢?我不是很懂

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 文章太长没看到.先问个问题~泛域名 *.example.com解析这个之后, 所以我可以直接在群辉上设置file.example.com/audio.example.com诸如此类,只需要解析一个..就可以都使用所有自定义的域名了么?我自己做的都是每一个都去解析.才能访问 [损失几个亿]

    校验提示文案

    提交
    对的,可以都交给反向代理去做

    校验提示文案

    提交
    收起所有回复
  • 好像我比楼主的要简单一些~ 1.获取godaddy的API KEY,2.在docker里面装一个godaddy的容器,实现DDNS的功能,3.有一个自定义获取Let's 证书的SSL脚本,放到群晖上配置为计划任务就可以了。我直接留了端口,没有做反向映射,平时用的的也不错~ 顺便,我改过端口了。

    校验提示文案

    提交
    嗯嗯。改了群晖端口的话,你这种方法是更简单的, 我就是不想改动本身群晖的设置,所以才这么折腾。

    校验提示文案

    提交
    你没明白我的意思,我的意思是我改端口是为了避免指定端口被扫到而已。

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 大部分值友看不懂的,包括我,手里只有218J,进来点个赞,撤~

    校验提示文案

    提交
  • 打一下卡,慢慢看~~~~~~~!!

    校验提示文案

    提交
  • 貌似是我一直在找的攻略,点赞收藏先!

    校验提示文案

    提交
  • 通配符证书,好难申请

    校验提示文案

    提交
  • 这种方式安全性如何?会不会很容易扫到被攻击?发现搞外网很少讨论安全性问题

    校验提示文案

    提交
  • 白裙,同求证书布署,13772519810@163.com

    校验提示文案

    提交
  • 请教楼主,能解释下nginx.conf如何配置吗?配置文件看不懂,我想增加其他的内网服务,而不是群晖上的PHOTO,要如何修改呢?谢谢!!

    校验提示文案

    提交
  • 哇,太好了。最近开个十几个应用,家里光猫端口映射只有十来个的上限,尴尬啊,琢磨着用NGINX还发现80被占了,这下有地图了

    校验提示文案

    提交
  • 输入docker-compose up -d的时候就说没找到文件 是咋回事?

    校验提示文案

    提交
  • 大佬! 通过你这种方法只用可以用一级域名访问吗? 譬如 12345.xyz访问吗? 后面不需要端口?

    校验提示文案

    提交
    主要看你服务器80和443端口有没有被封,不然肯定还是要端口的,或者在dns那边直接设置隐性转发也行

    校验提示文案

    提交
    收起所有回复
  • 一看就会,一搭就废,还是老老实实用宝塔+可道云吧

    校验提示文案

    提交
  • 买了群晖,然后跑可道云kodbox

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

超级大野人

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
339
扫一下,分享更方便,购买更轻松