v0 делает ровно то, для чего его собрали: вы описываете экран и получаете рабочий код на React и Next.js. Трудность начинается на следующем шаге — генератор предлагает единственный путь публикации, на Vercel, потому что это платформа той же компании. Причины искать, где ещё задеплоить проект из v0, обычно три: не подходит способ оплаты, хочется держать сайт рядом с остальными проектами или просто не нужен ещё один аккаунт ради одной страницы. Хорошая новость в том, что код ничем не заперт: это обычное Next.js-приложение, и дальше речь о том, что проверить перед переездом и как получить публичную HTTPS-ссылку на Dockbox без аренды сервера, nginx и ручных сертификатов.
Что именно отдаёт v0 и почему это обычный Next.js-проект
v0 генерирует не «проект для Vercel», а стандартный стек: Next.js с App Router, Tailwind и компоненты shadcn/ui. Компоненты shadcn — это не библиотека с версиями, а обычные файлы в папке components/ui, они переносятся буквально копированием; в dependencies при этом остаются их спутники вроде lucide-react, clsx и tailwind-merge. Сам каркас приложения работает на любом хосте, умеющем собирать Node-проекты, а жёсткая привязка появляется только там, где вы использовали платформенные надстройки — её функции, хранилище и cron.
Переезд на практике спотыкается о три вещи: приложение слушает не тот порт, часть проекта существует только на платформе, а ключи к моделям и сервисам лежат прямо в файлах. Ниже — по шагам, что с этим делать.
Шаг 1. Соберите код в нормальную папку проекта
Из v0 код забирают двумя способами: копированием файлов в свой проект или экспортом через интерфейс. Соберите всё в одну папку, чтобы рядом лежали package.json, исходники и конфиг Next.js:
app/
components/ui/
package.json
next.config.js
В архив не кладите node_modules, .next и out — зависимости платформа поставит сама, а сборку выполнит в контейнере. Файл .env.local, если он есть, тоже не переносите: значения из него отправятся в раздел переменных окружения. После этого проекта «из v0» больше не существует — есть обычное Next.js-приложение, с которым можно работать как с любым другим.
Шаг 2. Определите: статика или серверное приложение
От этого зависит весь деплой. Если страницы содержат только разметку, стили и навигацию, сайт собирается в готовые файлы — включите статический экспорт в конфиге:
const nextConfig = {
output: 'export'
}
module.exports = nextConfig
Если в проекте есть route handlers, авторизация или данные, загружаемые на сервере, оставляйте обычный режим с next start — это серверное приложение. Тонкость в том, что v0 любит генерировать обработчики для вызовов ИИ прямо в проекте: такой route handler статический экспорт ломает, и next build упадёт прямым текстом.
Шаг 3. Порт должен приходить из окружения
Серверное приложение обязано слушать порт, который выдаёт платформа, а не число, вписанное в код. Next.js читает PORT из окружения сам, поэтому обычно менять ничего не нужно — достаточно убрать захардкоженное значение из скрипта запуска:
"start": "next start -p 3000"
Правильный вариант — без флагов:
"start": "next start"
Захардкоженный порт — причина номер один, по которой сборка проходит, а ссылка открывается пустой страницей. Контейнеру порт назначает платформа, а приложение упрямо слушает свой.
Шаг 4. Замените всё, что работало только на Vercel
Кроме самого Next.js платформа даёт свои надстройки: серверные функции, key-value хранилище, базу, загрузку файлов, обработчики на edge рядом с пользователем. Всё это принадлежит платформе, а не фреймворку, и «как есть» не заработает — честно говоря, такие куски придётся переписать обычным серверным кодом. Функции становятся route handlers внутри вашего приложения, хранилище — базой рядом с проектом или постоянной папкой /data, содержимое которой переживает обновление кода, а запланированные задачи выносятся в отдельный процесс. Заодно вычистите из package.json пакеты вида @vercel/*: они тянут платформенные зависимости, которых на новом хосте нет.
Шаг 5. Шрифты и картинки собираются на этапе сборки
В Next.js шрифты и изображения обрабатываются не в браузере, а при сборке. Если шрифты подключены через next/font, они скачиваются во время next build — это нормально, просто сборка идёт чуть дольше. С картинками две частые ловушки: при статическом экспорте встроенную оптимизацию изображений нужно отключить, иначе сборка остановится с ошибкой, а изображения с чужого домена требуют явного разрешения в конфиге — иначе вместо картинок вы увидите пустые места.
const nextConfig = {
images: {
unoptimized: true
}
}
module.exports = nextConfig
Шаг 6. Вынесите ключи в секреты и опубликуйте
Сгенерированный код часто хранит ключи к моделям и внешним сервисам прямо в файлах. Перенесите их в переменные окружения: платформа спросит значения при настройке проекта и подставит их зашифрованными, так что в архиве и в репозитории они не окажутся. Помните, что в Next.js всё с префиксом NEXT_PUBLIC_ уезжает в браузер и секретом уже не является. Дальше проект отправляется ZIP-архивом или подключением Git-репозитория, включая приватный: платформа распознаёт Next.js по package.json, ставит зависимости, выполняет сборку и выдаёт публичную HTTPS-ссылку. Логи и статус публикации видны в панели в реальном времени, а упавший контейнер перезапускается автоматически.
Сколько это стоит и как работают контейнеры
Своим сервером и nginx заниматься не нужно: контейнеры на Dockbox работают постоянно, без «засыпания» и без лимита по часам. Сайт из v0 не засыпает и не просыпается на первом запросе — он отвечает всегда.
Starter — 990 ₽/мес. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект. Первый месяц бесплатный. Next.js-приложению этого хватает с запасом.
Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов — если проектов несколько или нужен запас на сборку.
Team — 4 990 ₽/мес — для команд, которым нужен запас ресурсов и SLA.
Свой Dockerfile поддерживается, но не обязателен. Тарифы — на dockbox.host.
Частые вопросы
Обязательно ли деплоить проект из v0 на Vercel?
Нет. v0 отдаёт обычный код на React и Next.js, который запускается на любом хосте, умеющем собирать Node-проекты. Привязка возникает только там, где вы использовали надстройки платформы — её функции, хранилище или edge-обработчики; всё остальное переезжает без изменений.
Как понять, статика у меня или серверное приложение?
Посмотрите, что внутри. Если это только страницы, стили и навигация — сайт собирается в готовые файлы и раздаётся как статика. Если есть route handlers, авторизация или данные, загружаемые на сервере, — это серверное приложение, и его нужно запускать обычным способом.
Что делать с функциями и хранилищем Vercel?
Переписать. Они принадлежат конкретной платформе, а не Next.js, и больше нигде не работают. Функции превращаются в route handlers внутри приложения, хранилище — в базу рядом с проектом или постоянную папку /data, содержимое которой сохраняется при обновлении кода.
Почему сборка проходит, а страница открывается пустой?
Чаще всего приложение слушает порт, вписанный в код или в команду запуска, вместо порта из переменной PORT. Вторая по частоте причина — вызов платформенной функции, который теперь падает. И то и другое видно в логах сборки и запуска в панели.
Как обновить сайт после правок в v0?
Заберите обновлённый код в ту же папку и загрузите новую версию из панели либо обновите проект из GitHub, если код живёт там. Публичная ссылка остаётся прежней, а секреты и настройки проекта сохраняются.