如何配置 Dozzle 使用 Authelia 反向代理认证?
2026/9/15 12:27:17 网站建设 项目流程

如何配置 Dozzle 使用 Authelia 反向代理认证?

【免费下载链接】dozzleRealtime log viewer for containers. Supports Docker, Swarm and K8s.项目地址: https://gitcode.com/GitHub_Trending/do/dozzle

如果你已经部署(或打算部署)Authelia,并想让它完整接管 Dozzle 的登录认证——用户先在 Authelia 登录,通过后才看得到容器日志——就需要把 Dozzle 切到forward-proxy认证模式。在这种模式下 Dozzle 不做任何登录,只信任反向代理转发过来的请求头(默认读取Remote-UserRemote-Email等),由 Authelia 通过 forward-auth 中间件完成身份校验。

本文以 Forward Proxy 文档中的 Authelia 示例为主线,覆盖:Dozzle 侧要设置的参数、Authelia 与 Traefik 的示例配置、把 Authelia 用户组映射为 Dozzle 角色,以及如何判断配置是否生效。示例基于 Docker Compose + Traefik 的组合,且要求持有有效的 SSL 证书(Authelia 只支持 SSL)。

1. 先理解 forward-proxy 模式的请求头

设置--auth-providerforward-proxy后,Dozzle 期望收到以下请求头(见 forward-proxy 文档):

  • Remote-User:映射为 Dozzle 用户名,例如johndoe
  • Remote-Email:用户邮箱,同时用于查找 Gravatar 头像;
  • Remote-Name:显示名,例如John Doe
  • Remote-Filter:该用户允许使用的过滤器,逗号分隔;
  • Remote-Roles:该用户允许的角色,逗号分隔。

这些默认头名都可以通过环境变量调整(见 环境变量表):DOZZLE_AUTH_HEADER_USERDOZZLE_AUTH_HEADER_EMAILDOZZLE_AUTH_HEADER_NAMEDOZZLE_AUTH_HEADER_FILTERDOZZLE_AUTH_HEADER_ROLES。此外可用DOZZLE_AUTH_LOGOUT_URL配置一个登出地址(文档示例值为http://oauth2.example.ru/oauth2/sign_out),这是可选项,不是必做步骤。

一个必须遵守的前提:forward-proxy 模式下绝不能把 Dozzle 端口直接发布出去。Authentication 总览明确指出,Dozzle 对每个请求都信任Remote-User头,且在没有 roles 头时会授予全部角色——如果 8080 端口直接暴露,任何人都能绕过 Authelia 自己伪造头部。Dozzle 必须留在内部网络里,只发布代理(本文示例中即 Traefik)。

另外,forward-proxy 模式下用户个人设置同样会写入磁盘,所以要挂载/data卷,否则容器重建后设置丢失。

2. 部署配置:Authelia + Traefik + Dozzle

下面是 forward-proxy 文档给出的示例docker-compose.yml。其中authelia.example.comdozzle.example.comtraefik.example.com是文档中的示例域名,替换成你自己的域名时,要保证 compose 的 Traefik 标签、Authelia 配置中的access_control域名和 cookie domain 三处一致:

networks: net: driver: bridge services: authelia: image: authelia/authelia container_name: authelia volumes: - ./authelia:/config networks: - net labels: - "traefik.enable=true" - "traefik.http.routers.authelia.rule=Host(`authelia.example.com`)" - "traefik.http.routers.authelia.entrypoints=https" - "traefik.http.routers.authelia.tls=true" - "traefik.http.routers.authelia.tls.options=default" - "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia:9091/api/authz/forward-auth" - "traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader=true" - "traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email" expose: - 9091 restart: unless-stopped traefik: image: traefik:v3.5 container_name: traefik volumes: - ./traefik:/etc/traefik - /var/run/docker.sock:/var/run/docker.sock networks: - net labels: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`traefik.example.com`)" - "traefik.http.routers.api.entrypoints=https" - "traefik.http.routers.api.service=api@internal" - "traefik.http.routers.api.tls=true" - "traefik.http.routers.api.tls.options=default" - "traefik.http.routers.api.middlewares=authelia@docker" ports: - "80:80" - "443:443" command: - "--api" - "--providers.docker=true" - "--providers.docker.exposedByDefault=false" - "--providers.file.filename=/etc/traefik/certificates.yml" - "--entrypoints.http=true" - "--entrypoints.http.address=:80" - "--entrypoints.http.http.redirections.entrypoint.to=https" - "--entrypoints.http.http.redirections.entrypoint.scheme=https" - "--entrypoints.https=true" - "--entrypoints.https.address=:443" - "--log=true" - "--log.level=DEBUG" dozzle: image: amir20/dozzle:latest networks: - net environment: DOZZLE_AUTH_PROVIDER: forward-proxy volumes: - /var/run/docker.sock:/var/run/docker.sock - dozzle:/data labels: - "traefik.enable=true" - "traefik.http.routers.dozzle.rule=Host(`dozzle.example.com`)" - "traefik.http.routers.dozzle.entrypoints=https" - "traefik.http.routers.dozzle.tls=true" - "traefik.http.routers.dozzle.tls.options=default" - "traefik.http.routers.dozzle.middlewares=authelia@docker" expose: - 8080 restart: unless-stopped volumes: dozzle:

