# Authentik

## Purpose

Authentik provides centralized identity and access management for the Bytek homelab.

Authentik allows users to access multiple applications with one account while applying consistent authentication, multi-factor authentication, group membership, and access policies.

Authentik provides:

<div id="bkmrk-central-user-account" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Central user accounts.
- Multi-factor authentication.
- OpenID Connect.
- OAuth2 providers.
- Proxy Providers.
- ForwardAuth.
- Group-based application access.
- Email-domain policies.
- Application entitlements.
- An embedded proxy outpost.
- Central application launch links.
- Administrative auditing and event records.

---

</div>## Service Information

<div id="bkmrk-setting-value-servic" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Service name</td><td>Authentik</td></tr><tr><td>Private IP address</td><td>`192.168.2.162`</td></tr><tr><td>Backend port</td><td>TCP 9000</td></tr><tr><td>Public hostname</td><td>`portal.bytek.ca`</td></tr><tr><td>Public access</td><td>Traefik</td></tr><tr><td>Deployment directory</td><td>`/opt/authentik`</td></tr><tr><td>Database</td><td>PostgreSQL</td></tr><tr><td>Supporting service</td><td>Redis</td></tr><tr><td>Proxy component</td><td>Embedded outpost</td></tr><tr><td>Normal user group</td><td>`bytek-users`</td></tr><tr><td>Administrator group</td><td>`bytek-admin`</td></tr><tr><td>Backup coverage</td><td>Proxmox scheduled backup</td></tr><tr><td>Proxmox VM ID</td><td>Confirm current VM ID</td></tr></tbody></table>

</div></div></div>Authentik portal:

