Приложения
Платформа приложений разворачивает веб-приложения из Git-репозитория или прямо из папки на вашем диске — по модели Vercel/Netlify. Каждый push в выбранную ветку автоматически собирает и публикует новую версию.
Сайт можно не писать самому: конструктор T1000 собирает приложение по описанию словами и публикует его на этой же платформе.
Подключение репозитория
Поддерживаются провайдеры GitHub, GitLab, GitVerse, GitFlic и Gitea
(git.tatnet.ru). Подключите репозиторий, выберите ветку — и платформа
будет реагировать на push'и через веб-хуки.
Без репозитория — из папки
Репозиторий нужен не всегда. Локальную папку можно выложить одной командой консольного клиента:
cd ~/проекты/лендинг
tatnet deploy
Это удобно, чтобы попробовать платформу, выложить статический сайт или отдать на сборку результат чужого конвейера. Подробности и ограничения — «Деплой из папки»; главное из них: у такой выкладки нет коммита, то есть ни автора, ни разницы с прошлой версией.
Сборка
Сборка запускается автоматически и поддерживает популярные стеки: Next.js, статические сайты, Go и другие. Логи сборки доступны в реальном времени, а статус деплоя приходит через SSE.
Домены и HTTPS
- Каждое приложение получает поддомен
*.tatnet.app. - Можно подключить свой домен:
- если он в управляемой зоне аккаунта —
A-запись создаётся автоматически; - для внешнего домена платформа покажет, какую запись прописать.
- если он в управляемой зоне аккаунта —
- TLS-сертификат выпускается автоматически (см. TLS-сертификаты).
Приватная сеть (VPC)
Приложение можно подключить к приватной сети аккаунта — тогда оно ходит к остальным ресурсам этой сети по приватным адресам. Сеть выбирается при создании приложения и меняется в любой момент в настройках приложения (карточка «VPC сеть»); значение «Без VPC» отключает приложение от приватной сети и возвращает его в общий пул.
Работающая реплика остаётся в той сети, в которой была создана, поэтому при
смене платформа пересоздаёт инстансы приложения в новой сети — возможен
короткий перерыв. При стратегии rolling реплики заменяются по одной, и
несколько минут часть из них ещё работает в старой сети, видя старый набор
ресурсов. Если такое промежуточное состояние недопустимо, переключите
стратегию на recreate перед сменой сети.
Подключить можно только сеть того же региона, в котором работает
приложение: регион задаётся при создании и не меняется, а в чужом регионе у
приложения нет сетевого порта. В панели список сетей уже отфильтрован по
региону приложения, через API сеть другого региона отклоняется с ошибкой
400.
Переменные окружения
Переменные окружения (включая секреты) задаются в панели и доступны приложению во время сборки и выполнения.
Конфигурация маршрутизации
Файл vercel.json (или tatnet.json) в репозитории описывает headers,
redirects и rewrites — они компилируются при сборке и применяются на
edge.
Модель CORS — строгая, как у Vercel: если в конфигурации нет правил CORS,
заголовки Access-Control-Allow-Origin не добавляются. Задавайте CORS явно
в vercel.json.
Масштабирование
По умолчанию деплой выполняется по стратегии rolling. Для приложений с постоянной доступностью держите не менее одной реплики — иначе при простое приложение масштабируется до нуля и первый запрос ждёт cold start.
Как считаются вычисления
Статическому сайту вычисления не нужны: файлы отдаются напрямую. Платят приложения, у которых есть сервер, — backend и SSR (например, Next.js). Как именно — зависит от числа реплик.
Реплик 1 и больше — постоянный резерв. Машины работают всё время, оплата помесячная за выделенные vCPU и память каждой реплики, по прайсу.
Реплик 0 — по требованию. Машина поднимается на первый запрос и гаснет после простоя. Считаются две величины:
- Active CPU — время, когда процессор действительно выполнял код приложения. Пока приложение ждёт запрос, ответ базы данных или внешнего API, процессор простаивает и Active CPU не расходуется. Мы измеряем его снаружи машины, по работе её виртуальных процессоров, поэтому ни код, ни нагрузка внутри на измерение не влияют. Актуальная ставка — на странице цен.
- Память — объём памяти машины × время, пока она запущена, в ГБ·ч.
Пример: сайт на Next.js обработал за день 5 000 запросов по 40 мс процессора на каждый. Это 200 секунд, то есть около 0,06 ч Active CPU, хотя машина была запущена несколько часов. За всё время запуска отдельно учитывается память.
В каждый тариф входят часы Active CPU и ГБ·ч памяти на месяц — они указаны в карточке тарифа и расходуются первыми. Расход по приложениям виден в разделе «Финансы».
Если измерение за какой-то час не удалось, этот час по CPU не выставляется вовсе — мы не подставляем за вас оценку.
Проба готовности
Некоторые приложения открывают сетевой порт раньше, чем действительно
готовы обслуживать запросы, — например, пока прогревается кэш, применяются
миграции или идёт JIT-компиляция. Без пробы готовности платформа считает
реплику готовой сразу после открытия порта и может направить на неё трафик
слишком рано — тогда первые запросы после деплоя или cold start отдают
502/503/504.
Чтобы этого избежать, задайте путь пробы готовности (readiness_path) —
например /healthz. Тогда после старта реплики платформа опрашивает
GET http://<реплика>:<порт><readiness_path> и включает реплику в
обслуживание только после ответа со статусом 2xx или 3xx. Пока путь
отвечает иначе (или недоступен), реплика не получает трафик; если готовности
нет по истечении таймаута, деплой этой реплики считается неуспешным.
- Поле опциональное. Если оставить его пустым, поведение прежнее: реплика считается готовой сразу после открытия порта.
- Проверка выполняется изнутри микро-VM (
127.0.0.1), поэтому эндпоинт готовности не обязан быть публичным. - Задавайте лёгкий эндпоинт: он опрашивается на каждой итерации при старте.
Настраивается в разделе Deployment настроек приложения или через API
(поле readiness_path в создании/обновлении приложения).
API
Публичный REST API (https://api.min.tatnet.ru/v1, заголовок
Authorization: Bearer <tn_live_…>):
| Метод | Путь | Действие |
|---|---|---|
GET | /v1/projects/{project_id}/apps | список приложений проекта |
POST | /v1/projects/{project_id}/apps | создать приложение (в т.ч. readiness_path) |
GET | /v1/projects/{project_id}/apps/{id} | получить приложение |
PATCH | /v1/projects/{project_id}/apps/{id} | масштабирование, ресурсы и сеть: replica_count, replica_vcpu, replica_memory_mb, readiness_path, vpc_id, name — каждое поле опционально |
POST | /v1/projects/{project_id}/apps/{id}/deploy | запустить сборку и деплой |
POST | /v1/projects/{project_id}/apps/{id}/deployments | выложить исходники из папки: тело запроса — tar.gz (для приложений с source_type=upload) |
GET | /v1/projects/{project_id}/apps/{id}/builds/{build_id}/logs | поток лога сборки (SSE) |
DELETE | /v1/projects/{project_id}/apps/{id} | удалить приложение |
GET | /v1/projects/{project_id}/apps/{id}/builds | список сборок |
GET | /v1/projects/{project_id}/apps/{id}/env | список переменных окружения (секреты маскируются) |
POST | /v1/projects/{project_id}/apps/{id}/env | создать или обновить переменную (name, value, is_secret) — существующее имя обновляется на месте |
DELETE | /v1/projects/{project_id}/apps/{id}/env/{env_var_id} | удалить переменную |
GET | /v1/projects/{project_id}/apps/{id}/domains | список доменов |
POST | /v1/projects/{project_id}/apps/{id}/domains | добавить кастомный домен |
DELETE | /v1/projects/{project_id}/apps/{id}/domains/{domain_id} | удалить домен |
Адресация без проекта
У каждого пути выше есть плоский двойник без проекта в адресе — тот же смысл, та же политика ключа:
| Метод | Путь | Действие |
|---|---|---|
GET | /v1/apps | все приложения аккаунта ключа; ?project_id= — только одного проекта |
GET / PATCH / DELETE | /v1/apps/{id} | приложение по id |
… | /v1/apps/{id}/deploy, /deployments, /builds, /builds/{build_id}/logs, /env, /domains, /jobs, /job-runs | то же, что и под /projects/{project_id}/apps/{id}/… |
Так же, с 2026-09-23, адресуются ВМ, функции, тома, кластеры Postgres, Valkey
и Kubernetes и балансировщики: /v1/<вид> и /v1/<вид>/{id}/….
Зачем: чтобы обратиться к приложению, не нужно знать и не нужно иметь право
читать проект. Ключу, которому не выдали GET /v1/projects, приложение по
плоскому пути доступно — если политика разрешает действие на него.
Исключение — создание: POST /v1/apps нет, приложение создаётся в
проекте (POST /v1/projects/{project_id}/apps).
Ошибки те же: чужой аккаунт → 404 (существование не раскрывается), свой
аккаунт без права → 403.
Изменение ресурсов реплики применяется сразу — деплойер прокатывает работающие реплики на новый размер (rolling). Изменение переменной окружения также автоматически перезапускает реплики.
Пример — поднять реплику до 4 vCPU / 6 ГБ:
curl -X PATCH "https://api.min.tatnet.ru/v1/projects/{project_id}/apps/{id}" \
-H "Authorization: Bearer $TATNET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"replica_vcpu": 4, "replica_memory_mb": 6144}'
Пример — задать пробу готовности (пустая строка снимает её):
curl -X PATCH "https://api.min.tatnet.ru/v1/projects/{project_id}/apps/{id}" \
-H "Authorization: Bearer $TATNET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"readiness_path": "/healthz"}'
Пример — подключить приложение к приватной сети;
null отключает его от сети:
curl -X PATCH "https://api.min.tatnet.ru/v1/projects/{project_id}/apps/{id}" \
-H "Authorization: Bearer $TATNET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vpc_id": "8a2fd6c4-ee02-4441-beb6-74e500aefbca"}'
Смена сети, как и в панели, пересоздаёт инстансы приложения — поле не применяется «тихо», одной записью в базу.