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 consudo 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}
Notael servicio
workermonta/var/run/docker.sockpara poder desplegar outposts (proxy, LDAP, RADIUS) como contenedores. Eso le da control total sobre Docker en el host. Si no vas a usar outposts gestionados por Authentik, puedes quitar esa línea del archivo.
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/.
Advertenciacompleta este paso justo después de publicar Authentik. Hasta que lo hagas, cualquiera que llegue a esa URL puede fijar la contraseña del administrador.
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:
- Ve a Directory > Groups > Create, escribe
devopscomo nombre y guarda. - Ve a Directory > Users > Create, rellena el nombre de usuario, el nombre visible y el correo, y guarda.
- Abre el usuario, pulsa Set password para asignarle una contraseña (o Send recovery link si configuraste SMTP).
- 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:
- Ve a Applications > Applications y pulsa Create with provider.
- En Application, pon el nombre
Grafanay el sluggrafana. El slug forma parte de las URLs del proveedor. - En Choose a Provider, selecciona OAuth2/OpenID Provider.
- 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
Stricty la URL de callback de tu aplicación, por ejemplohttps://grafana.your_domain/login/generic_oauth. - Copia el Client ID y el Client Secret, los necesitarás en la aplicación.
- Authorization flow:
- En Configure Bindings, pulsa Bind existing group y elige
devops. Solo los miembros de ese grupo podrán usar la aplicación. - 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.
