DinD HostingПосібник
ENУК
Власний PaaS · один хост · жодного опублікованого порту

Ваша власна хмарна платформа на вкладених демонах Docker.

Розгортайте з git або з архіву застосунки на Node.js, Python і PHP та статичні сайти. Підключайте PostgreSQL чи MySQL, отримуйте HTTPS-домени, сховище S3, резервні копії та метрики — і керуйте всім із веб-консолі, через REST API або з ШІ-агента.

4середовища виконання
2СУБД
33інструменти MCP
0відкритих портів хоста
https://blog.alex.example.com dind-hosting · main DinD 10.10.10.10 Traefik:80 · :443 · TLS managementUI · REST · MCP MinIOS3 · копії platform-pgстан · метрики projects-alexдемон користувача blogstatic · nginx 1.27:10000 shopnode 24:10001 projects-bob apipython 3.12 · :10000 dbспільний демон БД postgresshop-main · :20000 mysqlblog-wp · :20001
Що вміє платформа

Усе, що потрібно невеликому PaaS, — і нічого, що довелося б збирати самому.

Одна платформа замінює купу склейок: конвеєр збірки, балансувальник із сертифікатами, бази даних із консоллю, об'єктне сховище, резервні копії та метрики — а користувачі надійно відокремлені один від одного.

Розгортання з git або з архіву

Вкажіть репозиторій або завантажте .zip/.tar.gz до 512 МіБ. Середовище виконання визначається автоматично, збірка транслюється наживо, а невдала збірка ніколи не замінює працюючий застосунок.

Розгортання →

Вибір версії середовища виконання

version: "22" збирає на найновішій 22.x і оновлюється при кожному розгортанні; "22.12.1" лишається зафіксованою. Типово: Node 24, Python 3.12, PHP 8.5, nginx 1.27.

Версії середовища виконання →

PostgreSQL і MySQL

База даних для кожного проєкту зі згенерованими обліковими даними, що додаються як змінні DB_*, SQL-консоль із запобіжниками та дампи на вимогу.

Бази даних →

Домени й автоматичний HTTPS

Кожен проєкт одразу отримує slug.alias.domain. Додавайте власні імена: перевірка підтверджує, що вони ведуть до вас, ще до запиту сертифіката.

Домени та TLS →

Змінні та секрети лише для запису

Тришарові змінні середовища із зашифрованими секретами, які ніхто не може прочитати назад, — задавайте їх у консолі, через REST або з агента, а застосовуйте одним перестворенням.

Змінні середовища та секрети →

Об'єктне сховище S3

Особистий бакет і ключі з обмеженими правами у вбудованому MinIO; змінні S3_* додаються одним рядком у маніфесті.

Файлове сховище →

Резервні копії та відновлення в один клік

Дампи баз даних, архіви томів і архів вихідного коду — в одній резервній копії проєкту, з терміном зберігання, контрольними сумами та запобіжником для руйнівного відновлення.

Резервні копії →

Метрики, журнали та аудит

CPU і пам'ять кожного контейнера щоп'ятнадцять секунд, журнали застосунку й збірки в реальному часі та запис аудиту для кожної зміни.

Метрики та журнали →

Окремий демон для кожного користувача

Застосунки збирає й запускає демон Docker, яким користується лише їхній власник. Бази даних — окремі контейнери з власними обліковими даними.

Основні поняття →

REST API

Усе, що вміє консоль, можна автоматизувати за допомогою curl і API-токена — ідеально для CI-конвеєрів і середовищ попереднього перегляду.

REST API →

MCP-сервер для ШІ-агентів

33 інструменти дають Claude Code чи будь-якому MCP-клієнту змогу створювати проєкти, розгортати, виконувати запити до баз даних і керувати доменами — з вашими правами.

MCP →

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

Після перезавантаження чи збою узгоджувач (reconciler) відновлює весь стек — демони, маршрути, контейнери — не торкаючись ваших даних.

Експлуатація →
Як це працює

Від вихідного коду до працюючого HTTPS-сайту за три кроки.

Той самий процес у консолі, через REST або з агента.

Створіть проєкт

Виберіть slug і базовий домен. Ім'я сайту slug.alias.domain резервується одразу.

Розгорніть свій код

Завантажте архів або вкажіть git URL. Платформа визначає середовище виконання, збирає образ у вашому демоні й запускає його.

Сайт працює

Traefik маршрутизує ім'я, перевірка проходить, сертифікат видається — і поновлюється — автоматично.

