configuring digital ocean vps В этом посте рассмотрим шаги необходимые для того чтобы развернуть ваш проект на nodejs (конфигурация в итоге за вами, это незначительные детали) и сделать доступным его за вашим доменом

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

Далее в посте буду использовать термин droplet / дроплет / машинка , если кому-то ближе термин VPS (Virtual Private Server) можете воспринимать это как синонимы в данном случае (я считаю что это и есть синонимы, но возможно я ошибаюсь).

Стартуем

Идем по первой инструкции в рамках которой будут пройдены следующие этапы:

  • Заводим пользователя
  • Добавляем его в группу sudo
  • Устанавливаем nginx
  • Устанавливаем и включаем фаервол
  • Создаем тестовую страничку и конфиг
  • Привязываем домен (этот пункт может быть неактуален, так как у меня например другой регистратор) - но эта часть сводится к добавлению A записи в ip вашей машинки в настройках DNS (эта инструкция наверняка есть у вашего регистратора)
  • Изменения вступают в силу в течении ~15 минут
  • Проверяем доступность страницы из интернета при обращению по нужному домену
  • Устанавливаем certbot для https сертификатов
  • После включения certbot'a - он пропатчит конфигурацию для вашего домена благодаря чему будет автоматически настроен редирект на https (443 порт) - проверить наличие секции можно так cat /etc/nginx/sites-enabled/<your_domain_configname>

https is working

На этом этапе базовая часть закончена, на данном этапе у нас отображается статическая страничка и это позволит развернуть простые spa приложения. Но их можно раздавать хоть с github pages или любого самого дешевого хостинга, поэтому далее я опишу процесс установки и запуска приложения на NodeJs - для этого потребуется установить на наш сервер nvm и pm2 который будет менеджерить nodejs процесс.

Установка NVM

NVM - Node version manager, он позволяет иметь на одной машине несколько версий nodejs, поэтому я всегда предпочитаю его установке конкретной версии ноды

  1. Открой терминал.
# Скачай и установи NVM: Выполни следующую команду:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
  1. Перезагрузите терминал или выполните:
source ~/.bashrc
# или
source ~/.profile
# (В зависимости от вашей оболочки.)
  1. Проверь, что NVM установлен:
nvm --version
  1. Установка Node.js через NVM
nvm install --lts # Установит lts версию
nvm install node # Установит последнюю версию nodejs
nvm install 22.10 # Установить конкретную версию nodejs
nvm alias default 22.10 # Сделать 22 версию дефолтной
# Проверяем
node -v
npm -v

Установка PM2

PM2 - это демон-менеджер процессов, который поможет вам управлять вашим приложением и поддерживать его в режиме онлайн 24/7, дальше в этом посте мы рассмотрим запуск приложения с помощью pm2

npm install -g pm2
pm2 -v

Создаем тестовое приложение

Для простоты я не буду рассматривать в этом посте этап деплоя вашего приложения - это отдельная тема которая напрямую не относится к настройке и конфигурированию vps, а быстро создам тестовое приложение на fastify прямо на машинке

cd ~
mkdir test-app
cd ./test-app
npm init -y
npm i fastify
touch app.js

Добавляем следующее содержимое в файл app.js (Возьмем пример с официального сайта)

// Require the framework and instantiate it

// ESM
import Fastify from 'fastify'

const fastify = Fastify({
  logger: true
})

// Declare a route
fastify.get('/', function (request, reply) {
  reply.send({ hello: 'world' })
})

// Run the server!
fastify.listen({ port: 3000 }, function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  // Server is now listening on ${address}
})

После этого можно стартануть приложение с помощью pm2

pm2 start ~/test-app/app.js --name "fastify-app"

Возможно тут ты ожидаешь, что сможешь увидеть свое приложение перейдя по ip адресу и указав порт, но... Мы уже настроили фаервол в первой части инструкции и 3000 порт больше не торчит в интернет.

Приложение запущено и работает, в этом можно убедиться с помощью команды pm2 list, ты также можешь закрыть ssh соединение и подключиться заново, приложение будет продолжать работать

app is working fine

Теперь когда наше nodejs приложение уже живет своей жизнью на 3000 порту, осталось добавить проксирование запросов из nginx который мы установили в первой части инструкции из 443 порта в 3000

Также настроим раздачу статики с помощью nginx чтобы нода не занималась этим. Для этого создадим каталог и положим туда тестовую картинку

mkdir -p ~/test-app/images
curl -o ~/test-app/images/test_image.jpg https://www.mememaker.net/static/images/memes/4463255.jpg

Далее мы должны решить вопрос с правами на файлы, так как раздавать мы собираемся файлы, которые были созданы нашим пользователем (предположим это <user>)

Если посмотреть на директорию images c помощью команды ls -la мы увидим следующую информацию:

drwxrwxr-x <user>:<user>

Мы можем добавить пользователя под которым nginx будет обращаться к нашим файлам в группу <user> иначе при попытке получения файлов мы получим ошибку 403 Forbidden

sudo usermod -a -G <user> www-data

Теперь перейдем к редактированию конфигурации nginx

Редактируем конфиг nginx'a

  1. cd /etc/nginx/sites-enabled/
  2. Открываем конфигурацию любым редактором в моем случае команда такая (sudo vi /etc/nginx/sites-enabled/test-app)
  3. Добавляем секции для раздачи файлов и проксирования

location /images/ {
    alias /home/<user>/test-app/images/; # Проверь чтобы путь соотвествовал тому, по которому у тебя находится статика
    try_files $uri $uri/ =404; # Если не может найти файл, или если не хватает прав получить доступ, вернет 404 страницу
}

location / {
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header Host $http_host;
	proxy_pass http://localhost:3000;
}
  1. Сохраняем и проверяем корректность конфигурации с помощью sudo nginx -t
  2. Если увидели что все ок, перезагружаем nginx sudo systemctl restart nginx
  3. Проверяем
    1. На / мы должны увидеть {"hello":"world"} вместо статической тестовой страницы
    2. А на /images/test_image.jpg должны увидеть загруженную нами картинку

Заключение

Поздравляю, теперь у тебя есть настроенный сервер где крутится твой невероятный проект! Возможно так появится убийца ютуба или нетфликса - удачи! и надеюсь этот пост был полезен