Сервер настроенный у нас есть, теперь надо как-то запустить на нём ваше творение. Я поначалу думал 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, и последующий билд и деплой делается одной командой 🎉
Если будут вопросы, пожелания, предложения, или найдёте косяки в скриптах — пишите 🤜🤛