Бэкенд без бэкенда
для MVP и SaaS
База данных, авторизация, хранилище файлов, серверные функции, отправка писем и приём платежей через ЮKassa. Приложение подключается через SDK, писать и размещать собственный бэкенд не требуется
import { createClient } from "@supabase/supabase-js";
// адрес и публичный ключ из панели Hostim Backend
const db = createClient(
"https://myapp.backend.hostim.app",
import.meta.env.VITE_BACKEND_ANON_KEY,
);
// письмо со ссылкой для входа
await db.auth.signInWithOtp({ email });
// после входа: файлы и данные пользователя
await db.storage.from("docs").upload(path, file);
const { data } = await db.from("invoices").select("*");Бесплатный тариф без ограничения срока: в пределах лимитов, с тестовым режимом ЮKassa и адресом на поддомене Hostim. Платный тариф от 990 ₽ в месяц нужен для приёма реальных платежей и собственного домена
Код на supabase-js, в том числе из Lovable, Bolt и Cursor, работает без изменений: в настройках меняются адрес и ключ. Данные переносятся отдельно
Серверы в дата-центре на территории РФ. Оплата в рублях, закрывающие документы для ИП и юрлиц
Подойдёт и не подойдёт
- Нет бэкенд-разработчика или времени на серверную часть
- Приложение создано в Lovable, Bolt или Cursor и использует supabase-js
- SaaS с подпиской и оплатой в рублях через ЮKassa
- Персональные данные пользователей необходимо хранить в РФ
- Требуется база данных в нескольких регионах или реплики для чтения
- Требуются отдельные копии базы данных для веток разработки (branching)
- Требуются массовые email-рассылки
База данных PostgreSQL
Приложение работает с данными через SDK, без собственного API. Права доступа задаются правилами на уровне строк
- Таблицы создаются в табличном редакторе панели, через SQL или ИИ-агентом
- Правила доступа к строкам (RLS)
- Прямое подключение для миграций, psql и ORM
- Realtime: изменения таблиц передаются в приложение по WebSocket
- Бэкап базы данных ежедневно. Восстановление на любую секунду за последние 7 дней на тарифе «Стартап» и 30 дней на тарифе «Профи»
create table public.notes (
id bigint generated always as identity primary key,
user_id uuid not null default auth.uid()
references auth.users on delete cascade,
body text not null
);
alter table public.notes enable row level security;
create policy "свои заметки" on public.notes
for all to authenticated
using ((select auth.uid()) = user_id)
with check ((select auth.uid()) = user_id);Регистрация и вход пользователей
Готовые сценарии входа, подтверждения почты и восстановления пароля. Письма для входа отправляются сразу, без настройки SMTP
- Email и пароль, вход по ссылке, коды на почту
- Google, GitHub, Яндекс ID, VK ID, Telegram
- Сессии с автоматическим обновлением токенов
- Идентификатор пользователя доступен в правилах базы данных через auth.uid()
// вход через Google
await db.auth.signInWithOAuth({ provider: "google" });
// ссылка для входа на почту
await db.auth.signInWithOtp({ email });
// восстановление пароля
await db.auth.resetPasswordForEmail(email, {
redirectTo: "https://app.example.ru/new-password",
});
// текущий пользователь
const { data: { user } } = await db.auth.getUser();Хранилище файлов
Хранение документов, изображений и вложений. Доступ к файлам задаётся такими же правилами, как доступ к данным
- Загрузка из браузера и мобильного приложения
- Временные ссылки на приватные файлы
- Уменьшенные копии изображений по запросу
- Ограничения на размер и тип файла
- Резервная копия файлов раз в сутки
const path = `${user.id}/contract.pdf`;
await db.storage.from("documents").upload(path, file);
// ссылка на 1 час
const { data } = await db.storage
.from("documents")
.createSignedUrl(path, 3600);Серверные функции
Код, который нельзя выполнять в браузере: обработка вебхуков, запросы к внешним API с секретными ключами, формирование документов
- TypeScript в среде Deno, как Edge Functions в Supabase
- Секреты хранятся в панели, а не в коде
- Лог каждого вызова, уведомление об ошибке в Telegram
- Вызов из приложения через SDK, по HTTP-запросу или по расписанию
const cors = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers":
"authorization, x-client-info, apikey, content-type",
};
Deno.serve(async (req) => {
if (req.method === "OPTIONS") {
return new Response("ok", { headers: cors });
}
const { orderId } = await req.json();
const token = Deno.env.get("PARTNER_API_TOKEN");
const url = "https://api.example.com/invoices";
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ orderId }),
});
return Response.json(await res.json(), {
status: res.status,
headers: cors,
});
});
// вызов из приложения:
// db.functions.invoke("create-invoice", {
// body: { orderId },
// })Отправка писем
Транзакционные письма с домена приложения: подтверждения, счета, уведомления. Для домена панель показывает готовые DNS-записи и проверяет их
- Письма входа без настройки
- Отправка из функций по SMTP
- Статусы доставки: отправлено, принято сервером получателя, отклонено, жалоба на спам
- Только письма приложения, рассылки запрещены
Подключение ИИ-агентов
MCP-сервер позволяет Cursor, Claude Code и другим агентам читать схему базы данных и логи, создавать таблицы, правила доступа и функции
- Подключение командой в Claude Code или файлом настроек в Cursor
- Агент видит схему базы данных и логи ошибок
- Cursor, Claude Code и другие клиенты MCP
# Claude Code
claude mcp add --transport http hostim-backend \
https://mcp.backend.hostim.app/myapp
# дальше обычной просьбой агенту:
# «создай таблицу заказов, где каждый
# пользователь видит только свои заказы»Платежи и подписки через ЮKassa
Договор с ЮKassa заключает владелец приложения. В панели указываются shopId и секретный ключ. Продление подписок, повторные списания, чеки и возвраты обрабатываются автоматически
- Тарифы подписки для пользователей приложения: цена, период оплаты, пробный период
- Повтор неудачного списания через 1, 3 и 5 дней с уведомлением пользователя
- Данные для чека в каждом платеже, возврат из панели
- Готовая функция checkout и таблица subscriptions
Автоплатежи включает ЮKassa по заявке. Чеки работают при подключённой кассе или сервисе «Чеки от ЮKassa». Смена тарифа подписки пользователем действует со следующего периода оплаты
// ссылка на оплату тарифа «Pro»
const { data, error } = await db.functions
.invoke("checkout", { body: { plan: "pro" } });
if (error) throw error;
window.location.href = data.url;
// подписка текущего пользователя:
// правило доступа отдаёт только его строку
const { data: sub } = await db
.from("subscriptions")
.select("plan, status")
.maybeSingle();
if (sub?.plan === "pro" && sub.status === "active") {
showReports();
}Дополнительно
Запуск функций по расписанию: отчёты, напоминания, очистка устаревших данных
Логи функций и запросов. Уведомление об ошибке функции в Telegram с текстом ошибки и строкой кода
Отчёт о таблицах без правил доступа и публичных хранилищах файлов с пояснением риска
Как это работает
- 01Проект
Создание проекта в панели. Адрес, ключи и блок .env доступны сразу
- 02Подключение
Официальный Supabase SDK для JavaScript, Flutter, Swift, Kotlin, Python или прямое подключение к PostgreSQL
- 03Функции
Публикация через CLI или ИИ-агента по MCP. Секреты задаются в панели
- 04Запуск
Переход на тариф «Стартап» включает боевой режим ЮKassa и собственный домен
Бесплатно до запуска
Тарификация по числу пользователей и объёму данных, без выбора мощности сервера. Списание посуточно из кошелька Hostim
- ·2 проекта на аккаунт
- ·500 активных пользователей в месяц
- ·База данных 500 МБ, файлы 1 ГБ, трафик 5 ГБ в месяц
- ·100 000 вызовов функций в месяц
- ·100 писем входа в месяц
- ·Платежи ЮKassa в тестовом режиме
- ·Бэкап базы данных раз в сутки, хранение 1 день
- ·Пауза после 7 дней без запросов, возобновление при следующем запросе
- ·10 000 активных пользователей в месяц
- ·База данных 5 ГБ, файлы 25 ГБ, трафик 100 ГБ в месяц
- ·1 млн вызовов функций в месяц
- ·5 000 писем в месяц
- ·Платежи ЮKassa в боевом режиме
- ·Восстановление базы данных на любую секунду за 7 дней
- ·Собственный домен, без паузы
- ·50 000 активных пользователей в месяц
- ·База данных 20 ГБ, файлы 100 ГБ, трафик 250 ГБ в месяц
- ·5 млн вызовов функций в месяц
- ·25 000 писем в месяц
- ·Платежи ЮKassa в боевом режиме
- ·Восстановление базы данных на любую секунду за 30 дней
- ·Собственный домен, без паузы
Цена за месяц сверх лимита тарифа. Только на платных тарифах и только если владелец проекта включил доплаты и задал потолок расходов. По умолчанию доплаты отключены
| 1 000 активных пользователей | 100 ₽ |
| 1 ГБ базы данных | 10 ₽ |
| 1 ГБ файлов | 2 ₽ |
| 1 ГБ трафика | 5 ₽ |
| 1 млн вызовов функций | 100 ₽ |
| 1 000 писем | 50 ₽ |
- Активный пользователь
- вошёл или продлил сессию хотя бы раз за календарный месяц
- База данных
- таблицы и индексы на диске, без журнала транзакций и бэкапов
- Файлы
- суммарный размер загруженных файлов без уменьшенных копий изображений
- Трафик
- данные, переданные пользователям из API, хранилища файлов и функций. Входящий трафик не учитывается
- Вызов функции
- каждый запуск функции: HTTP-запрос, вебхук, задача по расписанию или повторная попытка
Что важно знать заранее
- !Функции работают в среде Deno, как Edge Functions в Supabase
- !Восстановление базы данных на момент времени создаёт её копию на выбранную секунду. При аварии сервера возможна потеря изменений за последнюю минуту. Файлы хранилища восстанавливаются только на конец суток
- !Telegram не передаёт email, VK передаёт не всегда. Вход через них создаёт отдельный аккаунт до привязки почты
- !Отправляются только письма входа и уведомления приложения, рассылки запрещены. Для собственного домена нужны записи SPF и DKIM
- !Проверка безопасности охватывает базу данных и настройки хранилища, код фронтенда не анализируется
- !Нет копий базы данных для веток разработки (branching) и Management API Supabase
- !Технические пределы на тарифах «Бесплатный», «Стартап» и «Профи»: одновременных подключений к базе данных 20, 60 и 120; время выполнения функции 30, 150 и 150 секунд
Частые вопросы
Это Supabase?
В основе открытый движок Supabase, поэтому официальный SDK и код на supabase-js работают без изменений. Hostim не связан с компанией Supabase.
Когда нужен платный тариф?
Платный тариф нужен для боевого режима ЮKassa и собственного домена, переход выполняет владелец проекта. Без перехода проект остаётся на бесплатном тарифе: при выходе за лимиты деньги не списываются, проект работает с ограничениями.
Что будет при достижении лимита?
Уведомления приходят при 80% и 100% лимита. После этого база данных переходит в режим только для чтения, новые загрузки файлов и вызовы функций отклоняются, письма остаются в очереди. На платных тарифах с включёнными доплатами превышение оплачивается в пределах потолка расходов.
Что такое потолок расходов?
Максимальная сумма доплат за месяц, которую устанавливает владелец проекта. По умолчанию доплаты отключены.
Как перенести проект с Supabase?
Схема, данные, пользователи и файлы переносятся с помощью поддержки. В коде меняются адрес и ключи. Пользователям потребуется повторный вход.
Можно ли использовать вместе с хостингом Hostim?
Да, но это не обязательно: Hostim Backend работает с приложениями на любом хостинге. Оплата из общего кошелька Hostim.
Где хранятся данные?
В дата-центре в России.
Когда откроется доступ?
По мере готовности, в первую очередь по заявкам с этого сайта. Письмо придёт на указанный email.
Заявка на доступ к Hostim Backend
Приглашение придёт на email. Первые проекты подключаются и переносятся с помощью поддержки