February 24, 2024

DEPLOY

  1. установить nvm (Node Version Manager):
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
source ~/.bashrc

После установки nvm вам необходимо установить node (версия 18):

nvm i 18

Если вы используете yarn, установите и его:

npm i -g yarn

Затем перейдите в каталог вашего проекта и установите пакеты через npm или yarn, затем создайте свое приложение. После этого установите pm2 для запуска вашего приложения (навсегда):

npm i -g pm2

После установки pm2 проверьте, работает ли он:

pm2

Если это так, вы можете запустить свое приложение, выполнив команду. Если есть postgres или redis, вам нужно сначала запустить их, а затем ваше приложение (см. 2)

pm2 start ./dist/main.js --name my-nestjs-app
# pm2 start <script_file_path.js> --name <name_optional>
  1. Если вы используете Postgres или Redis, я рекомендую использовать для них Docker Compose. Это мой пример файла docker-compose.yml для Postgres и Redis:

УСТАНОВКА DOCKER

Сначала обновите существующий список пакетов:

sudo apt update

Затем установите несколько необходимых пакетов, которые позволяют apt использовать пакеты по протоколу HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-co

Docker в вашу систему:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Добавьте репозиторий Docker в APT sources:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Это также обновит нашу базу данных пакетов пакетами Docker из недавно добавленного репозитория.

Убедитесь, что вы собираетесь выполнять установку из репозитория Docker, а не из репозитория Ubuntu по умолчанию:

apt-cache policy docker-ce

Вы увидите вывод, подобный этому, хотя номер версии Docker может отличаться:

Вывод политики apt-кэша docker-ce

docker-ce:
  Installed: (none)
  Candidate: 5:19.03.9~3-0~ubuntu-focal
  Version table:
     5:19.03.9~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

Обратите внимание, что docker-ce не установлен, но кандидат на установку находится в репозитории Docker для Ubuntu 20.04 (focal).

Наконец, установите Docker:

sudo apt install docker-ce

Теперь Docker должен быть установлен, демон запущен, а процесс разрешен для запуска при загрузке. Убедитесь, что он запущен:

sudo systemctl status docker

Вывод должен быть похож на следующий, показывающий, что служба активна и запущена:

Output● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 24321 (dockerd)
      Tasks: 8
     Memory: 46.4M
     CGroup: /system.slice/docker.service
             └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Установка Docker теперь предоставляет вам не только службу Docker (daemon), но и docker утилиту командной строки или клиент Docker. Мы рассмотрим, как использовать docker команду позже в этом руковод

version: "3"
services:
  postgres:
    image: postgres
    restart: always
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - '5432:5432'
    volumes:
      - my-nestjs-app:/var/lib/postgresql/data
  redis:
    image: "bitnami/redis:7.2"
    restart: unless-stopped
    ports:
      - "6379:6379"
#    volumes:
#      - "redis_data:/bitnami/redis/data"
    environment:
      REDIS_PASSWORD: ${REDIS_PASSWORD}
      REDIS_PORT: ${REDIS_PORT}
      REDIS_DB: ${REDIS_DB}
      REDIS_IO_THREADS: 4
      REDIS_IO_THREADS_DO_READS: yes
      REDIS_DISABLE_COMMANDS: FLUSHDB,FLUSHALL

volumes:
  my-nestjs-app:

Для запуска docker compose у вас должен быть docker. Полное руководство по установке docker в ubuntu. После установки docker запустите docker-compose:

sudo docker compose up -d

Настройка nginx

Итак, давайте настроим nginx для приложения nestjs. Перед установкой nginx обновите существующий список пакетов:

sudo apt update

Затем установите nginx:

sudo apt install nginx

Проверьте nginx, работает ли он:

sudo systemctl status nginx

Вы получите:

Создайте файл конфигурации nginx в /etc/nginx/sites-available/my-nestjs-app

sudo vim /etc/nginx/sites-available/my-nestjs-app

Затем скопируйте / вставьте эту конфигурацию:

server {
    server_name domain.com;
    client_max_body_size 300M;

    # add_header 'Access-Control-Allow-Origin' '*';

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_pass http://127.0.0.1:3000;
    }
}

Давайте разберемся в этой конфигурации:

  • имя_сервера — Согласно документам nginx: оно используется для данного запроса. Они могут быть определены с использованием точных имен, подстановочных знаков (например, domain.com sub.dobmain.com) или регулярных выражений.
  • client_max_body_size - максимальный размер тела клиентского запроса. При превышении этого размера nginx возвращает ошибку с кодом состояния 413. Если вы этого не хотите, просто прокомментируйте это.
  • location / — означает, что если запрос соответствует этому “/” или значению location, то nginx запускает ”код внутри своего блока". Мы использовали директивы proxy_set_header и proxy_pass. proxy_set_header задает заголовок для определенного запроса. proxy_pass вроде как пересылает запросы по заданному URL или пути. Мы устанавливаем localhost 3000, чтобы каждый запрос в имя_сервера и местоположении перенаправлялся в местоположение 3000 (domain.com / -> localhost: 3000/)

После этого сохраните файл (в виде vim : wq) и протестируйте conf-файл с помощью команды nginx:

sudo nginx -t

Если вы допустите синтаксическую ошибку, она будет показана. Если все в порядке, создайте ссылку:

sudo ln -s /etc/nginx/sites-available/my-nestjs-app /etc/nginx/sites-enabled/my-nestjs-app

затем протестируйте nginx и перезапустите nginx:

sudo systemctl restart nginx

Настройка доменного имени

Прежде всего, вам необходимо перенаправить доменное имя на ваш VPS. Перейдите на панель управления вашего провайдера домена> Записи DNS> создайте запись с именем и введите IP-адрес вашего VPS в поле “имя” (пример). Затем проверьте, что оно перенаправлено на ваш IP-адрес ($ hostname -I чтобы увидеть IP):

ping thetestdev.ru

Если эти IP-адреса не совпадают с IP-адресом вашего VPS, вам следует подождать, пока он не станет таким же (это может занять от нескольких минут до нескольких дней, в зависимости от регистратора вашего домена), в противном случае вы столкнетесь с проблемами.

Вам необходимо добавить SSL-сертификат к вашему домену. С certbot это просто, поэтому установите cerbot:

sudo apt update
sudo apt install certbot python3-certbot-nginx

После этого запустите эту команду, чтобы сгенерировать SSL-сертификаты для вашего домена:

sudo certbot --nginx -d example.com

После этого протестируйте файл nginx conf:

sudo nginx -t

Если все в порядке, перезапустите nginx:

sudo systemctl restart nginx

Установить зависимости

npm install

Установить powerman

apt install powerman