TGViewer
IT Хасслер IT Хасслер @overemployd · 450 subscribers
Post #91 452
IT Хасслер Как задеплоить не очень сложный продукт на VPS: Часть 1 Возник у меня такой вопрос пару недель назад, потому что не хотелось сразу заморачиваться с k8s, а облака не подходят для моей архитектуры. Спасибо Роману — он сразу поделился своим подходом и скриптами…
Как задеплоить не очень сложный продукт на VPS: Часть 2

Сервер настроенный у нас есть, теперь надо как-то запустить на нём ваше творение. Я поначалу думал nodejs-сервер собрать с помощью Rollup в готовый js-скрипт, который просто запущу с помощью systemd-сервиса. Но меня убедили юзать докер и не париться, поэтому приложу Dockerfile для абстрактного nodejs-приложения, (собранного также с Rollup, поэтому не требующего установки npm-пакетов).

Продолжение схемы:

6️⃣ В папку с вашим приложением кладём файлик deploy.json — в нём заменяем:

<vps_ip> — на IP-адрес вашего VPS;
<username> — на имя вашего юзера, которого мы создали на VPS в первой части;
<keyfile> — на путь до публичного ключа, который мы создавали, в формате OpenSSH.

Это просто конфиг, указывающий, куда деплоить приложение. Далее:

7️⃣ В эту же папку с приложением кладём скрипт build.sh. Он выполнит сборку приложения, сборку docker-образа, загрузит этот образ на VPS и перезапустит docker compose (или запустит его, если это первый раз). Выполним его позже.

Особенно интересный в нём метод доставки образа в докер на VPS. Я о нём не знал, как ни странно, и думал, что придётся поднимать свой docker registry, но это решение (спасибо Роман!) — просто спасение 😁

Также скрипт использует pnpm. Если у вас другой менеджер пакетов, замените pnpm build на соответствующую команду.

8️⃣ На VPS в папку ~/ (то есть /home/<username>) загружаем файл docker-compose.yml. Там только одно приложение описано, впишите туда всё что хотите запускать.

9️⃣ Ну и теперь финалочка! Запускаем build.sh:

./build.sh <app>


Где <app> - название вашего приложения, оно же должно быть указано и в deploy.json.

Скрипт в качестве версии приложения берёт версию из package.json, а при создании docker-образа сохраняет его как .tar.gz архив в папку /images внутри вашего проекта (её стоит добавить в .gitignore). И если в этой папке уже есть образ с такой версией, он выдаст ошибку. Поэтому при каждом билде можно или повышать версию в package.json, или добавить второй аргумент к скрипту (любой):

./build.sh <app> f


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

Ну теперь, если всё сделано правильно (и я в скриптах не накосячил), ваше приложение должно заработать на VPS, и последующий билд и деплой делается одной командой 🎉

Если будут вопросы, пожелания, предложения, или найдёте косяки в скриптах — пишите 🤜🤛
  • 👍 5
  • ❤ 3
More from @overemployd
  1. Dec 23, 2025Cursor подвёл итоги года Я в Top-5% users 🤓 Любимая модель - Claude 4 Sonnet Использовал…
  2. Aug 26, 2025Ребят, кто сейчас делает AI-powered продукты? А именно — те, которые построены на базе LLM…
  3. Aug 14, 2025Чем сейчас занимаюсь фулл-тайм 👨🏻‍💻 В начале лета приступил к разработке сервиса по пок…
  4. Jul 30, 2025🥷🏻 Я работаю в stealth mode уже долгое время. Есть фуллтайм и парочка пет-проектов: один…
  5. Jun 11, 2025Ну а у меня за прошедшее время куча новостей, много всего происходит, и я надеюсь, в ближа…
  6. Jun 11, 2025Привет, уговорила меня жена завести еще один канал, потому что к текущему врядли Паша Дуро…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →