Перейти к основному содержимому

Приложения

Платформа приложений разворачивает веб-приложения из 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

Модель 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"}'

Смена сети, как и в панели, пересоздаёт инстансы приложения — поле не применяется «тихо», одной записью в базу.