Перейти до змісту

Desktop Installer — поставка DOP кінцевому користувачеві

Статус: 📋 архітектурне рішення зафіксовано, реалізація відкладена (deferred).

Контекст: Dockerfile.demo уже працює — можна передати образ колезі-розробнику через .tar або registry. Цей документ описує наступний крок: зробити поставку для не-технічного користувача (бухгалтер, менеджер), у якого немає досвіду з Docker CLI.


Зміст


Цільовий UX

Користувач (бухгалтер) отримує один файл — DOP-Setup.exe (email / USB / хмарне посилання).

  1. Подвійний клік → Next → Next → Install.
  2. Інсталятор за потреби ставить Docker Desktop, імпортує образ, створює контейнер з persistent volume.
  3. На робочому столі зʼявляється ярлик «DOP» з іконкою продукту.
  4. Клік по ярлику → стартує контейнер (якщо зупинений) → чекає health-check → відкриває браузер на http://localhost:8080 (або Electron-вікно).
  5. Закриття вікна — опційно зупиняє контейнер (або лишає у 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) — викликає docker CLI і відкриває браузер.

Склад інсталятора

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

  1. Перевірка Docker. where docker → якщо 0, стрибок до (3). Інакше:
  2. Встановлення Docker Desktop. Запустити Docker Desktop Installer.exe /quiet + чекати завершення. Можливо знадобиться reboot (WSL2 backend).
  3. Імпорт образу. docker load -i "%INSTALL_DIR%\dop-essentials.tar" — одноразово.
  4. Створення контейнера. Один раз:
    docker create --name dop -p 8080:80 -v dop-data:/app/backend --restart unless-stopped eswf-demo:latest
    docker start dop
    
  5. --restart unless-stopped — контейнер сам піднімається після перезавантаження ОС.
  6. -v dop-data:/app/backend — persistent SQLite (але див. застереження про volume у docker.md).
  7. Копіювання launcher.exe у C:\Program Files\DOP\.
  8. Створення ярлика на робочому столі, що викликає launcher.exe.
  9. Реєстрація 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.demoCMD → перед 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.demolinux/amd64. На Apple Silicon Mac запуститься через Rosetta-емуляцію (повільно).
  • Для Mac-поставки — окремий --platform linux/arm64 build і окремий 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 користувача.