这个 compose 里对当前场景起决定作用的三处:

  1. Dozzle 服务DOZZLE_AUTH_PROVIDER: forward-proxy开启代理认证模式;expose: 8080而不使用ports,让 8080 只存在于 compose 网络内,外部只能经过 Traefik + Authelia 到达 Dozzle。
  2. Authelia 的 forwardAuth 中间件:指向http://authelia:9091/api/authz/forward-auth,并在authResponseHeaders中指定 Authelia 校验通过后回传给下游的头:Remote-User,Remote-Groups,Remote-Name,Remote-Email。注意这里回传的是Remote-Groups而不是Remote-Roles,下一节会处理这个差异。
  3. Dozzle 的路由挂载了authelia@docker中间件:所有访问dozzle.example.com的请求先经 Authelia 鉴权,通过后带着上述头部转发给 Dozzle。

如果不使用 Compose,也可以用 CLI 启动 Dozzle(forward-proxy 文档给出的形式):

docker run -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/dozzle/data:/data -p 8080:8080 amir20/dozzle --auth-provider forward-proxy

注意:裸docker run时请自行保证-p 8080:8080只对内网发布,并让代理(Authelia 所在的代理层)注入同样的请求头,安全边界与 Compose 示例的要求一致。

Authelia 侧的示例配置

文档说明 Authelia 本身的安装配置不在该节范围内,但提供了一份可参考的configuration.yml示例(放在 compose 中./authelia:/config挂载目录下)。其中access_controldozzle.example.com使用one_factor策略(单因子认证即可放行),default_policydeny

server: address: tcp://0.0.0.0:9091 log: level: info totp: issuer: authelia.com identity_validation: reset_password: jwt_secret: a_very_important_secret authentication_backend: file: path: /config/users_database.yml access_control: default_policy: deny rules: - domain: traefik.example.com policy: one_factor - domain: dozzle.example.com policy: one_factor session: secret: unsecure_session_secret cookies: - domain: example.com # Should match whatever your root protected domain is authelia_url: https://authelia.example.com default_redirection_url: https://public.example.com regulation: max_retries: 3 find_time: 120 ban_time: 300 storage: encryption_key: you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this local: path: /config/db.sqlite3 notifier: filesystem: filename: /config/notification.txt

上面的jwt_secretsession.secretencryption_key均为文档原样的示例值(文档注释也提示 encryption_key 需自行生成二十字符以上的随机串),落地部署时应替换为自己的值;cookies.domain按注释要求替换为你的受保护根域名。用户列表由 Authelia 的users_database.ymlfile后端)管理,这部分属于 Authelia 自身配置,Dozzle 不读取也不管理。

3. 把 Authelia 用户组映射为 Dozzle 角色

Authelia 通过Remote-Groups头下发用户所属组,而 Dozzle 默认读取Remote-Roles——两者对不上。forward-proxy 文档给出的做法是:在 Dozzle 服务上设置DOZZLE_AUTH_HEADER_ROLES: Remote-Groups,并把 Authelia 的组名直接命名为 Dozzle 角色名。