Натисніть + Новий проєкт, відкрийте його вкладку Розгортання, виберіть архів і натисніть Розгорнути.

hosting.example.com/projects/7
Розгортання
bash
PID=$(curl -fsS -X POST $BASE/api/v1/projects -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"slug":"hello","display_name":"Hello","base_domain":"example.com"}' | jq .id)

UP=$(curl -fsS -X POST $BASE/api/v1/projects/$PID/uploads \
  -H "Authorization: Bearer $TOKEN" -F file=@site.tgz | jq -r .upload_id)

curl -fsS -X POST $BASE/api/v1/projects/$PID/deployments \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d "{\"source\":{\"type\":\"archive\",\"upload_id\":\"$UP\"}}"
ВиСтвори проєкт «hello» на example.com і розгорни теку ./site.
create_project(slug="hello", display_name="Hello", base_domain="example.com") → id 7 · hello.alex.example.com
upload_archive(project=7, filename="site.tgz", content_base64="…") → upload_id 3f0c…e1.tgz
deploy_app(project=7, source_type="archive", upload_id="3f0c…e1.tgz") → deployment #1 queued
list_deployments(project=7) → #1 running · domain_status(project=7) → pre-check passed · certificate issued
АгентГотово — розгортання #1 працює, сертифікат видано. Ваш сайт доступний на https://hello.alex.example.com.
Архітектура

Один привілейований контейнер. Власний демон для кожного користувача.

На хості працює єдиний контейнер dind-hosting, і він нічого не публікує. Усередині нього сервіси платформи та демони Docker окремих користувачів спільно використовують приватну мережу й спілкуються через unix-сокети.

зовні Браузери*.alex.example.com REST-клієнти · CIBearer JWT / токен dt_ ШІ-агентиClaude Code · MCP Ingress хоста проксі абоnftables на хостіваше рішення → 10.10.10.10 dind-hostingголовний DinD · privileged · міст «hosting» · 10.10.10.10 · портів не публікує platform-net · 172.28.0.0/16 · статичні IP Traefik:80 :443 · ACME172.28.0.3 management:8900 UI·API·MCP172.28.0.2 platform-pgстан · метрики172.28.0.4 MinIOS3 · копії172.28.0.5 projects-alex172.28.0.64 blogstatic:10000 shopnode 24:10001 dbспільний демон БД172.28.0.10 postgresshop-main:20000 mysqlblog-wp:20001 projects-bob172.28.0.65 apipython 3.12:10000 sitephp 8.5:10001 db-aliceнеобов'язково · окремий postgresanalytics:20000 /platform-data/sockets/ main.sock · db.sock · projects-alex.sock · … data/ на хості монтується в головний DinD: main-docker · platform/{db,minio,deploys, traefik,secrets,sockets} · dind/ умовні позначення HTTP-маршрут за Host Docker API через unix-сокети демон користувача (застосунки) демон баз даних єдиний контейнер рівня хоста
Повна картина: вхідний шлюз (ingress) хоста, сервіси платформи, демон для кожного користувача та спільний демон баз даних.

Одна адреса, жодних опублікованих портів

Платформа доступна за адресою 10.10.10.10 на хостовому мості (bridge). Що саме ваш фаєрвол перенаправляє туди — вирішуєте ви; в API Docker немає TCP-слухача.

Ізоляція на рівні користувача

Застосунки працюють у демоні власника, вихідний код передається потоком під час кожного розгортання (і ніколи не монтується), а кожна база даних має власний контейнер і облікові дані.

Відтворюваність і відновлюваність

Усе, що має зберігатися, лежить в одному каталозі data/. Узгоджувач при кожному запуску знову приводить систему до бажаного стану, тож відновлення — це просто make up.

Середовища виконання

Чотири середовища виконання, які визначаються за вашими файлами.

Писати Dockerfile не потрібно. Додайте необов'язковий platform.yaml, щоб вибрати середовище виконання, зафіксувати версію, підключити базу даних або змінити спосіб запуску застосунку.

static

образ
nginx 1.27
визначається за
index.html
додатково
SPA-fallback, gzip

node

образ
node 24 LTS
визначається за
package.json
виконує
npm ci → збірка → npm start

python

образ
python 3.12
визначається за
requirements.txt
виконує
pip install → uvicorn / start_cmd

php

образ
php 8.5 fpm + nginx
визначається за
composer.json
виконує
встановлення Composer, supervisor

Маніфест необов'язковий — і невеликий.

Усе наведене нижче — типові значення, які можна змінити. Невідомі ключі відхиляються, тому одруківка дає помітну помилку, а не мовчки нічого не робить.

