Skip to main content
  1. Posts/
  2. IAM and IdP Solutions/

Authentik overview: architecture, features, and comparison with Keycloak

··1087 words·6 mins· loading · loading · ·
Stilicho2011
Author
Stilicho2011
Writing about homelab, self-hosting, automation and open-source solutions
Table of Contents
IAM-решения - This article is part of a series.
Part : This Article

Why you need Authentik at all (and what IAM / IdP means in a homelab / production)
#

Why solutions like Authentik / IAM / IdP are needed
#

In basic setups, each service (application, web interface, API) often implements its own form of login - its own users, password storage, session mechanism, and so on. This creates:

  • Duplicated authentication/authorization logic
  • Different passwords across different systems
  • A larger security-error surface
  • Difficulties with centralized user management, MFA, and auditing
  • Problems with a unified session (SSO) across systems

Solutions like IAM / IdP (Identity Provider) allow you to centralize authentication and authorization: services “delegate” the login process to the IdP solution, and the IdP issues a token/session/assertions that the services trust.

Benefits in a production environment
#

  • Centralized security policy (MFA, IP restrictions, time-limited access)
  • Unified auditing and logging
  • Integration with LDAP, AD, and third-party OAuth providers
  • Scalability: adding new services without duplicating authentication

In a homelab / self-hosted environment
#

  • Control over your own data and passwords
  • The ability to experiment with policies and customization
  • Single sign-on for multiple home services (Nextcloud, Home Assistant, etc.)
  • Levelling up your infrastructure to a production-grade level

Bottom line: Authentik is one of the solutions that combines convenience, flexibility, and an open-source approach, making it suitable for both home labs and production.


What Authentik is - a brief overview
#

Authentik is an open-source / open-core Identity Provider (IdP) and Single Sign-On (SSO) system, built with an emphasis on flexibility and extensibility.

Key capabilities
#

  • Support for standards: OAuth2 / OIDC, SAML2, LDAP, SCIM, RADIUS
  • A Flows / Stages mechanism for building authentication scenarios
  • A convenient UI for admins and users
  • Self-service (registration, password recovery, MFA)
  • Conditional access policies
  • API, Terraform, Blueprints - configuration as code
  • Scaling from Docker to Kubernetes / Helm
  • Support for external identity providers

An IdP is a critically important security element. Authentik needs to be regularly updated and monitored. In 2024, vulnerabilities related to certificate management were reported, but they were promptly fixed.


Core concepts
#

ConceptDescription
Flows / StagesThe logic of the authentication sequence (password, MFA, IP check, etc.).
Applications / ProvidersConfiguration of applications and login providers (OIDC, SAML, etc.).
Policy / ConditionsAccess control based on attributes (group, IP, time of day).
SCIM / LDAP / FederationSyncing users from external systems.
Self-Service / EnrollmentInterface for users (password change, MFA, etc.).
Consent / Attribute MappingManaging the attributes passed to applications.
API / AutomationFull automation of configuration via API, Terraform, Blueprints.

Advantages and limitations
#

Advantages
#

  • High flexibility and customizability (flows, policies).
  • Support for a wide range of protocols (OIDC, SAML, LDAP, RADIUS).
  • Suits small/medium environments and Kubernetes clusters.
  • Simpler interface compared to Keycloak.
  • API and Terraform for automation.
  • Open source - control over your data and code.

Limitations
#

  • A smaller community than Keycloak’s.
  • May require optimization under heavy load.
  • Requires regular updates and auditing.
  • Some features are available only in the enterprise version.
  • Configuring flows requires experience.

Comparing Authentik with competitors
#

CharacteristicAuthentikKeycloakAutheliaAuth0 / Okta (SaaS)
Solution typeSelf-host / open coreSelf-host / enterpriseSelf-host / gatewaySaaS / managed
Supported protocolsOAuth2 / OIDC, SAML2, LDAP, SCIM, RADIUSOAuth2 / OIDC, SAML2, Kerberos, LDAP / ADSSO / 2FA, limited protocolsOAuth2 / OIDC, SAML, social login
CustomizationVery flexible (flows, policies)High (plugins)SimpleMinimal
IntegrationsLDAP, SCIM, external OAuthLDAP / AD, federationLDAPMany ready-made ones
InstallationDocker, Helm, UIJava stack (heavy)LightweightNo installation
ScalabilityMedium loads, clusteringEnterpriseSmall scenariosUnlimited
CommunityYoung, fast-growingMatureNicheHuge
SecurityRequires updatesMatureSimplifiedHigh (SLA)
CostFree / enterprise supportFree / Red Hat supportFreeSubscription
Best use caseHomelab, SMB, customizationEnterpriseSimple SSO / 2FANo admin overhead

Authentik is often called the “golden middle ground” between heavy IAM solutions and simple proxy systems like Authelia.

A more detailed comparison of Authentik, Authelia, Keycloak, and ZITADEL against each other (by features, installation complexity, resource usage) is in a separate comparison article.


