В этом посте рассмотрим шаги необходимые для того чтобы развернуть ваш проект на 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>
На этом этапе базовая часть закончена, на данном этапе у нас отображается статическая страничка и это позволит развернуть простые spa приложения. Но их можно раздавать хоть с github pages или любого самого дешевого хостинга, поэтому далее я опишу процесс установки и запуска приложения на NodeJs - для этого потребуется установить на наш сервер nvm и pm2 который будет менеджерить nodejs процесс.
Установка NVM
NVM - Node version manager, он позволяет иметь на одной машине несколько версий nodejs, поэтому я всегда предпочитаю его установке конкретной версии ноды
- Открой терминал.
# Скачай и установи NVM: Выполни следующую команду:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash- Перезагрузите терминал или выполните:
source ~/.bashrc
# или
source ~/.profile
# (В зависимости от вашей оболочки.)- Проверь, что NVM установлен:
nvm --version- Установка 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 соединение и подключиться заново, приложение будет продолжать работать
Теперь когда наше 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
cd /etc/nginx/sites-enabled/- Открываем конфигурацию любым редактором в моем случае команда такая (
sudo vi /etc/nginx/sites-enabled/test-app) - Добавляем секции для раздачи файлов и проксирования
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;
}- Сохраняем и проверяем корректность конфигурации с помощью
sudo nginx -t - Если увидели что все ок, перезагружаем nginx
sudo systemctl restart nginx - Проверяем
- На
/мы должны увидеть{"hello":"world"}вместо статической тестовой страницы - А на
/images/test_image.jpgдолжны увидеть загруженную нами картинку
- На
Заключение
Поздравляю, теперь у тебя есть настроенный сервер где крутится твой невероятный проект! Возможно так появится убийца ютуба или нетфликса - удачи! и надеюсь этот пост был полезен










