Authentik es un proveedor de identidad open source que centraliza el inicio de sesión de tus aplicaciones mediante OpenID Connect, OAuth2, SAML, LDAP o un proxy de autenticación. Incluye interfaz web de administración, flujos de login configurables, MFA y gestión de usuarios y grupos. En este tutorial lo instalarás con Docker Compose en Ubuntu 24.04, lo publicarás detrás de Nginx con HTTPS, crearás la cuenta de administrador y registrarás una aplicación OpenID Connect restringida a un grupo.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, al menos 2 vCPU y 2 GB de RAM (4 GB si vas a tener muchos usuarios), por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Docker Engine y el plugin de Docker Compose instalados desde el repositorio oficial de Docker.
  • Nginx y Certbot instalados: sudo apt install nginx certbot python3-certbot-nginx, y los puertos 80 y 443 abiertos con sudo ufw allow 'Nginx Full'.
  • Un subdominio para Authentik, en esta guía auth.your_domain, con un registro DNS A apuntando a la IP del servidor.

Paso 1: Descargar el archivo de Docker Compose

Authentik publica un archivo de Compose oficial con tres servicios: PostgreSQL (base de datos), server (interfaz web y API) y worker (tareas en segundo plano y gestión de outposts). Crea el directorio de trabajo y descárgalo:

sudo mkdir -p /opt/authentik
cd /opt/authentik
sudo curl -fsSL -o docker-compose.yml https://goauthentik.io/docker-compose.yml

Comprueba qué versión de Authentik fija el archivo:

grep -m1 AUTHENTIK_TAG docker-compose.yml
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.8.3}

Paso 2: Generar los secretos y el archivo .env

Authentik necesita una contraseña para PostgreSQL y una clave secreta con la que firma cookies y tokens. Genera ambas directamente en el archivo .env, que Compose lee automáticamente:

echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" | sudo tee /opt/authentik/.env > /dev/null
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" | sudo tee -a /opt/authentik/.env > /dev/null

Añade el resto de ajustes abriendo el archivo:

sudo nano /opt/authentik/.env

Pega estas líneas debajo de las dos que ya existen:

# Publicar los puertos solo en localhost; Nginx hará de frontal
COMPOSE_PORT_HTTP=127.0.0.1:9000
COMPOSE_PORT_HTTPS=127.0.0.1:9443

# No enviar informes de errores a los desarrolladores
AUTHENTIK_ERROR_REPORTING__ENABLED=false

# Correo saliente para recuperación de contraseña y verificaciones
AUTHENTIK_EMAIL__HOST=smtp.your_domain
AUTHENTIK_EMAIL__PORT=587
AUTHENTIK_EMAIL__USERNAME=noreply@your_domain
AUTHENTIK_EMAIL__PASSWORD=your_smtp_password
AUTHENTIK_EMAIL__USE_TLS=true
AUTHENTIK_EMAIL__FROM=noreply@your_domain

Publicar los puertos en 127.0.0.1 es importante: Docker inserta sus propias reglas de iptables y se salta UFW, así que con el valor por defecto los puertos 9000 y 9443 quedarían abiertos a Internet. Si todavía no tienes servidor SMTP, omite las líneas AUTHENTIK_EMAIL__*; Authentik funciona igual, pero no podrá enviar correos.

Restringe los permisos del archivo, ya que contiene la contraseña de la base de datos:

sudo chmod 600 /opt/authentik/.env

Paso 3: Arrancar Authentik

Descarga las imágenes y levanta los contenedores:

cd /opt/authentik
sudo docker compose pull
sudo docker compose up -d

El primer arranque tarda uno o dos minutos porque Authentik crea el esquema de la base de datos. Comprueba el estado:

sudo docker compose ps
NAME                      IMAGE                                COMMAND                  SERVICE      STATUS                   PORTS
authentik-postgresql-1    docker.io/library/postgres:16-alpine "docker-entrypoint.s…"   postgresql   Up 2 minutes (healthy)   5432/tcp
authentik-server-1        ghcr.io/goauthentik/server:2026.8.3  "dumb-init -- ak ser…"   server       Up 2 minutes (healthy)   127.0.0.1:9000->9000/tcp, 127.0.0.1:9443->9443/tcp
authentik-worker-1        ghcr.io/goauthentik/server:2026.8.3  "dumb-init -- ak wor…"   worker       Up 2 minutes (healthy)

Cuando los tres servicios aparecen como healthy, verifica que la interfaz responde en local:

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/if/flow/initial-setup/
200

Si algún contenedor se reinicia, revisa sus registros con sudo docker compose logs server --tail 50.

Paso 4: Publicar Authentik con Nginx y HTTPS

Authentik usa WebSockets para la interfaz de administración y la comunicación con los outposts, así que Nginx debe reenviar las cabeceras Upgrade y Connection. Crea el sitio:

sudo nano /etc/nginx/sites-available/auth.your_domain
map $http_upgrade $connection_upgrade_keepalive {
    default upgrade;
    ''      '';
}

server {
    listen 80;
    server_name auth.your_domain;

    client_max_body_size 25m;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade_keepalive;
    }
}

Activa el sitio y valida la configuración:

sudo ln -s /etc/nginx/sites-available/auth.your_domain /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Obtén el certificado de Let's Encrypt. Certbot añade al bloque server la configuración TLS y la redirección de HTTP a HTTPS:

sudo certbot --nginx -d auth.your_domain
Successfully deployed certificate for auth.your_domain to /etc/nginx/sites-enabled/auth.your_domain
Congratulations! You have successfully enabled HTTPS on https://auth.your_domain

Paso 5: Crear la cuenta de administrador

Authentik crea un usuario administrador llamado akadmin sin contraseña y lo completa mediante un flujo de configuración inicial. Abre en el navegador (la barra final es necesaria):

