之前介绍过非常多的Docker应用,有的应用会自带一个前端认证。用NAS举例,本身的WEB自带登陆认证,还支持配置两步验证到WEB各种应用服务。再比如QB、TR、EMBY这些常见Docker服务都内置了登陆验证,但很多轻量级的工具类服务可能并没有(IT- tools等),别人知道你的服务域名后就能直接白嫖。
本期咱们就来介绍一款中间认证服务:Tinyauth,用于保护我们的应用服务。大家看看动图演示应该就能了解效果~
Tinyauth 正在积极开发中,配置可能会经常更改。更新前请务必仔细阅读发行说明。
如果只是个人使用,Nginx/Caddy/Lucky 等自带的 BasicAuth 其实已经非常方便。
因为Lucky自带认证,并且Tinyauth官方文档明确对于Nginx Proxy Manager有很好的支持,所以就承接上一篇文章,我们基于NPM进行改造。
Lucky的认证如下图所示。大家如果觉得够用则无需部署Tinyauth。
Tinyauth 简介
Tinyauth 是一个由 Go 语言开发的 轻量级身份认证中间件,主要用于在自托管或容器化环境中为 Web 应用快速增加访问控制功能。它不需要修改原有应用,只需通过反向代理(如 Traefik、Nginx、Caddy)接入,就能实现登录保护。
✨ 主要特点
-
轻量简洁:单个二进制文件即可运行,无额外依赖,资源占用极低。
-
即开即用:配置简单,常见场景只需设置环境变量即可完成部署。
-
多种认证方式:支持用户名密码认证,也支持 OAuth 登录(如 Google、GitHub)。
-
反向代理友好:可与 Traefik、Nginx、Caddy 等无缝集成,适合 Homelab 和企业小型应用。
-
Cookie 统一认证:基于域名设置 Cookie,实现同一主域下多个应用的单点登录。
🔧 应用场景
-
给 个人 NAS 服务(如 QNAP)增加外网访问保护。
-
保护 内部工具(如 Portainer、Grafana、Whoami 等)。
-
在 家庭实验室 或 小团队项目 中快速加一层身份验证,而无需搭建复杂的 OAuth 服务。
准备工作
我们需要准备生成用户名/密码哈希
以及32字节随机密钥
。
SSH工具连接NAS,依次输入以下命令。将生成的内容复制备用。可参考图片。
# 交互生成用户名/密码哈希(整行复制)
docker run -it --rm ghcr.io/steveiliop56/tinyauth:v3 user create --interactive
# 输入用户名和密码每一步都要回车,最后移动键盘方向键,选择yes再回车一次即可
# 我设置的账户/密码为 ydxian/qnap1234
# 生成32字节随机密钥(整串复制),试过64会报错
openssl rand -hex 16
部署流程
先创建一个专用网络,方便需要反代的应用与NPM连通。
docker network create npm-net
查阅官方文档后,我给出的推荐代码如下:
services:
app:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: always
environment:
TZ: Asia/Shanghai
DISABLE_IPV6: "true"
volumes:
- /share/Container/npm/data:/data
- /share/Container/npm/letsencrypt:/etc/letsencrypt
ports:
- "81:81" # NPM面板(仅内网)
- "8442:80" # 公网HTTP(非常用端口)
- "8443:443" # 公网HTTPS(非常用端口)
networks:
- npm-net
tinyauth:
image: ghcr.io/steveiliop56/tinyauth:v3
container_name: tinyauth
restart: always
environment:
- APP_URL=https://auth.19960509.xyz:8443 # 走NPM的8443
- USERS=ydxian:$$2a$$10$$9Yc/rH90cPJEJjemF6oRmu9tbnClFyDhjSSjlRyJFPstuFqxr45Ky
- SECRET=597c4353178836b87f78c5588fc6fc60
networks:
- npm-net
ports:
- "5202:3000"
networks:
npm-net:
external: true
需要注意的是,咱们国内用非标准端口号,APP_URL
也要进行补齐。
将上面代码改写后,打开Container Station 创建新的应用程序。
成功的日志参考。
反向代理
这步是必要的~
打开NPM,我们要为Tinyauth进行反向代理。如下图填写相关信息后保存。要注意别勾选Block Common Exploits
,如果启用,nginx 将不允许在查询参数中使用 URL,而这正是 Tinyauth 正常运行所必需的。
再次对这条反代进行编辑。因为上一篇我们申请了泛域名证书,这次就方便很多~保存即可。
接着浏览器输入域名+8443就能访问Tinyauth。
为应用添加验证
我的主NAS中部署了IT-Tools万能工具箱,这个服务是不带登录认证的,咱们就拿它来演示。
为了方便容器互通,部署代码:
services:
it-tools:
image: ghcr.io/corentinth/it-tools:latest
container_name: it-tools
ports:
- "8864:80" # 可留作本地直连排错;不是必须
networks:
- npm-net
restart: always
networks:
npm-net:
external: true
重复上面步骤,为该服务做好反向代理。然后对其进行编辑,将下面的内容修改后粘贴进框内并保存。需要修改的位置已用中文标注。修改完后建议将注释都删除。
# 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
# 下面这个域名改成你自己的Tinyauth服务
location @tinyauth_login {
return 302 https://auth.xxx.xyz:8443/login?redirect_uri=$scheme://$http_host$request_uri;
}
换到最后一栏,我们将参数编辑后粘贴进框内后保存。
浏览器输入域名访问工具箱。
我从Chrome换成了Safari,因为缓存问题。其实新开个无痕也能验证。会自动跳转到验证界面,速度大家不用担心,很快~丝滑~
输入上文SSH设置的账户密码,不要输入哈希值啊~回车登录~如下图所示,点击继续。
然后就成功进入应用咯。
评论区