<span class="___xxxjie0 f1w7gpdv f1gqqdtu" data-wra="1" style="opacity: 1; transition: opacity 500ms ease-out;">[Open Authentik](https://portal.bytek.ca/)</span>

<div id="bkmrk-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Architecture Role

Authentik is the trusted identity provider for the Bytek environment.

Applications rely on Authentik to answer these questions:

<div id="bkmrk-who-is-the-user%3F-has" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Who is the user?
- Has the user completed authentication?
- Has the user completed MFA?
- Is the user a member of the required group?
- Does the user satisfy the application policy?
- Should the user be allowed to continue to the application?

</div>Authentik does not normally replace application-specific permissions.

For example:

<div id="bkmrk-authentik-authentica" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Authentik authenticates a Proxmox user, but Proxmox controls the user’s ACL.
- Authentik authenticates a BookStack user, but BookStack controls the user’s roles.
- Authentik authenticates a Nextcloud user, but Nextcloud controls shares and application permissions.
- Authentik authenticates a Vikunja user, but Vikunja controls projects and task permissions.

---

</div>## Request Flow

A normal OIDC login follows this process:

<div id="bkmrk-the-user-opens-an-ap" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. The user opens an application.
2. The application redirects the browser to `portal.bytek.ca`.
3. Traefik forwards the request to Authentik at `192.168.2.162:9000`.
4. Authentik identifies the requested application.
5. Authentik requests credentials if no valid session exists.
6. Authentik requests MFA according to the authentication flow.
7. Authentik evaluates the application’s group and policy bindings.
8. Authentik issues a signed authorization response.
9. Authentik redirects the browser to the application callback.
10. The application validates the response and creates or matches the local account.
11. The application applies its own permissions.

---

</div>## Core Components

### Authentik Server

The Authentik server provides:

<div id="bkmrk-the-web-interface.-l" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- The web interface.
- Login and authorization flows.
- OAuth2 and OIDC endpoints.
- Provider endpoints.
- Administrative interfaces.
- API services.
- User-facing application portal.

</div>### Authentik Worker

The worker performs background tasks such as:

<div id="bkmrk-scheduled-processing" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Scheduled processing.
- Event handling.
- Email-related tasks.
- Outpost-related processing.
- Provider maintenance.
- Background synchronization.

</div>### PostgreSQL

PostgreSQL stores Authentik configuration and identity data.

PostgreSQL contains critical information including:

<div id="bkmrk-users.-groups.-polic" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Users.
- Groups.
- Policies.
- Applications.
- Providers.
- Flows.
- Stages.
- Events.
- Outpost configuration.
- Authentication settings.

</div>PostgreSQL is the most important Authentik data component to protect.

### Redis

Redis supports Authentik’s runtime and task-processing requirements.

Redis is required for normal stack operation but PostgreSQL remains the authoritative persistent data source.

### Embedded Outpost

The embedded outpost provides:

<div id="bkmrk-forwardauth.-proxy-p" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- ForwardAuth.
- Proxy Provider routing.
- Authentication callbacks.
- Identity-header forwarding.
- Access enforcement for applications without native OIDC.

---

</div>## Application Portal

The Authentik user portal displays applications available to the signed-in user.

The portal should show only applications that the user is allowed to access.

Normal users may see:

<div id="bkmrk-nextcloud.-vikunja.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Nextcloud.
- Vikunja.
- BookStack.

</div>Administrators may additionally see:

<div id="bkmrk-proxmox-ve.-traefik-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Proxmox VE.
- Traefik dashboard.
- Uptime Kuma.

</div>Application visibility is controlled by:

<div id="bkmrk-group-bindings.-poli" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Group bindings.
- Policy bindings.
- Policy engine mode.
- Application launch URL.
- User authentication state.

---

</div>## Group Model

### bytek-users

The `bytek-users` group grants access to normal user-facing applications.

Applications using this group include:

<div id="bkmrk-nextcloud.-vikunja.--1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Nextcloud.
- Vikunja.
- BookStack.

</div>Users should be added to `bytek-users` only when access to normal Bytek applications is required.

### bytek-admin

The `bytek-admin` group grants access to administrative applications.

Applications using this group include:

<div id="bkmrk-proxmox-ve.-traefik--1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Proxmox VE.
- Traefik dashboard.
- Uptime Kuma dashboard.

</div>Membership in `bytek-admin` must be limited to trusted infrastructure administrators.

### Administrator Membership

An administrator may belong to both groups:

<div id="bkmrk-bytek-users-bytek-ad" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `bytek-users`
- `bytek-admin`

</div>This allows access to both normal applications and administrative interfaces.

<div id="bkmrk--1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Shared Email-Domain Policy

Applications also use the policy:

<div id="bkmrk-allow-bytek.ca-users" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `Allow bytek.ca users`

</div>The policy validates the user according to the configured Bytek email-domain rules.

The application policy engine is normally set to `ALL`.

For a normal application, access requires:

<div id="bkmrk-membership-in-bytek--1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Membership in `bytek-users`.
- Successful evaluation of `Allow bytek.ca users`.

</div>For an administrative application, access requires:

<div id="bkmrk-membership-in-bytek--2" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Membership in `bytek-admin`.
- Successful evaluation of `Allow bytek.ca users`.

---

</div>## Policy Engine Mode

Authentik applications normally use policy engine mode `ALL`.

With `ALL`, every enabled binding must pass.

A normal application should therefore have:

<div id="bkmrk-binding-type-binding" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Binding Type</th><th>Binding</th></tr><tr><td>Group</td><td>`bytek-users`</td></tr><tr><td>Policy</td><td>`Allow bytek.ca users`</td></tr></tbody></table>

</div></div></div>An administrative application should have:

<div id="bkmrk-binding-type-binding-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Binding Type</th><th>Binding</th></tr><tr><td>Group</td><td>`bytek-admin`</td></tr><tr><td>Policy</td><td>`Allow bytek.ca users`</td></tr></tbody></table>

</div></div></div>Do not attach both `bytek-users` and `bytek-admin` to the same application using `ALL` unless every permitted user must belong to both groups.

An earlier access-denied event occurred because both groups were attached to the same application with `ALL`.

<div id="bkmrk--2" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Application Integration Matrix

<div id="bkmrk-application-integrat-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Application</th><th>Integration Type</th><th>Required Group</th></tr><tr><td>Nextcloud</td><td>Native OIDC</td><td>`bytek-users`</td></tr><tr><td>Vikunja</td><td>Native OIDC</td><td>`bytek-users`</td></tr><tr><td>BookStack</td><td>Native OIDC</td><td>`bytek-users`</td></tr><tr><td>Proxmox VE</td><td>Native OIDC</td><td>`bytek-admin`</td></tr><tr><td>Traefik dashboard</td><td>Single-application ForwardAuth</td><td>`bytek-admin`</td></tr><tr><td>Uptime Kuma</td><td>Proxy Provider</td><td>`bytek-admin`</td></tr></tbody></table>

</div></div>---

</div>## Native OIDC Applications

### Nextcloud

<div id="bkmrk-setting-value-applic" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`nextcloud`</td></tr><tr><td>Integration</td><td>OpenID Connect user backend</td></tr><tr><td>Callback</td><td>`https://cloud.bytek.ca/apps/user_oidc/code`</td></tr><tr><td>Subject mode</td><td>User UUID</td></tr><tr><td>Scopes</td><td>`openid profile email`</td></tr><tr><td>Required group</td><td>`bytek-users`</td></tr></tbody></table>

</div></div></div>Nextcloud uses native OIDC so desktop clients, mobile clients, WebDAV, CalDAV, and CardDAV can communicate directly with Nextcloud.

Do not add ForwardAuth to the Nextcloud Traefik router.

### Vikunja

<div id="bkmrk-setting-value-applic-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`vikunja`</td></tr><tr><td>Integration</td><td>Native OIDC</td></tr><tr><td>Callback</td><td>`https://projects.bytek.ca/auth/openid/authentik`</td></tr><tr><td>Subject mode</td><td>User UUID</td></tr><tr><td>Scopes</td><td>`openid profile email`</td></tr><tr><td>Required group</td><td>`bytek-users`</td></tr></tbody></table>

</div></div></div>Vikunja creates or matches users after a successful Authentik login.

### BookStack

<div id="bkmrk-setting-value-applic-2" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`bookstack`</td></tr><tr><td>Integration</td><td>Native OIDC</td></tr><tr><td>Callback</td><td>`https://docs.bytek.ca/oidc/callback`</td></tr><tr><td>Subject mode</td><td>User UUID</td></tr><tr><td>Required group</td><td>`bytek-users`</td></tr><tr><td>Signing</td><td>RSA signing key</td></tr><tr><td>Token encryption</td><td>Disabled</td></tr></tbody></table>

</div></div></div>BookStack does not automatically link users solely by matching email addresses.

BookStack links an OIDC identity using the token’s `sub` claim.

The local BookStack administrator must use a different email address from the normal Authentik account unless the account is deliberately linked using the correct external authentication ID.

### Proxmox VE

<div id="bkmrk-setting-value-applic-3" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`proxmox`</td></tr><tr><td>Integration</td><td>Native OIDC</td></tr><tr><td>Callback</td><td>`https://pve.bytek.ca:8006`</td></tr><tr><td>Subject mode</td><td>User UUID</td></tr><tr><td>Required group</td><td>`bytek-admin`</td></tr><tr><td>Selected scopes</td><td>`openid`, `email`, and `profile`</td></tr></tbody></table>

</div></div></div>Proxmox authentication and authorization are separate.

Authentik allows the user to authenticate, but Proxmox requires a separate ACL before the user can see or manage VMs.

<div id="bkmrk--3" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## OIDC Provider Standard

New OIDC providers should normally use:

<div id="bkmrk-provider-setting-sta" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Provider Setting</th><th>Standard Value</th></tr><tr><td>Client type</td><td>Confidential</td></tr><tr><td>Subject mode</td><td>Based on the user’s UUID</td></tr><tr><td>Authorization flow</td><td>Default implicit-consent provider flow</td></tr><tr><td>Signing key</td><td>Selected</td></tr><tr><td>Encryption key</td><td>None</td></tr><tr><td>Redirect type</td><td>Strict Authorization</td></tr><tr><td>Policy engine</td><td>ALL</td></tr></tbody></table>

</div></div></div>A signing key is required so applications can validate tokens.

An encryption key should remain empty unless the target application explicitly supports encrypted OIDC tokens.

BookStack login failed when an encryption key was selected.

Clearing the encryption key while retaining the RSA signing key resolved the token-validation failure.

<div id="bkmrk--4" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## OIDC Scope Mappings

Providers must include the scopes required by the application.

Common scopes include:

<div id="bkmrk-openid-email-profile" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `openid`
- `email`
- `profile`

</div>The mapping names may appear as Authentik default OAuth scope mappings.

Missing scope mappings can allow the initial browser authorization to complete while causing the application to fail later when requesting profile or userinfo data.

### Proxmox Scope Issue

Proxmox initially returned an authentication failure because the Authentik provider did not have the expected scopes selected.

The detailed Proxmox log reported a failure while contacting the userinfo endpoint.

Selecting the required mappings resolved the issue.

### Scope Review Procedure

When an OIDC application fails:

<div id="bkmrk-open-the-authentik-p" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Open the Authentik provider.
2. Review selected scope mappings.
3. Confirm `openid`.
4. Confirm `email`.
5. Confirm `profile`.
6. Review any application-specific mappings.
7. Save the provider.
8. Retry in a completely new private browser session.
9. Review the application log.

---

</div>## Redirect URI Requirements

Redirect URIs must match the application exactly.

A mismatch can cause:

<div id="bkmrk-invalid-redirect-err" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Invalid redirect errors.
- Authorization rejection.
- Login loops.
- Callback failures.
- Token validation failures.

</div>### Known Redirect URIs

<div id="bkmrk-application-strict-a" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Application</th><th>Strict Authorization URI</th></tr><tr><td>Nextcloud</td><td>`https://cloud.bytek.ca/apps/user_oidc/code`</td></tr><tr><td>Vikunja</td><td>`https://projects.bytek.ca/auth/openid/authentik`</td></tr><tr><td>BookStack</td><td>`https://docs.bytek.ca/oidc/callback`</td></tr><tr><td>Proxmox VE</td><td>`https://pve.bytek.ca:8006`</td></tr></tbody></table>

</div></div></div>Do not add unneeded wildcard redirect URIs.

Strict redirect matching is preferred.

<div id="bkmrk--5" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Post-Logout Redirects

Where supported, providers should include approved post-logout destinations.

BookStack uses destinations such as:

<div id="bkmrk-bookstack-home.-book" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- BookStack home.
- BookStack login page.
- BookStack login page with automatic OIDC initiation prevented.

</div>Post-logout redirects must use the actual production hostname.

Do not use obsolete provisional hostnames such as `wiki.bytek.ca`.

<div id="bkmrk--6" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## ForwardAuth Applications

### Traefik Dashboard

The Traefik dashboard uses a Proxy Provider configured for single-application ForwardAuth.

<div id="bkmrk-setting-value-applic-4" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`traefik-dashboard`</td></tr><tr><td>External host</td><td>`https://proxy.bytek.ca`</td></tr><tr><td>Required group</td><td>`bytek-admin`</td></tr><tr><td>Shared policy</td><td>`Allow bytek.ca users`</td></tr><tr><td>Outpost</td><td>Embedded outpost</td></tr></tbody></table>

</div></div></div>The Traefik middleware sends authentication checks to Authentik.

The callback path under `/outpost.goauthentik.io/` must remain reachable without applying the same ForwardAuth middleware.

The outpost ping endpoint should return HTTP 204.

### Uptime Kuma

Uptime Kuma uses an Authentik Proxy Provider.

<div id="bkmrk-setting-value-applic-5" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Application slug</td><td>`uptime-kuma`</td></tr><tr><td>External host</td><td>`https://status.bytek.ca`</td></tr><tr><td>Internal host</td><td>`http://192.168.2.115:3001`</td></tr><tr><td>Required group</td><td>`bytek-admin`</td></tr><tr><td>Shared policy</td><td>`Allow bytek.ca users`</td></tr><tr><td>Outpost</td><td>Embedded outpost</td></tr></tbody></table>

</div></div></div>Public status-page, badge, push, and asset paths may require selected unauthenticated-path exceptions.

Do not disable Uptime Kuma’s local authentication until the Authentik proxy path has been tested successfully.

<div id="bkmrk--7" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Embedded Outpost

The embedded outpost handles Authentik proxy integrations.

Applications assigned to the embedded outpost include:

<div id="bkmrk-traefik-dashboard.-u" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Traefik dashboard.
- Uptime Kuma.

</div>The outpost must be able to reach each protected application backend.

For Uptime Kuma, Authentik at `192.168.2.162` must be permitted to reach `192.168.2.115` on TCP port 3001.

The outpost callback path must remain accessible through Traefik.

<div id="bkmrk--8" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Outpost Health

The outpost health endpoint should return HTTP 204.

For the Traefik dashboard, test:

`curl -k -I https://proxy.bytek.ca/outpost.goauthentik.io/ping`

Expected result:

<div id="bkmrk-http-204." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HTTP 204.

</div>A 204 response contains no page body and is expected.

If the endpoint redirects to login or loops repeatedly, review:

<div id="bkmrk-callback-router-prio" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Callback router priority.
- Middleware assignment.
- Outpost application assignment.
- External host.
- Traefik service destination.
- Host header forwarding.

---

</div>## Reverse-Proxy Requirements

Traefik must preserve the original request information for Authentik.

Important forwarded values include:

<div id="bkmrk-original-host.-origi" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Original host.
- Original HTTPS scheme.
- Client forwarding information.
- Forwarded protocol.
- WebSocket compatibility.

</div>Incorrect forwarded headers can cause:

<div id="bkmrk-csrf-cookie-errors.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- CSRF cookie errors.
- Origin mismatch.
- Redirect loops.
- Wrong callback URLs.
- Session-cookie problems.

</div>An Authentik CSRF error previously reported that the CSRF cookie was not set.

When diagnosing a CSRF error, review:

<div id="bkmrk-browser-cookies.-bro" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Browser cookies.
- Browser privacy extensions.
- Request Origin header.
- Request Host header.
- Traefik host-header forwarding.
- Authentik system information.
- Existing stale browser sessions.

---

</div>## DNS Requirements

Authentik must be reachable from:

<div id="bkmrk-user-browsers.-traef" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- User browsers.
- Traefik.
- Nextcloud containers.
- Vikunja.
- BookStack.
- Proxmox.
- Uptime Kuma where required.
- The Authentik embedded outpost.

</div>### Internal Resolution

LAN clients using Pi-hole resolve:

<div id="bkmrk-portal.bytek.ca-to-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `portal.bytek.ca` to `192.168.2.182`.

</div>### Proxmox Resolution

Proxmox uses Quad9 and normally resolves:

<div id="bkmrk-portal.bytek.ca-to-3" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `portal.bytek.ca` to `38.29.213.101`.

</div>This sends Proxmox’s server-to-server OIDC requests through:

<div id="bkmrk-vps.-wireguard.-trae" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. VPS.
2. WireGuard.
3. Traefik.
4. Authentik.

</div>### Container Resolution

Application containers that require private split DNS should use Pi-hole at `192.168.2.65`.

If an OIDC discovery endpoint becomes unreachable after a power failure, verify DNS from inside the application container before changing provider credentials.

<div id="bkmrk--9" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Health Endpoints

### Direct Readiness

Direct backend:

`http://192.168.2.162:9000/-/health/ready/`

Expected result:

<div id="bkmrk-http-200." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HTTP 200.

</div>### Routed Readiness

Public hostname:

<span class="___xxxjie0 f1w7gpdv f1gqqdtu" data-wra="1" style="opacity: 1; transition: opacity 500ms ease-out;">[Open Authentik Readiness](https://portal.bytek.ca/)</span>

Expected result:

<div id="bkmrk-http-200.-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HTTP 200.

</div>### Embedded Outpost

The outpost ping endpoint should return:

<div id="bkmrk-http-204.-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HTTP 204.

---

</div>## Container Management

Move to the Authentik deployment directory:

`cd /opt/authentik`

Check container state:

`sudo docker compose ps`

List Compose service names:

`sudo docker compose config --services`

View recent logs:

`sudo docker compose logs --tail 100`

View server logs:

`sudo docker compose logs --tail 100 server`

View worker logs:

`sudo docker compose logs --tail 100 worker`

The exact service names should be confirmed using the Compose service listing before running service-specific commands.

<div id="bkmrk--10" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Expected Container State

The Authentik stack should have healthy or running equivalents of:

<div id="bkmrk-authentik-server.-au" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Authentik server.
- Authentik worker.
- PostgreSQL.
- Redis.

</div>The server should not be considered ready until PostgreSQL and Redis are available.

A running Docker container does not necessarily mean the application is ready.

Use the readiness endpoint for application-level validation.

<div id="bkmrk--11" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## User Administration

When creating a user:

<div id="bkmrk-create-or-confirm-th" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Create or confirm the user’s email address.
2. Add the user to the required groups.
3. Confirm MFA enrollment.
4. Confirm the user appears in the application portal.
5. Test one user-facing application.
6. Test application logout.
7. Confirm no duplicate account is created.
8. Review application-specific permissions.

</div>Do not add normal users to `bytek-admin`.

<div id="bkmrk--12" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Administrator Administration

An Authentik administrator should:

<div id="bkmrk-belong-to-bytek-admi" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Belong to `bytek-admin`.
- Belong to `bytek-users` if normal applications are required.
- Have MFA enabled.
- Use a unique password.
- Have recovery methods stored securely.
- Avoid using the local break-glass accounts for daily work.

</div>Administrative group membership should be reviewed periodically.

<div id="bkmrk--13" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## MFA

Authentik provides MFA for applications using OIDC or proxy authentication.

MFA should be required for:

<div id="bkmrk-proxmox.-traefik-das" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Proxmox.
- Traefik dashboard.
- Uptime Kuma.
- Nextcloud.
- Vikunja.
- BookStack.
- Authentik administration.

</div>Preserve recovery codes or backup authentication devices.

Do not rely on one physical authenticator without a documented recovery method.

<div id="bkmrk--14" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Local Application Recovery Accounts

Authentik must not be the only recovery path.

### Proxmox

Use:

<div id="bkmrk-root%40pam" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `root@pam`

</div>### Nextcloud

Use:

<div id="bkmrk-local-nextcloud-admi" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Local Nextcloud administrator.
- Direct local login path.

</div>### BookStack

Switch:

<div id="bkmrk-auth_method-from-oid" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `AUTH_METHOD` from `oidc` to `standard`.

</div>Then sign in using the dedicated local administrator.

### Uptime Kuma

Restore direct private access and re-enable local authentication.

### Traefik

Restore a known-good dashboard file or use retained Basic Auth.

<div id="bkmrk--15" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Common Failure Scenarios

### Application Shows Permission Denied

Possible causes:

<div id="bkmrk-user-is-not-in-the-r" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- User is not in the required group.
- An extra group binding is attached.
- Policy engine is `ALL`.
- One binding returns false.
- Email-domain policy fails.
- Application is not assigned to the user.

</div>Review the Authentik denial explanation.

A binding shown as `None` in the explanation may correspond to a direct group-membership check.

### Discovery Endpoint Is Unreachable

Possible causes:

<div id="bkmrk-application-containe-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Application container DNS failure.
- Pi-hole unavailable.
- Traefik unavailable.
- Authentik unavailable.
- Certificate issue.
- Local-address protection inside the application.
- Wrong application slug.

</div>Test discovery from the application host and container.

### CSRF Cookie Not Set

Possible causes:

<div id="bkmrk-stale-browser-sessio" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Stale browser session.
- Browser cookie blocking.
- Wrong Origin header.
- Wrong Host header.
- Incorrect reverse-proxy forwarding.
- Proxy or VPN interference.

</div>Test using a new private browser window.

### Token Payload Cannot Be Parsed

Possible cause:

<div id="bkmrk-authentik-provider-e" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Authentik provider encryption key is selected.

</div>Correction:

<div id="bkmrk-keep-the-signing-key" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Keep the signing key.
- Clear the encryption key.
- Start a fresh authorization flow.

</div>### User’s Email Is Already Taken

The application may not automatically link an OIDC account to a local account based only on email.

For BookStack:

<div id="bkmrk-use-a-separate-local" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Use a separate local break-glass administrator email.
- Allow Authentik to create the normal OIDC account.
- Assign BookStack roles separately.

</div>### Authentication Works but Application Is Empty

Authentication succeeded, but application authorization is missing.

For Proxmox:

<div id="bkmrk-assign-an-acl-at-%2F.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Assign an ACL at `/`.
- Select the required role.
- Enable propagation.

---

</div>## OIDC Troubleshooting Order

When an OIDC application fails:

<div id="bkmrk-keep-the-local-admin" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Keep the local administrator session open.
2. Confirm Authentik readiness.
3. Confirm Traefik routing.
4. Confirm the application provider.
5. Confirm the application slug.
6. Confirm client ID and client secret.
7. Confirm redirect URI.
8. Confirm selected scope mappings.
9. Confirm signing key.
10. Confirm encryption key is empty.
11. Confirm user group membership.
12. Confirm policy results.
13. Test the discovery endpoint.
14. Test DNS from the application container.
15. Review the application log.
16. Review Authentik events.
17. Retry from a completely new private browser session.

</div>Do not recreate the provider until the detailed failure is understood.

<div id="bkmrk--16" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Monitoring

Recommended Uptime Kuma monitors include:

<div id="bkmrk-monitor-target-authe" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Monitor</th><th>Target</th></tr><tr><td>Authentik VM</td><td>Ping `192.168.2.162`</td></tr><tr><td>Direct readiness</td><td>`http://192.168.2.162:9000/-/health/ready/`</td></tr><tr><td>Routed readiness</td><td>`https://portal.bytek.ca/-/health/ready/`</td></tr><tr><td>Authentik certificate</td><td>`portal.bytek.ca`</td></tr><tr><td>PostgreSQL availability</td><td>Internal service-level check</td></tr><tr><td>Embedded outpost</td><td>Outpost ping endpoint</td></tr></tbody></table>

</div></div></div>Monitoring should distinguish between:

<div id="bkmrk-vm-unavailable.-cont" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- VM unavailable.
- Container unavailable.
- Database unavailable.
- Direct readiness failure.
- Traefik failure.
- Certificate failure.
- Public VPS or WireGuard failure.
- Outpost failure.

</div>