Installation and architectural recommendations
#

Installation approaches
#

  • Docker Compose - ideal for a homelab and testing
  • Kubernetes / Helm - for production
  • Cloud AMI / Marketplace - ready-made images (AWS, etc.)

Architecture and tips
#

  • Separate the services: PostgreSQL, Redis, Authentik web/worker.
  • Use external DB and Redis.
  • Set up backups.
  • Ensure TLS/HTTPS for the interfaces.
  • Set up monitoring and updates.
  • Use clustering and replication if needed.

Minimal installation example (Docker Compose) version 2025.10.1
#

Note

Update note. At the time of publication, the current version was 2025.10.1, but Authentik releases often - as of August 2026, the current branch is 2026.5.x. Don’t blindly copy the version tag: before installing, check the releases page on GitHub and substitute the current AUTHENTIK_TAG. The overall structure of the docker-compose file hasn’t fundamentally changed since then.

---
services:
  postgresql:
    image: docker.io/library/postgres:16-alpine
    container_name: authentik_postgres
    restart: unless-stopped
    healthcheck:
      interval: 30s
      retries: 5
      start_period: 20s
      test:
      - CMD-SHELL
      - pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}
      timeout: 5s
    volumes:
        - database:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${PG_PASS:?database password required}
      POSTGRES_USER: ${PG_USER:-authentik}
      POSTGRES_DB: ${PG_DB:-authentik}
    env_file:
    - .env
    networks:
        authentik:
#
  server:
    command: server   
    depends_on:
      postgresql:
        condition: service_healthy
    env_file:
        - .env
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.10.1}
    container_name: authentik_server
    restart: unless-stopped
    environment:
        AUTHENTIK_REDIS__HOST: redis
        AUTHENTIK_POSTGRESQL__HOST: postgresql
        AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
        AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
        AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
        TZ: Europe/Moscow
    volumes:
        - ./media:/media
        - ./custom-templates:/templates
    networks:
        authentik:
        proxy:
    labels:
        - "traefik.enable=true"
        - "traefik.http.routers.authentik.entrypoints=web"
        - "traefik.http.routers.authentik.rule=Host(`authentik.domain.ru`)"
        - "traefik.http.middlewares.authentik-https-redirect.redirectscheme.scheme=https"
        - "traefik.http.routers.authentik.middlewares=authentik-https-redirect"
        - "traefik.http.routers.authentik-secure.entrypoints=websecure"
        ## Individual Application forwardAuth regex (catch any subdomain using individual application forwardAuth)
        - "traefik.http.routers.authentik-secure.rule=Host(`authentik.domain.ru`) || HostRegexp(`{subdomain:[a-z0-9]+}.domain.ru`) && PathPrefix(`/outpost.goauthentik.io/`)"
        - "traefik.http.routers.authentik-secure.tls=true"
        - "traefik.http.routers.authentik-secure.service=authentik"
        - "traefik.http.services.authentik.loadbalancer.server.port=9000"
        - "traefik.docker.network=proxy"
#
  worker:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.10.1}
    restart: unless-stopped
    command: worker
    container_name: authentik_worker
    environment:
        AUTHENTIK_REDIS__HOST: redis
        AUTHENTIK_POSTGRESQL__HOST: postgresql
        AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
        AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
        AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
        TZ: Europe/Moscow
    # `user: root` and the docker socket volume are optional.
    # See more for the docker socket integration here:
    # https://goauthentik.io/docs/outposts/integrations/docker
    # Removing `user: root` also prevents the worker from fixing the permissions
    # on the mounted folders, so when removing this make sure the folders have the correct UID/GID
    # (1000:1000 by default)
    #user: root
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./media:/media
        - ./certs:/certs
        - ./custom-templates:/templates
    env_file:
        - .env
    depends_on:
      postgresql:
        condition: service_healthy
    networks:
        proxy:
        authentik:
#
volumes:
  database:
      driver: local
#
networks:
  proxy:
      external: true
  authentik:
      external: true
PG_PASS=pass
AUTHENTIK_SECRET_KEY=secret
# SMTP Host Emails are sent to
AUTHENTIK_ERROR_REPORTING__ENABLED=true
AUTHENTIK_EMAIL__HOST=smtp.gmail.com
AUTHENTIK_EMAIL__PORT=465
# Optionally authenticate (don't add quotation marks to your password)
AUTHENTIK_EMAIL__USERNAME=mail@gmail.com
AUTHENTIK_EMAIL__PASSWORD=password
# Use StartTLS
AUTHENTIK_EMAIL__USE_TLS=false
# Use SSL
AUTHENTIK_EMAIL__USE_SSL=true
AUTHENTIK_EMAIL__TIMEOUT=10
# Email address authentik will send from, should have a correct @domain
AUTHENTIK_EMAIL__FROM=mail@gmail.com
AUTHENTIK_ERROR_REPORTING__ENABLED=true
IAM-решения - This article is part of a series.
Part : This Article

Related