<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dozzle on Sysadmin Tales</title>
    <link>https://blog.ssb-tech.net/tags/dozzle/</link>
    <description>Recent content in Dozzle on Sysadmin Tales</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 13 Oct 2026 12:39:05 -0400</lastBuildDate>
    <atom:link href="https://blog.ssb-tech.net/tags/dozzle/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Setting up Dozzle with OIDC via Authentik</title>
      <link>https://blog.ssb-tech.net/posts/dozzle-oidc-setup/</link>
      <pubDate>Tue, 13 Oct 2026 12:15:52 -0400</pubDate>
      <guid>https://blog.ssb-tech.net/posts/dozzle-oidc-setup/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://dozzle.dev&#34;&gt;Dozzle&lt;/a&gt; is a great little utility container to view logs, and potentially stop and start other containers.&lt;/p&gt;&#xA;&lt;p&gt;I had occasionally used it when in a more lengthy troubleshooting session in order to stop relying on just &lt;code&gt;docker logs -f&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;However, I decided yesterday to set up something a bit more permanent.&lt;/p&gt;&#xA;&lt;p&gt;Each of my Docker hosts runs a Traefik instance to terminate SSL, and it now has a dedicated path &lt;code&gt;/dozzle&lt;/code&gt; that takes me to the host&amp;rsquo;s logs.&lt;/p&gt;&#xA;&lt;p&gt;However, I didn&amp;rsquo;t want to just leave my logs out there for anyone who&amp;rsquo;s on my network to see, so I put it behind OIDC authentication.&lt;/p&gt;&#xA;&lt;p&gt;I was already using &lt;a href=&#34;https://goauthentik.io/&#34;&gt;Authentik&lt;/a&gt; for my self-hosted OIDC needs, so I wanted to use that.&lt;/p&gt;&#xA;&lt;p&gt;Dozzle themselves had some &lt;a href=&#34;https://dozzle.dev/guide/authentication/oidc#authentik&#34;&gt;guidance on setting up Authentik&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dozzle requests a non-standard &amp;ldquo;roles&amp;rdquo; claim in addition to the normal &amp;ldquo;openid email profile&amp;rdquo; scopes.&lt;/p&gt;&#xA;&lt;p&gt;However, even with those docs it took some playing around to get this working. I will document what worked for me.&lt;/p&gt;&#xA;&lt;p&gt;If I remember I may also open a pull request to try and improve their docs.&lt;/p&gt;&#xA;&lt;p&gt;Create your Dozzle application and OIDC provider as normal in Authentik.&lt;/p&gt;&#xA;&lt;p&gt;Next, go into Customization &amp;gt; Property Mappings, and create a new Scope Mapping.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ssb-tech.net/posts/dozzle-oidc-setup/images/authentik-scopes.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The expression, for easy copy and pasting.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;roles &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;user&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ak_groups&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dozzle-admins&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exists():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    roles&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;all&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;user&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ak_groups&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dozzle-users&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exists():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    roles&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;download&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dozzle_roles&amp;#34;&lt;/span&gt;: roles}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Go to your directory and ensure that you have at least a &amp;ldquo;dozzle-admins&amp;rdquo; group created.&lt;/p&gt;&#xA;&lt;p&gt;Your user account should be added into the group.&lt;/p&gt;&#xA;&lt;p&gt;Edit your Dozzle OIDC provider and add the custom property mapping you created earlier to your selected scopes under &amp;ldquo;Advanced Protocol Settings&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;This is also a good time to ensure that you have the correct Redirect URIs defined.&lt;/p&gt;&#xA;&lt;p&gt;I have a regex Authorization URI that looks like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;^https://[a-zA-Z0-9-]+\.lan\.example\.com/dozzle.*$&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;rsquo;ll need to add some environment variables to your Dozzle Docker Compose file.&lt;/p&gt;&#xA;&lt;p&gt;It should looks something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;dozzle&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;amir20/dozzle:v11.3.1-alpine@sha256:55e5e0686c745314481fc24aef1aa99a741a99785b15bb0cb911b00380279429&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dozzle&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;dozzle_data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;labels&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.http.routers.dozzle.rule=Host(`docker01.{{ TRAEFIK_HOST_DOMAIN }}`) &amp;amp;&amp;amp; PathPrefix(`/dozzle`)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.enable=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.http.routers.dozzle.entrypoints=websecure&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.http.routers.dozzle.service=dozzle&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.http.services.dozzle.loadbalancer.server.port=8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;traefik.http.routers.dozzle.tls=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# - DOZZLE_ENABLE_ACTIONS=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# Uncomment to allow access to container shells. See https://dozzle.dev/guide/shell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# - DOZZLE_ENABLE_SHELL=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# Uncomment to enable authentication. See https://dozzle.dev/guide/authentication&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# - DOZZLE_AUTH_PROVIDER=simple&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# Label this Dozzle instance (shown in the header and multi-host menu). See https://dozzle.dev/guide/hostname&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_HOSTNAME=docker01&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_BASE=/dozzle&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_PROVIDER=oidc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_OIDC_ISSUER=https://{{ AUTHENTIK_HOST }}/application/o/dozzle/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_OIDC_CLIENT_ID={{ dozzle_oidc_id }}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_OIDC_CLIENT_SECRET={{ dozzle_oidc_secret }}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_OIDC_ROLES_CLAIM=dozzle_roles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOZZLE_AUTH_OIDC_SCOPES=roles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;dozzle_data&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
