Як розгорнути Excalidraw на власному сервері у 2026 році: спільна робота, TLS і межі даних
Практичний посібник із self-hosting Excalidraw: Docker, порти, постійні дані, TLS, безпека, резервні копії та проблеми, які блокують використання в production у 2026 році.
Якщо ви вже намагалися розгорнути Excalidraw на власному сервері, вам, напевно, знайомий цей неприємний стан: інтерфейс відображається, але спільна робота не працює, бо його WebSocket endpoint налаштовано неправильно. Повторне створення контейнера рідко усуває розбіжності між URL, станом і залежностями.
У цьому посібнику використовується один конкретний критерій готовності — створити й експортувати діаграму, поділитися посиланням для спільної роботи через налаштований room-сервіс і під’єднати другий браузер. Кожне конфігураційне рішення оцінюється за цим критерієм, а не за зеленим статусом контейнера.
Відновлення Excalidraw на порожньому хості
Для базового розгортання Excalidraw рівень контейнера є одноразовим, і том для даних не потрібен. У базовому образі немає серверних даних для відновлення; створюйте резервні копії окремого сервісу спільної роботи. Зберігайте digest образу, конфігурацію та всі окремо підтримувані assets під контролем змін.
Видаліть і повторно створіть сервіс у чистому середовищі, а потім перевірте, що клієнт відновлюється з образу, зафіксованого за digest, а окремий room-сервіс відновлює весь стан спільної роботи, який він має зберігати. Тут доречна модель із посібника з розгортання репозиторію Git у production: перебудовується artifact, а резервуються лише зовнішні дані, які справді існують.
Не називайте каталог постійним, якщо Excalidraw не записує туди важливі дані. Порожні або невикористовувані mount-и створюють хибне відчуття надійності й змушують наступних операторів шукати стан не там, де він зберігається.
Проаналізуйте Excalidraw перед роботою з Docker
HTTP-процес Excalidraw слухає порт 80; залиште цей порт у мережі застосунку й опублікуйте лише маршрут платформи. Для роботи потрібні окремий room-сервер і рівень storage для постійного стану спільної роботи. Явно визначте життєвий цикл цих компонентів, щоб перенесення Excalidraw між хостами непомітно не змінювало його поведінку.
Зафіксуйте межі у вигляді короткого контракту: хто відповідає за вимогу, які credentials використовуються, який timeout є прийнятним і як проявляється збій. Потім виконайте цю транзакцію: створіть і експортуйте діаграму, поділіться посиланням для спільної роботи через налаштований room-сервіс і під’єднайте другий браузер. Під час виконання перевірте доставлення static assets базового образу, а WebSocket-з’єднання та стан кімнати віднесіть до окремого сервісу спільної роботи, оскільки таке навантаження дає корисніший початковий орієнтир за неактивний контейнер.
Випробування Excalidraw для приймання в production
Кандидат на реліз Excalidraw отримує трафік лише після проходження фіксованого сценарію: створіть і експортуйте діаграму, поділіться посиланням для спільної роботи через налаштований room-сервіс і під’єднайте другий браузер. Зафіксуйте digest образу, ефективну конфігурацію без секретів, публічний origin і часові мітки цього сценарію. Тестові дані мають бути одноразовими, але достатньо реалістичними, щоб перевіряти той самий шлях, яким користуються користувачі.
Запускайте тест після заміни runtime, а потім перебудуйте сервіс: у базовому образі немає серверних даних; створюйте резервні копії окремого сервісу спільної роботи. Відновлення вважається успішним, коли клієнт відновлюється з образу, зафіксованого за digest, а окремий room-сервіс відновлює весь стан спільної роботи, який він має зберігати. Порівняйте вимірювання ресурсів для доставлення static assets базового образу, WebSocket-з’єднань і стану кімнати окремого сервісу спільної роботи з попереднім релізом і дослідіть помітні відхилення до promotion.
Нарешті, відпрацюйте такий контрольований збій: передайте безпечні тестові дані близько до ліміту ресурсу або формату, пов’язаного з цією межею: інтерфейс завантажується, але спільна робота не працює, бо його WebSocket endpoint налаштовано неправильно. Переконайтеся, що Excalidraw пояснює причину збою, не пошкоджує наявний стан і відновлює роботу після повернення коректної умови. Збережіть знеособлений фрагмент логу та час відновлення. Разом ці перевірки охоплюють поведінку, збереження даних і експлуатаційні характеристики, а не лише доступність процесу.
Перетворіть локальну команду на сервіс, який можна перевіряти
Запуск, наближений до production, навмисно нецікавий: іменований state, явний порт і жодних секретів усередині образу.
docker run -d \
--name excalidraw \
--restart unless-stopped \
-p 127.0.0.1:80:80 \
excalidraw/excalidraw:latest
Цей приклад є базовим, а не повним supporting stack. Перед публікацією підтвердьте локальну вимогу: окремий room-сервер і рівень storage для постійного стану спільної роботи. Перевірте фактичні mount-и та listener, а потім створіть і експортуйте діаграму, поділіться посиланням для спільної роботи через налаштований room-сервіс і під’єднайте другий браузер. Перед наступним перезапуском зафіксуйте робочий образ.
Специфічні для Excalidraw рішення з безпеки
Для Excalidraw ротація облікових записів не є основним завданням hardening, оскільки стандартний образ не має сховища облікових записів. Зосередьтеся на тому, щоб не вважати static image самостійним джерелом постійного сховища спільних кімнат, захищайте приватні кімнати спільної роботи й не заявляйте про довговічність спільної роботи, якщо розгорнуто лише вебобраз Excalidraw.
Використовуйте HTTPS, optional authentication на рівні платформи та перевірений digest образу. Не монтуйте сторонні дані хоста й обмежуйте навантаження, яке створюють доставлення static assets базового образу, WebSocket-з’єднання та стан кімнати окремого сервісу спільної роботи. Чистий зовнішній клієнт має бачити потрібну збірку, а неавторизований клієнт — отримувати відмову ще до досягнення контейнера, якщо доступ обмежено.
Маршрутизуйте Excalidraw без хибного уявлення про HTTPS
Випуск TLS — лише половина маршруту Excalidraw. Обслуговуйте клієнт через HTTPS і налаштовуйте endpoints спільної роботи окремо. Передавайте трафік усередині на порт 80 і пробросьте зовнішню схему, щоб згенеровані URL і secure cookies залишалися узгодженими.
Використовуйте повний сценарій Excalidraw із чистої мережі, а не лише кореневу сторінку. Помилку 502 або проблему із сертифікатом можна локалізувати за допомогою автоматичного налаштування домену й TLS. Якщо трафік доходить до процесу, інтерфейс завантажується, але спільна робота не працює, бо його WebSocket endpoint налаштовано неправильно, діагностуйте цю умову саме в місці її виникнення, а не додавайте нові redirects.
Оновлюйте Excalidraw без припущень
Корисний індикатор роботи Excalidraw — успішне виконання сценарію «створити й експортувати діаграму, поділитися посиланням для спільної роботи через налаштований room-сервіс і під’єднати другий браузер». Поєднуйте цей результат із доставленням static assets базового образу, WebSocket-з’єднаннями та станом кімнати окремого сервісу спільної роботи; зелена коренева сторінка нічого не говорить про сумісність output або вичерпання ресурсів.
Перед заміною образу врахуйте цей ризик: версії frontend, room-сервера та storage потрібно тестувати разом, а не припускати, що static client володіє спільними даними. Перевірте типові та граничні вхідні дані в обох версіях і збережіть старий digest, доки кандидат не пройде перевірку. Якщо інтерфейс завантажується, але спільна робота не працює, бо його WebSocket endpoint налаштовано неправильно, перевірте формат запиту, поведінку клієнта та runtime-логи, перш ніж змінювати налаштування маршруту або storage.
Використовуйте Dockup для рівня платформи
Однокліковий шаблон Excalidraw має містити digest образу, порт 80, параметри health check, домен і TLS. Оскільки базовий сервіс є stateless, Dockup може безпосередньо відтворити його на compute-ресурсах Dockup або на під’єднаній машині, не видаючи порожній volume за резервну копію.
Після запуску обслуговуйте клієнт через HTTPS і налаштовуйте endpoints спільної роботи окремо. Dockup має зберегти параметри runtime Excalidraw, а оператор — підтвердити локальну вимогу: окремий room-сервер і рівень storage для постійного стану спільної роботи. Перевірте результат: створіть і експортуйте діаграму, поділіться посиланням для спільної роботи через налаштований room-сервіс і під’єднайте другий браузер. Будь-яке подальше stateful-розширення має явно визначати власний mount, secret і тест відновлення, а не непомітно змінювати призначення базового шаблону.
Поширені запитання
Що потрібно Excalidraw для розгортання в production?
Маршрутизуйте контейнер Excalidraw через порт 80 з одним HTTPS origin. Для роботи потрібні окремий room-сервер і рівень storage для постійного стану спільної роботи. Не вважайте Excalidraw готовим, доки не зможете створити й експортувати діаграму, поділитися посиланням для спільної роботи через налаштований room-сервіс і під’єднати другий браузер.
Які дані Excalidraw потрібно включати до резервної копії?
Стандартний образ Excalidraw не має обов’язкового mount-а з даними застосунку. Збережіть конфігурацію розгортання та створюйте резервні копії під’єднаного стану окремо; відновлення вважається успішним, коли клієнт відновлюється з образу, зафіксованого за digest, а окремий room-сервіс відновлює весь стан спільної роботи, який він має зберігати.
Чи потрібен Excalidraw HTTPS за reverse proxy?
Використовуйте HTTPS для публічного origin Excalidraw, а порт 80 залиште у внутрішньому маршруті. Коректно застосуйте налаштування Excalidraw: обслуговуйте клієнт через HTTPS і налаштовуйте endpoints спільної роботи окремо. Для Excalidraw HTTPS захищає credentials або користувацький контент під час передавання та забезпечує узгоджену поведінку клієнта, чутливу до origin.
Як тестувати оновлення Excalidraw?
Розгорніть кандидатський образ Excalidraw поруч із поточним і повторіть транзакцію приймання з відомими вхідними даними. Зверніть особливу увагу на те, що версії frontend, room-сервера та storage потрібно тестувати разом, а не припускати, що static client володіє спільними даними. Стандартний контейнер не має міграції даних, тому зберігайте попередній digest, доки перевірки output і сумісності не буде пройдено.
