# Configuration


## Configuring Traefik Forward Auth

Mount a YAML configuration file into the container at the path `/etc/traefik-forward-auth/config.yaml`.

In your `docker-compose.yaml` you can mount the configuration file similar to this:

```yaml
services:
  # ...
  traefik-forward-auth:
    image: ghcr.io/italypaleale/traefik-forward-auth:4
    volumes:
      - `/path/on/host/config.yaml:/etc/traefik-forward-auth/config.yaml:ro`
  # ...
```

You can also reference a secret. For example, using Docker Compose:

```yaml
services:
  # ...
  traefik-forward-auth:
    image: ghcr.io/italypaleale/traefik-forward-auth:4
    secrets:
      # Load the configuration from the secret
      - source: "tfa_config"
        target: "/etc/traefik-forward-auth/config.yaml"
  # ...

secrets:
   tfa_config:
     file: tfa-config.yaml
```

You can find the list of [all configuration options](/advanced/all-configuration-options.md).

## Exposing Traefik Forward Auth

In order to use Traefik Forward Auth, it needs to be reachable through a Traefik router. You can configure it in 2 ways:

1. **Using a dedicated sub-domain**  
   This is most commonly used when all the apps you want to protect are served under the same domain (e.g. `example.com`). Traefik Forward Auth is exposed through its own sub-domain (for example, `https://auth.example.com`), while your apps are served through the parent domain (`https://example.com`) or other sub-domains (`https://myapp.example.com`).  
   This scenario is the most convenient one when you need to protect multiple applications at once using the same Traefik Forward Auth instance.
2. **Using a sub-path**  
   In this scenario you do not need a dedicated sub-domain for Traefik Forward Auth, which is instead exposed in a sub-path. For example, if your app is reachable at `https://example.com`, Traefik is configured to route requests to Traefik Forward Auth at `https://example.com/auth`.

> Although Traefik Forward Auth doesn't need to be reachable from the public Internet, your clients must be able to have a route to it (for example, within the LAN or using a VPN)  
> Additionally, most OAuth2 identity providers (including Google and Microsoft Entra ID) require the callback URL to be served via HTTPS/TLS (even if using a self-signed certificate).

<div class="content-tabs" data-content-tabs data-tabs-label="Content tabs">
  
<section class="content-tab" data-tab-title="Using a dedicated sub-domain">
  <div class="content-tab-heading">Using a dedicated sub-domain</div>
  <div class="content-tab-body">
    <h3 id="using-a-dedicated-sub-domain">Using a dedicated sub-domain<a href="#using-a-dedicated-sub-domain" class="heading-anchor" aria-label="Link to this section">#</a></h3><p>Using a dedicated sub-domain is the most convenient way to protect multiple apps, as long as they are all served under sub-domains of the same domain name (e.g. <code>example.com</code>).</p>
