Платформам · Сайты

Генерация сайтов как функция вашего продукта

Ваш пользователь описывает страницу. Один POST запускает прогон, обратно приходит HTTPS-адрес с DNS, ревизиями и откатом. Ваш бренд, ваш облачный аккаунт, ваш счёт клиенту.

Один POST, дальше опрос

Запуск идёт через обычный эндпоинт процессов — тот же, которым запускается любой другой прогон Forge, а не отдельное API, у которого вы были бы единственным клиентом. Идентификатор прогона возвращается сразу, результат забирается опросом.

Деплой внутри прогона

Тот же прогон создаёт бакет, включает статический хостинг, загружает файлы, ставит перед ними CDN с сертификатом — чтобы на выходе был HTTPS, — и обновляет DNS-запись. Ничего не возвращается человеку «доделать».

Ваш облачный аккаунт, не наш

Доступы подставляются на сервере в пределах вашей организации и никогда не попадают в контекст модели. Файлы лежат в хранилище, которым владеете и за которое платите вы, под доменом, который контролируете вы.

Ревизии и откат — это эндпоинты

Каждая опубликованная ревизия фиксируется и попадает в список. Откатиться на нужную или удалить сайт можно вызовом — вашей поддержке не нужно писать нам.

Ваши клиенты нас не видят

В этом сценарии нет никакой панели Forge, потому что ваши пользователи её не получают. Они общаются с вашим продуктом, а ваш продукт — с API.

Задача

«Наш пользователь должен уйти со страницей, которая существует по адресу. Не с черновиком, не с архивом и не с задачей для кого-то на нашей стороне».

Сгенерировать HTML — самая простая часть этого обещания и ровно та, на которой большинство «ИИ-конструкторов сайтов» останавливается. Всё остальное — обвязка: нужен бакет, нужно включить хостинг, нужно залить файлы, нужно выпустить сертификат, нужно направить DNS — и кто-то должен отвечать за ситуацию, когда третий шаг прошёл, а четвёртый нет. Построить это один раз для своего продукта — квартал разработки, который не имеет отношения к тому, за что вам платят клиенты.

Что вызывает ваш продукт

Один вызов — от описания до работающего адреса:

Ваш продуктinputописание, которое ввёл пользователь
ДизайнерДизайнергенерирует сайт
ПубликаторDevOpsбакет · хостинг · загрузка
HTTPS + DNSCDN, сертификат, поддомен
Живой URLoutputревизия зафиксирована, обратима

Дизайнер превращает описание в саму страницу. Публикатор берёт на себя неблагодарную половину. Обратно приходит URL и обычный след того, как прогон к нему пришёл.

Всё, что происходит после первого вызова, — тоже эндпоинты: перечислить ревизии сайта, откатиться на конкретную, удалить его. Отмена входит в интеграцию, а не в процесс вашей поддержки.

Почему эта модель изоляции важна именно вам

Единица изоляции — это ваша организация. Токен вы выпускаете сами в своих настройках: никто не выписывает его за вас и никто не нужен в момент, когда вы его перевыпускаете.

Облачные доступы хранятся в пределах вашей организации и подставляются на сервере по имени в момент вызова инструмента. Из этого следует вполне конкретная вещь, и её стоит проговорить прямо: на нашей стороне нет доступа, которым можно дотянуться до инфраструктуры другого партнёра, потому что подстановка происходит до того, как инструмент вообще запустится. Чтение по чужой организации возвращает «не найдено», а не «запрещено» — мы не подтверждаем, что чужая организация существует.

Одно правило, которое важно на практике: токен ваш и остаётся на сервере. Он даёт всё, что может делать ваша организация, — значит, его место в вашем бэкенде, а не в браузере и тем более не у конечного пользователя.

Как есть на самом деле

Работает в продакшене. Партнёрский продукт делает этот вызов сегодня — своим токеном, в своём облачном аккаунте, — и сайты его клиентов живые. Путь от брифа до работающего HTTPS-адреса (генерация, бакет, хостинг, загрузка, CDN, сертификат, DNS) выкачен, как и список ревизий, откат на выбранную и удаление сайта.

По-настоящему всё стало ясно на живых прогонах. Они поймали четыре дефекта, которые юнит-тесты поймать не могли: облачный API, потребовавший другой content type; инструмент, зарегистрированный на одном пути исполнения и не зарегистрированный на другом; три недостающих IAM-гранта; и enum, который обязан быть в верхнем регистре. Зелёная сборка — это не работающий конвейер, поэтому здесь ничего не считается готовым, пока не отработало на настоящем окружении.

Где пока узко — и лучше вы услышите это от нас: выкаченный адаптер работает с объектным хранилищем, CDN и DNS одного облака; сама форма процесса к нему не привязана, но другие адаптеры ещё не написаны. Очень большие многофайловые сборки упираются в потолок размера запроса, который мы пока не подняли. Распространение сертификата на краю облачной сети на свежем домене может занять часы — это скорее их сторона, чем наша, но это реально и это стоит заложить в ваш онбординг. А имя хоста, на котором окажутся сайты, — пока предмет разговора на старте, а не настройка, которую вы переключаете сами.

Хотите, чтобы пользователь уходил с адресом, а не с архивом?

Нужны организация и облачный аккаунт. Со стороны интеграции — один POST и опрос статуса.