Руководства
От git clone до продакшена на одном сервере Hetzner
Опубликовано · 5 мин чтения· Anton Shubin
Коротко
- Один сервер с Ubuntu, Docker, DNS-записи и один файл окружения, потом deno task deploy.
- Миграции, сертификаты и прокси запускаются сами; бэкапы — ещё один шаг.
- 3 ноября 2026 года самый дешёвый x86-сервер Hetzner с хранилищем для бэкапов стоил 12,48 € в месяц.
- Vercel Pro и Supabase Pro для одного разработчика стоят от 45 $ в месяц, не считая расхода.
Чтобы развернуть SaaS на Seed на одном сервере Hetzner, создайте сервер с Ubuntu, поставьте на него
Docker и Deno, направьте на него домены, заполните на своей машине один файл окружения для
продакшена и выполните deno task deploy. Деплой копирует код, собирает образы на сервере и
запускает их; миграции и сертификаты появляются сами. 3 ноября 2026 года такой сервер вместе с
хранилищем для бэкапов стоил 12,48 € в месяц без НДС.
Этот пост — путь от работающей локальной копии (Как установить Seed и запустить его локально) до живых пользователей, и счёт в конце. Полный чек-лист со всеми командами и проверками — руководство по деплою; здесь я оставил главное и объяснил, зачем оно.
Сколько стоит держать SaaS на одном сервере Hetzner?
Вот цены из прайс-листов на 3 ноября 2026 года, без налогов:
| Что | Цена в месяц | Источник |
|---|---|---|
| Hetzner CX23: 2 vCPU, 4 ГБ, диск 40 ГБ, трафик 20 ТБ | 5,49 € | Hetzner Cloud API, GET /v1/server_types |
| Hetzner CPX32: 4 vCPU, 8 ГБ, диск 160 ГБ | 35,49 € | там же |
| Hetzner CPX42: 8 vCPU, 16 ГБ, диск 320 ГБ | 69,49 € | там же |
| Основной IPv4-адрес | 0,50 € | там же, GET /v1/pricing |
| Hetzner Object Storage для бэкапов (1 ТБ включён) | 6,49 € | hetzner.com |
| Vercel Pro, место разработчика (включён кредит 20 $ на расход) | 20 $ | vercel.com/pricing |
| Supabase Pro (кредит 10 $ на вычисления, 100 000 пользователей в месяц) | от 25 $ | supabase.com/pricing |
Более дешёвый CX33 (4 vCPU, 8 ГБ) всё ещё есть в списке Hetzner за 8,49 €, но в тот день его нельзя было заказать ни в одной локации, а CX23 — только в Нюрнберге и Хельсинки. Цены меняются, так что перед расчётом бюджета проверьте ещё раз.
Выберите сервер и размер команды:
Интерактивно
Seed на одном сервере против управляемого стека
Выберите сервер Hetzner и число разработчиков с местом в Vercel.
- Seed на Hetzner, в месяц
- 12,48 €
- Vercel Pro и Supabase Pro, в месяц
- 45,00 $
- примерно 40,12 €
- Seed экономит
- 27,64 € в месяц
- 331,68 € в год
С одним разработчиком Seed на CX23 стоит 12,48 € в месяц, а пара управляемых сервисов — 45 $, около 40,12 € по курсу ЕЦБ на 2 ноября 2026 года (1,1216 $ за евро), то есть разница около 332 € в год. С тремя разработчиками на CPX32 с 8 ГБ выходит 42,48 € против 85 $ (около 75,78 €), около 400 € в год.
Сравнение не один к одному, и лучше я скажу это сам, чем вы заметите позже. Seed на своём сервере даёт в эту цену ещё фоновые задачи, файловое хранилище, мониторинг и админку, а трафик у него фиксированный до 20 ТБ. Управляемая пара даёт то, чего у Seed нет: не нужно обновлять сервер, масштабирование без смены тарифа сервера и база, которую ведёт и бэкапит кто-то другой. Обеим сторонам нужен ещё SMTP-сервис для писем, поэтому я не включил его ни туда, ни сюда.
Какой сервер нужен?
Начинайте с малого. На моём ноутбуке весь стек разработки, в покое и с пустой базой, занимал 1,6 ГБ
памяти, и 700 МБ из них — dev-сервер Vite, которого в продакшене нет. Поэтому я начинаю с CX23 на 4
ГБ. Это вывод из цифры разработки, а не замер в продакшене: память Seed на боевом сервере я не
измерял, как и пик во время сборки образов, которую деплой каждый раз делает прямо на сервере. После
первого деплоя проверьте память сервера командой free -h. Hetzner позволяет увеличить сервер
позже; меняйте только CPU и память, без диска, если хотите иметь возможность вернуться назад.
Сколько пользователей выдержит один сервер — вопрос с измеренным ответом, а не с догадкой: в руководстве по ёмкости есть нагрузочные тесты и их цифры, пока снятые на ноутбуке.
Шаги по порядку
Создайте сервер с вашим SSH-ключом на Ubuntu. Заведите пользователя
deployс uid 1000 (контейнеры работают под этим uid) и отключите вход по паролю и под root. Блок из руководства делает это, и его можно безопасно вставить дважды.Поставьте Docker, Compose, rsync и Deno и добавьте пользователя
deployв группуdocker.Закройте файрвол для всего, кроме SSH, 80 и 443. Postgres, Valkey и Grafana слушают только
127.0.0.1, поэтому в интернет не смотрят. Надёжнее держать это правило в Hetzner Cloud Firewall перед сервером: Docker его не откроет.Направьте DNS на сервер: запись
A(иAAAA) для хоста приложения, а также для хостов сайта и админки, если они вам нужны. Let's Encrypt проверяет каждый хост через порт 80, так что сделайте это до старта прокси.Напишите файл окружения для продакшена на своей машине:
cp infra/envs/.env.example infra/envs/.env.prod, затем задайтеENV=prod, свои домены,SSH_TO_SERVER,PATH_ON_SERVER(папка приложения на сервере),TRAEFIK_ACME_EMAIL(куда Let's Encrypt пишет об истекающих сертификатах) и свежее значение для каждого секрета. УкажитеPROXY_HTTPS_HOST_PORT=443иPROXY_HTTP_HOST_PORT=80: в примере прокси слушает только127.0.0.1, и с этими значениями сайт снаружи недоступен, а Let's Encrypt не выдаст сертификат. ДобавьтеadminвCOMPOSE_PROFILESдля админки иmpaдля сайта, если они вам нужны. Деплой откажется работать с файлом, где остался секрет из примера или пустой секрет, и назовёт каждый. Файл не живёт на сервере: каждый деплой копирует его туда.Задеплойте, затем один раз запустите общий прокси:
ssh deploy@192.0.2.10 mkdir -p <PATH_ON_SERVER> deno task deploy ssh deploy@192.0.2.10 cd <PATH_ON_SERVER> && deno task proxy:startTraefik запрашивает у Let's Encrypt сертификат для каждого хоста сразу после старта.
Создайте первого оператора для админки:
deno task compose exec worker deno task operator:create <адрес>.Проверьте здоровье со своей машины:
curl -sS https://app.example.com/api/healthдолжен ответить"status":"ok"с кодом 200 без-k— это заодно проверяет сертификат.Включите бэкапы в S3-бакет вне сервера (Hetzner Object Storage подходит) и один раз отрепетируйте восстановление в запасную базу. Бэкап, который вы ни разу не восстанавливали, — это надежда, а не бэкап (бэкапы).
Дальше выкатить изменение — это снова deno task deploy. Он откажется работать при
незакоммиченных изменениях, а упавший шаг оставляет работать текущую версию.
Несколько продуктов на одном сервере
Один прокси обслуживает все проекты на сервере, поэтому второй продукт на Seed на той же машине — это вторая папка и второй файл окружения, со своей базой и своими портами. Деплой замечает, что порт уже занят другим проектом, и останавливается, не тронув ни одного контейнера. Так я держу несколько проектов на одном счёте.
Ваша очередь
Выберите в калькуляторе сервер под свой план и пройдите руководство по деплою с чашкой кофе. Если какой-то шаг в нём непонятен, откройте задачу, и я поправлю руководство.