Все уроки
DevOps и облакоНачальный10 мин чтенияПолезно знать

Vercel и Netlify

Пушите в Git — получаете глобальный сайт с превью-URL, serverless-функциями и кэшированием на edge.

  • Git deploys
  • Previews
  • Edge
  • ISR hosting
Шаг 1/5
Запросов нет — ноль инстансов. Ничего не работает, и ты ничего не платишь. Платформа крепко спит.

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

bash
# 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 — только там, где ответ действительно зависит от запроса.

tsx
// 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.

Лучшие практики

  1. Отдельные переменные окружения для Production, Preview и Development; превью не должны касаться продакшен-данных.
  2. Размещайте функции в том же регионе, что и базу данных, чтобы избежать межрегиональной задержки на каждом запросе.
  3. По умолчанию static и ISR; SSR — только там, где контент зависит от запроса.
  4. Настройте лимиты расходов и алерты по использованию и раз в месяц просматривайте дашборд использования.
  5. Защищайте превью-деплои с невыпущенной работой и запрещайте поисковикам их индексировать.
  6. Держите middleware маленьким и ограниченным через matcher, чтобы он не запускался на статике.
  7. Используйте мгновенный откат платформы и держите миграции базы обратно совместимыми, чтобы откат был безопасным.

Частые ошибки

  • Использовать Vercel Hobby для коммерческого сайта клиента.
  • Направить превью-сборки на продакшен-базу, а потом запускать разрушительные миграции из ветки.
  • Выполнять тяжёлую работу (генерация PDF, обработка видео, долгие AI-вызовы) в функциях запросов, пока они не упрутся в таймауты.
  • Класть секреты в переменные NEXT_PUBLIC_, которые попадают в браузер.
  • Оставлять ботам и краулерам свободный доступ к некэшированным динамическим маршрутам, умножая стоимость функций.

Глубже

06Путь запроса: маршрутизация, кэш и функции

Запрос попадает в ближайшую edge-локацию. Сначала выполняются правила маршрутизации платформы: редиректы, rewrites и заголовки из фреймворка или конфигов. Затем выполняется middleware, если он подходит. Дальше проверяется CDN-кэш по URL и любым ключам кэша или заголовкам Vary. Попадание в кэш возвращается сразу и стоит только CDN-запрос и трафик. Промах вызывает функцию в её настроенном регионе, который может быть далеко от edge, поэтому каждый промах платит за путь от edge до региона плюс за обращения к вашей базе. Stale-while-revalidate позволяет CDN отдавать устаревший контент, обновляя его в фоне. Cookies — скрытый враг кэширования: ответ, зависящий от сессионной cookie, нельзя делить между пользователями, поэтому разбивайте страницы на кэшируемый каркас и небольшие персонализированные части, загружаемые на клиенте или стримингом.

ts
// 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 для дорогих эндпоинтов, ведь каждый злонамеренный запрос — это оплачиваемое время функции.

Реальные ситуации

01

Маркетинговый сайт стал вирусным, и счёт взлетел

Проблема

Лендинг с серверным рендерингом получил всплеск трафика из соцсетей. Использование функций и счёт за два дня далеко превысили включённый в план кредит.

Как решить

Сначала включите или понизьте лимит расходов, чтобы ограничить риск. Посмотрите дашборд использования и убедитесь, какие маршруты потребили время функций. Затем сделайте лендинг статическим или ISR: перенесите персонализацию (приветствие, число товаров в корзине) в клиентские компоненты или небольшой API-вызов и задайте revalidate, чтобы страница пересобиралась не чаще раза в несколько минут. Добавьте заголовки s-maxage и stale-while-revalidate публичным API-маршрутам. Проверьте изображения: используйте image-компонент с разумными размерами или заранее оптимизированные ассеты в объектном хранилище. Включите защиту от ботов, если значительную часть трафика давали краулеры. После этого тот же трафик будет стоить в основном CDN-запросы и трафик.

02

Next.js-приложение на Vercel с базой в другом регионе

Проблема

Страницы со списками товаров открываются на Vercel за 1–2 секунды, а то же приложение на ноутбуке рядом с базой отвечает за 200 ms.

Как решить

Функция работает в регионе платформы по умолчанию, далеко от базы, а каждая страница делает несколько последовательных запросов, и каждый платит за межрегиональный round trip. Установите в настройках проекта регион функций, совпадающий с регионом базы (или перенесите базу). Затем сократите число обращений: независимые запросы выполняйте параллельно через Promise.all, объединяйте запросы и добавьте индексы. Кэшируйте стабильные данные через fetch-кэширование или хелперы unstable cache с тегами, а списки товаров сделайте ISR с ревалидацией по требованию при изменении товаров. Снова измерьте через observability платформы или заголовки server timing, чтобы убедиться, что время теперь уходит на сами запросы.

03

Перевод клиента с платформы на 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.

Есть идея продукта?Давайте создадим его.

Расскажите о своей идее, продукте или команде. Обычно отвечаю в течение одного рабочего дня.