Outline es una wiki de equipo elegante y rápida que puedes autoalojar con Docker, aunque tiene un requisito que sorprende: no trae inicio de sesión propio. En esta guía levantas Outline junto a PostgreSQL y Redis con un solo docker-compose.yml, conectas la autenticación por OIDC (con Authentik como ejemplo) y decides dónde guardar los archivos adjuntos, en disco local o en un almacén S3 como MinIO. La misma explicación está disponible en inglés.

Puntos clave

  • Outline es una base de conocimiento y wiki de equipo con editor de bloques, Markdown y colaboración en tiempo real; la imagen oficial es outlinewiki/outline, basada en Alpine y con publicaciones mensuales.
  • Necesita tres cosas para arrancar: una base de datos PostgreSQL, una caché Redis y, de forma obligatoria, un proveedor de autenticación externo.
  • Outline no tiene usuario y contraseña locales: el acceso se delega siempre en un proveedor SSO (Google, Slack, Microsoft o un OIDC genérico como Authentik).
  • Genera dos claves con openssl rand -hex 32 para SECRET_KEY y UTILS_SECRET; sin ellas el contenedor ni siquiera arranca.
  • Fija una versión concreta de la imagen (por ejemplo outlinewiki/outline:1.9.1) en lugar de :latest, para controlar tú cuándo actualizas.

¿Qué es Outline y para qué sirve?

Outline es una base de conocimiento y wiki de equipo de código disponible: un sustituto autoalojado de herramientas como Notion o Confluence. Su editor de bloques trabaja sobre Markdown, organiza el contenido en colecciones y documentos anidados, y permite la edición colaborativa en tiempo real gracias a los websockets que gestiona con Redis.

Frente a otras wikis de la serie, Outline apuesta por el pulido visual y la búsqueda rápida más que por la simplicidad de la instalación. Conviene saber que se publica bajo la licencia BSL 1.1 (Business Source License): el código es visible y puedes autoalojarlo sin coste, pero no es una licencia OSI pura, así que hay límites en la reventa como servicio gestionado. Para un equipo que quiere su propia documentación interna, eso rara vez supone un problema. Si buscas una alternativa con instalación aún más sencilla, más adelante en la serie está Docmost.

¿Qué necesitas antes de empezar?

Necesitas una máquina Linux con Docker y el plugin Compose instalados. Si aún no los tienes, sigue primero la guía para instalar Docker en Ubuntu 24.04. Con 2 GB de RAM basta para un equipo pequeño, aunque para varias decenas de usuarios conviene subir a 4 GB.

La pieza que más cuesta entender es la autenticación. A diferencia de la mayoría de aplicaciones, Outline no ofrece un formulario de usuario y contraseña: exige delegar el inicio de sesión en un proveedor externo. Tienes integraciones nativas con Google, Slack, Azure y Microsoft, y una integración genérica OIDC que sirve para cualquier proveedor compatible. En esta serie usamos Authentik como proveedor OIDC autoalojado, de modo que todo el inicio de sesión también queda en tu servidor.

Antes de escribir el Compose, genera las dos claves secretas que Outline necesita. Cada una es una cadena hexadecimal de 32 bytes (64 caracteres):

echo "SECRET_KEY=$(openssl rand -hex 32)"
echo "UTILS_SECRET=$(openssl rand -hex 32)"

¿Cómo configurar el inicio de sesión con Authentik u OIDC?

Con un proveedor OIDC como Authentik, el flujo es siempre el mismo. Sigue estos pasos:

  1. Crea en Authentik una aplicación y un proveedor OAuth2/OpenID para Outline.
  2. Anota el Client ID y el Client Secret que genera el proveedor.
  3. Fija como URL de redirección https://wiki.midominio.com/auth/oidc.callback.
  4. Copia las tres URLs del proveedor (autorización, token e información de usuario) en las variables OIDC_AUTH_URI, OIDC_TOKEN_URI y OIDC_USERINFO_URI.
  5. Arranca la pila y entra por el botón de inicio de sesión OIDC que aparecerá en la pantalla de acceso.

Las variables que gobiernan esta integración son OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, las tres OIDC_*_URI, además de OIDC_USERNAME_CLAIM (por defecto preferred_username), OIDC_DISPLAY_NAME y OIDC_SCOPES (normalmente openid profile email). Un detalle importante: el correo del usuario que inicie sesión debe coincidir con el dominio configurado para que Outline lo dé de alta automáticamente.

El docker-compose.yml de Outline

Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Sustituye las contraseñas, las dos claves generadas antes y los valores de OIDC por los tuyos:

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: outline
      POSTGRES_PASSWORD: cambia_esta_clave_db
      POSTGRES_DB: outline
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U outline"]
      interval: 30s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7.4-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 5s
      retries: 5

  outline:
    image: outlinewiki/outline:1.9.1
    restart: unless-stopped
    ports:
      - "3000:3000"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      SECRET_KEY: pega_aqui_la_secret_key
      UTILS_SECRET: pega_aqui_la_utils_secret
      DATABASE_URL: postgres://outline:cambia_esta_clave_db@postgres:5432/outline
      PGSSLMODE: disable
      REDIS_URL: redis://redis:6379
      URL: https://wiki.midominio.com
      PORT: 3000
      FILE_STORAGE: local
      FILE_STORAGE_UPLOAD_MAX_SIZE: 262144000
      OIDC_CLIENT_ID: pega_el_client_id
      OIDC_CLIENT_SECRET: pega_el_client_secret
      OIDC_AUTH_URI: https://sso.midominio.com/application/o/authorize/
      OIDC_TOKEN_URI: https://sso.midominio.com/application/o/token/
      OIDC_USERINFO_URI: https://sso.midominio.com/application/o/userinfo/
      OIDC_USERNAME_CLAIM: preferred_username
      OIDC_DISPLAY_NAME: Authentik
      OIDC_SCOPES: openid profile email

volumes:
  postgres_data:
  redis_data:

Fíjate en un par de detalles. El servicio outline no arranca hasta que PostgreSQL y Redis pasan su healthcheck, gracias a depends_on con la condición service_healthy. La variable PGSSLMODE: disable es necesaria porque el PostgreSQL del Compose no usa TLS; si la omites, el arranque falla con un error de conexión. Y el puerto 3000 del contenedor se publica en el 3000 del anfitrión solo para esta primera prueba: en producción lo pondrás detrás de un proxy inverso.

Con el archivo listo, arranca la pila y sigue los registros del contenedor de Outline:

docker compose up -d
docker compose ps
docker compose logs -f outline

La primera vez, Outline ejecuta las migraciones de base de datos automáticamente antes de quedar a la escucha. Cuando el registro muestre que el servidor escucha en el puerto 3000, abre http://localhost:3000 y entra con el botón de OIDC.

¿Dónde guarda Outline los archivos subidos?

Con FILE_STORAGE: local, Outline guarda las imágenes y los adjuntos en un volumen dentro del contenedor. Es lo más sencillo para empezar, pero para una instalación seria conviene usar un almacén S3, que separa los datos del contenedor y facilita las copias de seguridad. En esta serie ese almacén es MinIO, compatible con la API de S3 y también autoalojable.

Para cambiar a S3, ajusta FILE_STORAGE a s3 y añade las variables del bucket. El tamaño máximo de subida por defecto es de 262144000 bytes (unos 250 MB), controlado por FILE_STORAGE_UPLOAD_MAX_SIZE:

      FILE_STORAGE: s3
      AWS_ACCESS_KEY_ID: la_clave_de_acceso
      AWS_SECRET_ACCESS_KEY: la_clave_secreta
      AWS_REGION: us-east-1
      AWS_S3_UPLOAD_BUCKET_URL: https://s3.midominio.com
      AWS_S3_UPLOAD_BUCKET_NAME: outline
      AWS_S3_FORCE_PATH_STYLE: "true"
      AWS_S3_ACL: private

Con MinIO, AWS_S3_FORCE_PATH_STYLE debe ser true para que las rutas apunten al bucket correcto, y AWS_S3_UPLOAD_BUCKET_URL es la dirección pública de tu MinIO. Para sacar Outline a Internet con un certificado válido, colócalo detrás de un proxy inverso como Traefik, quita la sección ports y ajusta la variable URL a tu dominio real; recuerda que la URL de redirección de OIDC debe coincidir con ese dominio.

Preguntas frecuentes

¿Puedo usar Outline sin configurar un proveedor de autenticación?

No. A diferencia de otras wikis, Outline no incluye un sistema de usuario y contraseña local, así que necesitas al menos un proveedor de inicio de sesión configurado antes de poder entrar. Las opciones son Google, Slack, Microsoft o cualquier proveedor OIDC genérico; para mantenerlo todo en tu servidor, un OIDC autoalojado como Authentik es la vía habitual.

¿Por qué no debo usar la etiqueta latest de la imagen?

Porque :latest cambia sin avisarte y puede aplicar una migración de base de datos irreversible durante un simple reinicio. Al fijar outlinewiki/outline:1.9.1 decides tú cuándo actualizas, puedes leer antes las notas de la versión y hacer una copia de seguridad de PostgreSQL por si necesitas volver atrás.

¿Qué diferencia hay entre Outline y Docmost?

Ambos son wikis de equipo autoalojables sobre PostgreSQL y Redis, pero Outline destaca por su editor pulido y su búsqueda, mientras que Docmost es más ligero de instalar y admite inicio de sesión local sin depender de un proveedor externo. Si el requisito de SSO de Outline te frena, Docmost es la alternativa más directa.

Conclusión

Con un único docker-compose.yml tienes una wiki de equipo completa: Outline, su base de datos PostgreSQL y la caché Redis, con el inicio de sesión delegado en tu propio proveedor OIDC. El siguiente paso lógico es moverla a un almacén S3 con MinIO para los adjuntos y publicarla con HTTPS detrás de Traefik. A partir de ahí, tu equipo tendrá una base de conocimiento rápida y con buen diseño, sin ceder tus documentos a una nube ajena.

Fuentes

  1. Documentación oficial de Outline
  2. Repositorio de Outline (outline/outline en GitHub)
  3. Imagen oficial outlinewiki/outline en Docker Hub

Ruta: Productividad y documentos self-hosted con Docker