给你的Docker应用加一层保险!10分钟搭建一个简单好用的认证中间件—— Tinyauth

本博客用什么VPS?创作不易,欢迎请咕咕喝杯咖啡☕☕☕

1. 唠嗑

这两三年来,我们搭建了不少好玩的Docker应用,其实一直陆陆续续有小伙伴在视频评论区和博客的评论区询问,怎么样才能让我的Docker应用更安全一点?

这一期,我们就来介绍这样一个工具,用最简单的方式来给我们的Docker应用加一层保险!

效果展示:

保存之后。

再次打开简历这个网页。

提示需要登录了。

ae23d63f56a62d74560f7997f8537212.png

输入账号密码,继续

9cb7f756e503807085b95ed778e742c8.png

进来了。

cd86b2609a4ec471929f0fbc4d43d825.png

2. Tinyauth简介

Tinyauth 是个简单好用的认证中间件,能给你的 Docker 应用加个简洁的登录页面,或者支持 Google、GitHub 以及其他平台的 OAuth 认证。它跟主流代理比如 Nginx Proxy Manager、Traefik、Nginx 和 Caddy 都能无缝配合。

355959a7fc641c514e84dc5272ba9893.png

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. 搭建环境

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

6788be9f0dedebd6fa8cd177d5dfe651.png

为docker格式化输出这个,记得选yes(按住shift再按小键盘方向键就可以选)

原因是USERS这边在yaml文件里要做哈希转换(比如哈希中的 $ 需要正确转义为 $$,命令行的 Docker 格式会自动处理。),如果不格式化输出会有问题。

c60fa52194d0d7b685327187290f75de.png

当然也支持多个用户,可以再打一遍代码,设置第二个用户,

595a1c77b1cc3807c6f4d398609c5c20.png

如果是一个用户,我们直接贴到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

出现类似,代表成功。

d9f4bfbde7c1b712d735d834b0cffb87.png

这边我们先搞一下反向代理!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo上 6位数字的xyz续费永远都是0.99美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 配置Tinyauth的反向代理

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

343d7766a70c301276c8bfae52fae8e3.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

aca0ebcc28a73586bb9c43131b0490cf.png

确保“阻止常见漏洞”(Bolck Common Exploits)选项是关掉的。如果这选项开了,Nginx 会把 URL 里的查询参数给拦下来,而 Tinyauth 得靠这些参数才能正常工作。

tinyauth这个是容器的名字,因为它和NPM在一个网络下,所以可以用容器名字来代替域名,3000是内部的端口,保持即可不要更改。

8ecf402ef51f5a3ec7ca759a85ae647c.png
48c4db84474ea229406a39104f965c33.png
b1f1a1aec3c198cc06b60758a3fad1e5.png

然后访问域名就可以访问了!

5c42cfa09961f64c36e18ea9d2ba4aeb.png

7.2 配置需要保护的应用的反向代理

我这边以之前介绍的简历应用(让写简历变得简单且智能!十分钟搭建一个在线简历编辑器——Magic Resume|好玩儿的Docker项目)为例子,

084d9f5958a47f6b0e867f163ddc06de.png

找到你需要添加登录页的应用的对应的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的域名即可。

75bde1737d7b3d2d605860bb839fa567.png

保存之后。

再次打开简历这个网页。

提示需要登录了。

ae23d63f56a62d74560f7997f8537212.png

输入账号密码,继续

9cb7f756e503807085b95ed778e742c8.png

进来了。

cd86b2609a4ec471929f0fbc4d43d825.png

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/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Roy的头像Roy
上一篇 6天前
下一篇 2025年4月22日 下午4:35
   

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注