Индекс на дневникаDockup / бележка от практиката
Note / self-host-excalidraw

Как да хоствате Excalidraw самостоятелно през 2026 г.: съвместна работа, TLS и граници на данните

Практическо ръководство за самостоятелно хостване на Excalidraw с Docker, портове, постоянни данни, TLS, сигурност, резервни копия и проблемите, които пречат на използването му в продукционна среда. През 2026 г.

Ако вече сте опитвали да хоствате Excalidraw самостоятелно, вероятно ви е познато това неприятно състояние: интерфейсът се зарежда, но съвместната работа не функционира, защото неговият WebSocket endpoint е неправилен. Пресъздаването на контейнера рядко решава несъответствие между URL адреси, състояние и зависимости.

Това ръководство използва един конкретен критерий за успешно завършване — начертайте и експортирайте диаграма, споделете link за съвместна работа чрез конфигурираната room услуга и свържете повторно втори браузър. Всяко конфигурационно решение се оценява спрямо този критерий, а не спрямо зеления индикатор на контейнера.

Възстановяване на Excalidraw върху празен хост

При базово внедряване на Excalidraw слоят на контейнера е временен и не е необходим data volume. Възстановителният манифест не съдържа server data в базовия image; архивирайте всяка отделна collaboration услуга. Съхранявайте digest-а на image-а, конфигурацията и всички отделно поддържани assets под контрол на промените.

Изтрийте и създайте услугата отново в чиста среда, след което докажете, че клиентът се изгражда отново от фиксирания му image и че отделната room услуга възстановява всяко collaboration state, което обещава да съхранява. Ръководството за преминаване от Git repository към production е подходящият модел тук: изградете артефакта отново и архивирайте само външното state, което действително съществува.

Не обозначавайте дадена директория като persistent, освен ако Excalidraw не записва смислени данни в нея. Празните или неизползвани mounts създават фалшиво усещане за сигурност и карат следващите оператори да търсят state на неправилното място.

Направете карта на Excalidraw, преди да докоснете Docker

HTTP процесът на Excalidraw слуша на порт 80; оставете този порт в application network и публикувайте само platform route. Локалното runtime изискване е отделен room server и storage layer за persistent collaboration. Управлявайте жизнения му цикъл изрично, така че преместването на Excalidraw между хостове да не променя поведението му незабелязано.

Запишете границата като кратък договор: кой отговаря за изискването, кои credentials се използват, какъв timeout е приемлив и как изглежда отказът. След това изпълнете следната транзакция: начертайте и експортирайте диаграма, споделете collaboration link чрез конфигурираната room услуга и свържете повторно втори браузър. Наблюдавайте доставянето на static assets за базовия image, като WebSocket connections и room state принадлежат на отделната collaboration услуга по време на изпълнението, тъй като това натоварване дава по-полезен начален размер от неактивен контейнер.

Production acceptance тест за Excalidraw

Release candidate версията на Excalidraw получава трафик, като изпълни фиксиран сценарий: начертайте и експортирайте диаграма, споделете collaboration link чрез конфигурираната room услуга и свържете повторно втори браузър. Запишете digest-а на image-а, ефективната конфигурация без secrets, public origin и timestamp-ите за този сценарий. Тестовите данни трябва да могат да бъдат изхвърлени, но да са достатъчно реалистични, за да упражнят същия път като потребителите.

Изпълнете го след подмяна на runtime-а, след което изградете услугата отново без server data в базовия image; архивирайте всяка отделна collaboration услуга. Възстановяването е успешно, когато клиентът се изгражда отново от фиксирания си image и отделната room услуга възстановява всяко collaboration state, което обещава да съхранява. Сравнете измерванията на ресурсите за доставянето на static assets за базовия image, като WebSocket connections и room state принадлежат на отделната collaboration услуга, с тези от предишния release и проучете съществените отклонения, преди да продължите.

Накрая изпълнете този контролиран отказ: изпратете безвреден input близо до resource или format limit, свързан с тази граница: интерфейсът се зарежда, но съвместната работа не функционира, защото неговият WebSocket endpoint е неправилен. Проверете дали Excalidraw обяснява отказа, не поврежда съществуващото state и възобновява работа, след като валидното условие се възстанови. Запазете редактиран откъс от log-а и времето за възстановяване. Заедно тези проверки обхващат поведението, устойчивостта на данните и оперативната работа, а не само това дали процесът работи.

Превърнете локалната команда в услуга, която може да се инспектира

Стартирането, подходящо за production, нарочно е скучно: именувано state, изрично зададен порт и никакви secrets в image-а.

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

Примерът е базова конфигурация, а не пълен supporting stack. Потвърдете локалното изискване, преди да разрешите външен достъп: отделен room server и storage layer за persistent collaboration. Проверете ефективните mounts и listener-а, след което опитайте да начертаете и експортирате диаграма, да споделите collaboration link чрез конфигурираната room услуга и да свържете повторно втори браузър. Фиксирайте работещия image, преди да рестартирате отново.

