DinD HostingПосібник
ENУК
Огляд/Посібник/Керування платформою
РОЗДІЛ 15

Експлуатація

Для того, хто відповідає за хост Linux. Три команди піднімають платформу; усе, що має зберігатися, лежить в одному каталозі, який можна скопіювати будь-яким файловим інструментом.

Вимоги#

  • хост Linux із Docker (і Compose v2);
  • щонайменше приблизно 2 CPU і 4 ГБ ОЗП — вкладені демони потребують багато ресурсів;
  • вихідний доступ до Інтернету для завантаження образів: хост має пересилати й маскарадити мережу hosting, щоб платформа могла дістатися до реєстрів;
  • ext4 (або інша файлова система, сумісна з overlay) для data/.

Встановлення трьома командами#

bash
git clone <this repo> && cd dind   # 1
make build                          # 2 — збирає образ management (і MinIO); перший раз і після змін у коді
make up                             # 3 — ідемпотентний початковий запуск

Команду make up безпечно запускати повторно будь-коли. Вона створює мережу hosting, запускає головний DinD, завантажує образи платформи, створює внутрішню мережу, запускає контейнер management і чекає, поки він повідомить про справний стан. Після цього відкрийте http://10.10.10.10:8900 і увійдіть як admin@platform.example з паролем, виведеним у журналі management (він також лежить у data/platform/secrets/panel.admin_password).

хост Linux · Docker 29Зворотний проксі / nftablesnginx stream, HAProxy …пересилає 80/443/8900 …10.10.10.10міст docker «hosting» · 10.10.10.0/24dind-hostingголовний контейнер DinDбез опублікованих портів10.10.10.10бік хостаінтерфейс мостуадреса на хості10.10.10.254data/ (bind mounts)усе, що зберігається, —тут, а не в томах Docker,які можна втратитиБудь-що інше в мережі«hosting» дістанеться внутрішніхпортів — лишайте її лише для шлюзу.
Єдиний слід на рівні хоста: одна мережа-міст, одна адреса контейнера й один каталог даних.

На хості нічого не публікується

dind-hosting не публікує жодних портів. До платформи звертаються за адресою 10.10.10.10 у мережі-мосту hosting (80/443 — Traefik, 8900 — консоль/API/MCP, 9000/9001 — MinIO). Спрямовуйте на цю адресу ваш зворотний проксі або правила nftables. Головний демон не має TCP-слухача — лише unix-сокети.

Щоденні команди#

Завдання Команда
Внутрішні контейнери make ps
Журнали management make logs
Журнали головного DinD docker logs dind-hosting
Стан і доступність make check
Запуск або самовідновлення make up
Зупинка (дані зберігаються) make down
Оновлення платформи make build && scripts/upgrade.sh
Видалити все make down && make clean-data — знищує всі дані користувачів

Щоб виконати команду всередині головного DinD, використовуйте docker exec dind-hosting docker … (наприклад, docker exec dind-hosting docker ps).

Самовідновлення#

  • Перезавантаження хоста → Docker запускає dind-hosting → кожен внутрішній контейнер має restart: unless-stopped → стек повертається без втручання.
  • Збій management → він перезапускається за своєю політикою; під час завантаження узгоджувач (reconciler) заново приводить до потрібного стану мережу, контейнери платформи та демон кожного користувача (створює, якщо відсутній, запускає, якщо зупинений — і ніколи не знищує дані користувачів).
  • Збій демона → його контейнери повертаються разом із ним, а сокет створюється знову.
  • Демону, який лише ще запускається, дається пільговий проміжок часу, перш ніж його вважатимуть несправним.

Резервне копіювання даних#

Усе, що має зберігатися, лежить у data/ поруч із Makefile:

Шлях Вміст
data/main-docker образи й контейнери головного демона
data/platform/db PostgreSQL платформи
data/platform/minio усі бакети, резервні копії та дампи
data/platform/deploys завантажений вихідний код і контексти збірки
data/platform/traefik файли маршрутів, сертифікати, облікові записи ACME
data/platform/secrets згенеровані секрети (режим 0700/0600)
data/platform/sockets спільний каталог сокетів docker
data/dind кореневі каталоги даних усіх демонів користувачів і баз даних

Для узгодженої копії платформу треба зупинити (make down), потім скопіювати data/ на рівні файлів (rsync, знімок, tar) і виконати make up. Зберігайте data/platform/secrets разом з рештою — там лежить ключ шифрування збережених паролів, і без нього збережені паролі баз даних і секрети розшифрувати неможливо.

Ротація секретів

