技术标签: UnRaid 内网穿透 SSL证书 https 自动更新 docker
标题虽然有点拗口,但确实是很多爱折腾的朋友需要实现的功能,通过我无数次的构思与实验,终于探索出了一条可行路径,当然,如果你本身已经拥备公网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是一款专门提供反向代理的软件(应该还有其他功能,我还没有研究,爱折腾的朋友请自行摸索)。可在unraid的app商店中直接搜索NginxProxyManager进行安装,我是全部缺省确认安装的。它的安装界面大致如下:
记住图中的3个端口:7818是程序的管理端口,NginxProxyManager的管理界面从这个端口进行访问;1880是程序的http端口,你反代到程序的http页面通过这个端口访问;18443是程序的https端口,你反代到程序的https页面通过这个端口访问。你可以把这3个端口改成你想要的或喜欢的数字,只要不和其他端口重合就行。
默认的登录账户和密码是:
Email address: [email protected]
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及你想运行的应用的自启动功能。
从打开电源到开始操作,计算机的启动是一个非常复杂的过程。 我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示...... 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。 零、boot的含义 先问一个问题,"启动"用英语怎么说? 回答是boot。可是,bo...
题目 1003: [编程入门]密码破译题目描述要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E".“E"代替"A”。因此,“China"应译为"Glmre”。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。#include<stdio.h>#includ
转自:https://www.jianshu.com/p/c1dfa1d40f53互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效。假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中确实有数据,由于这个队列是线程间共享的,所以,需要使用互斥锁进行保护,一个线程在往队列添加数据的时候,另一个线程...
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进...
如图所示的要求。我选择的是第一个,正好练习练习sqlalchemy.在此之前,你需要自行安装sqlalchemy相关库。1.增创造一个Session实例,之后调用add(Emp实例)Session_class = sessionmaker(bind=engine)Session = Session_class()emp_obj = Emp(id=id, name=name, age=...
1,例子 浅谈二分答案2,解析 二分答案法、三分法3,
端口号的范围是从1~65535。其中1~1024是被RFC 3232规定好了的,被称作“众所周知的端口”(Well Known Ports);从1025~65535的端口被称为动态端口(Dynamic Ports),可用来建立与其它主机的会话,也可由用户自定义用途。一些常见的端口号及其用途如下: TCP 21端口:FTP 文件传输服务 TCP 23端口:TELNET 终端仿真服务
package demo0809.demo1;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;public class Test333 { public static void main...
/etc/profile为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效。当被修改时,必须重启才会生效。英文描述:”System wide environment and startup programs, for login setup.”/etc/environment系统的环境变量,/etc/profile是所有用户的环境变量...
1.phantomjs PHANTOMJS_CDNURL=http://cnpmjs.org/downloads mvn -B clean install package jdeb:jdeb -DskipTests -Dpython.ver="python >= 2.6" -Preplaceurl
作者:lemonbit微信公众号:Python数据之道from Unsplash [email protected] Enerio翻译 |Lemon来源 | Machine Learning Plus本文总结了 Matplotlib 以及 Seaborn 用的最多的50个图形,掌握这些图形的绘制,对于数据分析的可视化有莫大的作用,强烈推荐大家阅读后续内容。如果觉得内容不错,欢迎分享到您的朋友圈。Tips...