Индекс журналаDockup / заметка с места
Note / self-host-excalidraw

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

Практическое руководство по самостоятельному размещению Excalidraw: Docker, порты, постоянные данные, TLS, безопасность, резервное копирование и проблемы, мешающие использовать сервис в production в 2026 году.

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

В этом руководстве используется один конкретный критерий готовности — нарисовать и экспортировать диаграмму, отправить ссылку для совместной работы через настроенный room-сервис и повторно подключить второй браузер. Каждое решение по конфигурации оценивается относительно этого критерия, а не по зелёному статусу контейнера.

Восстановление Excalidraw на пустом хосте

В базовом развёртывании Excalidraw слой контейнера является одноразовым, а постоянный том не требуется. В базовом образе отсутствуют серверные данные; создайте резервную копию всех отдельных сервисов совместной работы. Храните digest образа, конфигурацию и все отдельно сопровождаемые ресурсы под контролем изменений.

Удалите и пересоздайте сервис в чистом окружении, затем убедитесь, что клиент собирается заново из закреплённого образа, а отдельный room-сервис восстанавливает всё состояние совместной работы, которое он должен сохранять. Здесь применима инструкция по переходу от Git-репозитория к production: пересобирайте артефакт и сохраняйте только действительно существующее внешнее состояние.

Не называйте каталог постоянным, если Excalidraw не записывает в него значимые данные. Пустые или неиспользуемые mount создают ложную уверенность и заставляют следующих операторов искать состояние не там, где оно находится.

Изучите устройство Excalidraw до работы с Docker

HTTP-процесс Excalidraw прослушивает порт 80; оставьте этот порт внутри сети приложения и публикуйте только маршрут платформы. Локальное требование среды выполнения — отдельный room-сервер и слой хранения для постоянного состояния совместной работы. Явно определите их жизненный цикл, чтобы перенос Excalidraw между хостами незаметно не менял поведение системы.

Зафиксируйте границы в виде короткого контракта: кто отвечает за требование, какие credentials используются, какой timeout допустим и как проявляется сбой. Затем выполните эту транзакцию: нарисуйте и экспортируйте диаграмму, отправьте ссылку для совместной работы через настроенный room-сервис и повторно подключите второй браузер. Во время проверки наблюдайте за доставкой static assets базового образа, а WebSocket-подключения и состояние комнат должны относиться к отдельному сервису совместной работы, поскольку такая нагрузка даёт более полезную начальную оценку размера, чем простаивающий контейнер.

Приёмочные испытания Excalidraw в production

Кандидат на релиз Excalidraw получает рабочую нагрузку после успешного выполнения фиксированного сценария: нарисовать и экспортировать диаграмму, отправить ссылку для совместной работы через настроенный room-сервис и повторно подключить второй браузер. Для этого сценария сохраните digest образа, эффективную конфигурацию без секретов, публичный origin и временные метки. Тестовые данные должны быть одноразовыми, но достаточно реалистичными, чтобы проходить тот же путь, что и пользовательские данные.

Запустите проверку после замены среды выполнения, затем пересоберите сервис: в базовом образе отсутствуют серверные данные; создайте резервную копию всех отдельных сервисов совместной работы. Восстановление считается успешным, когда клиент пересобирается из закреплённого образа, а отдельный room-сервис восстанавливает всё состояние совместной работы, которое он должен сохранять. Сравните показатели ресурсов для доставки static assets базового образа, WebSocket-подключений и состояния комнат отдельного сервиса совместной работы с предыдущим релизом и до продвижения сборки разберитесь с существенными отклонениями.

Наконец, выполните контролируемую проверку отказа: отправьте безопасные данные, близкие к ограничению по ресурсам или формату, связанному с этой границей: интерфейс загружается, но совместная работа не запускается, потому что адрес его WebSocket endpoint указан неправильно. Убедитесь, что Excalidraw объясняет причину сбоя, не повреждает существующее состояние и возобновляет работу после восстановления корректного условия. Сохраните обезличенный фрагмент лога и время восстановления. Вместе эти проверки оценивают поведение, сохранность данных и эксплуатационные характеристики, а не только доступность процесса.

Превратите локальную команду в наблюдаемый сервис

Запуск, приближенный к production, намеренно остаётся простым: именованное состояние, явно заданный порт и отсутствие секретов внутри образа.

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

Этот пример — отправная точка, а не полностью готовый supporting stack. Перед публикацией подтвердите локальное требование: отдельный room-сервер и слой хранения для постоянного состояния совместной работы. Проверьте фактические mount и listener, затем нарисуйте и экспортируйте диаграмму, отправьте ссылку для совместной работы через настроенный room-сервис и повторно подключите второй браузер. Перед следующим перезапуском закрепите рабочий образ.

Решения по безопасности, специфичные для Excalidraw

В Excalidraw ротация аккаунтов не является задачей hardening, поскольку стандартный образ не содержит хранилища аккаунтов. Сосредоточьтесь на том, чтобы не считать один статический образ источником постоянного хранилища общих комнат, защищайте закрытые комнаты совместной работы и не заявляйте о постоянном сохранении совместной работы, если развёрнут только web-образ Excalidraw.

