JournalindeksDockup / feltnote
Note / self-host-excalidraw

Sådan self-hoster du Excalidraw i 2026: Samarbejde, TLS og datagrænser

En praktisk guide til self-hosting af Excalidraw med fokus på Docker, porte, persistent data, TLS, sikkerhed, backups og de fejl, der forhindrer produktionsbrug. I 2026.

Hvis du allerede har prøvet at self-hoste Excalidraw, kender du sikkert den frustrerende situation: Brugerfladen vises, men samarbejdet fejler, fordi dens WebSocket-endpoint er forkert. At oprette containeren igen løser sjældent en uoverensstemmelse mellem URL'er, state og afhængigheder.

Denne gennemgang bruger ét konkret kriterium for, hvornår opsætningen er gennemført — tegn og eksportér et diagram, del et samarbejdslink via den konfigurerede room-service, og opret forbindelse igen fra en anden browser. Hvert konfigurationsvalg vurderes ud fra dette kriterium og ikke ud fra et grønt containerbadge.

Gendan Excalidraw på en tom host

I den grundlæggende Excalidraw-deployment kan containerlaget genskabes efter behov, og der kræves ingen datavolumen. Recovery-manifestet indeholder ingen serverdata i det grundlæggende image; tag backup af en eventuel separat collaboration-service. Hold image digest, konfiguration og eventuelle separat vedligeholdte assets under change control.

Slet og genskab servicen i et rent miljø, og verificér derefter, at klienten genskabes fra sit pinned image, og at den separate room-service gendanner den collaboration-state, den lover at bevare. Guiden fra Git-repository til produktion er den relevante model her: Genskab artifactet, og tag kun backup af ekstern state, der faktisk findes.

Mærk ikke en mappe som persistent, medmindre Excalidraw skriver meningsfulde data til den. Tomme eller ubrugte mounts skaber falsk tryghed og får senere operatører til at lede efter state det forkerte sted.

Kortlæg Excalidraw, før du rører ved Docker

Excalidraws HTTP-proces lytter på port 80. Behold den port på application network, og eksponér kun platform-routen. Det lokale runtime-krav er en separat room-server og et storage layer til persistent collaboration. Gør dens lifecycle eksplicit, så en flytning af Excalidraw mellem hosts ikke ændrer funktionaliteten ubemærket.

Skriv grænsen ned som en kort kontrakt: Hvem ejer kravet, hvilken credential bruges, hvilken timeout er acceptabel, og hvordan kommer en fejl til udtryk? Kør derefter denne transaktion: Tegn og eksportér et diagram, del et samarbejdslink via den konfigurerede room-service, og opret forbindelse igen fra en anden browser. Observer levering af statiske assets fra base-imaget, mens WebSocket-forbindelser og room-state hører til den separate collaboration-service under kørslen, fordi denne workload giver et mere nyttigt udgangspunkt for størrelsen end en inaktiv container.

En production acceptance run for Excalidraw

En release candidate for Excalidraw får trafik ved at gennemføre et fast scenarie: Tegn og eksportér et diagram, del et samarbejdslink via den konfigurerede room-service, og opret forbindelse igen fra en anden browser. Registrér image digest, effektiv ikke-hemmelig konfiguration, public origin og timestamps for scenariet. Testdataene bør kunne kasseres, men skal være realistiske nok til at udøve den samme sti som brugerne.

Kør testen efter udskiftning af runtime, og genskab derefter servicen uden serverdata i det grundlæggende image; tag backup af en eventuel separat collaboration-service. Recovery er godkendt, når klienten genskabes fra sit pinned image, og den separate room-service gendanner den collaboration-state, den lover at bevare. Sammenlign resourcemålinger for levering af statiske assets fra base-imaget, mens WebSocket-forbindelser og room-state hører til den separate collaboration-service, med den tidligere release, og undersøg betydelige afvigelser før promotion.

Udfør til sidst denne kontrollerede fejl: Send harmløst input tæt på den ressource- eller formatgrænse, der er forbundet med denne grænse: Brugerfladen indlæses, men samarbejdet fejler, fordi dens WebSocket-endpoint er forkert. Kontrollér, at Excalidraw forklarer fejlen, ikke beskadiger eksisterende state og genoptager funktionen, når den gyldige tilstand vender tilbage. Gem et redigeret loguddrag og recovery-tiden. Tilsammen dækker disse kontroller funktionalitet, holdbarhed og drift — ikke kun procesoppetid.

Gør den lokale kommando til en service, der kan inspiceres

En production-lignende start er med vilje kedelig: navngiven state, eksplicit port og ingen secret i imaget.

docker run -d \
  --name excalidraw \
  --restart unless-stopped \
  -p 127.0.0.1:80:80 \
  excalidraw/excalidraw:latest

Eksemplet er et udgangspunkt og ikke en komplet supporting stack. Bekræft det lokale krav før eksponering: en separat room-server og et storage layer til persistent collaboration. Kontrollér de effektive mounts og listeneren, og prøv derefter at tegne og eksportere et diagram, dele et samarbejdslink via den konfigurerede room-service og oprette forbindelse igen fra en anden browser. Pin det fungerende image før næste restart.