<p>In this example:</p>
<ul>
<li>Applications are hosted on <code>https://example.com</code> and/or subdomains such as <code>https://myapp.example.com</code></li>
<li>Traefik Forward Auth is served on <code>https://auth.example.com</code></li>
</ul>
<p>To configure Traefik and Traefik Forward Auth in this scenario:</p>
<ol>
<li>
<p>If using a provider based on OAuth2 (including Google, Microsoft Entra ID, GitHub, and OpenID Connect providers), configure your authentication callback to: <code>https://auth.example.com/portals/main/oauth2/callback</code></p>
</li>
<li>
<p>Configure Traefik Forward Auth with one entry under <a href="/advanced/all-configuration-options#config-opt-server-domains"><code>server.domains</code></a>
, where:</p>
<ul>
<li><code>domain</code> is the cookie domain, e.g. <code>example.com</code> (or whatever parent domain covers all your apps)</li>
<li><code>authHost</code> is the public hostname of Traefik Forward Auth itself (<code>auth.example.com</code> in this example). This is required in &ldquo;dedicated sub-domain&rdquo; mode so redirects and OAuth2 callbacks target the correct host.</li>
</ul>
</li>
<li>
<p>Create a Traefik middleware of type <code>forwardauth</code> with:</p>
<ul>
<li><code>address</code>: <code>http://traefik-forward-auth:4181/portals/main</code><br>
This is the address of the <code>traefik-forward-auth</code> container within your Docker network. In this example, we are assuming the container/service is named <code>traefik-forward-auth</code>. Also note that the internal communication happens over HTTP by default.</li>
<li><code>authResponseHeaders</code>: <code>X-Forwarded-User,X-Forwarded-Displayname,X-Authenticated-User</code><br>
This is optional, but allows your application to read the ID of the authenticated user through the request header <code>X-Forwarded-User</code>. Alternatively, <code>X-Authenticated-User</code> contains a JSON object similar to <code>{&quot;provider&quot;:&quot;provider-name&quot;,&quot;user&quot;:&quot;user-id&quot;}</code>. In addition, <code>X-Forwarded-Displayname</code> optionally contains the display name of the user (if available).</li>
</ul>
</li>
<li>
<p>Configure Traefik to expose your applications, including:</p>
<ul>
<li>Traefik Forward Auth at <code>auth.example.com</code>, using the &ldquo;websecure&rdquo; entry point (which is enabled for HTTPS/TLS)</li>
<li>Your applications at <code>example.com</code> or other sub-domains such as <code>myapp.example.com</code></li>
</ul>
</li>
</ol>
<p>Full example using Docker Compose:</p>
<div class="code-block">
    <button class="code-copy" type="button" aria-label="Copy code to clipboard" title="Copy code" data-copy-code>
      <svg class="code-copy-icon code-copy-icon-copy" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
        <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-check" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M20 6 9 17l-5-5"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-failed" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M18 6 6 18"/>
        <path d="m6 6 12 12"/>
      </svg>
    </button><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># docker-compose.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;3&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">traefik</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">traefik:v3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--providers.docker=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--entrypoints.websecure.address=:443&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;443:443&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/run/docker.sock:/var/run/docker.sock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">traefik-forward-auth</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/italypaleale/traefik-forward-auth:4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">secrets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Load the configuration from the secret</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;tfa_config&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/traefik-forward-auth/config.yaml&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181/portals/main&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User,X-Forwarded-Displayname,X-Authenticated-User&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.trustForwardHeader=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.rule=Host(`auth.example.com`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.tls=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">whoami</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/traefik/whoami:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WHOAMI_PORT_NUMBER=4545</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.rule=Host(`whoami.example.com`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.middlewares=traefik-forward-auth&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.whoami.loadbalancer.server.port=4545&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.tls=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">secrets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">tfa_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="l">tfa-config.yaml</span></span></span></code></pre></div></div><p>Example of the minimum configuration for Traefik Forward Auth, as <code>tfa-config.yaml</code>:</p>
<div class="code-block">
    <button class="code-copy" type="button" aria-label="Copy code to clipboard" title="Copy code" data-copy-code>
      <svg class="code-copy-icon code-copy-icon-copy" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
        <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-check" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M20 6 9 17l-5-5"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-failed" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M18 6 6 18"/>
        <path d="m6 6 12 12"/>
      </svg>
    </button><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># tfa-config.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Domain(s) served by Traefik Forward Auth</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># `domain` is the cookie domain (the domain where the app is reachable, or a parent domain)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># `authHost` is the public hostname of Traefik Forward Auth itself</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">domains</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">authHost</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;auth.example.com&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">portals</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;main&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">providers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="c"># Configure one provider</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># github: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># google: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># microsoftEntraID: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># openIDConnect: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># tailscaleWhois: {}</span></span></span></code></pre></div></div>
  </div>
</section>

<section class="content-tab" data-tab-title="Using a sub-path">
  <div class="content-tab-heading">Using a sub-path</div>
  <div class="content-tab-body">
    <h3 id="using-a-sub-path">Using a sub-path<a href="#using-a-sub-path" class="heading-anchor" aria-label="Link to this section">#</a></h3><p>Using a sub-path does not require the use of sub-domains, but it is generally harder to implement when you want to protect more than one application.</p>
<p>In this example:</p>
<ul>
<li>Your application is hosted at <code>https://example.com</code></li>
<li>Traefik Forward Auth is served on <code>https://example.com/auth</code></li>
</ul>
<p>To configure Traefik and Traefik Forward Auth in this scenario:</p>
<ol>
<li>
<p>If using a provider based on OAuth2 (including GitHub, Google, Microsoft Entra ID, and OpenID Connect providers), configure your authentication callback to: <code>https://example.com/auth/portals/main/oauth2/callback</code></p>
</li>
<li>
<p>Configure Traefik Forward Auth with:</p>
<ul>
<li><a href="/advanced/all-configuration-options#config-opt-server-basepath"><code>server.basePath</code></a>
 (env: <code>TFA_SERVER_BASEPATH</code>): <code>/auth</code></li>
</ul>
</li>
<li>
<p>Create a Traefik middleware of type <code>forwardauth</code> with:</p>
<ul>
<li><code>address</code>: <code>http://traefik-forward-auth:4181/auth/portals/main</code><br>
This is the address of the <code>traefik-forward-auth</code> container within your Docker network. In this example, we are assuming the container/service is named <code>traefik-forward-auth</code>. Also note that the internal communication happens over HTTP by default.</li>
<li><code>authResponseHeaders</code>: <code>X-Forwarded-User,X-Forwarded-Displayname,X-Authenticated-User</code><br>
This is optional, but allows your application to read the ID of the authenticated user through the request header <code>X-Forwarded-User</code>. Alternatively, <code>X-Authenticated-User</code> contains a JSON object similar to <code>{&quot;provider&quot;:&quot;provider-name&quot;,&quot;portal&quot;:&quot;portal-name&quot;,&quot;user&quot;:&quot;user-id&quot;}</code>. In addition, <code>X-Forwarded-Displayname</code> optionally contains the display name of the user (if available).</li>
</ul>
</li>
<li>
<p>Configure Traefik to expose your applications, including:</p>
<ul>
<li>Traefik Forward Auth at <code>example.com/auth</code>, using the rule <code>PathPrefix(`/auth`)</code> the &ldquo;websecure&rdquo; entry point (which is enabled for HTTPS/TLS)</li>
<li>Your application at <code>example.com</code></li>
</ul>
</li>
</ol>
<p>Full example using Docker Compose:</p>
<div class="code-block">
    <button class="code-copy" type="button" aria-label="Copy code to clipboard" title="Copy code" data-copy-code>
      <svg class="code-copy-icon code-copy-icon-copy" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
        <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-check" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M20 6 9 17l-5-5"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-failed" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M18 6 6 18"/>
        <path d="m6 6 12 12"/>
      </svg>
    </button><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># docker-compose.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;3&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">traefik</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">traefik:v3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--providers.docker=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--entrypoints.websecure.address=:443&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;443:443&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/run/docker.sock:/var/run/docker.sock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">traefik-forward-auth</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/italypaleale/traefik-forward-auth:4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">secrets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Load the configuration from the secret</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;tfa_config&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/traefik-forward-auth/config.yaml&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181/auth/portals/main&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User,X-Forwarded-Displayname,X-Authenticated-User&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.middlewares.traefik-forward-auth.forwardauth.trustForwardHeader=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.rule=Host(`example.com`) &amp;&amp; PathPrefix(`/auth`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.traefik-forward-auth.tls=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">whoami</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/traefik/whoami:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WHOAMI_PORT_NUMBER=4545</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.rule=Host(`example.com`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.middlewares=traefik-forward-auth&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.whoami.loadbalancer.server.port=4545&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.whoami.tls=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">secrets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">tfa_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="l">tfa-config.yaml</span></span></span></code></pre></div></div><p>Example of the minimum configuration for Traefik Forward Auth, as <code>tfa-config.yaml</code>:</p>
<div class="code-block">
    <button class="code-copy" type="button" aria-label="Copy code to clipboard" title="Copy code" data-copy-code>
      <svg class="code-copy-icon code-copy-icon-copy" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
        <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-check" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M20 6 9 17l-5-5"/>
      </svg>
      <svg class="code-copy-icon code-copy-icon-failed" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M18 6 6 18"/>
        <path d="m6 6 12 12"/>
      </svg>
    </button><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># tfa-config.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Base path</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">basePath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/auth&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Domain(s) served by Traefik Forward Auth</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># `domain` is the cookie domain (the domain where the app is reachable, or a parent domain)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># `authHost` is generally omitted in &#34;sub-path&#34; mode, since Traefik Forward Auth shares each app&#39;s host</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">domains</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">portals</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;main&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">providers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="c"># Configure one provider</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># github: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># google: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># microsoftEntraID: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># openIDConnect: {}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># tailscaleWhois: {}</span></span></span></code></pre></div></div>
  </div>
</section>


</div>


