На данный момент я занимаюсь разработкой своего проекта TryCode и для деплоя, я использую два разных сервера. Каждый раз мне приходится пушить изменения на GitLab, потом заходить на SSH, делать git pull
и перезапускать нодовское приложение.
В целлом, на все эти действия уходит около 2-3 минут. Однако, когда часто вносишь изменения и заливаешь их на прод, это всё начинает надоедать.
Хочу отметить, что я слышал про Docker и на момент написания этой статьи узнал ещё про какие-то сервисы, для автоматического деплоя. Например, DeployBot. Скажу честно, было лень изучать докер и настраивать его. Я решил написать несколько скриптов и NPM-команд, для автоматического деплоя и сборки приложения на проде.
Требуется оптимизировать процесс деплоя приложения на прод и сохранить драгоценные 3 минуты моей жизни.
Для начала, надо разобраться с NPM-скриптами (командами). В моём случае, для деплоя на продакшн нужно:
/var/www/trycode.pw
и выполнить git pull
.Советую вам разбить на команды все действия, а потом выполнять их поочерёдно. В моём случае, я написал следующие NPM-скрипты.
С помощью NPM-команды prod-deploy
, происходит всё перечисленное выше. Команда prod-build
запускает нодовский скрипт prebuild.js
, который хранится в отдельной папке scripts
.
Содержимое скрипта выглядит так:
_10const exec = require('child_process').exec;_10_10async function run() {_10 await exec('rm -rf ./src/.next');_10 await exec('npm run build');_10}_10_10run();
Выполняется команда удаления папки с собранным приложением (в вашем случае это может быть build
, dist
) и запускается сборка приложения.
Далее происходит деплой всех изменений на GitLab с помощью NPM-команды deploy
. Команда поочередно выполняет добавление изменений, коммит и пуш.
После пуша изменений на GitLab, запускается нодовский скрипт pull.js
, который подключается к SSH-серверу и скачивает последние изменения.
_43const node_ssh = require('node-ssh');_43const ssh = new node_ssh();_43_43ssh_43 .connect({_43 host: '144.88.19.48',_43 username: 'root',_43 privateKey: '/Users/archakov/.ssh/id_rsa',_43 })_43 .then(() => {_43 ssh.execCommand('git pull origin master', { cwd: '/var/www/trycode.pw' }).then(function() {_43 console.log('✅ Changes successfully pulled!');_43 ssh.execCommand('yarn', { cwd: '/var/www/trycode.pw' }).then(function() {_43 console.log('✅ Dependecies installed');_43 ssh.execCommand('pm2 restart server', { cwd: '/var/www/trycode.pw' }).then(function() {_43 console.log('? Server restarted!');_43 process.exit();_43 });_43 });_43 });_43 });_43 _43// ИЛИ с async / await_43 _43const node_ssh = require('node-ssh');_43const ssh = new node_ssh();_43_43async function run() {_43 await ssh.connect({_43 host: '144.88.19.48',_43 username: 'root',_43 privateKey: '/Users/archakov/.ssh/id_rsa',_43 });_43 await ssh.execCommand('git pull origin master', { cwd: '/var/www/trycode.pw' });_43 console.log('✅ Changes successfully pulled!');_43 await ssh.execCommand('yarn', { cwd: '/var/www/trycode.pw' });_43 console.log('✅ Dependecies installed.');_43 await ssh.execCommand('pm2 restart server', { cwd: '/var/www/trycode.pw' });_43 console.log('? Server restarted!');_43 process.exit();_43}_43_43run();
Для подключения к SSH-серверу, используется библиотека node-ssh
. Создайте ssh-ключ для подключения к серверу без пароля и укажите путь к этому файлу в свойстве privateKey
.
password
и в значении указав пароль).После успешного подключения, скрипт переходит в папку /var/www/trycode.pw
и выполняет ряд команд:
yarn
(альтернатива npm install
).Работает всё отлично и деплоить приложение на прод уже не так больно. Перфектли!
P.S.: Буду рад, если расскажете в комментах или поделитесь ссылкой, как вы решаете подобный деплой или как сделать то же самое на докере.