Tutoriales de VPS
Despliegue de Outline en un VPS (2026): Docker Compose, PostgreSQL, Redis, OAuth y HTTPS
Despliegue la base de conocimiento de equipo Outline en un VPS con Ubuntu 24.04 usando Docker Compose, cubriendo PostgreSQL, Redis, inicio de sesión OAuth, HTTPS con Caddy, almacenamiento de adjuntos, copia de seguridad y restauración, actualización y reversión, y solución de problemas comunes.

Outline es un wiki de código abierto adecuado para documentación interna de equipos, manuales de producto y bases de conocimiento técnico. Su búsqueda, edición Markdown, permisos e historial de versiones son más adecuados para la colaboración a largo plazo que un simple directorio de archivos, pero un despliegue en producción requiere al menos PostgreSQL, Redis, almacenamiento de objetos (o un directorio local de adjuntos) y HTTPS. Este artículo usa Ubuntu 24.04, Docker Compose y un dominio independiente como ejemplo para desplegar desde cero una instancia de Outline mantenible.
Las páginas de Outline en sí no son pesadas; lo que realmente consume recursos es PostgreSQL, Redis, la búsqueda de texto completo y el procesamiento de adjuntos. Los equipos pequeños pueden planificar a partir de los siguientes puntos de partida:
| Escenario | Configuración recomendada | Notas |
|---|---|---|
| Pruebas personales | 2 núcleos, 2GB, SSD de 40GB | Solo unos pocos documentos; no recomendado para producción de equipo |
| Equipo de 5-20 personas | 2-4 núcleos, 4GB, SSD de 80GB | PostgreSQL, Redis y Outline en la misma máquina |
| Más de 20 personas | 4 núcleos, 8GB, NVMe de 160GB+ | Se recomienda respaldar la base de datos y los adjuntos por separado o dividirlos en máquinas distintas |
Si el VPS tiene solo 1GB de memoria, primero complete Optimización de ZRAM y Swap para VPS con poca memoria y luego despliegue Outline. El Swap solo puede aliviar los picos de arranque; no puede sustituir la memoria necesaria para el funcionamiento a largo plazo.
Apunte los registros A/AAAA de docs.example.com al VPS e instale Docker Compose:
sudo apt update
sudo apt install -y ca-certificates curl openssl
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"
newgrp docker
sudo mkdir -p /opt/outline/{data,postgres,redis}
sudo chown -R "$USER":"$USER" /opt/outline
cd /opt/outline
Abra solo SSH, 80 y 443. No asigne el 5432 de PostgreSQL ni el 6379 de Redis a la internet pública.
Outline requiere al menos SECRET_KEY y UTILS_SECRET. Use valores aleatorios; no copie ejemplos de internet:
openssl rand -hex 32
openssl rand -hex 32
Cree .env:
URL=https://docs.example.com
PORT=3000
FORCE_HTTPS=true
SECRET_KEY=替换为第一条随机值
UTILS_SECRET=替换为第二条随机值
DATABASE_URL=postgres://outline:替换数据库密码@postgres:5432/outline
REDIS_URL=redis://redis:6379
POSTGRES_USER=outline
POSTGRES_PASSWORD=替换数据库密码
POSTGRES_DB=outline
# OAuth 以 GitHub 为例,生产环境应使用组织级 OAuth App
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_AUTH_URI=
OIDC_TOKEN_URI=
OIDC_USERINFO_URI=
OIDC_LOGOUT_URI=
OIDC_USERNAME_CLAIM=preferred_username
OIDC_DISPLAY_NAME=公司账号
Outline no es adecuado para abrir directamente el "registro libre para cualquiera". Antes de conectar OAuth, mantenga el sitio dentro de una VPN, control de acceso o un entorno de prueba temporal.
Cree compose.yml:
services:
outline:
image: outlinewiki/outline:latest
container_name: outline
restart: unless-stopped
env_file: .env
command: sh -c "yarn sequelize:migrate --env production-ssl-disabled && yarn start"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "127.0.0.1:3000:3000"
volumes:
- ./data:/var/lib/outline/data
postgres:
image: postgres:16
container_name: outline-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
container_name: outline-redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- ./redis:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
Inicie y revise los registros:
docker compose up -d
docker compose ps
docker compose logs --tail=100 outline
El primer arranque ejecuta las migraciones de la base de datos. Si outline se cierra repetidamente, revise primero docker compose logs outline, centrándose en la URL, los secretos, la contraseña de la base de datos y la dirección de callback de OAuth; no elimine directamente el directorio de datos de PostgreSQL.
Outline requiere HTTPS y encabezados Host correctos; de lo contrario, los callbacks de inicio de sesión, las URL de adjuntos y las cookies tienden a fallar. Después de instalar Caddy, escriba lo siguiente en el Caddyfile:
docs.example.com {
reverse_proxy 127.0.0.1:3000
}
Caddy solicitará los certificados automáticamente. Después de modificar, verifique:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://docs.example.com
Si aún no tiene un punto de entrada de proxy inverso, consulte Configurar HTTPS automático con Caddy en un VPS. No exponga el puerto 3000 de Outline directamente a la internet pública.
Usando un proveedor de identidad compatible con OIDC como ejemplo, cree una aplicación en el panel de administración y complete la dirección de callback:
https://docs.example.com/auth/oidc.callback
Escriba el client ID, el Secret y las cuatro URL de OIDC en .env y reinicie:
docker compose up -d --force-recreate outline
docker compose logs -f outline
Si después de iniciar sesión vuelve a la página principal o aparece redirect_uri mismatch, verifique cada punto:
- Si la dirección de callback registrada en el proveedor usa exactamente HTTPS;
- Si
URLcoincide con el dominio al que accede el navegador; - Si Caddy reenvía el Host y el protocolo originales;
- Si las direcciones de issuer, userinfo y logout de OIDC pertenecen al mismo tenant.
Antes de modificar los parámetros de OAuth, conserve una ruta de inicio de sesión de administrador funcional para evitar dejar a todos los administradores fuera del sitio.
Durante las pruebas puede usar ./data:/var/lib/outline/data, pero un fallo de disco en una sola máquina perderá tanto la base de datos como los adjuntos. Para producción se recomienda más el almacenamiento compatible con S3, por ejemplo el almacenamiento de objetos MinIO en VPS desplegado anteriormente, manteniendo los adjuntos y la base de datos guardados por separado.
Ya sea con un directorio local o S3, restrinja los permisos:
chmod 600 /opt/outline/.env
sudo chown -R 1001:1001 /opt/outline/data
No configure el bucket de adjuntos con escritura pública. Los enlaces de descarga del frontend deben generarse desde la aplicación, y la Secret Key solo debe colocarse en variables de entorno del lado del servidor.
La base de datos es el objetivo de copia de seguridad más importante. Exporte PostgreSQL a diario y guarde al mismo tiempo .env, el archivo Compose y los adjuntos:
mkdir -p /opt/outline/backups
docker compose exec -T postgres pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip > /opt/outline/backups/outline-$(date +%F).sql.gz
tar -czf /opt/outline/backups/outline-config-$(date +%F).tar.gz .env compose.yml
No guarde las copias de seguridad solo en el mismo VPS. Puede combinar la guía de simulacros de copia de seguridad y restauración en VPS para sincronizar el archivo comprimido fuera del sitio y restaurarlo periódicamente una vez en una instancia temporal.
Antes de actualizar, fije la versión actual de la imagen y haga una copia de seguridad:
docker compose pull
docker compose up -d
docker compose logs --tail=200 outline
Si la migración de la nueva versión falla, no ejecute repetidamente comandos destructivos; conserve los registros, revierta a la etiqueta de imagen anterior y restaure desde la copia de seguridad de la base de datos a una instancia aislada para verificarla.
Confirme si el contenedor de Outline escucha en 3000, si Caddy está haciendo proxy a 127.0.0.1:3000, y verifique:
docker compose ps
curl -I http://127.0.0.1:3000
Revise prioritariamente URL, HTTPS, el dominio de la cookie y la hora del sistema. Cuando la capa de proxy degrada HTTPS a HTTP, el navegador descarta las cookies seguras.
Primero revise los registros de PostgreSQL, la E/S de disco y la memoria del contenedor, y luego compruebe si Redis está healthy. No aumente a ciegas la memoria de Node.js sin datos ni métricas.
- No incluya
.enven Git; guarde los secretos en un gestor de contraseñas. - PostgreSQL, Redis y 3000 solo deben escuchar en localhost o en la red interna de Docker.
- Los callbacks de OAuth solo deben permitir el dominio oficial; desactive el registro de autoservicio innecesario.
- Actualice los parches de seguridad del sistema semanalmente y haga una copia de seguridad de la base de datos antes de cada actualización de Outline.
- Mantenga al menos una copia fuera del sitio de la base de datos y los adjuntos, y realice simulacros de restauración.
- El panel de administración puede colocarse además en una red privada WireGuard, Tailscale o Headscale.
El funcionamiento estable de Outline depende de cuatro cosas: la persistencia de PostgreSQL, la disponibilidad de Redis, callbacks HTTPS correctos y copias de seguridad que realmente se puedan restaurar. Las pruebas personales pueden ejecutar tres contenedores en la misma máquina; la producción de equipo debe al menos incluir la base de datos y los adjuntos en copias de seguridad fuera del sitio, y verificar la ruta de migración y reversión antes de actualizar.