https://auth.your_domain/if/flow/initial-setup/

Introduce un correo y una contraseña robusta para akadmin y confirma. Authentik inicia la sesión y te lleva a la interfaz de usuario. Pulsa Admin interface para entrar en el panel de administración, que también está en https://auth.your_domain/if/admin/.

Como buena práctica, crea después tu propio usuario administrador en Directory > Users, añádelo al grupo authentik Admins y usa esa cuenta en el día a día.

Paso 6: Crear usuarios y un grupo

Las aplicaciones se restringen normalmente por grupo. En el panel de administración:

  1. Ve a Directory > Groups > Create, escribe devops como nombre y guarda.
  2. Ve a Directory > Users > Create, rellena el nombre de usuario, el nombre visible y el correo, y guarda.
  3. Abre el usuario, pulsa Set password para asignarle una contraseña (o Send recovery link si configuraste SMTP).
  4. En la pestaña Groups del usuario, pulsa Add to existing group y selecciona devops.

Paso 7: Registrar una aplicación OpenID Connect

En Authentik, una aplicación es lo que ve el usuario y un proveedor define el protocolo (OAuth2/OIDC, SAML, LDAP, proxy). El asistente crea ambos a la vez:

  1. Ve a Applications > Applications y pulsa Create with provider.
  2. En Application, pon el nombre Grafana y el slug grafana. El slug forma parte de las URLs del proveedor.
  3. En Choose a Provider, selecciona OAuth2/OpenID Provider.
  4. En Configure Provider:
    • Authorization flow: default-provider-authorization-implicit-consent, para que el usuario no tenga que aceptar un consentimiento en cada login.
    • Client type: Confidential.
    • Redirect URIs: modo Strict y la URL de callback de tu aplicación, por ejemplo https://grafana.your_domain/login/generic_oauth.
    • Copia el Client ID y el Client Secret, los necesitarás en la aplicación.
  5. En Configure Bindings, pulsa Bind existing group y elige devops. Solo los miembros de ese grupo podrán usar la aplicación.
  6. Revisa el resumen y pulsa Submit.

Authentik expone un documento de descubrimiento OpenID Connect por aplicación. Compruébalo desde el servidor:

curl -s https://auth.your_domain/application/o/grafana/.well-known/openid-configuration | python3 -m json.tool | head -8
{
    "issuer": "https://auth.your_domain/application/o/grafana/",
    "authorization_endpoint": "https://auth.your_domain/application/o/authorize/",
    "token_endpoint": "https://auth.your_domain/application/o/token/",
    "userinfo_endpoint": "https://auth.your_domain/application/o/userinfo/",
    "end_session_endpoint": "https://auth.your_domain/application/o/grafana/end-session/",
    "introspection_endpoint": "https://auth.your_domain/application/o/introspect/",
    "revocation_endpoint": "https://auth.your_domain/application/o/revoke/",

Estos son los valores que pide cualquier cliente OIDC. Si la aplicación admite descubrimiento automático, basta con indicarle el issuer, el Client ID y el Client Secret, y los ámbitos openid email profile.

Para probar el acceso, abre https://auth.your_domain en una ventana privada e inicia sesión con el usuario del paso 6: la aplicación Grafana aparece en su biblioteca. Un usuario fuera del grupo devops no la verá y recibirá un error de permisos si intenta usarla.

Paso 8: Hacer copias de seguridad y actualizar

Todo el estado de Authentik (usuarios, proveedores, flujos) vive en PostgreSQL, y los certificados y archivos subidos en /opt/authentik/data y /opt/authentik/certs. Para volcar la base de datos:

cd /opt/authentik
sudo docker compose exec -T postgresql pg_dump -U authentik -d authentik | gzip > ~/authentik-$(date +%F).sql.gz

Guarda también una copia de /opt/authentik/.env: sin AUTHENTIK_SECRET_KEY no podrás restaurar las sesiones ni algunos datos cifrados.

Para actualizar, lee primero las notas de la versión en la documentación de Authentik, descarga de nuevo docker-compose.yml con el mismo comando del paso 1 y ejecuta:

sudo docker compose pull
sudo docker compose up -d

Authentik aplica las migraciones de base de datos al arrancar. No saltes varias versiones mayores de golpe.

Solución de problemas

La interfaz de administración carga a medias o muestra errores de conexión. Falta el reenvío de WebSockets. Revisa que el bloque location tiene proxy_http_version 1.1 y las cabeceras Upgrade y Connection, y recarga Nginx.

Las URLs de los proveedores aparecen con http:// en lugar de https://. Nginx no está enviando X-Forwarded-Proto. Comprueba la cabecera en el bloque location del sitio.

Has perdido la contraseña de akadmin. Genera un enlace de recuperación válido durante 10 minutos:

cd /opt/authentik
sudo docker compose run --rm server create_recovery_key 10 akadmin

El comando imprime una ruta que debes abrir añadiéndola a https://auth.your_domain.

Un contenedor no arranca tras cambiar .env. Compose solo relee el archivo al recrear los contenedores. Ejecuta sudo docker compose up -d --force-recreate y revisa sudo docker compose logs server worker --tail 50.

Conclusión

Tienes Authentik funcionando con Docker Compose detrás de Nginx con HTTPS, con una cuenta de administrador, un grupo de usuarios y una aplicación OpenID Connect restringida a ese grupo. Como siguientes pasos puedes activar MFA con TOTP o WebAuthn en el flujo de autenticación por defecto, proteger aplicaciones sin soporte OIDC con un proveedor de tipo Proxy y el outpost integrado, o exponer un servidor LDAP con un outpost LDAP para equipos de red y aplicaciones heredadas.