Ротація секретів (ключ JWT, root-користувач MinIO, пароль бази даних платформи) має точну процедуру в посібнику оператора. Ротація ключа Fernet без повторного шифрування ламає паролі баз даних і секретні змінні.

Оновлення#

bash
git pull
make build            # новий образ management
scripts/upgrade.sh    # завантажити його, перестворити management, дочекатися справного стану

Дані не зачіпаються; міграції Alembic виконуються під час запуску. Щоб відкотитися, перезберіть попередній коміт і знову запустіть scripts/upgrade.sh.

  • Типові версії середовищ виконання (node, python, php, nginx) задано в backend/app/services/deploy/runtimes.py; їх можна перевизначити через PLATFORM_DEFAULT_*_VERSION — застосунки, що йдуть за типовою версією, переходять на нову під час наступної перебудови.
  • Образи баз даних для нових баз — PLATFORM_DB_POSTGRES_IMAGE / PLATFORM_DB_MYSQL_IMAGE; наявні бази зберігають свій образ. База даних самої платформи залишається на postgres:16-alpine — не переводьте її на 17.

Домени та TLS у режимі prod#

  1. Спрямуйте A-запис домену на вхідний шлюз (ingress) перед хостом.
  2. Переконайтеся, що ingress пересилає порти 80 і 443 на 10.10.10.10 і що платформа має доступ до ACME CA.
  3. Вкажіть Публічні IP балансувальника і справжню електронну адресу в полі Контактна пошта у розділі Платформа → Налаштування / Сертифікати (ACME), потім переведіть Режим TLS у значення prod.
  4. Додавайте домени; кожен спершу має пройти перевірку.

Справжні адреси клієнтів за L4 ingress#

Якщо перед платформою стоїть nginx stream (або щось подібне), він може надсилати протокол PROXY, щоб застосунки та журнали бачили справжню адресу клієнта. За замовчуванням його вимкнено: задайте PLATFORM_TRAEFIK_PROXY_PROTOCOL_TRUSTED_IPS (або окремі для точок входу …_WEB_TRUSTED_IPS / …_WEBSECURE_TRUSTED_IPS) рівним адресі проксі. Адресу клієнта визначає заголовок довіреного вузла; заголовок недовіреного ігнорується; значення з неправильним форматом, /0 або такі, що перетинаються з мережею платформи, відхиляються під час запуску.

Великі завантаження через ingress#

PUT архіву понад 100 МБ на …/api/v1/uploads/<token> проходить через ваш ingress: дозвольте тіло запиту щонайменше 512 МіБ, вимкніть буферизацію запитів для цього шляху й задайте щедрий тайм-аут. Передавайте Host і X-Forwarded-Proto у location /mcp/ або задайте PLATFORM_PUBLIC_URL, щоб посилання для завантаження містило правильну адресу.

Використання диска#

Шари образів і томи накопичуються всередині кожного демона. Перевіряйте їх для кожного демона окремо:

bash
docker exec dind-hosting docker system df
docker exec dind-hosting docker exec projects-<alias> docker system df

Очищайте кеш збірки та «висячі» образи всередині демона командами docker image prune / docker builder prune — але ніколи не виконуйте volume prune на демоні баз даних.

Обмеження журналів контейнерів#

Журнал кожного контейнера, який створює платформа — сервіси платформи, демони користувачів, застосунки, бази даних — ротується за PLATFORM_LOG_MAX_SIZE (типово 25m) × PLATFORM_LOG_MAX_FILE (типово 2) = щонайбільше 50 МБ; найновіші 25 МБ завжди переживають ротацію. Задайте ці дві змінні як змінні CI/CD. Docker не вміє змінювати параметр журналу в працюючого контейнера, тому нове значення потрапляє в management під час наступного поступового оновлення, у Traefik — під час наступного запуску management, а в застосунки й бази даних — під час їх наступного розгортання чи перестворення; контейнери платформи зі станом зберігають старе налаштування, доки їх не перестворять.

Де шукати журнали#

Що Де
Management make logs
Головний демон docker logs dind-hosting
Traefik, MinIO, БД платформи docker exec dind-hosting docker logs <name>
Контейнери застосунків вкладка «Застосунок» або docker exec dind-hosting docker exec projects-<alias> docker logs app-<slug>
Журнал аудиту й історія запитів таблиці бази даних платформи audit_log і query_log

Розгортання самої платформи (CI)#

Розгортання в production виконуються з GitLab CI на окремому runner (тег h0-infra): перевірка стану, оновлення та ручне завдання розгортання. Конвеєр викликає ті самі скрипти, що описані вище, — через ssh нічого не змінюється. Перелік завдань і змінні CI дивіться в посібнику оператора (OPERATIONS.md).