Развёртывание сайта на хостинге в один клик

6 июля 2024 г.

Такие хостинговые площадки, как Vercel, Netlify и т.п., предлагают готовые CLI-решения для Node.js, позволяющие автоматизировать развёртывание сайта из командной строки. Но что делать, если сайт размещён на виртуальном хостинге или на VPS/VDS сервере? Ведь не очень удобно для каждой новой сборки сайта открывать FTP-клиент и загружать сайт на хостинг практически вручную.

Хорошая новость в том, что для такого сценария у меня тоже есть готовое решение для Node.js. Решение основано на подключении к хостингу по защищённому протоколу SFTP, который можно включить на любом хостинге.

Решение

  1. Добавляем к проекту библиотеку ssh2-sftp-client:
terminal
npm i -D ssh2-sftp-client
  1. Создаем в корне проекта файл deploy.js со скриптом для развёртывания:
deploy.js
import Client from 'ssh2-sftp-client';
const sftp = new Client();
 
const local = 'build';
const remote = '/var/www/user/data/www/example.ru/';
 
sftp
  .connect({
    host: 'example.ru',
    port: '22',
    username: 'user',
    password: '******'
  })
 
  .then(() => {
    console.log('delete old...');
    return sftp.rmdir(remote, true);
  })
 
  .then(() => {
    console.log('...done');
 
    sftp.on('upload', (info) => {
      console.log(`upload: ${info.source}`);
    });
 
    console.log('upload new...');
    return sftp.uploadDir(local, remote);
  })
 
  .then(() => {
    console.log('...done');
    return sftp.end();
  })
 
  .catch((error) => {
    console.log(error);
    return sftp.end();
  });

Пояснения:

  • Порт для подключения по SFTP нужно выяснить в настройках хостинга, он может отличаться от стандартного 22.
  • В примере выше локальная папка с готовой сборкой сайта называется build, но у различных генераторов она может называться по другому, например dist.
  • Абсолютный путь к папке сайта на хостинге /var/.../example.ru тоже может различаться на разных хостинговых площадках.
  1. После правильной настройки порта и папок, сайт можно загрузить на хостинг одной командой:
terminal
node deploy

Полная документация по API библиотеки ssh2-sftp-client по ссылке.