yaml
runtime: node
version: "24"        # беріть у лапки: "3.10" не має перетворитися на 3.1
databases: [main]    # додає змінні DB_MAIN_*
s3: true             # додає змінні S3_*
resources: {cpu: "1.0", memory: 512m}
volumes:
  - {name: uploads, path: /app/uploads}
Три входи — одні правила

Клацніть, автоматизуйте — або просто скажіть.

Консоль, REST API і MCP-сервер звертаються до того самого сервісного шару — з тією самою авторизацією, обмеженнями та журналом аудиту. Створіть API-токен один раз і передайте його скрипту чи агенту.

hosting.example.com/projects/7
Середовище
ВиРозгорни ./api як «orders» на example.com із базою Postgres і покажи перші рядки журналу.
create_project(slug="orders", display_name="Orders", base_domain="example.com") → id 12
create_database(project=12, name="main", engine="postgres") → postgres:17-alpine
create_upload_url(project=12, filename="api.tar.gz") → one-time PUT link (15 min)
shell: curl -T api.tar.gz '<upload_url>' → upload_id 3f0c…
deploy_app(project=12, source_type="archive", upload_id="3f0c…") → deployment #1 queued
get_logs(project=12, tail=5) → listening on 0.0.0.0:10000
АгентПрацює. Змінні DB_MAIN_* дійшли до застосунку, і він слухає свій порт. Підключити власний домен?
Можливості

Що на ній будують.

Сайти та односторінкові застосунки

Викладайте зібрану SPA з runtime: static, spa: true — nginx, gzip і сертифікат за одне завантаження.

API та бекенди

Сервіси на Node.js і Python з базою даних PostgreSQL чи MySQL, секретами та S3 для файлів.

PHP-застосунки

Застосунки на Composer, які обслуговує php-fpm за nginx, з постійним томом для даних.

Внутрішні інструменти

Адмінпанелі та дашборди, яким потрібні база даних і вхід, — на вашому обладнанні та у вашому домені.

Розгортання під керуванням агента

Скажіть Claude Code створити проєкт, задати змінні, розгорнути застосунок і прочитати журнали. Кожен крок потрапляє в аудит і виконується з вашими правами.

Середовища попереднього перегляду

Нехай CI створює проєкт для кожної гілки через REST, розгортає тег, публікує URL і видаляє проєкт після злиття гілки.

Створено з турботою

Безпечні типові налаштування, прозора поведінка.

Секрети лишаються секретами

Секретні змінні зашифровано, і вони доступні лише для запису: жодна консоль, REST, MCP, журнал чи запис аудиту ніколи їх не повертає.

Власність, а не «заборонено»

Усе, що вам не належить, відповідає не знайдено, тож факт існування ніколи не розкривається — ні в консолі, ні в API, ні в MCP.

Перевірка перед сертифікатами

Платформа спершу переконується, що ім'я веде до неї, і лише потім звертається до CA — тож ліміти не витрачаються через хибний запис DNS.

SQL-консоль із запобіжниками

Один запит, тайм-аут 30 секунд, 1 000 рядків або 1 МіБ — і кожне виконання потрапляє до журналу запитів.

Одноразові посилання для завантаження

Великі архіви обходять MCP за допомогою одноразового PUT-посилання на 15 хвилин, прив'язаного до одного проєкту й одного розширення.

Аудит кожної зміни

Хто розгорнув, перестворив, змінив змінну чи відновив резервну копію — усе записується, але секрети не записуються ніколи.

Чесно про межі

Чого вона не вміє — поки що.

DinD Hosting — свідомо невелика платформа для одного хоста. Ось відомі межі цієї версії:

  • Один хост — немає режиму з кількома хостами чи Kubernetes.
  • Один застосунок на проєкт — для іншого сервісу створіть інший проєкт.
  • Користувачів створює адміністратор — немає самореєстрації чи SSO.
  • Резервні копії — на вимогу — вбудованого розкладу немає.
  • Лише сертифікати HTTP-01 — без wildcard-сертифікатів.
  • Немає відкату в один клік — розгорніть старіший тег чи архів.
  • Немає публічних портів баз даних — користуйтеся SQL-консоллю, дампами чи самим застосунком.
  • Немає вбудованих сповіщень — метрики можна переглядати, але тривог вони не піднімають.

Готові щось розгорнути?

Швидкий старт займає близько п'яти хвилин: вхід, проєкт і архів. Для всього, що буде далі, у посібнику є окремий розділ.