1. 唠嗑
这两三年来,我们搭建了不少好玩的Docker应用,其实一直陆陆续续有小伙伴在视频评论区和博客的评论区询问,怎么样才能让我的Docker应用更安全一点?
这一期,我们就来介绍这样一个工具,用最简单的方式来给我们的Docker应用加一层保险!
效果展示:
保存之后。
再次打开简历这个网页。
提示需要登录了。
输入账号密码,继续
进来了。
2. Tinyauth简介
Tinyauth 是个简单好用的认证中间件,能给你的 Docker 应用加个简洁的登录页面,或者支持 Google、GitHub 以及其他平台的 OAuth 认证。它跟主流代理比如 Nginx Proxy Manager、Traefik、Nginx 和 Caddy 都能无缝配合。
3. 相关地址
官方GitHub地址:https://github.com/steveiliop56/tinyauth (目前5.3K个star,欢迎大家去给项目点星星!)
文档地址:https://tinyauth.app/docs/guides/nginx-proxy-manager
Demo地址:https://tinyauth.app/
下面我们就用 Tinyauth配合 Nginx Proxy Manager,简单分享一下是怎么搭建这个中间件从而来保护我们的Docker应用的。
4. 搭建环境
- 服务器:这边强烈建议用非大陆的服务器,咕咕这边用的香港的莱卡云轻量应用服务器,建议服务器内存1G以上,当然你也可以选择其他高性价比的服务器。
- 系统:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK,之后教程都是用 Debian 或者 Ubuntu 搭建~)
- 安装好 Docker、Docker-compose(相关脚本)
- 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
- 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址)
- 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程)
5. 搭建视频(过俩天补充 = =)
5.1 YouTube
视频地址:
5.2 哔哩哔哩
哔哩哔哩:
6. 搭建方式
6.1 安装 Docker 与 Nginx Proxy Manager
可以直接参考这篇内容:
https://blog.laoda.de/archives/nginxproxymanager/
我们这边假设大家都装好了Nginx Proxy Manger,
假设Nginx Proxy Manger在服务器上的路径是~/data/docker_data/npm
这边的话就只需要修改一下即可。
官方文档给的参考如下:
services:
npm:
container_name: npm
image: jc21/nginx-proxy-manager:2
restart: unless-stopped
ports:
- 80:80
- 443:443
- 81:81
volumes:
- npm-data:/data
- npm-letsencrypt:/etc/letsencrypt
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
tinyauth:
container_name: tinyauth
image: ghcr.io/steveiliop56/tinyauth:v3
restart: unless-stopped
environment:
- SECRET_FILE=/secret.txt
- APP_URL=http://tinyauth.example.com
- USERS=user:$$2a$$10$$UdLYoJ5lgPsC0RKqYH/jMua7zIn0g9kPqWmhYayJYLaZQ/FTmH2/u # user:password
volumes:
npm-data:
npm-letsencrypt:
如果直接使用,你一定会遇到很多问题。
~~我不会告诉你我用官方的这个配置文件,折腾了大半小时 = =
~~
这边直接用咕咕修改过的这个:
重新编辑你的NPM的docker-compose.yaml
文件,改成下面这个:
services:
npm:
container_name: npm
image: jc21/nginx-proxy-manager:2
restart: unless-stopped
ports:
- 80:80
- 443:443
- 81:81
volumes:
- ./data:/data # 冒号左边的 ./data改成你自己实际的路径
- ./letsencrypt:/etc/letsencrypt # 冒号左边的 ./letsencrypt改成你自己实际的路径
tinyauth:
container_name: tinyauth
image: ghcr.io/steveiliop56/tinyauth:v3
restart: unless-stopped
environment:
- SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2 # 这个也要修改
- APP_URL=https://auth.gugu.ovh #这个也要修改
- USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfWxkI4VriQn/y # user:password 这边要修改
然后我们来看需要修改的部分。
SECRET
,这个的话,直接在命令行操作:
生成secret:
openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32 && echo
输出类似:kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2
填入yaml即可。
APP_URL
这里改成你的tinyauth将来想要使用的域名,比如我这边https://auth.gugu.ovh
USERS
,这个官方也提供了方法,生成用户名和密码。
docker run -i -t --rm ghcr.io/steveiliop56/tinyauth:v3 user create --interactive
为docker格式化输出这个,记得选yes
(按住shift再按小键盘方向键就可以选)
原因是USERS这边在yaml文件里要做哈希转换(比如哈希中的 $
需要正确转义为 $$
,命令行的 Docker 格式会自动处理。),如果不格式化输出会有问题。
当然也支持多个用户,可以再打一遍代码,设置第二个用户,
如果是一个用户,我们直接贴到yaml文件里即可,但是如果像我们现在这样,有三个用户,直接放进yaml文件会有点长,而且也不好维护。
所以,我们可以把用户配置放入 .env
文件,可以这样做:
编辑 ~/data/docker_data/npm/.env
:
SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2
APP_URL=https://auth.gugu.ovh
USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfEjBdSB5rIicj23O8WxkI4VriQn/y,gugu:$$2a$$10$$s.nq/KZLBlFwUiSUNyRUGe0j2pp.A9/.tecuX7QsCBq242baKgKJ.,xixi:$$2a$$10$$6smj5Y/PD.jB1a2Z2gDAxOVnlcv8HfINtLrzCmmTjMZLObBwV8DoW
修改 docker-compose.yaml
以引用 .env
:
services:
npm:
container_name: npm
image: jc21/nginx-proxy-manager:2
restart: unless-stopped
ports:
- 80:80
- 443:443
- 81:81
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
tinyauth:
container_name: tinyauth
image: ghcr.io/steveiliop56/tinyauth:v3
restart: unless-stopped
env_file:
- .env
# environment:
# - SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2
# - APP_URL=https://auth.gugu.ovh
# - USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfEjBdSB5rIicj23O8WxkI4VriQn/y # user:password
这样基本上就OK啦。
重新启动NPM
cd ~/data/docker_data/npm
docker compose down
docker compose up -d
docker compose logs tinyauth
出现类似,代表成功。
这边我们先搞一下反向代理!
做反向代理前,你需要一个域名!
namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo上 6位数字的xyz续费永远都是0.99美元 = =)
如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade
来获得 1 美元的优惠(不知道现在还有没有)
namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些丑 古老 = =)
【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)
我们接着往下看!
7. 反向代理
7.1 配置Tinyauth的反向代理
在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)
之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager(相关教程))
注意:
Nginx Proxy Manager(以下简称 NPM)会用到
80
、443
端口,所以本机不能占用(比如原来就有 Nginx)
直接丢几张图:
确保“阻止常见漏洞”(Bolck Common Exploits)选项是关掉的。如果这选项开了,Nginx 会把 URL 里的查询参数给拦下来,而 Tinyauth 得靠这些参数才能正常工作。
tinyauth
这个是容器的名字,因为它和NPM在一个网络下,所以可以用容器名字来代替域名,3000
是内部的端口,保持即可不要更改。
然后访问域名就可以访问了!
7.2 配置需要保护的应用的反向代理
我这边以之前介绍的简历应用(让写简历变得简单且智能!十分钟搭建一个在线简历编辑器——Magic Resume|好玩儿的Docker项目)为例子,
找到你需要添加登录页的应用的对应的NPM配置,在Advance里面添加:
# Root location
location / {
# Pass the request to the app
proxy_pass $forward_scheme://$server:$port;
# Add other app specific config here
# Tinyauth auth request
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
}
# Tinyauth auth request
location /tinyauth {
# Pass request to Tinyauth
proxy_pass http://tinyauth:3000/api/auth/nginx;
# Pass the request headers
proxy_set_header x-forwarded-proto $scheme;
proxy_set_header x-forwarded-host $http_host;
proxy_set_header x-forwarded-uri $request_uri;
}
# Tinyauth login redirect
location @tinyauth_login {
return 302 https://auth.gugu.ovh/login?redirect_uri=$scheme://$http_host$request_uri; # Make sure to replace the https://auth.gugu.ovh with your own app URL
}
其他地方都不用管,只要把https://auth.gugu.ovh
替换成你自己的tinyauth的域名即可。
保存之后。
再次打开简历这个网页。
提示需要登录了。
输入账号密码,继续
进来了。
8. 使用教程
其他的也类似,只需要在对应应用的NPM的Advance里面加:
# Root location
location / {
# Pass the request to the app
proxy_pass $forward_scheme://$server:$port;
# Add other app specific config here
# Tinyauth auth request
auth_request /tinyauth;
error_page 401 = @tinyauth_login;
}
# Tinyauth auth request
location /tinyauth {
# Pass request to Tinyauth
proxy_pass http://tinyauth:3000/api/auth/nginx;
# Pass the request headers
proxy_set_header x-forwarded-proto $scheme;
proxy_set_header x-forwarded-host $http_host;
proxy_set_header x-forwarded-uri $request_uri;
}
# Tinyauth login redirect
location @tinyauth_login {
return 302 https://auth.gugu.ovh/login?redirect_uri=$scheme://$http_host$request_uri; # Make sure to replace the https://auth.gugu.ovh with your own app URL
}
即可。
PS: /tinyauth
这个路径可以随便改,指南里用这个名字只是为了方便。
9. 常见问题及注意点
大家有问题欢迎评论区交流。
10. 结尾
祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。
同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!
最后,感谢作者@steveiliop56的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star ⭐️
参考资料
官方GitHub:https://github.com/steveiliop56/tinyauth
---------------
如何觉得文章内容不错,欢迎点击一下广告,支持一下咕咕😍😍😍
原创文章,作者:Roy,如若转载,请注明出处:https://iwanlab.com/docker-compose-install-tinyauth/