---
title: "Cómo instalar Outline Wiki en Docker: guía completa 2025"
description: "Aprende a instalar Outline Wiki con Docker Compose en 2025. Alternativa a Notion autoalojada con autenticación Slack/OIDC, SMTP, almacenamiento de archivos y consejos de resolución de problemas."
date: 2024-02-06
categories: ["self-hosting"]
tags: ["self-hosted","docker","docker-compose"]
---

import YouTubeEmbed from "@components/widgets/YouTubeEmbed.astro";
import Notice from "@components/widgets/Notice.astro";
import ListCheck from "@components/widgets/ListCheck.astro";
import Accordion from "@components/widgets/Accordion.astro";
import Tabs from "@components/widgets/Tabs.astro";
import Tab from "@components/widgets/Tab.astro";
import { Picture } from "astro:assets";
import img1 from "@assets/images/24/02/slack-oauth.jpeg";

Si quieres instalar Outline Wiki en Docker, esta guía lo cubre. Outline es una alternativa a Notion autoalojada: una base de conocimiento y wiki para documentos, especificaciones, notas de reuniones y respuestas de soporte en una infraestructura que tú controlas. Funciona sobre PostgreSQL y Redis, soporta almacenamiento local de archivos y tiene ~39,8k estrellas en GitHub con la última versión en v1.9.0.

Esta guía recorre una configuración completa de Docker Compose: autenticación con Slack u OIDC, SMTP para notificaciones por email, almacenamiento local de archivos, Cloudflare Tunnels, resolución de problemas y copias de seguridad. Si estás evaluando otras herramientas de notas autoalojadas, mira [Docmost, otra wiki autoalojada](/es/instalar-docmost-docker/) o [Memos para tomar notas más ligeras](/es/instalar-memos/).

<Notice type="info" title="Actualizado en julio de 2025">
Esta guía se ha actualizado para Outline v1.9.0, Postgres 18, Redis 7 y Docker Compose V2. Las versiones anteriores tenían varios problemas importantes (la ruta del volumen de Postgres, la sintaxis de Compose obsoleta) que ya están corregidos.
</Notice>

## ¿Qué es Outline Wiki? Una alternativa a Notion autoalojada

[Outline](https://www.getoutline.com/) es una plataforma de base de conocimiento y documentación creada para equipos. Se centra en una sola cosa: organizar y compartir documentos internos. No intenta ser un espacio de trabajo todo en uno como Notion.

<ListCheck>
<ul>
<li>Editor colaborativo rápido con soporte de markdown, comandos de barra e incrustaciones interactivas</li>
<li>Colaboración en tiempo real (varias personas editando el mismo documento simultáneamente)</li>
<li>Más de 17 idiomas con soporte de texto RTL (de derecha a izquierda)</li>
<li>Permisos de usuario detallados y colecciones para organizar documentos por equipo o tema</li>
<li>Apps de escritorio para macOS y Windows, además de una PWA que puedes instalar en la pantalla de inicio de iOS y Android</li>
<li>Modo oscuro</li>
</ul>
</ListCheck>

Algunas cosas que debes saber antes de decidirte:

- **Licencia:** Outline usa la [licencia BSL 1.1](https://github.com/outline/outline), con código disponible pero no totalmente open source. Para la mayoría de los equipos autoalojados esto no importa, pero conviene saberlo si el cumplimiento normativo es una preocupación.
- **Sin autenticación por email+contraseña por diseño.** Outline requiere un proveedor SSO (Slack, OIDC, Google, Microsoft, GitHub, Discord, GitLab, SAML, Passkeys o enlaces mágicos por email). Es deliberado, no una función que falte.
- **Sin apps móviles nativas.** Hay una PWA para iOS/Android y apps de escritorio para macOS/Windows, pero no aparece en la App Store ni en Play Store.

**¿Cómo se compara con Notion?** Outline tiene un alcance más reducido (solo documentos y base de conocimiento), es más sencillo de usar y puedes autoalojarlo. Notion tiene bases de datos, gestión de proyectos y un conjunto de funciones mucho más amplio; pero quedas atado a su nube.

## Requisitos previos para instalar Outline Wiki en Docker

Antes de empezar, ten esto preparado:

<ListCheck>
<ul>
<li>Un VPS o mini PC (mínimo 1 CPU / 512 MB de RAM para pruebas ligeras; mínimo realista 2 vCPU / 2 GB de RAM para un equipo de más de 5 personas)</li>
<li>Docker y Docker Compose V2 instalados (<code>docker compose version</code> debería funcionar)</li>
<li>Un dominio o subdominio apuntando a tu servidor (p. ej. <code>docs.yourdomain.com</code>)</li>
<li>Un proxy inverso (Cloudflare Tunnels, Traefik, Nginx o Caddy)</li>
<li>Una cuenta de proveedor de autenticación (un workspace de Slack es lo más fácil, o un proveedor OIDC como Authentik, Keycloak, Authelia)</li>
<li>Una forma de gestionar tus stacks ([Dockge para gestionar Docker](/es/instalar-dockge/), [Dokploy como panel de despliegue alternativo](/es/instalar-dokploy/) o [Coolify, PaaS autoalojado](/es/instalar-coolify-alternativa-heroku/))</li>
</ul>
</ListCheck>

<Notice type="info" title="Coste del VPS">
Un CX22 de [Hetzner](https://go.bitdoze.com/hetzner) (2 vCPU, 4 GB de RAM, 40 GB SSD) cuesta ~5 €/mes y es de sobra para un equipo pequeño que use Outline. El VPS de [Hostinger](https://go.bitdoze.com/hostinger-vps) es otra opción económica. Si prefieres ejecutarlo en casa, un [mini PC GMKtec M5 Ultra](/go/gmktec-m5-ultra/) o cualquier [mini PC como servidor doméstico](/es/mejor-mini-pc-servidor-casa/) también funciona bien.
</Notice>

_Los precios de los VPS subieron en general en 2026 — si estás reconsiderando una máquina alquilada, mira [qué cambió y cuándo gana un mini PC](/es/subidas-precios-vps/)._

Lo que se instala: Outline (latest o una versión fijada), PostgreSQL 18 y Redis 7.

Para una comparativa de paneles de gestión de Docker, consulta los [mejores paneles de servidor autoalojados](/es/mejores-paneles-autoalojados/). Si prefieres Traefik en lugar de Cloudflare Tunnels, tengo una guía completa sobre [Traefik como proxy inverso en Docker](/es/traefik-proxy-docker/).

## Paso 1: Configurar la autenticación de Slack para Outline Wiki

Slack es gratis y la opción de autenticación más sencilla para equipos que ya lo usan. Así se configura.

1. Ve a [Slack API Apps](https://api.slack.com/apps/) y haz clic en **Create New App** → **From scratch**.
2. Ponle un nombre (p. ej. "Outline Docs") y selecciona tu workspace.
3. En **OAuth & Permissions**, añade la URL de redirección:
   ```
   https://docs.yourdomain.com/auth/slack.callback
   ```
4. En **Basic Information**, copia el **Client ID** y el **Client Secret**.

<Picture formats={["webp"]} fallbackFormat="webp" src={img1} alt="Página de configuración de la app OAuth de Slack mostrando la URL de redirección para la autenticación de Outline Wiki" />

Los scopes necesarios son `identity.avatar`, `identity.basic`, `identity.email` e `identity.team`. Slack los solicita por defecto para Sign in with Slack.

<Notice type="info" title="¿No usas Slack?">
Salta a la [sección de autenticación OIDC](#opcional-configurar-autenticación-oidc-para-outline-wiki) de abajo. Outline tiene soporte OIDC nativo integrado que funciona con Authentik, Keycloak, Authelia, Gitea y cualquier proveedor que cumpla el estándar. No hace falta una imagen oidc-server aparte.
</Notice>

## Paso 2: Configurar SMTP para Outline Wiki (notificaciones por email e invitaciones)

<Notice type="warning" title="SMTP es obligatorio">
Sin SMTP configurado, las invitaciones de usuarios, las notificaciones por email, el inicio de sesión con enlace mágico y los flujos de restablecimiento de contraseña fallarán silenciosamente. Configúralo antes de invitar a tu equipo.
</Notice>

SMTP se añade rápido. Necesitas estas variables de entorno:

| Variable | Ejemplo | Notas |
|----------|---------|-------|
| `SMTP_HOST` | `smtp.mailgun.org` | El hostname de tu servidor SMTP |
| `SMTP_PORT` | `465` | Normalmente 465 (SSL) o 587 (TLS) |
| `SMTP_USERNAME` | `postmaster@mg.yourdomain.com` | Credenciales SMTP |
| `SMTP_PASSWORD` | `your_smtp_password` | Credenciales SMTP |
| `SMTP_FROM_EMAIL` | `Outline <noreply@yourdomain.com>` | Dirección de remitente que se muestra en los emails |
| `SMTP_SECURE` | `true` | Por defecto true; ponlo en `false` para pruebas locales |

Si usas un proveedor conocido (Mailgun, SendGrid, SES, Gmail), puedes sustituir `SMTP_HOST`/`SMTP_PORT` por `SMTP_SERVICE=mailgun` (o `sendgrid`, `ses`, `gmail`).

Las variables SMTP reales van en el archivo `docker.env` que se muestra en el Paso 3. Las he incluido como líneas comentadas que puedes descomentar.

## Paso 3: Configuración de Docker Compose para Outline Wiki

Aquí está el `docker-compose.yml` completo y actualizado. Cambios clave respecto a versiones antiguas: sin campo `version` (obsoleto en Compose V2), imágenes fijadas de Postgres 18 y Redis 7 Alpine, ruta del volumen de Postgres corregida, healthchecks con `condition: service_healthy` y `expose` para los servicios internos.

```yaml
services:
  outline:
    image: docker.getoutline.com/outlinewiki/outline:latest
    env_file: ./docker.env
    ports:
      - "3000:3000"
    volumes:
      - ./storage-data:/var/lib/outline/data
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    env_file: ./docker.env
    expose:
      - "6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 30s
      retries: 3
    restart: unless-stopped

  postgres:
    image: postgres:18
    env_file: ./docker.env
    expose:
      - "5432"
    volumes:
      - ./database-data:/var/lib/postgresql
    healthcheck:
      test: ["CMD", "pg_isready", "-d", "outline", "-U", "user"]
      interval: 30s
      timeout: 20s
      retries: 3
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: outline
      PGSSLMODE: disable
    restart: unless-stopped
```

**Qué cambió respecto a la versión antigua:**

1. Se eliminó `version: "3.2"` (obsoleto en Docker Compose V2)
2. Se cambió el volumen de Postgres de `/var/lib/postgresql/data` a `/var/lib/postgresql` (cambio incompatible de Postgres 18)
3. Se fijaron `postgres:18` y `redis:7-alpine` en lugar de `:latest` sin fijar
4. Se añadió `condition: service_healthy` a `depends_on`, para que Outline espere a que Postgres y Redis estén listos
5. Se cambió `ports` por `expose` en los servicios internos (Redis y Postgres no necesitan mapeo de puertos al host)
6. Se añadió `PGSSLMODE: disable` al entorno de Postgres
7. Se añadió `env_file: ./docker.env` a todos los servicios (patrón de archivo env compartido de la documentación oficial)
8. Se eliminaron `container_name` y `hostname` (el DNS integrado de Docker gestiona el descubrimiento de servicios)
9. Se eliminó el montaje del volumen `redis.conf` (no es necesario para un uso básico de Outline)
10. Se añadió `restart: unless-stopped` a Postgres y Redis

### El archivo docker.env explicado

Crea un archivo `docker.env` en el mismo directorio que tu `docker-compose.yml`:

```
# PostgreSQL
POSTGRES_USER=user
POSTGRES_PASSWORD=pass
POSTGRES_DB=outline
PGSSLMODE=disable

# Outline
URL=https://docs.yourdomain.com
SECRET_KEY=generate_with_openssl_rand_hex_32
UTILS_SECRET=generate_with_openssl_rand_hex_32
PORT=3000

# Conexión a la base de datos
DATABASE_URL=postgres://user:pass@postgres:5432/outline
REDIS_URL=redis://redis:6379

# Almacenamiento de archivos
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
FILE_STORAGE_UPLOAD_MAX_SIZE=26214400

# Auth — Slack
SLACK_CLIENT_ID=your_slack_client_id
SLACK_CLIENT_SECRET=your_slack_client_secret

# Auth — OIDC (alternativa a Slack, elige una)
# OIDC_CLIENT_ID=your_oidc_client_id
# OIDC_CLIENT_SECRET=your_oidc_client_secret
# OIDC_AUTH_URI=https://auth.yourdomain.com/application/o/authorize/
# OIDC_TOKEN_URI=https://auth.yourdomain.com/application/o/token/
# OIDC_USERINFO_URI=https://auth.yourdomain.com/application/o/userinfo/
# OIDC_USERNAME_CLAIM=preferred_username
# OIDC_DISPLAY_NAME=SSO Login
# OIDC_SCOPES=openid profile email

# SMTP (necesario para invitaciones y notificaciones por email)
# SMTP_HOST=smtp.example.com
# SMTP_PORT=465
# SMTP_USERNAME=your_username
# SMTP_PASSWORD=your_password
# SMTP_FROM_EMAIL=Outline <noreply@yourdomain.com>
# SMTP_SECURE=true

# Opcional pero recomendado
FORCE_HTTPS=true
# RATE_LIMITER_MULTIPLIER=1.0
# LOG_LEVEL=debug  # solo para depurar
```

Genera ambos secretos con:

```sh
openssl rand -hex 32
```

<Notice type="error" title="SECRET_KEY es crítico">
Si pierdes `SECRET_KEY`, todos los datos cifrados (tokens, sesiones, integraciones) se destruyen. Hay un script de recuperación (`node ./build/server/scripts/reset-encrypted-data.js`) pero borra los datos cifrados. Haz copia de seguridad de tu archivo `docker.env` junto con tu base de datos.
</Notice>

**Variables clave explicadas:**

- **`URL`**: debe coincidir exactamente con tu dominio público (incluido el `https://`). Outline la usa para las URLs de callback y los enlaces a recursos.
- **`FORCE_HTTPS`**: ponlo en `true` cuando estés detrás de un proxy inverso que gestiona el TLS. Ponlo en `false` para pruebas locales sin TLS. Configurarlo mal provoca bucles de redirección.
- **`DATABASE_URL`**: el hostname (`postgres`) debe coincidir con el nombre del servicio en `docker-compose.yml`, no `localhost`.
- **`RATE_LIMITER_MULTIPLIER`**: valor en punto flotante, 1.0 por defecto. Auméntalo para equipos más grandes que alcancen los límites de peticiones.
- **`LOG_LEVEL=debug`**: activa el registro detallado temporalmente al diagnosticar problemas de arranque.

Para más información sobre la gestión del entorno en Docker Compose, consulta las [variables de entorno de Docker en Compose](/es/variables-entorno-docker/) y la [gestión de secretos en Docker Compose](/es/secretos-docker-compose/).

### Configuración de los servicios PostgreSQL y Redis

**Postgres 18** está fijado porque la imagen de Docker cambió su directorio de datos interno. Usar la ruta antigua `/var/lib/postgresql/data` con Postgres 18+ provoca: `Error: Postgres detected data in /var/lib/postgresql/data (unused mount/volume)`. La solución es usar `/var/lib/postgresql` sin el sufijo `/data`.

**Redis 7 Alpine** es una imagen pequeña (~10 MB) que funciona sin configuración para Outline. No hace falta un `redis.conf` personalizado.

**`expose` frente a `ports`:** los servicios internos (Postgres, Redis) usan `expose`. Son accesibles para otros contenedores en la red de Docker pero no se mapean a puertos del host. Solo el puerto 3000 de Outline se expone al host. Es más seguro que mapear los tres servicios a puertos del host.

## Paso 4: Desplegar y verificar tu instalación de Outline Wiki

Despliega con:

```sh
docker compose up -d
```

### Comprueba que todos los contenedores están en marcha

```sh
docker compose ps
```

Los tres servicios deberían mostrar "Up" y estado healthy:

```
NAME              STATUS                    PORTS
outline-app       Up (healthy)              0.0.0.0:3000->3000/tcp
outline-postgres  Up (healthy)              5432/tcp
outline-redis     Up (healthy)              6379/tcp
```

Revisa los logs de Outline para ver los mensajes de arranque y migración:

```sh
docker compose logs outline
```

Busca `Server started on port 3000` y los mensajes de migración. Si ves errores de conexión a Postgres o Redis, comprueba que los nombres de servicio en `DATABASE_URL` y `REDIS_URL` coinciden con tu `docker-compose.yml`.

### Corrige los permisos de subida de archivos

Outline se ejecuta como UID 1001 dentro del contenedor. Sin los permisos correctos, las subidas de imágenes fallan silenciosamente:

```sh
chown 1001 ./storage-data
```

Verifica: abre Outline en tu navegador, crea un documento y sube una imagen. Si funciona, ya está.

### Prueba la conectividad WebSocket

Abre el mismo documento en dos pestañas del navegador. Escribe en una. Los cambios deberían aparecer en la otra en un segundo. Esto confirma que las conexiones WebSocket funcionan a través de tu proxy inverso.

Si la sincronización en tiempo real no funciona, es probable que tu proxy inverso no esté reenviando las cabeceras de upgrade de WebSocket. Consulta la sección de resolución de problemas más abajo.

## Opcional: Configurar autenticación OIDC para Outline Wiki

<Notice type="info" title="OIDC es lo recomendado para instalaciones autoalojadas">
OIDC es la opción de autenticación más flexible para Outline autoalojado. Funciona con Authentik, Keycloak, Authelia, Gitea y cualquier proveedor OIDC que cumpla el estándar. No hace falta una imagen oidc-server aparte. Está integrado.
</Notice>

Tienes dos formas de configurar OIDC: endpoints manuales o descubrimiento automático mediante la URL del emisor (issuer).

<Tabs>
<Tab name="Configuración manual">
Define cada endpoint explícitamente en tu `docker.env`:

```
OIDC_CLIENT_ID=your_oidc_client_id
OIDC_CLIENT_SECRET=your_oidc_client_secret
OIDC_AUTH_URI=https://auth.yourdomain.com/application/o/authorize/
OIDC_TOKEN_URI=https://auth.yourdomain.com/application/o/token/
OIDC_USERINFO_URI=https://auth.yourdomain.com/application/o/userinfo/
OIDC_USERNAME_CLAIM=preferred_username
OIDC_DISPLAY_NAME=SSO Login
OIDC_SCOPES=openid profile email
```

La URL de callback para tu proveedor OIDC es:
```
https://docs.yourdomain.com/auth/oidc.callback
```
</Tab>
<Tab name="URL del emisor (autodescubrimiento)">
Si tu proveedor soporta autodescubrimiento (Authentik, Keycloak y Authelia lo hacen), solo necesitas la URL del emisor:

```
OIDC_CLIENT_ID=your_oidc_client_id
OIDC_CLIENT_SECRET=your_oidc_client_secret
OIDC_ISSUER_URL=https://auth.yourdomain.com/application/o/your-app/
OIDC_DISPLAY_NAME=SSO Login
OIDC_SCOPES=openid profile email
```

Outline obtiene los endpoints automáticamente desde `{OIDC_ISSUER_URL}/.well-known/openid-configuration`.
</Tab>
</Tabs>

Otros proveedores de autenticación que soporta Outline: Discord, GitLab, GitHub, Google Workspace, Microsoft, SAML, Passkeys (biométricas/claves de seguridad) y enlaces mágicos por email. Outline nunca tendrá autenticación por email+contraseña. Es una decisión de diseño deliberada.

Tras activar OIDC, reinicia Outline (`docker compose restart outline`) y prueba el flujo de inicio de sesión. El botón de OIDC debería aparecer en la página de login.

## Opcional: Configurar Cloudflare Tunnels para Outline Wiki

Para exponer Outline mediante Cloudflare Tunnels:

1. Ve al panel de Cloudflare → **Access** → **Tunnels**
2. Selecciona tu túnel → **Configure** → **Public Hostname** → **Add a public hostname**
3. Define el dominio a tu subdominio (p. ej. `docs.yourdomain.com`)
4. Define el servicio como `http://localhost:3000` (o tu puerto mapeado)

<Notice type="warning" title="Desactiva Cloudflare Rocket Loader">
Cloudflare Rocket Loader **debe estar desactivado** para tu subdominio de Outline. Inyecta scripts que rompen el renderizado JavaScript del lado cliente de Outline. Ve a **Speed** → **Optimization** → **Rocket Loader** → ponlo en **Off** para tu dominio de Outline. La documentación oficial de Outline advierte explícitamente sobre esto.
</Notice>

Define `FORCE_HTTPS=true` en tu `docker.env` cuando uses Cloudflare Tunnels (gestiona el TLS en el edge).

Si prefieres gestionar los túneles de forma autoalojada, echa un vistazo a [Pangolin como alternativa autoalojada a Cloudflare Tunnels](/es/pangolin-alternativa-cloudflare-tunnels/).

## Resolución de problemas comunes de Outline Wiki en Docker

<Accordion label="Bucles de redirección HTTPS" group="troubleshooting">
**Síntoma:** el navegador muestra `ERR_TOO_MANY_REDIRECTS` o la página se recarga constantemente.

**Solución:** si tu proxy inverso termina el TLS y reenvía HTTP a Outline, `FORCE_HTTPS=true` puede provocar bucles de redirección una vez que el navegador cachea las cabeceras HSTS. Pon `FORCE_HTTPS=false` en `docker.env` y limpia la caché HSTS de tu navegador: en Chrome, ve a `chrome://net-internals/#hsts`, consulta tu dominio y elimínalo.
</Accordion>

<Accordion label="Conflictos con Cloudflare Rocket Loader" group="troubleshooting">
**Síntoma:** Outline carga pero los botones no funcionan, el editor está roto o aparecen errores de JavaScript en la consola del navegador.

**Solución:** desactiva Rocket Loader en el panel de Cloudflare: **Speed** → **Optimization** → **Rocket Loader** → ponlo en **Off** para tu subdominio de Outline.
</Accordion>

<Accordion label="Permiso denegado al subir archivos" group="troubleshooting">
**Síntoma:** subir imágenes o archivos a un documento falla, ya sea silenciosamente o con un error de permisos en los logs.

**Solución:** ejecuta `chown 1001 ./storage-data` en el directorio de tu stack de Outline. El proceso de Node.js se ejecuta como UID 1001 dentro del contenedor y necesita acceso de escritura al volumen montado.
</Accordion>

<Accordion label="WebSocket / edición colaborativa no funciona" group="troubleshooting">
**Síntoma:** la colaboración en tiempo real no se sincroniza entre pestañas del navegador o usuarios.

**Solución:** tu proxy inverso necesita soportar el upgrade de WebSocket. En Cloudflare Tunnels, los WebSockets funcionan por defecto. En Nginx, asegúrate de que están definidos `proxy_set_header Upgrade $http_upgrade` y `proxy_set_header Connection "upgrade"`. En Traefik, el soporte de WebSocket viene integrado — verifica la configuración de tu router.
</Accordion>

<Accordion label="Errores de conexión a la base de datos" group="troubleshooting">
**Síntoma:** Outline no arranca y muestra errores de conexión rechazada o de autenticación contra Postgres.

**Solución:** revisa tres cosas:
1. El hostname de `DATABASE_URL` debe coincidir con el nombre del servicio Postgres en `docker-compose.yml` (`postgres`, no `localhost` ni `outline-postgres`)
2. `PGSSLMODE=disable` debe estar definido tanto en el entorno de Outline como en el de Postgres
3. Verifica que el healthcheck de Postgres pasa: `docker compose ps` debería mostrar el contenedor de Postgres como "healthy"
</Accordion>

<Accordion label="Errores de formato de SECRET_KEY" group="troubleshooting">
**Síntoma:** Outline no arranca y muestra un error de validación de la clave secreta.

**Solución:** `SECRET_KEY` debe tener exactamente 64 caracteres hexadecimales generados con `openssl rand -hex 32`. No uses una frase de contraseña, una URL ni ninguna cadena arbitraria. Lo mismo para `UTILS_SECRET`.
</Accordion>

<Accordion label="DNS lookup not allowed" group="troubleshooting">
**Síntoma:** Outline no puede alcanzar tu proveedor OIDC, servidor SMTP u otros servicios en una red local/privada. Los logs muestran errores de DNS lookup o de conexión a IPs privadas.

**Solución:** define `ALLOWED_PRIVATE_IP_ADDRESSES` en `docker.env` con las IPs de los servicios que Outline necesita alcanzar, separadas por comas. Por ejemplo: `ALLOWED_PRIVATE_IP_ADDRESSES=10.0.0.5,192.168.1.100`. Es una medida de seguridad que bloquea ataques SSRF por defecto.
</Accordion>

Para un registro más detallado durante la depuración, añade temporalmente `LOG_LEVEL=debug` a tu `docker.env` y reinicia el contenedor.

## Cómo hacer copia de seguridad y actualizar Outline Wiki en Docker

### Copia de seguridad de la base de datos y los archivos

Tres cosas necesitan copias de seguridad periódicas:

**1. Base de datos Postgres:**

```sh
docker exec outline-postgres pg_dump -U user outline > backup_$(date +%F).sql
```

**2. Directorio de almacenamiento de archivos:**

```sh
cp -r ./storage-data ./storage-data-backup-$(date +%F)
```

**3. Archivo docker.env:**

Contiene `SECRET_KEY` y `UTILS_SECRET`. Sin `SECRET_KEY`, todos los datos cifrados de la base de datos son irrecuperables. Guárdalo junto con el volcado de tu base de datos.

Para una estrategia de copias de seguridad más robusta, puedes enviar los volcados de la base de datos y el almacenamiento de archivos a un almacenamiento compatible con S3. Mira cómo [limpiar el espacio en disco de Docker](/es/limpiar-docker-overlay2/) si tus volúmenes de copias de seguridad consumen demasiado disco.

### Actualizar Outline Wiki a la última versión

El proceso de actualización:

```sh
# 1. Haz copia de seguridad primero
docker exec outline-postgres pg_dump -U user outline > backup_$(date +%F).sql

# 2. Descarga las nuevas imágenes
docker compose pull

# 3. Reinicia con las nuevas imágenes
docker compose up -d

# 4. Revisa los logs para ver la salida de las migraciones
docker compose logs -f outline
```

Las migraciones se ejecutan automáticamente al arrancar el contenedor. No hay paso de migración manual — pero esto también significa que **las migraciones son irreversibles**. Si una actualización rompe algo, necesitas una copia de seguridad de la base de datos para volver atrás.

**Fijar la versión en producción:** en lugar de `:latest`, usa un tag específico como `outline:1.9.0`. Así controlas cuándo se aplican las actualizaciones y evitas roturas inesperadas al redesplegar.

```yaml
image: docker.getoutline.com/outlinewiki/outline:1.9.0
```

Para una guía detallada sobre cómo actualizar contenedores de Docker Compose, consulta [cómo actualizar contenedores Docker Compose](/es/actualizar-contenedor-docker-compose/).

<Notice type="warning" title="Las migraciones son irreversibles">
Las migraciones se ejecutan automáticamente al arrancar y no se pueden revertir. Haz siempre una copia de seguridad de tu base de datos antes de actualizar Outline.
</Notice>

## Conclusiones sobre autoalojar Outline Wiki

Outline ha madurado mucho — v1.9.0 con ~39,8k estrellas en GitHub, soporte OIDC nativo, apps de escritorio, una PWA para móvil y un editor colaborativo pulido. Es una de las mejores plataformas de documentación autoalojadas si quieres algo enfocado y limpio en lugar del enfoque de Notion de querer meterlo todo.

Puntos clave de esta configuración:

- **Fija las versiones de las imágenes** en producción para evitar roturas inesperadas al redesplegar
- **Haz copia de seguridad de `docker.env`** junto con tu base de datos — perder `SECRET_KEY` significa perder todos los datos cifrados
- **Configura SMTP pronto** — sin él, las invitaciones y notificaciones fallan silenciosamente
- **Fija Postgres en la 18** y usa la ruta de volumen `/var/lib/postgresql` (no `/var/lib/postgresql/data`)
- Usa `docker compose` (plugin V2), no `docker-compose` (obsoleto)

Outline usa la licencia BSL 1.1 — código disponible pero no totalmente open source. Para la mayoría de los equipos autoalojados está bien, pero conviene saberlo.

<YouTubeEmbed
  url="https://www.youtube.com/embed/IY1jONuTEic"
  label="Instalación de Outline"
/>

> **Nota:** el vídeo de arriba se grabó con una versión anterior. Los pasos son similares, pero algunos comandos y configuraciones se han actualizado en esta guía.

Para más apps Docker autoalojadas, echa un vistazo a las [mejores apps Docker autoalojadas para empresas](/es/contenedores-docker-empresas/) y a los [contenedores Docker autoalojados para tu servidor doméstico](/es/contenedores-docker-servidor-casa/).