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

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.on("upload", (info) => {
  console.log(`upload: ${info.source}`);
});
 
sftp
  .connect({
    host: "example.ru",
    port: "22",
    username: "user",
    password: "******",
  })
 
  .then(() => {
    console.log("delete old...");
    return sftp.rmdir(remote, true);
  })
 
  .then(() => {
    console.log("...done");
 
    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 по ссылке.