Специфични за Excalidraw решения за сигурност

При Excalidraw ротацията на акаунти не е задачата за hardening, тъй като стандартният image няма account store. Вместо това се съсредоточете върху предположението, че само static image-ът осигурява durable shared-room storage, защитете всички private collaboration rooms и не твърдете, че collaboration е durable, когато е внедрен единствено web image-ът на Excalidraw.

Използвайте HTTPS, optional platform authentication и проверен image digest. Не монтирайте несвързани host data и ограничете натоварването, представено от доставянето на static assets за базовия image, като WebSocket connections и room state принадлежат на отделната collaboration услуга. Чист external client трябва да вижда предвидения build, а неоторизиран client трябва да бъде отхвърлен, преди да достигне контейнера, когато достъпът е ограничен.

Маршрутизирайте Excalidraw, без да заблуждавате относно HTTPS

Издаването на TLS е само половината от маршрута на Excalidraw. Доставяйте клиента през HTTPS и конфигурирайте collaboration endpoints отделно. Изпращайте трафика вътрешно към порт 80 и препращайте външната схема, така че генерираните URL адреси и secure cookies да останат съгласувани.

Използвайте целия сценарий за Excalidraw от чиста network среда, а не само root page. 502 или проблем със сертификата може да бъде изолиран чрез автоматична настройка на домейн и TLS. Ако трафикът достига до процеса и интерфейсът се зарежда, но collaboration не функционира, защото неговият WebSocket endpoint е неправилен, диагностицирайте състоянието там, където възниква, вместо да наслагвате redirects.

Надграждайте Excalidraw, без да гадаете

Полезният service indicator за Excalidraw е успешното изпълнение на „начертайте и експортирайте диаграма, споделете collaboration link чрез конфигурираната room услуга и свържете повторно втори браузър“. Съчетайте този резултат с доставянето на static assets за базовия image, като WebSocket connections и room state принадлежат на отделната collaboration услуга; зелена root page не казва нищо за съвместимостта на output-а или изчерпването на ресурси.

Преди да подмените image-а, отчетете следния риск: версиите на frontend-а, room-server-а и storage-а трябва да се тестват заедно, вместо да приемате, че static client-ът притежава shared data. Тествайте представителни и гранични inputs и с двете версии и запазете стария digest, докато кандидатът не премине проверките. Ако интерфейсът се зарежда, но collaboration не функционира, защото неговият WebSocket endpoint е неправилен, проверете request format-а, поведението на клиента и runtime logs, преди да променяте route или storage настройките.

Използвайте Dockup за platform слоя

One-click template за Excalidraw трябва да кодира image digest-а, порт 80, health timing-а, домейна и TLS. Тъй като базовата услуга е stateless, Dockup може да я пресъздаде директно върху Dockup compute или свързана машина, без да представя празен volume като backup.

След стартирането доставяйте клиента през HTTPS и конфигурирайте collaboration endpoints отделно. Dockup трябва да запази runtime настройките на Excalidraw, докато операторът потвърди това локално изискване: отделен room server и storage layer за persistent collaboration. Проверете следния резултат: начертайте и експортирайте диаграма, споделете collaboration link чрез конфигурираната room услуга и свържете повторно втори браузър. Всяко последващо stateful разширение трябва да декларира собствен mount, secret и restore test, вместо незабелязано да променя значението на базовия template.

Често задавани въпроси

Какво е необходимо на Excalidraw за production внедряване?

Маршрутизирайте контейнера на Excalidraw през порт 80 към един HTTPS origin. Локалното runtime изискване е отделен room server и storage layer за persistent collaboration. Не обявявайте Excalidraw за готов, докато не можете да начертаете и експортирате диаграма, да споделите collaboration link чрез конфигурираната room услуга и да свържете повторно втори браузър.

Кои данни на Excalidraw трябва да бъдат включени в backup?

Стандартният image на Excalidraw няма задължителен mount за application data. Запазете deployment конфигурацията му и архивирайте свързаното state отделно; възстановяването е успешно, когато клиентът се изгражда отново от фиксирания си image и отделната room услуга възстановява всяко collaboration state, което обещава да съхранява.

Необходим ли е HTTPS за Excalidraw зад reverse proxy?

Използвайте HTTPS за публичния origin на Excalidraw и оставете порт 80 във вътрешния route. Приложете правилно настройката на Excalidraw: доставяйте клиента през HTTPS и конфигурирайте collaboration endpoints отделно. При Excalidraw HTTPS защитава credentials или user content при пренос и поддържа съгласувано поведението на клиента, което зависи от origin-а.

Как трябва да се тества надграждане на Excalidraw?

Внедрете candidate image-а на Excalidraw паралелно с текущия и повторете acceptance транзакцията с известен input. Обърнете специално внимание, тъй като версиите на frontend-а, room-server-а и storage-а трябва да се тестват заедно, вместо да приемате, че static client-ът притежава shared data. Стандартният контейнер няма data migration, затова запазете предишния digest, докато проверките на output-а и съвместимостта не преминат.