Используйте HTTPS, дополнительную аутентификацию на уровне платформы и проверенный digest образа. Не монтируйте посторонние данные с хоста и ограничивайте нагрузку, создаваемую доставкой static assets базового образа, WebSocket-подключениями и состоянием комнат отдельного сервиса совместной работы. Чистый внешний клиент должен видеть нужную сборку, а неавторизованный клиент при ограниченном доступе должен получать отказ до обращения к контейнеру.

Настройте маршрут Excalidraw без ложных обещаний HTTPS

Выпуск TLS-сертификата — лишь половина настройки маршрута Excalidraw. Обслуживайте клиент по HTTPS, а endpoints совместной работы настраивайте отдельно. Направляйте трафик внутри системы на порт 80 и передавайте внешнюю схему, чтобы генерируемые URL и secure cookies оставались согласованными.

Проверьте полный сценарий Excalidraw из чистой сети, а не только корневую страницу. Ошибку 502 или сбой сертификата можно локализовать с помощью автоматической настройки домена и TLS. Если трафик доходит до процесса и интерфейс загружается, но совместная работа не запускается, потому что адрес его WebSocket endpoint указан неправильно, диагностируйте это условие на соответствующем уровне, а не добавляйте новые редиректы.

Обновляйте Excalidraw без догадок

Полезный индикатор работоспособности Excalidraw — успешное выполнение сценария «нарисовать и экспортировать диаграмму, отправить ссылку для совместной работы через настроенный room-сервис и повторно подключить второй браузер». Сопоставляйте этот результат с доставкой static assets базового образа, WebSocket-подключениями и состоянием комнат отдельного сервиса совместной работы; зелёная корневая страница ничего не говорит о совместимости вывода или исчерпании ресурсов.

Перед заменой образа учтите следующий риск: версии frontend, room-сервера и storage следует тестировать вместе, а не предполагать, что статический клиент владеет общими данными. Проверьте типичные и пограничные входные данные в обеих версиях и сохраняйте старый digest, пока кандидат не пройдёт проверку. Если интерфейс загружается, но совместная работа не запускается, потому что адрес его WebSocket endpoint указан неправильно, изучите формат запроса, поведение клиента и runtime logs, прежде чем менять настройки маршрута или storage.

Используйте Dockup для платформенного слоя

Шаблон Excalidraw для запуска в один клик должен содержать digest образа, порт 80, параметры health check, домен и TLS. Поскольку базовый сервис stateless, Dockup может напрямую пересоздать его на Dockup compute или подключённой машине, не выдавая пустой volume за резервную копию.

После запуска обслуживайте клиент по HTTPS, а endpoints совместной работы настраивайте отдельно. Dockup должен сохранить настройки среды выполнения Excalidraw, пока оператор подтверждает локальное требование: отдельный room-сервер и слой хранения для постоянного состояния совместной работы. Проверьте следующий результат: нарисуйте и экспортируйте диаграмму, отправьте ссылку для совместной работы через настроенный room-сервис и повторно подключите второй браузер. Любое последующее расширение с сохранением состояния должно объявлять собственный mount, secret и тест восстановления, не меняя молча смысл базового шаблона.

Часто задаваемые вопросы

Что нужно Excalidraw для развёртывания в production?

Направьте контейнер Excalidraw через один HTTPS origin на порт 80. Локальное требование среды выполнения — отдельный room-сервер и слой хранения для постоянного состояния совместной работы. Не объявляйте Excalidraw готовым, пока не сможете нарисовать и экспортировать диаграмму, отправить ссылку для совместной работы через настроенный room-сервис и повторно подключить второй браузер.

Какие данные Excalidraw нужно включать в резервную копию?

Стандартному образу Excalidraw не требуется mount с данными приложения. Сохраняйте его конфигурацию развёртывания и отдельно создавайте резервные копии подключённого состояния; восстановление считается успешным, когда клиент пересобирается из закреплённого образа, а отдельный room-сервис восстанавливает всё состояние совместной работы, которое он должен сохранять.

Требуется ли Excalidraw HTTPS за reverse proxy?

Используйте HTTPS для публичного origin Excalidraw, а порт 80 оставьте во внутреннем маршруте. Корректно применяйте настройку Excalidraw: обслуживайте клиент по HTTPS, а endpoints совместной работы настраивайте отдельно. Для Excalidraw HTTPS защищает credentials и пользовательский контент при передаче и обеспечивает согласованное поведение клиента, зависящее от origin.

Как тестировать обновление Excalidraw?

Разверните кандидатный образ Excalidraw рядом с текущим и повторите приёмочную транзакцию с известными входными данными. Уделите этому особое внимание, поскольку версии frontend, room-сервера и storage следует тестировать вместе, а не предполагать, что статический клиент владеет общими данными. Стандартный контейнер не выполняет миграцию данных, поэтому сохраняйте предыдущий digest, пока не пройдут проверки вывода и совместимости.