[{"data":1,"prerenderedAt":258},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-excalidraw-en-un-vps-pizarra-colaborativa-sin-suscripcion-ma-es":6,"promo-bar-likely":249},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-excalidraw-en-un-vps-pizarra-colaborativa-sin-suscripcion-ma-es",{"id":9,"slug":10,"slugs":11,"title":14,"excerpt":15,"readTime":16,"views":17,"isPinned":18,"noindex":18,"publishedAt":19,"updatedAt":20,"category":21,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":190,"ctaBody":191,"ctaButton":192,"ctaUrl":193,"relatedPosts":194},349,"alojar-excalidraw-en-un-vps-pizarra-colaborativa-sin-suscripcion",{"fr":12,"en":13,"ar":13,"es":10},"heberger-excalidraw-vps","heberger-excalidraw-vps-2","Alojar Excalidraw en un VPS: pizarra colaborativa sin suscripción","Despliega Excalidraw en tu VPS: pizarra MIT, tiempo real en tu servidor y lo que sigue en manos de terceros (Firebase, enlaces para compartir).",15,10,false,"2026-09-11T00:00:00+00:00","2026-11-09T20:55:15+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[28],{"id":22,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-excalidraw-vps-poster.svg","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 dice sin rodeos lo que una instalación estándar sigue dejando en servicios de terceros (Firebase, enlaces para compartir).",[34,38,48,51,54,62,81,84,91,131,134,137,146,150,184,187],{"type":35,"title":36,"body":37},"h2","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.\n\nAutoalojar Excalidraw desplaza el perímetro de control a tu propia infraestructura. El tiempo real pasa por **tu** servidor WebSocket, en **tu** dominio; lo que una instalación estándar sigue dejando en un tercero (la escena guardada, los enlaces para compartir) se detalla más abajo. 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.",{"type":39,"title":40,"items":41},"ul","Beneficios concretos",[42,43,44,45,46,47],"**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** — el dibujo en directo permanece en tu infraestructura. La escena guardada y las imágenes de una sala hay que tratarlas aparte (Firebase por defecto): consulta « Lo que funciona de verdad al autoalojar ».","**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.",{"type":35,"title":49,"body":50},"Arquitectura: dos contenedores, roles distintos","Excalidraw separa lo que la mayoría considera una sola herramienta en dos componentes independientes:\n\n- **`excalidraw\u002Fexcalidraw`** — la interfaz React compilada, servida como sitio estático por nginx dentro del contenedor. No ejecuta ningún servidor de aplicación. Las direcciones de sus servicios (sala, Firebase, compartir) son variables `VITE_APP_*` leídas en la **compilación** y grabadas en el bundle JavaScript: cambiarlas en un contenedor ya en ejecución no tiene ningún efecto.\n\n- **`excalidraw\u002Fexcalidraw-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. La escena guardada de una sala no pasa por él (ver más abajo). Su imagen de Docker Hub no se republica desde diciembre de 2023 y su Dockerfile de origen parte de Node 12: mantenlo detrás de nginx, en la red de Docker, sin puerto publicado.\n\nConsecuencia práctica: la imagen Docker oficial se construyó con las direcciones de excalidraw.com. Para apuntar a tu propio `excalidraw-room`, debes **construir tu propia imagen** tras modificar `VITE_APP_WS_SERVER_URL` en `.env.production`.",{"type":35,"title":52,"body":53},"Requisitos previos","El VPS Solo 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.\n\n**Lo que necesitas antes de empezar:**",{"type":39,"title":55,"items":56},"Lista de comprobación de requisitos",[57,58,59,60,61],"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.",{"type":63,"title":64,"steps":65},"steps","Desplegar Excalidraw en 5 pasos",[66,69,72,75,78],{"title":67,"body":68},"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:\n\n```bash\ncurl -fsSL https:\u002F\u002Fget.docker.com | sh\n```\n\nVerifica que Docker Compose Plugin responde antes de continuar:\n\n```bash\ndocker compose version\n```",{"title":70,"body":71},"Construir la imagen con tu URL de colaboración","Clona el repositorio oficial y fija la dirección de la sala **en el archivo `.env.production` del repositorio** antes de construir. Reemplaza `collab.yourdomain.com` con el subdominio que asignes a `excalidraw-room`:\n\n`git clone https:\u002F\u002Fgithub.com\u002Fexcalidraw\u002Fexcalidraw.git`\n`cd excalidraw`\n`sed -i 's|^VITE_APP_WS_SERVER_URL=.*|VITE_APP_WS_SERVER_URL=https:\u002F\u002Fcollab.yourdomain.com|' .env.production`\n`docker build -t my-excalidraw:latest .`\n\n¿Por qué no `--build-arg`? El Dockerfile de origen no declara ningún `ARG` para las variables `VITE_APP_*`: un `--build-arg VITE_APP_WS_SERVER_URL=…` nunca llega al comando de build, la imagen se construye con normalidad y sigue apuntando al servidor de Excalidraw. Además, el `.dockerignore` de origen solo admite `.env.development` y `.env.production`, así que un `.env.production.local` se ignoraría. La dirección queda grabada en el bundle, por lo que cambiar de dominio obliga a reconstruir.\n\nComprueba el resultado: `docker run --rm --entrypoint sh my-excalidraw:latest -c \"grep -rl oss-collab.excalidraw.com \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml || echo limpio\"` debe mostrar `limpio`. La imagen oficial `excalidraw\u002Fexcalidraw` sirve para pruebas locales, pero apunta a los servicios públicos de Excalidraw.",{"title":73,"body":74},"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:\n\n```bash\nmkdir ~\u002Fexcalidraw-stack && cd ~\u002Fexcalidraw-stack\n```\n\nContenido del `docker-compose.yml`:\n\n```bash\nservices:\n  excalidraw:\n    image: my-excalidraw:latest\n    restart: unless-stopped\n    networks:\n      - excalidraw\n\n  excalidraw-room:\n    image: excalidraw\u002Fexcalidraw-room:latest\n    environment:\n      - CORS_ORIGIN=https:\u002F\u002Fdraw.yourdomain.com\n    restart: unless-stopped\n    networks:\n      - excalidraw\n\nnetworks:\n  excalidraw:\n```\n\nArranca el stack:\n\n```bash\ndocker compose up -d\n```",{"title":76,"body":77},"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.\n\nBloque nginx para el frontend de Excalidraw (`draw.yourdomain.com`):\n\n```bash\nserver {\n    listen 443 ssl;\n    server_name draw.yourdomain.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002Fexcalidraw:80;\n        proxy_set_header Host $host;\n    }\n}\n```\n\nBloque nginx para el servidor de sala (`collab.yourdomain.com`):\n\n```bash\nserver {\n    listen 443 ssl;\n    server_name collab.yourdomain.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002Fexcalidraw-room:80;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_read_timeout 86400s;\n    }\n}\n```\n\nRecarga nginx (`nginx -s reload`) tras colocar los bloques.",{"title":79,"body":80},"Probar la colaboración en tiempo real","Abre `https:\u002F\u002Fdraw.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.\n\nDibuja 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`).\n\nAbre después la pestaña de red del navegador: la conexión en tiempo real debe apuntar a `collab.yourdomain.com`, nunca a oss-collab.excalidraw.com. Lo que recibe Firebase se trata en la sección siguiente.",{"type":35,"title":82,"body":83},"Lo que funciona de verdad al autoalojar","Seamos precisos: « dos contenedores y listo » es el atajo que más repite este tipo de guía. El hilo paraguas del repositorio de origen (excalidraw\u002Fexcalidraw, issue n.º 1772, abierto desde junio de 2020 y aún activo en octubre de 2026) resume tres muros, que hemos contrastado con el código y los archivos `.env` del repositorio.\n\n**Muro n.º 1 — las direcciones se fijan al construir.** Las direcciones del servidor de colaboración, del servicio para compartir y del proyecto Firebase son variables `VITE_APP_*` que Vite lee durante el build. La imagen oficial `excalidraw\u002Fexcalidraw` se construyó con los valores de `.env.production`: por tanto sigue hablando con los servicios de excalidraw.com. Una variable pasada a `docker run` no cambia nada, y el Dockerfile de origen no declara ningún `ARG` para trasladar una al build.\n\n**Muro n.º 2 — la colaboración es medio local.** El tiempo real (quién dibuja qué, en directo) pasa por `excalidraw-room`, que alojas tú. Pero la escena guardada y las imágenes pegadas en una sala van a Firebase: el código llama a `saveToFirebase` y `saveFilesToFirebase`, con la configuración de `VITE_APP_FIREBASE_CONFIG`. Mientras esa variable conserve el valor de origen, esos datos (cifrados en el navegador con la clave de la sala) se almacenan en el proyecto Firebase de Excalidraw, no en el tuyo. Eso concilia los testimonios contradictorios del hilo: uno comprueba que con `VITE_APP_FIREBASE_CONFIG='{}'` la colaboración falla, otro que Jitsi Meet retiró la parte de Firebase y el tiempo real funciona solo con la sala. El directo prescinde de Firebase; guardar y retomar, no.\n\n**Muro n.º 3 — los enlaces para compartir exigen un servidor de almacenamiento que el proyecto no publica.** Un enlace `#json=` se crea con una petición a `VITE_APP_BACKEND_V2_POST_URL` y se relee mediante `VITE_APP_BACKEND_V2_GET_URL`, por defecto json.excalidraw.com. El hilo menciona reescrituras de la comunidad (una en Next.js sobre S3, otra sobre almacenamiento compatible con S3), pero no señala ninguna como oficial.",{"type":39,"title":85,"items":86},"Tres montajes posibles, y lo que cada uno deja en un tercero",[87,88,89,90],"**Montaje A — solo la sala (el de esta guía).** Cambias `VITE_APP_WS_SERVER_URL` y nada más. El dibujo en directo transita por tu servidor; la escena guardada y las imágenes de las salas siguen escribiéndose en el Firebase de Excalidraw. Aceptable para pizarras poco sensibles, no para presentarlo como « nada en un tercero ».","**Montaje B — sala + tu propio proyecto Firebase.** Creas un proyecto Firebase propio y pones su configuración JSON en `VITE_APP_FIREBASE_CONFIG`. El código solo lee esa variable; no lo hemos desplegado de punta a punta, y Firebase sigue siendo un servicio de Google, no autoalojamiento en sentido estricto.","**Montaje C — instancia en solitario.** Sirves la interfaz sola, sin sala ni enlace: cada uno dibuja, exporta a `.excalidraw` o a imagen, y archiva los archivos en tu infraestructura. Nada sale hacia un tercero por colaboración, porque no la hay.","**Lo que no existe en el lado oficial.** Ningún servidor de almacenamiento abierto para los enlaces `#json=`, ni una opción que traslade todo el perímetro a tu dominio con una sola variable en ejecución. Si tu requisito es « ningún dato en un tercero » con colaboración y enlaces, la respuesta honesta es un trabajo de adaptación o de fork, no una instalación.",{"type":92,"title":93,"headers":94,"rows":98},"comparison","Variable → función → qué se rompe sin ella",[95,96,97],"Variable","Función","Qué se rompe sin ella",[99,103,107,111,115,119,123,127],[100,101,102],"`VITE_APP_WS_SERVER_URL` (compilación)","Dirección del servidor de tiempo real Socket.IO (`excalidraw-room`).","Valor de origen conservado: tus sesiones pasan por oss-collab.excalidraw.com. Dirección inalcanzable: la colaboración no se establece.",[104,105,106],"`VITE_APP_FIREBASE_CONFIG` (compilación)","Configuración JSON del proyecto Firebase: escena guardada de una sala e imágenes pegadas.","Valor de origen: esos datos quedan en Excalidraw. Vacía o inválida (`{}` incluida): guardar y retomar una sala falla y, según un testimonio del hilo, la colaboración también. Un JSON ilegible registra `Error JSON parsing firebase config`.",[108,109,110],"`VITE_APP_BACKEND_V2_POST_URL` (compilación)","Creación de un enlace `#json=` (envío de la escena cifrada).","Valor de origen: el enlace se crea en json.excalidraw.com. Dirección sin servidor compatible: la creación del enlace falla.",[112,113,114],"`VITE_APP_BACKEND_V2_GET_URL` (compilación)","Relectura de un enlace `#json=` al abrirlo.","Valor de origen: el enlace se lee en Excalidraw. Dirección sin servidor compatible: la apertura del enlace falla.",[116,117,118],"`VITE_APP_DISABLE_SENTRY` (compilación)","Desactiva el envío de informes de errores a Sentry.","No se rompe nada; sin ella, la aplicación puede enviar informes de errores a un tercero. El script `build:app:docker` de origen ya la fija en `true`.",[120,121,122],"`VITE_APP_DISABLE_PREVENT_UNLOAD` (compilación)","Suprime el aviso antes de salir de una sala cuyo guardado no ha terminado.","No se rompe nada, pero cerrar la pestaña ya no avisa. Resérvala para depurar.",[124,125,126],"`CORS_ORIGIN` (ejecución, `excalidraw-room`)","Origen autorizado a abrir una conexión con el servidor de sala.","Ausente: el valor por defecto es `*`, cualquier página web puede conectarse. Fija `https:\u002F\u002Fdraw.yourdomain.com`.",[128,129,130],"`PORT` (ejecución, `excalidraw-room`)","Puerto de escucha del servidor de sala.","Ausente: escucha en el puerto 80 fuera del modo desarrollo, que es lo que suponen los bloques nginx de esta guía. Si lo cambias, `proxy_pass` debe seguirlo.",{"type":35,"title":132,"body":133},"Comprobar quién recibe qué","La única forma de saber qué sale de tu instancia es mirarlo. Abre la pestaña de red del navegador, inicia una sesión de colaboración, dibuja, pega una imagen y crea un enlace para compartir. Se leen tres familias de destinos: tu subdominio de sala (el tiempo real, esperado); los dominios `googleapis.com` de Firebase (escena e imágenes guardadas, esperado con la configuración de origen, a eliminar si pensabas lo contrario); json.excalidraw.com (enlaces para compartir). Esta inspección es la prueba de aceptación del montaje elegido: sin ella, « en mi servidor » sigue siendo una hipótesis.\n\nRecuerda por último que el servidor de sala no autentica a nadie: `CORS_ORIGIN` limita qué páginas web pueden conectarse, no qué personas. La identidad de los participantes se resuelve delante de la interfaz (Basic Auth, SSO), como se describe más abajo.",{"type":35,"title":135,"body":136},"Solución de problemas: la colaboración no arranca, o no recuerda nada","Los síntomas siguientes se deducen del código y del hilo de origen; no se reproduce ningún mensaje salvo los leídos en el repositorio.",{"type":39,"title":138,"items":139},"Síntomas, causas, remedios",[140,141,142,143,144,145],"**La sesión va a oss-collab.excalidraw.com (pestaña de red) aunque construiste tu imagen.** Causa: la dirección no se tuvo en cuenta al construir (`--build-arg` sin efecto, `.env.production.local` ignorado por el `.dockerignore`). Remedio: editar `.env.production`, reconstruir y repetir la comprobación `grep` del paso 2. Un cambio de dominio sigue la misma regla.","**El navegador ve rechazada la conexión con la sala.** Causa frecuente tras fijar `CORS_ORIGIN`: el origen no coincide exactamente con el de la página (esquema `http` en lugar de `https`, puerto, barra final). Remedio: el valor debe ser el origen exacto de la interfaz, por ejemplo `https:\u002F\u002Fdraw.yourdomain.com`.","**Los trazos aparecen en directo, pero un participante que se une más tarde, o tras un reinicio de la sala, no recupera el contenido ni las imágenes.** Causa: la escena y las imágenes se guardan a través de Firebase, no por `excalidraw-room`, que no retiene nada. Si `VITE_APP_FIREBASE_CONFIG` está vacía o inalcanzable, nada se relee. Remedio: elegir el montaje A o B de arriba.","**Aviso `Error JSON parsing firebase config. Supplied value:` en la consola del navegador.** Causa: `VITE_APP_FIREBASE_CONFIG` no es un JSON válido, casi siempre por comillas mal protegidas o un salto de línea en el archivo. Remedio: JSON en una sola línea, entre comillas simples en `.env.production`, como en el archivo de origen.","**Compartir por enlace falla, o el enlace generado apunta a json.excalidraw.com.** Causa: `VITE_APP_BACKEND_V2_POST_URL` y `VITE_APP_BACKEND_V2_GET_URL` no se cambiaron, o apuntan a un servidor que no implementa la API esperada. Remedio: conservar el valor por defecto con conocimiento de causa, o intercambiar archivos `.excalidraw`.","**Error de cifrado o de generación de clave en una red local con `http:\u002F\u002F`.** Causa: la API de cifrado del navegador (`window.crypto`) solo se expone en un contexto seguro; el hilo de origen señala esta trampa para el autoalojamiento en red local. Remedio: servir la interfaz en HTTPS (o en `localhost`), como exige el requisito TLS de arriba.",{"type":147,"title":148,"body":149},"tip","Persistencia de pizarras: lo que se guarda de verdad","Por defecto, `excalidraw-room` es completamente sin estado: si el servidor se reinicia, el relé arranca de cero. La escena guardada de una sala vive en otro sitio (Firebase, ver más arriba), y cada participante conserva además su dibujo en el `localStorage` de su navegador.\n\n**Opción 1 — Exportación manual de archivos `.excalidraw`.** El menú de exportación de la interfaz produce un archivo `.excalidraw` (o una imagen) que se puede reimportar en cualquier momento. Excalidraw no expone ninguna API de exportación que llamar desde un cron: es un gesto hecho en el navegador, cuyo archivo depositas luego en un volumen o un repositorio git.\n\n**Opción 2 — Bucket S3 compatible para archivar.** ServOrbit ofrece almacenamiento de objetos compatible con S3. Copia allí los archivos exportados con la herramienta que prefieras (`rclone`, `aws s3 cp`); la restauración consiste en reimportar el último archivo. El propio Excalidraw no escribe en S3.",{"type":92,"title":151,"headers":152,"rows":157},"Excalidraw autoalojado vs alternativas SaaS",[153,154,155,156],"Criterio","Excalidraw (autoalojado)","Miro","FigJam",[158,162,167,171,175,179],[159,160,161,161],"Coste por usuario","Ninguno (solo VPS)","De pago por puesto",[163,164,165,166],"Datos alojados en","Tu infraestructura (tiempo real); Firebase de Excalidraw por defecto para la escena guardada","Miro Inc.","Adobe \u002F Figma",[168,169,170,170],"Miembros simultáneos","Solo RAM","Limitado por plan",[172,173,174,174],"Licencia de software","MIT (open source)","Propietaria",[176,177,178,178],"Autoalojable","Parcialmente: dos contenedores, más Firebase y enlaces para compartir por resolver","No",[180,181,182,183],"Control de acceso","IP \u002F SSO \u002F Basic Auth","SSO (planes Pro)","SSO (planes Edu+)",{"type":35,"title":185,"body":186},"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.\n\n**HTTP Basic Auth a través de nginx.** Añade una directiva `auth_basic` delante del bloque `location \u002F` 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.\n\n**Allowlist de IP.** Si los colaboradores se conectan desde IPs fijas o una VPN corporativa, un bloque `allow`\u002F`deny` en nginx basta para cerrar la instancia al resto de Internet:\n\n```bash\nallow 203.0.113.0\u002F24;\nallow 198.51.100.42;\ndeny all;\n```\n\n**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.",{"type":35,"title":188,"body":189},"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.\n\nEsta 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.com reúne VPS, dominio y copias de seguridad en tu cuenta: despliega Excalidraw para tu equipo desde tu área de cliente.","Descubrir la oferta para agencias","\u002Fsolutions\u002Fagences",[195,220,239],{"id":196,"slug":197,"slugs":198,"title":202,"excerpt":203,"readTime":204,"views":205,"isPinned":18,"noindex":18,"publishedAt":206,"updatedAt":207,"category":208,"categories":214,"featuredImage":29,"bgImage":30,"posterImage":216,"relatedSolution":217},193,"alojar-penpot-en-un-vps",{"fr":199,"en":200,"ar":201,"es":197},"self-host-penpot-vps","self-host-penpot-open-source-figma-alternative-on-your-vps","استضافة-penpot-على-vps-بديل-figma-مفتوح-المصدر","Alojar Penpot en un VPS: alternativa a Figma open-source","Despliegue Penpot en un VPS ServOrbit: diseño colaborativo — prototipado vectorial, componentes, handoff a desarrollo — sin suscripción a Figma ni datos en terceros.",12,1,"2026-07-27T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":209,"name":210,"slug":211,"color":212,"icon":213},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[215],{"id":209,"name":210,"slug":211,"color":212,"icon":213},"\u002Fblog\u002Fcovers\u002Fself-host-penpot-vps-poster.svg",{"categorySlug":218,"appSlug":219},"colaboracion-productividad","penpot",{"id":221,"slug":222,"slugs":223,"title":227,"excerpt":228,"readTime":229,"views":230,"isPinned":18,"noindex":18,"publishedAt":231,"updatedAt":232,"category":233,"categories":234,"featuredImage":29,"bgImage":30,"posterImage":236,"relatedSolution":237},76,"alojar-mattermost-en-un-vps",{"fr":224,"en":225,"ar":226,"es":222},"heberger-mattermost","host-mattermost-on-your-own-vps","استضافة-mattermost-على-خادم-vps-الخاص-بك","Alojar Mattermost en su propio VPS","Guía completa 2026: despliegue Mattermost v10\u002Fv11 en VPS con Docker, PostgreSQL, SSL, integraciones y copias de seguridad. Alternativa self-hosted a Slack.",9,5,"2026-04-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},[235],{"id":22,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-mattermost-poster.svg",{"categorySlug":24,"appSlug":238},"mattermost",{"id":240,"slug":241,"slugs":242,"title":246,"excerpt":247,"readTime":248,"views":209,"isPinned":18,"noindex":249,"publishedAt":250,"updatedAt":251,"category":252,"categories":253,"featuredImage":29,"bgImage":30,"posterImage":255,"relatedSolution":256},302,"planka-tablero-kanban-open-source-autoalojado-en-vps",{"fr":243,"en":244,"ar":245,"es":241},"self-host-planka-vps","planka-self-host-an-open-source-kanban-board-on-your-vps","planka-نشر-لوحة-kanban-مفتوحة-المصدر-على-vps","Planka: tablero Kanban open-source autoalojado en VPS","Planka: tablero Kanban autoalojado para equipos de desarrollo. Alternativa open source a Trello (AGPL), ~12 k estrellas en GitHub — despliéguelo en su VPS en minutos.",3,true,"2026-01-13T00:00:00+00:00","2026-11-04T16:30:27+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},[254],{"id":22,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fself-host-planka-vps-poster.svg",{"categorySlug":218,"appSlug":257},"planka",1794270521962]