Простое развертывание приложения NestJS всего за 5 евро в месяц (до НДС)


Введение

Исчезновение бесплатного Heroku заставляет разработчиков искать альтернативные варианты развертывания для своих NodeJS APP, в частности, для этой статьи NestJS API.

В этом кратком руководстве я собираюсь показать альтернативный способ развертывания вашего API, хотя и не бесплатно, но всего за 5 евро в месяц на облачном vps.

Облачные провайдеры

Существует множество облаков, предоставляющих VPS (виртуальные частные серверы), которые представляют собой виртуальные машины под управлением ОС (операционной системы), в основном Linux.

Самыми дешевыми облачными провайдерами являются Linode, DigitalOcean, Vultr и Hetzner, причем Hetzner является самым дешевым.

Изменения в API NestJS

Перед развертыванием вам необходимо внести некоторые изменения в API NestJS.

Конфигурация и переменные окружения

В целях краткости данного руководства я буду считать, что в вашем приложении уже настроен модуль Config с необходимыми переменными окружения. Однако вам придется внести некоторые изменения в конфигурацию:

  • Если вы используете базу данных PostgreSQL, вам нужно будет изменить настройки с объекта options на URL Postgres, поэтому создайте переменную следующим образом:
DATABASE_URL='postgresql://USER:PASSWORD@HOST:PORT/DATABASE'
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Если вы используете базу данных MongoDB, вам нужно сделать то же самое, поэтому вам понадобится следующая переменная:
MONGO_URL='mongodb://username:password@host:port/defaultauthdb?options'
Enter fullscreen mode Выйти из полноэкранного режима
  • Если вы используете Redis с библиотекой IORedis, все может стать немного сложнее, но, как и в двух других случаях, вам понадобится переменная URL:
REDIS_URL='redis://:PASSWORD@HOST:PORT'
Войти в полноэкранный режим Выход из полноэкранного режима

Поскольку IORedis поддерживает URL только при использовании TLS, я обнаружил, что наличие функции util для деструктуризации URL в интерфейс RedisOptions проще в настройке, поэтому добавьте в папку config следующий redis-url-to-options.util.ts в каталог utils:

import { RedisOptions } from 'ioredis';

export const redisUrlToOptions = (url: string): RedisOptions => {
  if (url.includes('://:')) {
    const arr = url.split('://:')[1].split('@');
    const secondArr = arr[1].split(':');

    return {
      password: arr[0],
      host: secondArr[0],
      port: parseInt(secondArr[1], 10),
    };
  }

  const connectionString = url.split('://')[1];
  const arr = connectionString.split(':');
  return {
    host: arr[0],
    port: parseInt(arr[1], 10),
  };
};
Войти в полноэкранный режим Выйти из полноэкранного режима

Таким образом, ваш файл config.ts будет выглядеть примерно так:

import { IConfig } from './interfaces/config.interface';
import { redisUrlToOptions } from './utils/redis-url-to-options.util';

export function config(): IConfig {
  return {
    // ...
    redis: redisUrlToOptions(process.env.REDIS_URL),
    // ...
  };
}

Вход в полноэкранный режим Выйти из полноэкранного режима

Изменения в файле package.json

Поменяйте скрипт start на start:prod и удалите скрипт start:prod.

Таким образом, получается следующее:

{
  // ...
  "scripts": {
    // ...
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    // ...
  },
  // ...
}
Войти в полноэкранный режим Выход из полноэкранного режима

To:

{
  // ...
  "scripts": {
    // ...
    "start": "node dist/main",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    // ...
  },
  // ...
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Настройка Hetzner

Для начала создайте учетную запись, для завершения процесса регистрации вам потребуется либо прислать фотографию паспорта, либо сделать депозит в размере 20 евро.

После создания учетной записи войдите в систему и на консоли создайте новый проект.

Создайте сервер

В теге сервера вашего проекта нажмите на кнопку добавить сервер:

Параметры сервера

Выберите последнюю версию Ubuntu LTS (22.04):

Добавьте также ваш открытый ssh ключ, если вы этого еще не сделали, если у вас нет пары ssh ключей, просто выполните следующую команду на терминале вашего ПК:

ПРИМЕЧАНИЕ: Для пользователей windows может потребоваться установка OpenSSH

$ ssh-keygen -t ed25519 -C "your_email@example.com"
Войдите в полноэкранный режим Выйти из полноэкранного режима

Подключение к серверу

В вашей любимой IDE добавьте настройки подключения для вашего сервера:

  • В VSC установите следующее расширение SSH FS и добавьте конфигурацию вашего сервера, где:

    • Хост — публичный адрес вашего сервера;
    • Порт — 22;
    • Пользователь — root.
  • В WebStorm просто добавьте конфигурацию ssh с теми же опциями, как показано выше.

Наконец, откройте терминал для вашего сервера в IDE.

Начальные команды сервера

Перед началом развертывания нам необходимо выполнить несколько команд:

  1. Проверить и обновить программное обеспечение сервера:

    # may take sometime
    $ sudo apt update
    $ sudo apt upgrade
    
  2. Установите dokku — PaaS, который мы будем использовать для развертывания нашего API:

    $ wget https://raw.githubusercontent.com/dokku/dokku/v0.28.1/bootstrap.sh
    $ sudo DOKKU_TAG=v0.28.1 bash bootstrap.sh
    
  3. Предполагая, что у вас есть действительный домен для API, зайдите к провайдеру домена и добавьте A Record и CNAME Record, указывающие на публичный IP сервера. Если у вас нет такого домена, он вам понадобится, я рекомендую namecheap для покупки;

  4. Настройте SSH ключи dokku и параметры Virtualhost:

    $ cat ~/.ssh/authorized_keys | dokku ssh-keys:add admin
    $ dokku domains:set-global your-domain.com
    

Развертывание API

Для развертывания API вам нужно выполнить следующие шаги:

На терминале сервера

  1. Создайте новое приложение и подключите git:

    $ dokku apps:create app-name
    
  2. Установите плагин базы данных, создайте экземпляр db и свяжите его с вашим приложением:

    # For PostgresSQL
    $ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
    $ dokku postgres:create app-name-db
    $ dokku postgres:link app-name-db app-name
    
    # For MongoDB
    $ sudo dokku plugin:install https://github.com/dokku/dokku-mongo.git mongo
    $ dokku mongo:create app-name-db
    $ dokku mongo:link app-name-db app-name
    
  3. Если вы используете кэш с redis в вашем API, добавьте плагин Redis в dokku, создайте новый экземпляр Redis и свяжите его с вашим приложением:

    $ sudo dokku plugin:install https://github.com/dokku/dokku-redis.git redis
    $ dokku redis:create app-name-redis
    $ dokku redis:link app-name-redis app-name
    
  4. Добавьте все остальные переменные окружения, необходимые для работы вашего API:

    $ dokku config:set app-name URL=https://your-domain.com ...
    

В локальном терминале

Добавьте git remote для развертывания вашего приложения под именем dokku с публичным IP-адресом вашего сервера:

$ git remote add dokku dokku@server-public-ip-address:app-name
$ git push dokku main:master
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Вернитесь на терминал сервера

Наконец, настройте SSL (для HTTPS) и основной домен или поддомен для вашего API:

$ sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
$ dokku config:set --global DOKKU_LETSENCRYPT_EMAIL=your-email@your.domain.com
$ dokku domains:set app-name your-domain.com
$ dokku letsencrypt:enable app-name
$ dokku letsencrypt:cron-job --add 
Войти в полноэкранный режим Выход из полноэкранного режима

Заключение

Теперь вы можете развернуть свои приложения NestJS на любом VPS.

Оцените статью
devanswers.ru
Добавить комментарий