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

Руководства

От 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 € в год
Сервер Hetzner
Цены из прайс-листов без налогов, проверены 3 ноября 2026 года. Seed: сервер, его IPv4-адрес и Object Storage для бэкапов. Управляемый стек: базовые тарифы без оплаты за использование. Доллары в евро по курсу ЕЦБ на 2 ноября 2026 года.

С одним разработчиком 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 и память, без диска, если хотите иметь возможность вернуться назад.

Сколько пользователей выдержит один сервер — вопрос с измеренным ответом, а не с догадкой: в руководстве по ёмкости есть нагрузочные тесты и их цифры, пока снятые на ноутбуке.

Шаги по порядку

  1. Создайте сервер с вашим SSH-ключом на Ubuntu. Заведите пользователя deploy с uid 1000 (контейнеры работают под этим uid) и отключите вход по паролю и под root. Блок из руководства делает это, и его можно безопасно вставить дважды.

  2. Поставьте Docker, Compose, rsync и Deno и добавьте пользователя deploy в группу docker.

  3. Закройте файрвол для всего, кроме SSH, 80 и 443. Postgres, Valkey и Grafana слушают только 127.0.0.1, поэтому в интернет не смотрят. Надёжнее держать это правило в Hetzner Cloud Firewall перед сервером: Docker его не откроет.

  4. Направьте DNS на сервер: запись A (и AAAA) для хоста приложения, а также для хостов сайта и админки, если они вам нужны. Let's Encrypt проверяет каждый хост через порт 80, так что сделайте это до старта прокси.

  5. Напишите файл окружения для продакшена на своей машине: 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 для сайта, если они вам нужны. Деплой откажется работать с файлом, где остался секрет из примера или пустой секрет, и назовёт каждый. Файл не живёт на сервере: каждый деплой копирует его туда.

  6. Задеплойте, затем один раз запустите общий прокси:

    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:start
    

    Traefik запрашивает у Let's Encrypt сертификат для каждого хоста сразу после старта.

  7. Создайте первого оператора для админки: deno task compose exec worker deno task operator:create <адрес>.

  8. Проверьте здоровье со своей машины: curl -sS https://app.example.com/api/health должен ответить "status":"ok" с кодом 200 без -k — это заодно проверяет сертификат.

  9. Включите бэкапы в S3-бакет вне сервера (Hetzner Object Storage подходит) и один раз отрепетируйте восстановление в запасную базу. Бэкап, который вы ни разу не восстанавливали, — это надежда, а не бэкап (бэкапы).

Дальше выкатить изменение — это снова deno task deploy. Он откажется работать при незакоммиченных изменениях, а упавший шаг оставляет работать текущую версию.

Несколько продуктов на одном сервере

Один прокси обслуживает все проекты на сервере, поэтому второй продукт на Seed на той же машине — это вторая папка и второй файл окружения, со своей базой и своими портами. Деплой замечает, что порт уже занят другим проектом, и останавливается, не тронув ни одного контейнера. Так я держу несколько проектов на одном счёте.

Ваша очередь

Выберите в калькуляторе сервер под свой план и пройдите руководство по деплою с чашкой кофе. Если какой-то шаг в нём непонятен, откройте задачу, и я поправлю руководство.

Следующий пост — на почту

Короткое письмо, когда выходит новый пост или что-то запускается. Подписка подтверждается один раз по почте, отписаться можно в один клик.

Все посты