Чуть не попали на 7 тысяч долларов на Vercel и Next.js по недосмотру

6 февраля 2025 г.

Вчера мы обнаружили, что пробили лимит по тратам на хостинге Vercel. Если бы не заметили это вовремя, получив емейл о превышении лимита, счет мог бы вырасти до $7 000.

Начну сразу с уроков для продактов, основателей и инженеров:

  1. Если вы хотите, чтобы было быстро для пользователей, это может быть не просто не бесплатно, а мега-дорого. Нужно понимать косты эксплуатации.

  2. Если у вас не установлены лимиты на расходы на инфраструктуру, вы можете обанкротиться, даже если у вас маленький масштаб.

Итак... Что произошло?

Мы добавили каталог подкастов на сайт. Сейчас в нём ~7K подкастов и 1,4M выпусков. На каждой странице есть изображение, которое подтягивается со сторонних хостов.

В самом начале разработки, более года назад, без полного понимания масштабов мы включили оптимизацию изображений в Next.js. Таким образом, на сайте картинки грузились не напрямую с источника, а сначала скачивались на Vercel, сжимались и только потом показывались пользователю.

Для юзеров это круто — страницы грузятся очень быстро!

Но Vercel берет $5 за каждую тысячу оптимизированных изображений. Оптимизация 1,4M картинок обошлась бы нам в $7K. А по мере роста каталога сумма могла вырасти до полумиллиона! На полном масштабе (~100M выпусков) счет за одну только оптимизацию картинок мог бы составить $500K.

При этом проблема не в пользователях. У нас нет многомиллионного пользовательского трафика. Эти затраты вызваны спайдерами (crawlers), которые углубляются в сайт и сканируют все страницы для индексации на поисковых системах и чтобы п.здить данные.

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

Что дальше? Либо платить, либо уговаривать Vercel списать долг. Оба варианта — такое себе.

Пока что мы отключили оптимизацию изображений и картинки грузятся напрямую с хостов, куда их положили подкастеры. Загрузка стала в разы медленнее. Обложки подкастов размером 3000х3000 пикселей, они могут быть по мегабайту и то и больше. На нашем сайте обложки в 10 раз меньше. С оптимизацией изображений загрузка была почти мгновенной (помимо сжатия, Vercel еще и раскидывал изображения по узлам CDN по всему миру).

Теперь у нас диллема — оставить как есть или запилить собственный механизм ужатия изображений и выкладывания их на CloudFlare. Наши приоритеты сейчас в другом месте, поэтому пока мы просто оставляем картинки без оптимизации и смиряемся с тем, что на медленных соединениях картинки могут грузиться долго.

Мы сильно напугались. Когда увидели емейл, мы сначала расслабились — думали, что если бюджет сработал, то и траты остановятся, но у Vercel нет такой функции. Они отправили нам емейл, а затраты продолжали расти по часам.

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

На следующий день провел в режиме антикризисного пожарного. У нас опять подлетели косты на Vercel, когда боты Amazon и Claude заспамили нас 60-ю тысячами запросов за день.

Выяснилось, что мы по незнанию (ну и недосмотру, конечно же) сконфигурили Next.js оптимизировать все изображения, в том числе те, которые не хостятся на нашем сайте. И залетели на этом + создали дыру в безопасности на сайте. В теории наш сайт можно было использовать как API для сжатия изображений...

Краткий пост на английском тут. Он завирусился, наступил на больную мозоль... Мне уже написал продакт менеджер из Anthropic, а я в ответ полтора часа писал ему емейл про их ответственность перед владельцами сайтов. Посмотрим что из этого выйдет.

На следующей неделе напишу post-mortem, сделаем из этого всего PR moment. Пытаюсь договориться с Vercel о коллабе над блогом.

Весёлый выдался денёк.