Vercel и Netlify
Пушите в Git — получаете глобальный сайт с превью-URL, serverless-функциями и кэшированием на edge.
За 30 секунд
Vercel и Netlify — фронтенд-облачные платформы. Вы подключаете Git-репозиторий, и каждый пуш собирает сайт и деплоит его в глобальный CDN, а каждый pull request получает собственный превью-URL. Они также запускают serverless-функции и код на edge, так что у приложения на Next.js, Astro, Nuxt или SvelteKit может быть серверная часть без управления сервером. Вы меняете часть контроля и предсказуемости расходов на чрезвычайно быстрый рабочий процесс.
Не в моём ежедневном стеке — я понимаю принципы и изучу детали, когда это понадобится проекту.
Почему это важно
- Они убирают почти всю работу по деплою фронтенд-приложений: ни Nginx, ни сертификатов, ни CI-скриптов в базовом случае.
- Превью-деплои для каждого pull request меняют то, как команды проводят ревью: дизайнеры и клиенты кликают по живой ссылке вместо чтения описания.
- Vercel разрабатывает Next.js, поэтому ISR, стриминг, оптимизация изображений и middleware работают там без какой-либо настройки; Netlify поддерживает Next.js через адаптер на основе OpenNext.
- Команды выбирают их, чтобы быстро выпускать маркетинговые сайты, документацию и фронтенды, часто размещая тяжёлый бэкенд и базу данных в другом месте.
Как это работает
01Что они на самом деле делают
Представьте эти платформы как билд-сервер, CDN и serverless-рантайм, склеенные через Git. При пуше платформа клонирует репозиторий, определяет фреймворк, запускает команду сборки и разделяет результат. Статические файлы (HTML, CSS, JS, изображения) уходят в глобальный CDN с долгим кэшированием. Серверный код (API-маршруты, страницы с серверным рендерингом, server actions) упаковывается в функции, которые запускаются по требованию в одном или нескольких регионах. Middleware или edge-функции выполняются перед кэшем на облегчённом рантайме рядом с пользователем. Каждый деплой неизменяем и имеет свой URL; «production» — просто алиас, указывающий на один из них. Поэтому откат мгновенный: вы переводите алиас на более старый деплой, ничего не пересобирается. По сравнению с VPS вы больше не думаете о серверах, зато думаете о длительности функций, регионах, заголовках кэширования и счёте.
- Статика → CDN. Серверный код → функции. Middleware → edge.
- Каждый деплой неизменяем; production — это алиас.
- Превью-деплои для каждой ветки или pull request.
02Настройка проекта шаг за шагом
Создайте аккаунт, импортируйте репозиторий из GitHub, GitLab или Bitbucket и примите определённые настройки фреймворка. Первый деплой обычно работает без изменений. Затем сделайте настоящую настройку. Добавьте переменные окружения по окружениям (Production, Preview, Development) в дашборде и никогда не позволяйте превью-сборкам использовать продакшен-секреты или продакшен-базу. Добавьте свой домен: apex-домен направьте A-записью или ALIAS, а поддомен www — CNAME, как подскажет платформа; сертификаты выпускаются автоматически. Защитите превью встроенной deployment protection, если они показывают ещё не выпущенную работу. Установите регион функций тот же, что у базы данных. Наконец, подключите CLI для локальной работы: он подтягивает переменные окружения и может воспроизвести сборку платформы локально.
# Vercel
npm i -g vercel
vercel link # connect this folder to a project
vercel env pull .env.local
vercel # preview deploy
vercel --prod # production deploy
# Netlify
npm i -g netlify-cli
netlify link
netlify dev # local server with functions and redirects
netlify deploy --prod
03Рендеринг и кэширование: static, ISR, SSR, edge
То, где рендерится страница, определяет скорость и стоимость. Статические страницы собираются один раз и отдаются из CDN: быстрее всего и почти бесплатно. Incremental Static Regeneration (ISR) отдаёт закэшированную страницу и перегенерирует её в фоне после периода revalidate или по требованию, когда ваша CMS вызывает эндпоинт ревалидации, — так вы получаете скорость статики со свежим контентом. Серверный рендеринг запускает функцию на каждый запрос: это нужно для персонализированных страниц, но каждый запрос стоит времени функции. Middleware выполняется перед кэшем на каждом подходящем запросе, поэтому держите его крошечным: редиректы, rewrites, проверка auth-cookie, A/B-распределение. Обе платформы учитывают стандартные заголовки Cache-Control, а Vercel также читает CDN-Cache-Control и Vercel-CDN-Cache-Control для правил только для CDN. Netlify использует Netlify-CDN-Cache-Control и поддерживает cache tags для точечной очистки. Хорошее правило: по умолчанию static, для контента ISR, SSR — только там, где ответ действительно зависит от запроса.
// app/blog/[slug]/page.tsx (Next.js App Router)
export const revalidate = 3600; // regenerate at most once per hour
export async function generateStaticParams() {
const posts = await fetch("https://cms.example.com/posts").then((r) => r.json());
return posts.map((p: { slug: string }) => ({ slug: p.slug }));
}
export default async function Post({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const post = await fetch("https://cms.example.com/posts/" + slug, {
next: { tags: ["post-" + slug] },
}).then((r) => r.json());
return <article><h1>{post.title}</h1></article>;
}
04Функции: лимиты и как устроен биллинг
Обе платформы запускают ваш серверный код как функции, в основном на Node.js. На Vercel функции по умолчанию используют Fluid compute: один инстанс может обслуживать много одновременных запросов, что уменьшает холодные старты и стоимость для I/O-нагрузки вроде обращений к базе или к AI API. Оплата идёт за активное время CPU, выделенную память и вызовы, так что ожидание сети стоит намного меньше, чем «сырая» длительность. Edge Functions и middleware работают на более лёгком рантайме V8; теперь Vercel рекомендует Node.js-рантайм для большинства функций. Netlify Functions под капотом работают на AWS Lambda, а Netlify Edge Functions — на Deno на edge. Netlify использует модель планов на кредитах: деплои, вычисления, трафик и запросы расходуют кредиты из ежемесячного лимита. У обеих платформ есть максимальная длительность, лимиты размера тела запроса и памяти по планам, поэтому долгим задачам место в очереди или в фоновом воркере где-то ещё.
05Планы и ценовые ловушки
План Hobby у Vercel бесплатный, но только для личного некоммерческого использования; клиентским и корпоративным проектам нужен Pro, который тарифицируется за место (seat) с ежемесячным кредитом на использование, а дальше pay-as-you-go. Новые Pro-команды получают бюджет расходов по умолчанию с алертами и возможностью ставить проекты на паузу при достижении лимита: держите это включённым. У Netlify есть планы Free, Personal и Pro с ежемесячным лимитом кредитов; когда кредиты заканчиваются, сайты могут быть приостановлены, если не докупить кредиты или не включить автопополнение. Ловушки на обеих платформах похожи: вирусная страница с серверным рендерингом на каждый запрос, большие неоптимизированные изображения или видео, отдаваемые как трафик, боты, бьющие по динамическим маршрутам, оптимизация тысяч исходных изображений и превью-сборки на каждый коммит в загруженном монорепозитории. Перед решением для клиента сверяйте цены на официальных страницах: обе компании регулярно меняют модели.
- Hobby на Vercel — некоммерческий: для клиентской работы нужен Pro.
- Включите лимиты расходов или бюджетные алерты в первый же день.
- Кэшируйте агрессивно; некэшированный SSR — то место, где растут счета.
Когда применять
- Фронтенд-приложения и маркетинговые сайты на Next.js, Astro, Nuxt, SvelteKit или Remix, которым полезны CDN и превью.
- Команды, которым нужны превью-URL для каждого pull request — для дизайна, QA и ревью клиентом.
- Проекты без отдельного DevOps-специалиста, где сэкономленное на деплое время ценнее наценки платформы.
- Jamstack-сайты с headless CMS, где ISR или ревалидация по требованию поддерживают свежесть контента.
Когда не стоит
- Долгоживущие бэкенды, WebSocket-серверы, воркеры очередей или задачи с большим количеством cron: используйте VPS, контейнеры или отдельную бэкенд-платформу.
- Медиасайты с большим трафиком, где оплата за ГБ делает VPS или объектное хранилище с CDN намного дешевле.
- Строгие требования к локализации данных или сети (приватные сети, фиксированные egress IP), для которых нужны enterprise-планы.
Альтернативы
- Cloudflare Pages / Workers
Щедрый бесплатный уровень и очень дешёвый трафик; Next.js работает на Workers через адаптер OpenNext.
- VPS + Docker + Nginx
Фиксированная цена и полный контроль; сборки, TLS, кэширование и откаты — на вас.
- AWS Amplify / Cloud Run
Оставайтесь внутри облака, которое уже используете, — больше контроля и больше работы по настройке.
- Self-hosted Next.js (standalone)
next build с output standalone работает везде, где работает Node, включая Docker на VPS.
Лучшие практики
- Отдельные переменные окружения для Production, Preview и Development; превью не должны касаться продакшен-данных.
- Размещайте функции в том же регионе, что и базу данных, чтобы избежать межрегиональной задержки на каждом запросе.
- По умолчанию static и ISR; SSR — только там, где контент зависит от запроса.
- Настройте лимиты расходов и алерты по использованию и раз в месяц просматривайте дашборд использования.
- Защищайте превью-деплои с невыпущенной работой и запрещайте поисковикам их индексировать.
- Держите middleware маленьким и ограниченным через matcher, чтобы он не запускался на статике.
- Используйте мгновенный откат платформы и держите миграции базы обратно совместимыми, чтобы откат был безопасным.
Частые ошибки
- Использовать Vercel Hobby для коммерческого сайта клиента.
- Направить превью-сборки на продакшен-базу, а потом запускать разрушительные миграции из ветки.
- Выполнять тяжёлую работу (генерация PDF, обработка видео, долгие AI-вызовы) в функциях запросов, пока они не упрутся в таймауты.
- Класть секреты в переменные NEXT_PUBLIC_, которые попадают в браузер.
- Оставлять ботам и краулерам свободный доступ к некэшированным динамическим маршрутам, умножая стоимость функций.
Глубже
06Путь запроса: маршрутизация, кэш и функции
Запрос попадает в ближайшую edge-локацию. Сначала выполняются правила маршрутизации платформы: редиректы, rewrites и заголовки из фреймворка или конфигов. Затем выполняется middleware, если он подходит. Дальше проверяется CDN-кэш по URL и любым ключам кэша или заголовкам Vary. Попадание в кэш возвращается сразу и стоит только CDN-запрос и трафик. Промах вызывает функцию в её настроенном регионе, который может быть далеко от edge, поэтому каждый промах платит за путь от edge до региона плюс за обращения к вашей базе. Stale-while-revalidate позволяет CDN отдавать устаревший контент, обновляя его в фоне. Cookies — скрытый враг кэширования: ответ, зависящий от сессионной cookie, нельзя делить между пользователями, поэтому разбивайте страницы на кэшируемый каркас и небольшие персонализированные части, загружаемые на клиенте или стримингом.
// next.config.ts: long cache for a public API route, revalidated in the background
import type { NextConfig } from "next";
const config: NextConfig = {
async headers() {
return [
{
source: "/api/public/:path*",
headers: [{ key: "Cache-Control", value: "public, s-maxage=300, stale-while-revalidate=86400" }],
},
];
},
};
export default config;
07Подключения к базам данных из serverless-функций
Функции масштабируются, создавая больше инстансов, и каждый инстанс, открывающий собственные TCP-соединения к Postgres, под нагрузкой может исчерпать лимит соединений базы. Проблему решают три инструмента. Первый — пулер перед базой: PgBouncer, pooled-эндпоинт managed-провайдера или Prisma Accelerate, в transaction mode. Второй — для edge и короткоживущих функций выбирайте драйверы, рассчитанные на serverless, например HTTP- или WebSocket-драйверы serverless-провайдеров Postgres. Третий — с Vercel Fluid compute один инстанс обслуживает много запросов, так что небольшой пул на уровне модуля эффективно переиспользуется; используйте хелперы waitUntil или attachDatabasePool, чтобы простаивающие соединения закрывались до заморозки инстанса. Всегда ставьте регион функции рядом с базой: один межрегиональный переход на запрос, умноженный на десять запросов на страницу, — это разница между 50 и 500 миллисекундами.
08Безопасность: секреты, превью и edge
Переменные окружения шифруются при хранении, но всё, что имеет клиентский префикс (NEXT_PUBLIC_, PUBLIC_, VITE_), встраивается в браузерный бандл: считайте такие значения публичными. Ограничьте чувствительные переменные только окружением Production и пометьте их как sensitive, чтобы их нельзя было прочитать обратно из дашборда. Превью — реальная поверхность атаки: pull request из форка может во время сборки выполнить код с вашими секретами, поэтому платформы по умолчанию не отдают секреты сборкам из форков; так и оставьте. Используйте deployment protection (пароль, SSO или Vercel Authentication) для превью невыпущенной работы и добавьте заголовок X-Robots-Tag noindex, чтобы они никогда не индексировались. Включите файрвол и защиту от ботов для логина и API-маршрутов и добавьте rate limiting для дорогих эндпоинтов, ведь каждый злонамеренный запрос — это оплачиваемое время функции.
Реальные ситуации
Маркетинговый сайт стал вирусным, и счёт взлетел
Проблема
Лендинг с серверным рендерингом получил всплеск трафика из соцсетей. Использование функций и счёт за два дня далеко превысили включённый в план кредит.
Как решить
Сначала включите или понизьте лимит расходов, чтобы ограничить риск. Посмотрите дашборд использования и убедитесь, какие маршруты потребили время функций. Затем сделайте лендинг статическим или ISR: перенесите персонализацию (приветствие, число товаров в корзине) в клиентские компоненты или небольшой API-вызов и задайте revalidate, чтобы страница пересобиралась не чаще раза в несколько минут. Добавьте заголовки s-maxage и stale-while-revalidate публичным API-маршрутам. Проверьте изображения: используйте image-компонент с разумными размерами или заранее оптимизированные ассеты в объектном хранилище. Включите защиту от ботов, если значительную часть трафика давали краулеры. После этого тот же трафик будет стоить в основном CDN-запросы и трафик.
Next.js-приложение на Vercel с базой в другом регионе
Проблема
Страницы со списками товаров открываются на Vercel за 1–2 секунды, а то же приложение на ноутбуке рядом с базой отвечает за 200 ms.
Как решить
Функция работает в регионе платформы по умолчанию, далеко от базы, а каждая страница делает несколько последовательных запросов, и каждый платит за межрегиональный round trip. Установите в настройках проекта регион функций, совпадающий с регионом базы (или перенесите базу). Затем сократите число обращений: независимые запросы выполняйте параллельно через Promise.all, объединяйте запросы и добавьте индексы. Кэшируйте стабильные данные через fetch-кэширование или хелперы unstable cache с тегами, а списки товаров сделайте ISR с ревалидацией по требованию при изменении товаров. Снова измерьте через observability платформы или заголовки server timing, чтобы убедиться, что время теперь уходит на сами запросы.
Перевод клиента с платформы на VPS
Проблема
Стабильный высоконагруженный сайт с предсказуемой нагрузкой стоит на фронтенд-платформе намного больше, чем клиент готов платить, а превью почти не используются.
Как решить
Соберите Next.js с output: 'standalone', сделайте компактный Docker-образ и запустите его за Nginx или Caddy на VPS, а перед ним поставьте CDN вроде Cloudflare для статики и кэширования. Заменяйте возможности платформы по одной: ISR работает на одном Node-сервере с файловым кэшем, а при нескольких инстансах используйте общий cache handler с Redis; для оптимизации изображений нужен установленный sharp; cron-задачи переезжают в планировщик или systemd timers; редиректы — в конфиг фреймворка или Nginx. Оставьте GitHub Actions для сборки и деплоя с тегированными образами для отката. Запустите оба варианта параллельно, затем переключите DNS с низким TTL.
Шпаргалка
- Превью-деплой (Vercel)
vercel- Деплой в продакшен (Vercel)
vercel --prod- Подтянуть переменные окружения локально (Vercel)
vercel env pull .env.local- Откатить продакшен (Vercel)
vercel rollback <deployment-url>- Локальный запуск с функциями (Netlify)
netlify dev- Деплой в продакшен (Netlify)
netlify deploy --prod- Кэшировать публичный ответ в CDN
Cache-Control: public, s-maxage=300, stale-while-revalidate=86400- Ревалидировать тег по требованию (Next.js)
revalidateTag("post-hello-world")- Исключить статику из middleware
export const config = { matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"] }
Вопросы и ответы
Q1Что такое превью-деплой и чем он ценен?
Превью-деплой — это полная изолированная сборка ветки или pull request с собственным URL, создаваемая автоматически при пуше. Она запускает ту же сборку, что и продакшен, но с превью-переменными окружения. Её ценность — в ревью: дизайнеры, продакт-оунеры и клиенты видят реальное изменение по реальной ссылке, QA может его протестировать, а автоматические проверки вроде Lighthouse или end-to-end-тестов могут прогоняться на нём до мержа. Поскольку каждый деплой неизменяем, промоутится ровно тот превью, который вы одобрили. Главная осторожность — данные: превью должны использовать staging-базу или засеянные данные и быть защищены, если показывают невыпущенные функции.
Q2Как работает ISR на этих платформах?
Incremental Static Regeneration означает, что страница генерируется статически и кэшируется в CDN, а затем перегенерируется без полной пересборки. При ревалидации по времени первый запрос после окна revalidate всё ещё получает закэшированную страницу, пока платформа перегенерирует её в фоне; следующие посетители получают свежую версию. При ревалидации по требованию ваша CMS или бэкенд вызывает эндпоинт, который выполняет revalidatePath или revalidateTag, и платформа очищает и пересобирает только эти страницы. Вы получаете производительность и стоимость статики с контентом, который обновляется за секунды. На Vercel это нативно; на Netlify работает через её Next.js-рантайм с durable-кэшированием.
Q3Vercel или Netlify: как выбрать?
Для Next.js Vercel обычно самый гладкий вариант, потому что он разрабатывает фреймворк и поддерживает новые возможности в день релиза. Netlify хорошо поддерживает Next.js через свой адаптер и силён для команд с несколькими фреймворками, сайтов на Astro, форм и встроенных функций вроде split testing и identity. Сравните модель планов для ожидаемого трафика: Vercel тарифицирует Pro за место плюс вычисления по использованию, Netlify использует лимит кредитов на план. Проверьте также выбор регионов, лимиты функций, командные возможности вроде SSO и то, где живёт бэкенд. Для клиента я бы делал небольшой прототип на обеих платформах, только если решение неочевидно; обычно всё решает фреймворк.
Q4Можно ли разместить полноценный бэкенд на Vercel или Netlify?
Можно разместить API-маршруты и server actions, которые выполняют короткую работу «запрос — ответ»: читают и пишут в базу, вызывают сторонние API, обрабатывают вебхуки. Плохо подходит долгая или stateful-работа: WebSocket-серверы, потребители очередей, тяжёлые пакетные задачи или всё, что должно работать дольше лимита функции. Обычная архитектура — фронтенд и тонкий backend-for-frontend на платформе, managed-база (Postgres от Neon, Supabase или облачного провайдера) и отдельный сервис-воркер для очередей и задач по расписанию на VPS или в контейнерах. Так сохраняется быстрый рабочий процесс, а тяжёлая работа уходит туда, где дешевле.
Q5Как откатить неудачный деплой?
Каждый деплой неизменяем и остаётся доступным, а production — это алиас, указывающий на один из них. На Vercel используйте Instant Rollback в дашборде или vercel rollback с URL деплоя; на Netlify выберите более старый деплой и опубликуйте его, при желании заблокировав автопубликацию, пока чините проблему. Пересборки нет, поэтому это занимает секунды. Подвох — во всём, что вне деплоя: миграции базы, изменённые переменные окружения и внешние вебхуки не откатываются. Поэтому миграции должны быть обратно совместимыми (сначала expand, потом contract), чтобы предыдущая версия продолжала работать с новой схемой.
Вопросы уровня senior
S1Когда фронтенд-платформа перестаёт быть выгодной и как решить, что пора уходить?
Смоделируйте стоимость на единицу трафика. Платформы дёшевы, когда большая часть трафика кэшируется, а команда небольшая: экономия на DevOps-времени перевешивает оплату за использование. Дорогими они становятся при большом трафике (медиа, крупные загрузки), большом объёме некэшированного серверного рендеринга, тяжёлой оптимизации изображений, многих местах в команде или долгих вычислениях. Перед уходом оптимизируйте: по умолчанию static и ISR, заголовки кэширования, бюджеты на изображения, защита от ботов, правильный регион. Если счёт всё ещё высок, сравните полную стоимость владения: VPS или контейнеры плюс CDN, плюс инженерное время на CI, превью, TLS, мониторинг и дежурства. Часто выигрывает гибрид: фронтенд и превью остаются на платформе, а тяжёлые API, воркеры и медиа переезжают на более дешёвую инфраструктуру.
S2Edge-рантайм или Node.js-рантайм для серверного кода?
Edge-рантайм быстро стартует и работает рядом с пользователем, но у него ограниченный API (не полный Node.js, ограниченный набор пакетов, меньший размер кода, ограниченное время CPU). Он хорош для логики, которой не нужна база или нужно только глобально реплицированное хранилище: редиректы, геолокация, A/B-распределение, проверка auth-токенов, переписывание заголовков. Большая часть реальной работы общается с базой в одном регионе, и запуск её на edge означает, что каждый запрос пересекает полмира, — получается медленнее, а не быстрее. Node.js-функции в регионе базы, особенно с конкурентностью Fluid compute, обычно лучший вариант по умолчанию, и Vercel теперь рекомендует именно их. Используйте edge middleware для тонких решений по маршрутизации, а доступ к данным держите региональным.
S3Как спроектировать превью-окружения, включающие базу данных?
Статические превью — это просто; сложность в данных. Варианты от простого к богатому: одна общая staging-база для всех превью (дёшево, но ветки с миграциями конфликтуют); ветвление базы у провайдеров вроде Neon, где каждое превью получает copy-on-write-ветку, создаваемую вебхуком или шагом CI и удаляемую при закрытии pull request; или временная база на каждое превью, засеянная из фикстур. Миграции выполняются на ветке во время сборки или в отдельной CI-задаче. Секреты для превью берутся из интеграции, никогда — из продакшена. Добавьте автоматическую очистку, иначе ветки и их стоимость будут копиться. Компромисс — сложность настройки против уверенности: ветвление даёт реалистичную проверку миграций до того, как они попадут в продакшен.
Глоссарий
- Превью-деплой (Preview deployment)
- Автоматический изолированный деплой ветки или pull request с собственным URL.
- ISR
- Incremental Static Regeneration: отдавать закэшированную статическую страницу и перегенерировать её после временного окна или по требованию.
- Edge-функция (Edge function)
- Лёгкий код, который выполняется во множестве локаций рядом с пользователями, перед кэшем, на ограниченном рантайме.
- Fluid compute
- Модель функций Vercel, где один инстанс обрабатывает много одновременных запросов, а биллинг идёт по активному времени CPU.
- Instant rollback
- Перевод продакшен-алиаса на более ранний неизменяемый деплой без пересборки.
- s-maxage
- Директива Cache-Control, задающая, как долго общие кэши вроде CDN могут хранить ответ.
- Build minutes
- Время, потраченное на сборку деплоев; ограничено или оплачивается по плану и умножается в загруженных монорепозиториях.
- OpenNext
- Open-source-адаптер, позволяющий запускать Next.js-приложения на платформах помимо Vercel — Netlify, AWS или Cloudflare.
Что изучить дальше
Есть идея продукта?Давайте создадим его.
Расскажите о своей идее, продукте или команде. Обычно отвечаю в течение одного рабочего дня.