Por qué autoalojar Excalidraw en lugar de usar la versión pública
La versión pública en excalidraw.com funciona bien para bocetos rápidos en solitario. Enruta las sesiones de colaboración en tiempo real a través de un servidor gestionado por Excalidraw s.r.o. Es aceptable para una lluvia de ideas puntual. Lo es mucho menos cuando las pizarras contienen mockups de flujos de clientes, diagramas de arquitectura de sistemas internos o wireframes de proyectos bajo NDA.
Autoalojar Excalidraw desplaza el perímetro de control a tu propia infraestructura. Las sesiones pasan por tu servidor WebSocket, en tu dominio, sin transitar por un tercero. Tú decides quién se conecta — mediante allowlist de IP, SSO OIDC o HTTP Basic Auth delante de nginx. Y como los dos componentes están publicados bajo licencia MIT, no se aplica ninguna restricción comercial independientemente del número de clientes o colaboradores que trabajen en la instancia.
Beneficios concretos
- Cero suscripción de software — los dos componentes (interfaz y servidor de colaboración) son MIT. Pagas el VPS, nada más.
- Confidencialidad de los mockups — las sesiones de dibujo permanecen en tu infraestructura. Ningún archivo de diseño transita por un tercero.
- Acceso bajo tu control — allowlist de IP, SSO OIDC o HTTP Basic Auth delante de nginx según el nivel de aislamiento requerido.
- Sesiones y miembros ilimitados — sin límite por plan; el único límite es la RAM del servidor, y
excalidraw-roomes un servicio Node.js ligero. - Persistencia opcional — monta un volumen Docker o conecta un bucket S3 compatible para archivar pizarras exportadas como JSON.
- Integración en un stack autoalojado — una instancia de Excalidraw junto a Penpot, Mattermost o Docmost cierra el perímetro SaaS de una agencia completa.
Arquitectura: dos contenedores, roles distintos
Excalidraw separa lo que la mayoría considera una sola herramienta en dos componentes independientes:
- excalidraw/excalidraw — la interfaz React compilada, servida como sitio estático por nginx dentro del contenedor. No ejecuta ningún servidor de aplicación. Su única restricción es la variable VITE_APP_WS_SERVER_URL, que debe apuntar a tu servidor de sala en el momento de la compilación de la imagen. Esta variable queda grabada en el bundle JavaScript: cambiarla en un contenedor ya en ejecución no tiene ningún efecto.
- excalidraw/excalidraw-room — un servidor Node.js Socket.IO que retransmite en memoria los eventos de dibujo entre los participantes de una misma sesión. Es sin estado: no persiste nada y olvida todo al reiniciar. Los dibujos viven en el localStorage del navegador o se exportan manualmente.
Consecuencia práctica: la imagen Docker oficial tiene incrustada la URL del servidor de colaboración de Excalidraw. Para redirigir a tu propio excalidraw-room, debes construir tu propia imagen con VITE_APP_WS_SERVER_URL apuntando a tu dominio.
Requisitos previos
El VPS Start de ServOrbit (2 vCPU, 4 GB RAM) cubre el caso estándar: la interfaz estática tiene carga casi nula, y excalidraw-room consume menos de 256 MB en condiciones normales. Con diez colaboradores simultáneos te quedarás muy por debajo de la mitad de la RAM disponible.
Lo que necesitas antes de empezar:
Lista de comprobación de requisitos
- Un VPS con al menos 1 vCPU y 512 MB de RAM (1 GB recomendado para un equipo).
- Docker Engine y Docker Compose Plugin instalados (
docker compose versionpara verificar). - Un nombre de dominio apuntando a la IP del VPS — sin TLS los WebSockets quedan bloqueados en los navegadores modernos.
- Acceso SSH root o un usuario con derechos
sudo. - Un certificado TLS válido — ServOrbit configura Let's Encrypt automáticamente.
Desplegar Excalidraw en 5 pasos
Crear el VPS e instalar Docker
Aprovisiona un VPS Ubuntu 24.04 desde tu panel de ServOrbit. Una vez conectado por SSH, si Docker no está instalado aún, ejecuta:
curl -fsSL https://get.docker.com | shVerifica que Docker Compose Plugin responde antes de continuar:
docker compose versionConstruir la imagen con tu URL de colaboración
Clona el repositorio oficial y construye la imagen sustituyendo tu dominio. Reemplaza
collab.yourdomain.comcon el subdominio que asignes aexcalidraw-room:git clone https://github.com/excalidraw/excalidraw.git cd excalidraw docker build \ --build-arg VITE_APP_WS_SERVER_URL=wss://collab.yourdomain.com \ -t my-excalidraw:latest .Este paso graba la URL del servidor WebSocket en el bundle JavaScript. Si cambias de dominio más adelante, tendrás que reconstruir la imagen.
Escribir el archivo docker-compose.yml
Crea un directorio de trabajo y escribe el siguiente archivo. Ambos servicios escuchan internamente; nginx (siguiente paso) es el único punto de entrada público:
mkdir ~/excalidraw-stack && cd ~/excalidraw-stackContenido del
docker-compose.yml:services: excalidraw: image: my-excalidraw:latest restart: unless-stopped networks: - excalidraw excalidraw-room: image: excalidraw/excalidraw-room:latest restart: unless-stopped networks: - excalidraw networks: excalidraw:Arranca el stack:
docker compose up -dConfigurar nginx con las cabeceras WebSocket
Este es el paso donde fallan en silencio la mayoría de los despliegues: sin las cabeceras
UpgradeyConnection, el navegador abre una conexión HTTP normal en lugar de un WebSocket, y la colaboración parece no funcionar sin ningún mensaje de error visible.Bloque nginx para el frontend de Excalidraw (
draw.yourdomain.com):server { listen 443 ssl; server_name draw.yourdomain.com; location / { proxy_pass http://excalidraw:80; proxy_set_header Host $host; } }Bloque nginx para el servidor de sala (
collab.yourdomain.com):server { listen 443 ssl; server_name collab.yourdomain.com; location / { proxy_pass http://excalidraw-room:80; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400s; } }Recarga nginx (
nginx -s reload) tras colocar los bloques.Probar la colaboración en tiempo real
Abre
https://draw.yourdomain.comen dos pestañas o dos navegadores distintos. En la barra de herramientas, haz clic en Live collaboration y crea una sesión. Copia el enlace de sesión en la segunda pestaña.Dibuja algo en la primera pestaña: el trazo debe aparecer en la segunda en tiempo real. Si no aparece, revisa primero las cabeceras WebSocket en nginx (las herramientas de red del navegador muestran si la conexión ascendió a
101 Switching Protocols).
Persistencia de pizarras: dos enfoques
Por defecto, excalidraw-room es completamente sin estado. Si el servidor se reinicia, la sesión en curso se pierde — pero cada participante conserva localmente lo que dibujó en localStorage.
Opción 1 — Exportación JSON automática. Configura un cron job o script que llame a la API de exportación de Excalidraw y guarde los archivos .excalidraw en un volumen Docker. Estos archivos pueden reimportarse en cualquier momento desde la interfaz.
Opción 2 — Bucket S3 compatible. ServOrbit ofrece almacenamiento de objetos compatible con S3. Conecta tu bucket como destino de archivo para las exportaciones; la restauración tras un fallo consiste en reimportar el último archivo guardado.
Excalidraw autoalojado vs alternativas SaaS
Desplace la tabla
| Criterio | Excalidraw (autoalojado) | Miro | FigJam |
|---|---|---|---|
| Coste por usuario | Ninguno (solo VPS) | De pago por puesto | De pago por puesto |
| Datos alojados en | Tu infraestructura | Miro Inc. | Adobe / Figma |
| Miembros simultáneos | Solo RAM | Limitado por plan | Limitado por plan |
| Licencia de software | MIT (open source) | Propietaria | Propietaria |
| Autoalojable | Sí, dos contenedores | No | No |
| Control de acceso | IP / SSO / Basic Auth | SSO (planes Pro) | SSO (planes Edu+) |
Más allá: SSO y listas de IPs permitidas
Para agencias con requisitos estrictos de confidencialidad, exponer Excalidraw en un subdominio público no siempre es aceptable. Dos configuraciones habituales refuerzan el acceso sin modificar Excalidraw.
HTTP Basic Auth a través de nginx. Añade una directiva auth_basic delante del bloque location / del frontend. Cualquier persona que intente abrir la interfaz deberá autenticarse antes de que cargue la aplicación React. Sencillo de implementar y suficiente para proyectos internos.
Allowlist de IP. Si los colaboradores se conectan desde IPs fijas o una VPN corporativa, un bloque allow/deny en nginx basta para cerrar la instancia al resto de Internet:
allow 203.0.113.0/24;
allow 198.51.100.42;
deny all;SSO OIDC a través de un proxy reverso autenticador. Para equipos que ya disponen de un proveedor de identidad (Keycloak, Authelia, Authentik), un proxy como Oauth2-Proxy o Authelia delante de nginx delega la autenticación al SSO existente. Excalidraw no necesita saber que existe una capa de autenticación adicional.
Integración en un stack autoalojado
Excalidraw se integra de forma natural en un conjunto de herramientas autoalojadas. Si ya has desplegado Mattermost para la comunicación del equipo, puedes pegar un enlace de sesión de Excalidraw en un canal e invitar a los colaboradores a unirse a la pizarra directamente. Si Penpot cubre el diseño de alta fidelidad, Excalidraw gestiona el trabajo previo — wireframes rápidos, diagramas de flujo y sesiones de lluvia de ideas — antes de que los diseños entren en Penpot.
Esta complementariedad es el argumento real frente a los SaaS: cada herramienta permanece dentro de su área de competencia, sin una suscripción de plataforma que factura por funcionalidades que no necesitas.