Dozzle 为此提供了dozzle_前缀别名,例如名为dozzle_shell的组授予shell角色,其他不带该前缀、也非内置角色名的组名会被忽略。加到 dozzle 服务后:

environment: DOZZLE_AUTH_PROVIDER: forward-proxy DOZZLE_AUTH_HEADER_ROLES: Remote-Groups

完整的角色定义见 Simple Authentication 文档的角色表:shell(打开 exec 会话,实例需同时开启--enable-shell)、actions(启停容器,需--enable-actions)、downloadnotificationscloudallroles为空时的默认值)、none

两个需要明确知道的边界:

  • 不做这个映射时,每个已认证用户都会获得全部角色——forward-proxy 文档明确说明 "Without that mapping every authenticated user gets all roles"。如果所有用户本来就应当拥有全部权限,可以接受这个默认行为,但建议显式确认。
  • notificationscloud是实例级权限:规则按表达式匹配容器、不受用户 filter 限制,云连接也是单实例单 API key。文档建议只授予信任全部容器的用户。

4. 结果验证与常见现象

配置完成后,按文档描述的机制判断是否生效:

  1. 访问 Dozzle 域名(示例中的dozzle.example.com)。由于路由挂了authelia@docker中间件且策略是one_factor,未登录请求会被拦到 Authelia 的登录页;登录成功后带着Remote-UserRemote-NameRemote-Email(以及Remote-Groups)回到 Dozzle。
  2. 登录后的 Dozzle 界面中,用户名、显示名来自Remote-User/Remote-Name,头像按Remote-Email查找 Gravatar——页面上显示的是你自己的信息,说明头部链路是通的。
  3. 角色方面:若你已设置DOZZLE_AUTH_HEADER_ROLES: Remote-Groups并按dozzle_*命名了组,未拥有对应组的用户将看不到相应操作入口;若没有配置该环境变量,则所有认证用户拥有全部角色(见上节)。
  4. 用户个人设置应持久化在挂载的dozzle:/data卷中,重建容器不丢失。

与当前配置直接相关的已知问题(来自 Reverse Proxy & Base Path 文档的常见坑和 Authentication 总览):

  • Authelia 无法启动/证书报错:文档明确 "Authelia only supports SSL",必须配置有效的 SSL 证书。
  • 日志在几秒后停更或成批到达:Dozzle 用 SSE 推送日志,代理缓冲会打断它。若启用过 Traefik 的compress中间件,需要排除text/event-stream(文档给出的 Traefik 写法见 changing-base 页);若日志只停几秒,多为代理读/写超时过短,文档建议把超时提高到至少几分钟(Nginx 示例为proxy_read_timeout 3600s)。
  • Shell 立刻断开:WebSocket 升级头没有被转发;Traefik 会自动处理 WebSocket 升级,但自行配置代理时需确认转发了UpgradeConnection头。
  • 绕过认证:如果哪天发现没登录也能打开 Dozzle,先检查是否把 Dozzle 的 8080 端口发布到了外部——forward-proxy 模式下这是最典型的配置错误,Dozzle 会无条件信任请求里的Remote-User

5. 可选:配置登出地址

如果需要 Dozzle 内显示一个指向 Authelia 的登出入口,可以在 dozzle 服务上增加:

DOZZLE_AUTH_LOGOUT_URL: https://authelia.example.com/logout

文档中的示例值为http://oauth2.example.ru/oauth2/sign_out,此处应按你的 Authelia 实际登出端点设置;不配置时 Dozzle 不提供登出链接,但这不影响日志查看功能。


完成以上配置后,Dozzle 的所有访问都必须经过 Authelia 的 forward-auth 校验,Dozzle 自身不再出现登录页,用户身份与角色完全由 Authelia 的组和Remote-Groups头决定。进一步的用户管理(增删用户、组)在 Authelia 侧的users_database.yml中进行,Dozzle 侧无需再维护users.yml

【免费下载链接】dozzleRealtime log viewer for containers. Supports Docker, Swarm and K8s.项目地址: https://gitcode.com/GitHub_Trending/do/dozzle

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询