Tutorial

Alojar Excalidraw en un VPS: pizarra colaborativa sin suscripción

Autoalojamiento8 min de lectura5 pasos

Miro, FigJam, Lucidspark: las pizarras SaaS cobran por puesto, almacenan tus mockups en sus servidores y limitan los miembros según el plan. Excalidraw es la alternativa open source (MIT): una pizarra colaborativa en tiempo real de estilo dibujado a mano, cuyos dos componentes — la interfaz React y el servidor WebSocket de sala — se autoalojan en un VPS en dos contenedores Docker. Esta guía muestra cómo desplegarlos, configurar nginx para WebSockets y activar la persistencia de pizarras.

Contenido· Por qué autoalojar Excalidraw en lugar de usar la versión pública1/10
  1. 01Por qué autoalojar Excalidraw en lugar de usar la versión pública
  2. 02Beneficios concretos
  3. 03Arquitectura: dos contenedores, roles distintos
  4. 04Requisitos previos
  5. 05Lista de comprobación de requisitos
  6. 06Desplegar Excalidraw en 5 pasos
  7. 07Persistencia de pizarras: dos enfoques
  8. 08Excalidraw autoalojado vs alternativas SaaS
  9. 09Más allá: SSO y listas de IPs permitidas
  10. 10Integración en un stack autoalojado

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-room es 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 version para 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

  1. 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 | sh

    Verifica que Docker Compose Plugin responde antes de continuar:

    docker compose version
  2. Construir la imagen con tu URL de colaboración

    Clona el repositorio oficial y construye la imagen sustituyendo tu dominio. Reemplaza collab.yourdomain.com con el subdominio que asignes a excalidraw-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.

  3. 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-stack

    Contenido 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 -d
  4. Configurar nginx con las cabeceras WebSocket

    Este es el paso donde fallan en silencio la mayoría de los despliegues: sin las cabeceras Upgrade y Connection, 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.

  5. Probar la colaboración en tiempo real

    Abre https://draw.yourdomain.com en 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

CriterioExcalidraw (autoalojado)MiroFigJam
Coste por usuarioNinguno (solo VPS)De pago por puestoDe pago por puesto
Datos alojados enTu infraestructuraMiro Inc.Adobe / Figma
Miembros simultáneosSolo RAMLimitado por planLimitado por plan
Licencia de softwareMIT (open source)PropietariaPropietaria
AutoalojableSí, dos contenedoresNoNo
Control de accesoIP / SSO / Basic AuthSSO (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.

Una plataforma para tu VPS, dominio y copias de seguridad

ServOrbit centraliza VPS, dominio y copias de seguridad en un único espacio de agencia: despliega Excalidraw para tu equipo y gestiona la infraestructura de tus clientes desde el mismo panel.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva