Desktop Installer — поставка DOP кінцевому користувачеві¶
Статус: 📋 архітектурне рішення зафіксовано, реалізація відкладена (deferred).
Контекст:
Dockerfile.demoуже працює — можна передати образ колезі-розробнику через.tarабо registry. Цей документ описує наступний крок: зробити поставку для не-технічного користувача (бухгалтер, менеджер), у якого немає досвіду з Docker CLI.
Зміст¶
- Цільовий UX
- Розглянуті варіанти
- Обране рішення — Tarball-based installer
- Архітектура інсталятора
- Роль launcher.exe
- Відкриті питання
- Посилання
Цільовий UX¶
Користувач (бухгалтер) отримує один файл — DOP-Setup.exe (email / USB / хмарне посилання).
- Подвійний клік → Next → Next → Install.
- Інсталятор за потреби ставить Docker Desktop, імпортує образ, створює контейнер з persistent volume.
- На робочому столі зʼявляється ярлик «DOP» з іконкою продукту.
- Клік по ярлику → стартує контейнер (якщо зупинений) → чекає health-check → відкриває браузер на
http://localhost:8080(або Electron-вікно). - Закриття вікна — опційно зупиняє контейнер (або лишає у tray).
Нульова взаємодія з CLI, нульова документація «як запускати».
Розглянуті варіанти¶
| Варіант | Плюси | Мінуси |
|---|---|---|
Docker Hub public (docker pull eswf/dop:latest) |
безкоштовно, проста URL-команда | образ публічний; користувач все одно має робити pull |
| Docker Hub private ($5/міс) | приватний | платний; потрібен docker login |
| GitHub Container Registry (ghcr.io, приватний) | безкоштовно приватний | потрібен docker login з PAT — нереально для бухгалтера |
Власний registry (registry.eswf.dev) |
повний контроль, брендинг, push-оновлення | треба хостити + TLS + auth — доп. інфраструктура |
Tarball у інсталяторі (docker save → docker load) |
нічого не хостити, офлайн-friendly, фіксована версія | інсталятор важчий (~500 MB – 1 GB); оновлення = новий інсталятор |
Обране рішення — Tarball-based installer¶
Обрано: tarball, запакований усередину DOP-Setup.exe, без зовнішнього registry.
Чому саме так¶
- Нуль інфраструктури. Не треба Docker Hub account, registry, TLS, auth-flow. Інсталятор — єдиний артефакт.
- Офлайн-інсталяція. Бухгалтер може встановити без інтернету (у деяких офісах це вимога безпеки).
- Фіксована версія. Користувач отримує рівно той образ, який ми зібрали і протестували. Немає ризику, що
:latestу registry встиг зламатись. - Проста приватність. Образ не потрапляє на публічний registry.
Trade-off¶
- Розмір.
DOP-Setup.exeзростає до ~500 MB – 1 GB (сам tarball — ~600 MB). Передача email/chat — вже складно; треба USB / OneDrive / Google Drive / власний CDN. - Оновлення. Кожен апдейт = новий інсталятор. Для seamless-оновлень знадобиться registry (див. Відкриті питання).
Архітектура інсталятора¶
Стек¶
- Upstream installer framework: Inno Setup (або NSIS). Inno Setup має кращі українські translations і GUI-редактор, NSIS — гнучкіший скриптинг. Обидва безкоштовні.
- Launcher: невеликий standalone
.exe(Node/pkg або Go / Rust single-binary) — викликаєdockerCLI і відкриває браузер.
Склад інсталятора¶
DOP-Setup.exe (NSIS/Inno-bundle)
├── Docker Desktop Installer.exe # з docker.com, ~500 MB — за потреби
├── dop-essentials.tar # `docker save eswf-demo:latest -o ...`, ~600 MB
├── launcher.exe # стартує контейнер + відкриває браузер
├── icon.ico # іконка продукту
└── install.iss # Inno Setup script (або .nsi)
Кроки install.iss¶
- Перевірка Docker.
where docker→ якщо 0, стрибок до (3). Інакше: - Встановлення Docker Desktop. Запустити
Docker Desktop Installer.exe /quiet+ чекати завершення. Можливо знадобиться reboot (WSL2 backend). - Імпорт образу.
docker load -i "%INSTALL_DIR%\dop-essentials.tar"— одноразово. - Створення контейнера. Один раз:
--restart unless-stopped— контейнер сам піднімається після перезавантаження ОС.-v dop-data:/app/backend— persistent SQLite (але див. застереження про volume у docker.md).- Копіювання
launcher.exeуC:\Program Files\DOP\. - Створення ярлика на робочому столі, що викликає
launcher.exe. - Реєстрація uninstaller (Inno робить автоматично).
Uninstall¶
- Зупинити і видалити контейнер (
docker rm -f dop). - Видалити образ (
docker rmi eswf-demo:latest). - Опційно видалити volume з даними (
docker volume rm dop-data) — запитати користувача, щоб не втратити дані випадково. - Docker Desktop лишити (можливо потрібен для інших продуктів).
Роль launcher.exe¶
Мінімальний бінарник (kB, не MB), що виконує при кліку на ярлик:
1. docker inspect -f '{{.State.Running}}' dop
- якщо "true" → пропустити крок 2
- якщо "false" → docker start dop
- якщо error → показати дружнє вікно «Docker Desktop не запущено, запустити?»
і за згодою — `start "" "Docker Desktop.exe"` + wait loop
2. Polling health-check: curl http://localhost:8080/api/health/ кожні 500 ms, timeout 60 s.
3. start http://localhost:8080/ (або відкрити Electron-вікно з webview — див. варіант 2 нижче).
Два шляхи для launcher¶
| Шлях | Плюси | Мінуси |
|---|---|---|
| Тонкий launcher → системний браузер | kB-розмір, нуль залежностей, найпростіший | користувач бачить DOP як закладку у браузері |
| Electron launcher з webview | відчуття «десктопного додатка», брендинг, tray icon | +~70 MB, уже маємо launcher-gui/ + dist-launcher/ESWF-Launcher.exe |
Рекомендація: почати з тонкого launcher (швидше зробити), а Electron-обгортку приєднати у другу хвилю, якщо користувачі захочуть «desktop feel».
Відкриті питання¶
1. Оновлення¶
Поточний план — новий інсталятор на кожен апдейт. Для живого продукту це незручно.
Архітектура auto-update винесена окремо → update-delivery.md: канали stable/beta/dev, manifest на CDN, snapshot-rollback, plugin compat range. Цей installer покриває первинну установку (Phase 1 у roadmap-і), всі подальші апдейти — через update-агента описаного у тому ADR.
2. Persistent volume і міграції¶
dop-dataзберігає SQLite між запусками. Але нова версія образу може мати нові міграції, що не застосувались до збереженої БД (образ засіюється під час build, а не при старті з volume).- Рішення: у
Dockerfile.demo→CMD→ перед supervisord запускатиpython manage.py migrate --noinput(якщо volume змонтовано, накотяться тільки нові). Або окремий bootstrap-скрипт.
2.1 Резервне копіювання даних¶
Окрема фіча продукту, описана в dop/features/backup-recovery.md — UI в Admin Tools, налаштовуваний розклад і destination, підтримка SQLite і PostgreSQL, self-healing при detected corruption. Desktop-інсталятор при установці має виставити default-destination = %USERPROFILE%\Documents\DOP-Backups\ і ввімкнути daily auto-backup.
3. Firewall / антивірус¶
- Windows Defender / корпоративні антивіруси можуть карантинити unsigned
.exe. Рішення: code signing інсталятора і launcher (EV-сертифікат від Sectigo / DigiCert, ~$300–500/рік). - Без підпису Windows SmartScreen показує warning «Unknown publisher».
4. Docker Desktop liceнзування¶
- Docker Desktop безкоштовний для компаній з <250 employees і <$10M revenue. Для більших — платна ліцензія ($5/user/month Business tier).
- Альтернатива: Rancher Desktop або Podman Desktop — повністю безкоштовні. Треба протестувати сумісність наших команд.
5. ARM64 / Apple Silicon¶
- Поточний
Dockerfile.demo—linux/amd64. На Apple Silicon Mac запуститься через Rosetta-емуляцію (повільно). - Для Mac-поставки — окремий
--platform linux/arm64build і окремийDOP-Setup.dmg.
6. Розмір tarball¶
- Поточний demo image ~600 MB. Стиснутий tar (
tar.gz/tar.zst) дасть ~300–400 MB. - Inno Setup уміє LZMA2-compression — можна покластись на це і не стискати tar окремо.
Посилання¶
- docker.md — сам Docker-образ, nginx, supervisord
- build.md — збірка фронтендів
- Inno Setup docs
- Electron launcher-gui/ — вже готовий Electron-лаунчер для dev-запуску всіх сервісів (може стати основою Electron-варіанту desktop launcher)
🔮 Deferred / Ideas¶
Частина 1 — MVP інсталятор для одного користувача¶
Мотивація: відправити бухгалтеру DOP-Setup.exe, щоб він за 5 хвилин мав робочий DOP на машині без єдиної CLI-команди.
Чому відкладено: поточна поставка (docker image через .tar) працює для технічних колег; MVP інсталятор — роботи на 1–2 дні, але не блокує нічого критичного.
Trigger: перший реальний бухгалтер/менеджер, якому треба дати DOP для оцінки.
Частина 2 — Auto-update через private registry¶
Архітектура зафіксована → update-delivery.md. Реалізація відкладена. Trigger: >3 інсталяцій у зовнішніх користувачів, перша скарга на «як оновитись».
Частина 3 — Code signing + SmartScreen-compliant installer¶
Мотивація: без підпису Windows SmartScreen блокує .exe як «Unknown publisher» — непрофесійно виглядає для продажу. Чому відкладено: EV-сертифікат $300–500/рік, потрібен тільки коли почнемо продавати. Trigger: комерціалізація DOP (платні тарифи, реальні продажі).
Частина 4 — Mac / Linux поставка¶
Мотивація: не всі користувачі на Windows. Чому відкладено: 95%+ цільової аудиторії (українські бухгалтери) — Windows. Trigger: запит від не-Windows користувача.