Как задеплоить сайт на VPS: пошагово от кода до живого домена
Ты собрал сайт в Claude Code за вечер: лендинг, блог, небольшое приложение. Локально всё работает. А дальше стена: как выложить это в интернет, чтобы был свой домен и замочек HTTPS, а не ссылка вида localhost. Разбираю весь путь по шагам — от покупки сервера до живого адреса, с реальными командами и разбором мест, где новички спотыкаются чаще всего.
- Берёшь VPS за 200-900 ₽/мес (Ubuntu 24.04), получаешь IP и пароль.
- Заходишь по SSH, ставишь firewall (ufw) и веб-сервер Caddy — он сам делает HTTPS.
- Заливаешь файлы через scp или git, прописываешь домен A-записью на IP.
- Через 5-60 минут DNS расходится, Caddy выдаёт сертификат — сайт живой на своём домене.
Что такое VPS и зачем он вайб-проекту
Коротко: VPS — это твой личный сервер в аренду. В отличие от обычного хостинга ты хозяин: ставишь что хочешь, держишь Node, Docker, базу, несколько сайтов. Для проекта из Claude Code это правильный дом.
VPS расшифровывается как виртуальный выделенный сервер. По сути это компьютер в дата-центре, который целиком твой: у него свой IP-адрес, своя операционная система, свои гигабайты памяти. Ты подключаешься к нему через интернет и командуешь, что на нём запустить.
Обычный хостинг (тот, где просто заливаешь файлы по FTP) тесноват для вайб-проекта: там нельзя поставить Node, нельзя запустить свой процесс, часто нельзя нормально настроить сертификат. VPS снимает эти ограничения. Ты один раз разбираешься с сервером — и дальше катишь на него что угодно: лендинг сегодня, приложение завтра, три проекта на одном сервере через неделю.
Стоит это дешевле, чем кажется. Рабочий сервер под сайт — 200-900 ₽ в месяц. Это меньше, чем подписка на нейросеть, которой ты этот сайт собрал.
Что нужно перед деплоем
Коротко: собранный проект (папка со статикой или Node-приложение), домен (можно купить за 200 ₽/год), карта для оплаты сервера и 40 минут времени.
Чек-лист готовности, чтобы не застрять на середине:
- Проект собран и проверен локально. Если это статика — есть готовая папка (например,
distпосле сборки). Если Node — приложение запускается командой и открывается у тебя в браузере. - Секреты вынесены из кода. API-ключи, пароли, токены — в файле
.env, а сам.envв.gitignore. ИИ любит зашивать ключи прямо в код — проверь перед публикацией, иначе выложишь их на весь интернет. - Домен. Купи заранее у любого регистратора. Привяжем его в конце.
- Карта. Российские провайдеры принимают МИР и карты РФ. Зарубежные вроде Hetzner — нет.
Шаг 1. Выбрать и купить VPS
Коротко: новичку из РФ проще всего Timeweb Cloud (всё на русском, образы в один клик) или Beget (автобэкапы). Бери Ubuntu 24.04 — под неё максимум гайдов.
Минимальный рабочий конфиг под лендинг, блог или небольшое Node-приложение: 1-2 ядра, 2 ГБ памяти, 30-40 ГБ диска NVMe. Этого хватает с запасом.
| Провайдер | Ориентир цены | Кому подойдёт | Карты РФ |
|---|---|---|---|
| Timeweb Cloud | ~700-900 ₽/мес | Новичку: всё на русском, поддержка, образы в 1 клик | Да |
| Beget | от ~210 ₽/мес посуточно | Кому важны автобэкапы и простая панель | Да |
| Reg.ru Cloud | от ~149 ₽/мес | Кто хочет домен и сервер в одном месте | Да |
| Selectel | от ~385 ₽/мес | Кто перерастёт новичка: гибкий конструктор | Да |
| Aeza | от ~593 ₽/мес | Кому нужно свежее железо и крипто-оплата | Да |
| Hetzner (зарубеж) | ~400-480 ₽/мес | Лучшая цена, но нужна зарубежная карта | Нет |
После оплаты провайдер пришлёт три вещи: IP-адрес сервера, логин (обычно root) и пароль. Цены выше — ориентир на 2026, провайдеры их двигают: проверяй актуальное на сайте.
Шаг 2. Подключиться по SSH и настроить сервер
Коротко: SSH — защищённый канал до сервера: печатаешь команды у себя, выполняются на нём. Первым делом ставим firewall и файл подкачки.
SSH — это как удалённый пульт до сервера. Ты открываешь терминал у себя на компе (на Mac и Windows он встроенный) и подключаешься:
Первый раз спросит, доверяешь ли отпечатку сервера — печатаешь yes, потом пароль. Ты внутри. Дальше — базовая гигиена, без неё сервер держать нельзя.
Обновить систему и завести обычного пользователя (работать под root — как ходить по дому с ключами от всех замков в одной связке: потеряешь одну — потеряешь всё):
Поставить firewall (ufw) — сетевой замок. Правило одно, но железное: сначала разреши SSH, только потом включай. Иначе запрёшь сам себя снаружи.
Добавить swap — файл подкачки. На слабом сервере (2 ГБ памяти) сборка Node или npm может съесть всю память и уронить процесс. Swap — страховка:
Это первый кирпич системы, а не вся стройка
Свой сервер — фундамент. Но сервер сам по себе трафик не приводит. В Клубе «Трафик-машина без лица» собираем всю связку целиком: реалистичный ИИ-блогер, товар без лица на таком вот сервере и рилсы, которые льют на него просмотры в фоне. Не курс «с нуля», а готовая система: взял, повторил, получил охваты.
Что внутри Клуба →Шаг 3. Залить файлы проекта на сервер
Коротко: для разовой заливки — scp, для обновлений — rsync, на дистанции — git. Файлы статики клади в /var/www/, не в домашнюю папку.
Три способа доставить проект на сервер, от простого к правильному:
scp годится, чтобы выложить сайт первый раз. Как только начнёшь обновлять — переходи на rsync (он не гоняет всё заново) или на git (появляется история и откат, если новая версия сломалась).
/var/www/, а не в домашней папке /home/user/. Веб-сервер работает под своим пользователем, и до домашней папки он часто не может дотянуться — получишь 403 Forbidden на ровном месте.Шаг 4. Поднять сайт на Caddy с авто-HTTPS
Коротко: Caddy — веб-сервер, который сам получает и продлевает HTTPS-сертификат. Три строки конфига — и замочек появился. Для новичка это правильный дефолт вместо nginx.
Здесь главная развилка всего деплоя. Классика — nginx: мощный, но сертификат к нему ставят руками через certbot и потом следят за автопродлением. Caddy делает это сам: вписал домен — сертификат Let's Encrypt получился и обновляется без тебя. Для блога, лендинга и небольшого приложения это снимает самую болезненную часть и убирает целый класс ошибок.
| Caddy | nginx | |
|---|---|---|
| HTTPS | Автоматом из коробки | Руками через certbot |
| Конфиг | 3-5 строк, дефолты безопасные | Многословный, легко ошибиться |
| Порог входа | Пологий | Круче: больше понятий |
| Когда брать | Блог, лендинг, небольшое приложение | Тонкий контроль, экстрим-нагрузка |
Ставим Caddy на Ubuntu:
Дальше — весь конфиг сайта. Открываешь /etc/caddy/Caddyfile и пишешь под свой случай:
Если у тебя SPA (React или Vite — частый вывод ИИ), чтобы работал внутренний роутинг, добавь одну строку try_files. Если Node-приложение — Caddy проксирует на него и всё равно даёт бесплатный HTTPS:
Применяешь конфиг — и веб-сервер жив:
Шаг 5. Привязать домен
Коротко: в панели регистратора создаёшь A-запись «домен → IP сервера». Через 5-60 минут DNS расходится, Caddy сам выдаёт HTTPS-сертификат.
Осталось соединить домен с сервером. В панели регистратора (там, где покупал домен) заходишь в DNS-настройки и создаёшь A-запись:
@(сам домен) → IP твоего сервера.www→ тот же IP.
Дальше начинается DNS-пропагация — время, пока новая запись расходится по DNS-серверам мира. Обычно от 5 минут до пары часов (зависит от TTL записи). Проверить, доехало ли:
Как только домен указывает на сервер и открыты порты 80 и 443, Caddy сам берёт сертификат Let's Encrypt. Ты не делаешь ничего — просто открываешь https://mysite.ru и видишь замочек. Это и есть та причина, по которой новичку стоит начинать с Caddy, а не с nginx.
6 ошибок, на которых спотыкаются новички
Коротко: чаще всего сайт не открывается из-за закрытых портов, лишней IPv6-записи, прав доступа или непропагированного DNS. Ниже — симптом и как чинить.
1. Сайт не грузится, хотя SSH работает. Включил ufw, но разрешил только SSH — порты 80 и 443 закрыты. Чинишь: ufw allow 80/tcp && ufw allow 443/tcp. Плюс проверь сетевой экран в панели провайдера — у облачных VPS он часто отдельный от ufw.
2. Заперся сам в SSH. Включил ufw enable до ufw allow OpenSSH — и следующее подключение не проходит. Спасение: зайти через веб-консоль (VNC) в панели провайдера и выполнить ufw allow OpenSSH. Профилактика — всегда разрешай SSH перед включением.
3. HTTPS не выдаётся, хотя по IPv4 всё работает. Самая коварная. У домена есть лишняя AAAA-запись (IPv6), Let's Encrypt при проверке предпочитает IPv6, сервер по нему недоступен — сертификат не выдаётся. Чинишь: удаляешь AAAA-запись в DNS, если IPv6 не используешь. На Cloudflare — переключаешь SSL-режим на Full.
4. 403 Forbidden. Веб-сервер не может прочитать файлы: либо права, либо сайт лежит в домашней папке, куда ему не зайти. Чинишь: держи в /var/www/, папки — 755, файлы — 644.
5. Сайт открывается только с самого сервера. Node-приложение слушает 127.0.0.1 вместо 0.0.0.0, либо порт занят. Смотришь, кто держит порт: ss -tulpn | grep :3000. Правильно — Node за reverse-proxy Caddy, наружу его светить не надо.
6. «У меня не открывается» сразу после привязки домена. DNS ещё не пропагировался. Подожди 5-60 минут, проверь dig mysite.ru +short. Пока ждёшь — можешь открыть сайт по прямому IP.
Зачем это тебе на самом деле
Коротко: свой сервер с сайтом — это не про технику, это про актив, который работает без тебя. Лендинг товара без лица, который собирает заявки, пока ты спишь.
Деплой выглядит как техническая возня, но по факту ты только что научился делать важную вещь: превращать код в актив, который живёт в интернете сам по себе. Сегодня это тестовый сайт. Завтра — лендинг цифрового товара без лица, на который льют трафик рилсы, а заявки капают в фоне.
В этом и есть смысл ниши: собрал продукт с нейросетью, выложил на свой сервер, привёл охваты без съёмок в кадре — и система работает. Один раз разобрался с сервером — и дальше катишь на него каждый новый проект за вечер.
Частые вопросы
Сколько стоит VPS под сайт?
Рабочий сервер под лендинг, блог или небольшое Node-приложение — 200-900 ₽ в месяц (2 ядра, 2 ГБ памяти, 40 ГБ диска). Ориентиры на 2026: Timeweb Cloud около 700-900 ₽, Beget от 210 ₽ посуточно, Reg.ru Cloud от 149 ₽, Aeza от 593 ₽. Дешевле подписки на нейросеть. Цены двигаются — проверяй на сайте провайдера.
Что проще для новичка — Caddy или nginx?
Caddy. Он сам получает и продлевает HTTPS-сертификат: вписал домен в конфиг из трёх строк — замочек появился. С nginx сертификат ставят руками через certbot. Для блога, лендинга или небольшого сайта Caddy убирает самую болезненную часть и целый класс ошибок. nginx оправдан, когда нужен тонкий контроль или экстремальная нагрузка.
Как залить файлы сайта на сервер?
Три способа. scp — разовое копирование: scp -r ./dist user@IP:/var/www/mysite. rsync — умное обновление, шлёт только изменения: rsync -avz --delete ./dist/ user@IP:/var/www/mysite/. git — правильный способ на дистанции: пушишь код в GitHub, на сервере делаешь git pull, есть история и откат.
Сайт не открывается, хотя сервер настроен. Почему?
Три частые причины. Firewall блокирует порты: разрешил только SSH, нужно открыть 80 и 443, плюс проверить сетевой экран в панели провайдера. DNS ещё не пропагировался после привязки домена — подожди 5-60 минут, проверь dig mysite.ru +short. Приложение слушает localhost вместо 0.0.0.0 или порт занят.
Сертификат не выдаётся, хотя по IPv4 всё работает. В чём дело?
Частая причина — лишняя AAAA-запись (IPv6) у домена. Let's Encrypt при проверке предпочитает IPv6, и если сервер по нему недоступен, валидация проваливается, хотя по IPv4 сайт открыт. Решение: удалить AAAA-запись, если IPv6 не используешь, либо настроить IPv6 на сервере. На Cloudflare — переключить SSL-режим на Full.
Нужен ли Docker, чтобы выложить сайт?
Не обязательно. Для статики (собранный HTML, React или Vite после build) достаточно отдать папку через Caddy. Docker нужен, когда проект уже в контейнере или есть docker-compose.yml — тогда docker compose up -d поднимает всё как есть. Плюс Docker: работает у тебя — работает на сервере. Минус для новичка: лишний слой, сложнее дебажить первые разы.
Свой сервер есть. Теперь — трафик на него
Сайт в интернете — это половина дела. Вторая половина — как привести на него людей без съёмок в кадре и без бюджета на рекламу. В Клубе «Трафик-машина без лица» собираем связку целиком: ИИ-блогер, товар без лица и рилсы, которые льют просмотры в фоне. Готовая система, доступ навсегда.
Вступить в Клуб — 12 000 ₽Была статья полезной?
Матвей Абрамов