Sikkerhedsbeslutninger, der er specifikke for Excalidraw

Med Excalidraw er rotation af konti ikke den centrale hardening-opgave, fordi standardimaget ikke har noget account store. Fokuser i stedet på ikke at antage, at det statiske image alene leverer persistent storage til delte rooms, og beskyt eventuelle private collaboration-rooms. Påstå ikke, at collaboration er persistent, når der kun er deployet Excalidraws web-image.

Brug HTTPS, valgfri platform-authentication og et gennemgået image digest. Mount ingen uvedkommende hostdata, og sæt en grænse for den workload, der repræsenteres af levering af statiske assets fra base-imaget, mens WebSocket-forbindelser og room-state hører til den separate collaboration-service. En ren ekstern klient bør se det tilsigtede build, mens en uautoriseret klient bør afvises, før den når containeren, når adgangen er begrænset.

Rout Excalidraw uden at give et forkert billede af HTTPS

TLS-udstedelse er kun halvdelen af Excalidraw-routen. Servér klienten over HTTPS, og konfigurér collaboration-endpoints separat. Send trafikken internt til port 80, og videresend den eksterne scheme, så genererede URL'er og secure cookies forbliver konsistente.

Brug hele Excalidraw-scenariet fra et rent netværk — ikke kun root-siden. En 502- eller certifikatfejl kan isoleres med automatisk domæne- og TLS-opsætning. Hvis trafikken når processen, og brugerfladen indlæses, men samarbejdet fejler, fordi dens WebSocket-endpoint er forkert, skal du diagnosticere tilstanden dér, hvor den opstår, i stedet for at stable redirects oven på hinanden.

Opgradér Excalidraw uden at gætte

Den nyttige serviceindikator for Excalidraw er, om følgende gennemføres: “Tegn og eksportér et diagram, del et samarbejdslink via den konfigurerede room-service, og opret forbindelse igen fra en anden browser”. Kombinér resultatet med levering af statiske assets fra base-imaget, mens WebSocket-forbindelser og room-state hører til den separate collaboration-service. En grøn root-side siger intet om output-kompatibilitet eller ressourceudtømning.

Før du udskifter imaget, skal du tage højde for denne risiko: frontend-, room-server- og storage-versioner bør testes samlet i stedet for at antage, at den statiske klient ejer delte data. Test repræsentative inputs og grænseværdier mod begge versioner, og behold det gamle digest, indtil kandidaten består. Hvis brugerfladen indlæses, men samarbejdet fejler, fordi dens WebSocket-endpoint er forkert, skal du inspicere request-format, klientadfærd og runtime-logs, før du ændrer route- eller storage-indstillinger.

Brug Dockup til platformlaget

En one-click Excalidraw-template bør indeholde image digest, port 80, health-timing, domæne og TLS. Fordi baseservicen er stateless, kan Dockup genskabe den direkte på Dockup compute eller en tilknyttet maskine uden at lade som om, at en tom volume er en backup.

Efter lancering skal du servere klienten over HTTPS og konfigurere collaboration-endpoints separat. Dockup bør bevare Excalidraws runtime-indstillinger, mens operatøren bekræfter dette lokale krav: en separat room-server og et storage layer til persistent collaboration. Verificér dette resultat: Tegn og eksportér et diagram, del et samarbejdslink via den konfigurerede room-service, og opret forbindelse igen fra en anden browser. Enhver senere stateful udvidelse skal erklære sit eget mount, sin egen secret og sin egen restore-test i stedet for ubemærket at ændre betydningen af basetemplaten.

Ofte stillede spørgsmål

Hvad kræver Excalidraw i en production-deployment?

Rout Excalidraw-containeren på port 80 gennem én HTTPS-origin. Det lokale runtime-krav er en separat room-server og et storage layer til persistent collaboration. Kald ikke Excalidraw klar, før du kan tegne og eksportere et diagram, dele et samarbejdslink via den konfigurerede room-service og oprette forbindelse igen fra en anden browser.

Hvilke Excalidraw-data hører hjemme i en backup?

Standardimaget til Excalidraw har ikke noget påkrævet mount til applikationsdata. Bevar deployment-konfigurationen, og tag separat backup af forbundet state. Recovery er godkendt, når klienten genskabes fra sit pinned image, og den separate room-service gendanner den collaboration-state, den lover at bevare.

Kræver Excalidraw HTTPS bag en reverse proxy?

Brug HTTPS til Excalidraws offentlige origin, og behold port 80 på den interne route. Anvend Excalidraw-indstillingen korrekt: Servér klienten over HTTPS, og konfigurér collaboration-endpoints separat. For Excalidraw beskytter HTTPS credentials eller brugerindhold under transport og holder origin-følsom klientadfærd konsistent.

Hvordan bør en Excalidraw-opgradering testes?

Deploy kandidat-imaget til Excalidraw ved siden af den aktuelle version, og gentag acceptance-transaktionen med kendte inputs. Vær særligt opmærksom, fordi frontend-, room-server- og storage-versioner bør testes samlet i stedet for at antage, at den statiske klient ejer delte data. Standardcontaineren har ingen datamigrering, så behold det tidligere digest, indtil output- og kompatibilitetskontrollerne er bestået.