标题虽然有点拗口,但确实是很多爱折腾的朋友需要实现的功能,通过我无数次的构思与实验,终于探索出了一条可行路径,当然,如果你本身已经拥备公网ip,则远远没有如此麻烦,可以看看网上的其它文章,但本文对你依然有帮助,只是不需要其中的一些步骤罢了。好了,言归正传,开启折腾实录之旅——大佬勿喷,我只是希望和我一样的小白能够搞清楚而已。
最近中毒组了1台N1机箱的Nas小主机,华擎Z490m-itx/ac主板,qtb0-10900T处理器,16G+8G的DDR4内存条,硬盘若干,还购买了Unraid专业版正版授权,想着不折腾点实用功能都对不起这些高档(囧)的配件和软件。于是就想在该Unraid系统上安装自己的私有密码管理器(告别在线密码的隐私风险)、自己的图书管理系统、自己的邮件系统、自己的office系统……,而其中的密码管理系统等是需要https才能正常访问和部署的,于是就有了这篇折腾实录。
其它很多地方都是关于bitwarden的教程,在unraid中只有vaultawarden,在应用市场中搜索Vaultwarden按模板填写参数安装即可,只需规划好webui的端口即可(在unraid的docker页面查看docker应用也是可以找到这个端口数字的)
以申请mydomain.cf及其所有子域名的ssl证书为例,且是以在godaddy中解析的域名为例的,如果你是在其它dns解析商,可参考说明文档将其中一些参数修改为你自己的):
docker run --rm -itd -v /mnt/user/appdata/ssl/mydomain-cf:/acme.sh \
-e GD_Key=***** \
-e GD_Secret=***** \
--net=host --entrypoint /bin/sh --name=acme.sh neilpang/acme.sh
【注意:】其中Key和Secret需要你自己在godaddy解析的核实页面自行创建并第一时间记录,之后不再显示。
更改默认证书为letsencrypt,否则报错,需要邮箱注册(因为acme将默认证书设置成了ZeroSSL)
docker exec acme.sh --set-default-ca --server letsencrypt
正式申请证书:(我的是由godaddy负责域名解析,其它的情参考acme的说明)
docker exec acme.sh --issue --dns dns_gd -d mydomain.cf -d *.mydomain.cf
安装证书:(执行后将在创建容器那1步设置的路径中生成privkey.pem和fullchain.pem这两个证书文件)--这一步只需要更改-d后的域名,其它都不能动,否则会出错!(你可以先将这2个证书文件下载到本地备用——一会儿需要上传到NginxProxyManager中)
docker exec acme.sh --install-cert -d mydomain.cf \
--key-file /acme.sh/privkey.pem \
--fullchain-file /acme.sh/fullchain.pem
将证书拷贝到NginxProxyManager应用中(在NginxProxyManager应用安装后再进行,请参照NginxProxyManager应用安装步骤)
NginxProxyManager应用安装:
安装:
NginxProxyManager是一款专门提供反向代理的软件(应该还有其他功能,我还没有研究,爱折腾的朋友请自行摸索)。可在unraid的app商店中直接搜索NginxProxyManager进行安装,我是全部缺省确认安装的。它的安装界面大致如下:
记住图中的3个端口:7818是程序的管理端口,NginxProxyManager的管理界面从这个端口进行访问;1880是程序的http端口,你反代到程序的http页面通过这个端口访问;18443是程序的https端口,你反代到程序的https页面通过这个端口访问。你可以把这3个端口改成你想要的或喜欢的数字,只要不和其他端口重合就行。
默认的登录账户和密码是:
Email address: admin@example.com
Password: changeme
登录进去后,会弹出一个窗口,让你修改登录账户和密码(自己把它记录好,以后都要用这个账户和密码登录)。
在NginxProxyManager中导入一次custom证书(否则在下一步拷贝证书文件时是找不到证书目录npm-*的——我导入后增加了一个子目录npm-1),其中key是私钥即privkey.pem,certificates是域名证书即fullchain.pem(这2个文件是Acme安装证书那一步生成并下载到本地的)
将证书文件拷贝到NginxProxyManager证书目录下(到底是npm-*可以在上一步导入证书后自行到custom_ssl目录下去查看)
cp /mnt/user/appdata/ssl/5inas-cf/*.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/
在unraid网页管理docker页面重启或输入如下命令重启
docker exec NginxProxyManager reboot
Dashboard】→【Add Proxy Host】按提示填写(一定要对照欲代理的应用的ip和端口对应——比如我的密码库域名是mima.mydomain.cf,docker地址是http://192.168.18.109:1080)→域名填写mima.mydomain.cf,Scheme就用缺省的http,Forward hostname/ip就填写192.168.18.109(我曾尝试填写127.0.0.1,因为我认为我的docker应用npm与vaultwardens是在同一个主机上,仅是端口不一样而已,结果不成功!),forwar port填写1080,一切ok!
如此设置后,我们把mima.mydomain.cf解析到https://192.168.18.109:18443,然后通过npm再反向代理到http://192.168.18.109:1080,以实现https加密访问(下面分公网和大内网分别进行说明——这部分只作简要说明,不懂的朋友自行爬网恶补这方面的知识)。
——对于公网,将域名解析到你的路由器公网ip(或者通过动态dns方式),在你的路由器上将18443端口映射到你的unraid主机ip192.168.18.109,这样通过mima.mydomain.cf:18443可以成功访问。
——对于大内网,可以通过frp等内网穿透方式将域名mima.mydomain.cf指向https://192.168.18.109:18443,这样看直接通过https://mima.mydomain.cf不带端口方式访问。
按理到这一步就已经大功告成了,但是由于Acme申请的免费ssl证书的有效期只有90天,所以我们必须在其失效之前再次申请并将其拷贝到docker应用npm中,于是请出下一步的User Scripts插件。
在应用市场中搜索User Scripts并安装即可,然后在插件中找到User Scripts插件,添加代码,并将其设定为用户自定义计划任务(custom),输入0 0 0 1 9/2(从9月开始每隔2个月的1日 执行一次,可以到【在线cron表达式生成器】按条件生成
代码如下:
docker run --rm -itd -v /mnt/user/appdata/ssl/mydomain-cf:/acme.sh -e GD_Key=***** -e GD_Secret=***** --net=host --entrypoint /bin/sh --name=acme.sh neilpang/acme.sh;
docker exec acme.sh --set-default-ca --server letsencrypt;
docker exec acme.sh --issue --dns dns_gd -d mydomain.cf -d *.mydomain.cf --force;
docker exec acme.sh --install-cert -d mydomain.cf --key-file /acme.sh/privkey.pem --fullchain-file /acme.sh/fullchain.pem;
cp -rf /mnt/user/appdata/ssl/mydomain-cf/*.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/;
docker exec NginxProxyManager reboot
.
最后再来捋一下实现的思路:
1.AcmeSSL申请免费SSL证书(并通过用户自定义脚本2月定时更新)
2.添加用户docker应用
3.npm调用免费SSL证书,并根据用户需求添加反向代理指向docker应用的ip和端口
4.开启折腾模式……
提醒:全部测试OK后记得开启npm和vaultwarden及你想运行的应用的自启动功能。
PS:文章来自网络,原文地址。