Добавить в корзинуПозвонить
Найти в Дзене

Настройка сервера Express.js с БД MongoDB на ВМ Yandex.cloud

Это моя шпаргалка))) МЕНЮ:
1. Создание ВМ на yandex.cloud
2. Генерирование пары ssh ключей и создание файла config
3. Переходим на сервер по ssh
4. Создание файла конфигурации на сервере
5. Импорт открытого ключа внешнего репозитория MongoDB
6. Создание файла списка ключей для MongoDB
7. Перезагрузка локальной базы пакетов
8. Установка последней версии MongoDB
9. Запуск MongoDB
10. Проверка работы MongoDB
11. Установка git
12. Установка Node.js
13. Создание пары ssh ключей для гитхаба
14. Создание файла config для связи с github по ssh
15. Чтение и копирование публичного ключа
16. Запись публичного ключа на гитхабе
17. Клонирование репозитория с гитхаба на сервер, создание .env и замена JWT_SECRET на вновь сгенерированный.
18. Установка менеджера пакетов yarn
19. Установка зависимостей в проекте
20. Запуск приложения (для проверки)
21. Установка менеджера процессов pm2
22. Запуск приложения с помощью pm2
23. Настройка pm2 на автоматическое поднятие сервера (даже после его падения).
24

Это моя шпаргалка)))

МЕНЮ:
1. Создание ВМ на yandex.cloud
2. Генерирование пары ssh ключей и создание файла config
3. Переходим на сервер по ssh
4. Создание файла конфигурации на сервере
5. Импорт открытого ключа внешнего репозитория MongoDB
6. Создание файла списка ключей для MongoDB
7. Перезагрузка локальной базы пакетов
8. Установка последней версии MongoDB
9. Запуск MongoDB
10. Проверка работы MongoDB
11. Установка git
12. Установка Node.js
13. Создание пары ssh ключей для гитхаба
14. Создание файла config для связи с github по ssh
15. Чтение и копирование публичного ключа
16. Запись публичного ключа на гитхабе
17. Клонирование репозитория с гитхаба на сервер, создание .env и замена JWT_SECRET на вновь сгенерированный.
18. Установка менеджера пакетов yarn
19. Установка зависимостей в проекте
20. Запуск приложения (для проверки)
21. Установка менеджера процессов pm2
22. Запуск приложения с помощью pm2
23. Настройка pm2 на автоматическое поднятие сервера (даже после его падения).
24. Справочная информация о командах просмотра и удалении ключей
25. Создание домена и настройка DNS
26. Установка nginx
27. Настройка файла конфигурации nginx
28. Перезагрузка nginx
29. Обновление приложения с гитхаба
30. Заказ и получение сертификата SSL
31. Создание исполняемого файла на сервере для деплоя с гитхаба.

1. Создание новой ВМ (есть отдельный гайд на самом yandex.cloud)
Создал новую ВМ. ubuntu 22.04. IP-address сразу переделал в статический...

2. Сам yandex.cloud советует создавать ssh ключи такой командой:
ssh-keygen -t ed25519 ей и воспользуемся)

После выполнения команды вам будет предложено указать имена файлов, в которые будут сохранены ключи, и ввести пароль для закрытого ключа. Нажмите Enter, чтобы использовать имя по умолчанию id_ed25519. Пара ключей будет создана в директории ~/.ssh.

Открытый ключ будет сохранен в файле <имя_ключа>.pub.
Лучше сразу создать файл config в той же папке, где храните ключи (у меня это .ssh/). Текст в нем такой:

Host <name>
Hostname <000.000.000.000>
User <username>
IdentityFile ~/.ssh/<file_of_key>

3. Переходим на сервер. Теперь это просто:
ssh <name>

4. На сервере создадим сразу файл конфигурации (сразу можно добавить публичные ключи сотрудников, которым тоже будет разрешен доступ на сервер)
sudo mkdir -p -m 700 .ssh
sudo touch .ssh/authorized_keys
sudo chmod 664 .ssh/authorized_keys
sudo chown -R something:something .ssh - (заменить something:something на свой логин:логин, который записали при создании ВМ)
sudo nano ./.ssh/authorized_keys Откроется редактор.Наш ssh автоматически был добавлен при создании файла. Осталось добавить ssh сотрудников.

5. Дальше самое интересное!
Импортируем открытый ключ, используемый системой управления пакетами.
Первый (устаревший) вариант, но точно рабочий вариант:
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
Второй вариант. Этот написал (собрал из разных источников) сам. Надо проверять (проверил - работает😀):
wget -qO -
https://www.mongodb.org/static/pgp/server-6.0.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mongodb.gpg >/dev/null

6. Создаём файл списка для MongoDB
Для первого варианта:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

Для второго варианта:
echo "deb [ signed-by=/usr/share/keyrings/mongodb.gpg arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

7. Перезагрузим локальную базу пакетов:
sudo apt-get update

8. Установим последнюю версию MongoDB
sudo apt-get install -y mongodb-org

9. Запустим MongoDB
sudo systemctl start mongod

10. Проверим, что MongoDB работает:
sudo systemctl status mongod

-2

Ну вот. Всё работает)))

11. Установим git:
sudo apt install -y git
проверим, что гит установился:
git --version

12. Установим Node.js
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -

У меня 18 нода (если версия друга - измените версию на свою)

sudo apt install -y nodejs

13. Нам нужно создать новую пару ключей, причем приватный будет находится на сервере. Гитхаб советует:
cd ~/.ssh/ && ssh-keygen -t rsa -b 4096 -C "email@example.com" (устарел)
cd ~/.ssh/ && ssh-keygen -t ed25519 -C "your_email@example.com"
Так и поступим. (не забудьте только вставить свою почту, на которую регистрировались в гитхаб)

14. Создаем config
sudo nano ~/.ssh/config

Host *
Hostname github.com
User git
IdentityFile ~/.ssh/custom_id_rsa

custom_id_rsa - вместо него вставьте свой ключ (как сохранить файл - смотрите выше)

15. Копируем публичную часть ключа
cat ~/.ssh/custom_id_rsa.pub

16. Переходим на гитхаб и записываем туда публичную часть ключа:

  • Тыкаемся в свою иконку (справа вверху) и выбираем settings
  • Выбираем опцию “SSH и GPG-ключи" в левом сайд-баре
  • Находим такую кнопку и жмем
-3
  • Вставляем из буфера наш ключ и сохраняем.

17. Клонируем репозиторий на сервер. И создадим .env
cd <папка с приложением>
nano .env
Скопируем содержимое из .env на локальном компьютере во вновь созданный файл.
Заменим JWT_SECRET на вновь созданный
Создадим вот такой командой:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'));"

18. Установим yarn:
(я пользуюсь им вместо npm)

  • импортировать GPG ключ репозитория
    1) первый вариант (точно рабочий, хотя считается устаревшим):
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
    2) второй вариант (проверил: работает 😀):
    curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null

Справочно:
> /dev/null

Это частный случай перенаправления, когда всё из стандартного вывода перенаправляется в псевдоустройство /dev/null. Это означает уничтожение данных. То есть ничего не будет выводиться в стандартный вывод.

  • Добавить репозиторий:
    1) для первого варианта вот такая команда:
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
    2) для второго варианта:
    echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
  • Обновить списки пакетов
    sudo apt update
  • Установить yarn
    sudo apt install yarn

19. Зайти в папку репозитория и установить зависимости
yarn

20. Запустить приложение (для проверки)
yarn start
убедимся, что всё работает

21. Установим менеджер процессов pm2:
sudo yarn global add pm2

22. Запустим приложение (из папки приложения)
pm2 start app.js
или в моем случае: pm2 start server.js
Чтобы остановить приложение: pm2 kill

23. Сделаем так, чтобы приложение запускалось даже при перезагрузке сервера
pm2 startup

В ответ будет вот такое сообщение
В ответ будет вот такое сообщение

Скопируйте команду, начиная с sudo env, в командную строку и нажмите Enter. У меня это:
sudo env PATH=$PATH:/usr/bin /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 startup systemd -u nikolay --hp /home/nikolay

Сохраним командой
pm2 save

24. Чтобы просмотреть информацию об установленном ключе выполните команды:
sudo gpg --list-keys --keyring /usr/share/keyrings/yarnkey.gpg
sudo gpg --list-keys --keyring /usr/share/keyrings//mongodb.gpg


Справочно: удалить ключ можно (и нужно только) такой командой:
sudo apt-key del 3A79BD29
где последние восемь символов - это последние восемь символов ключа

или такой командой (если установили уже по новому регламенту)
удаление закрытого ключа (если он есть):

sudo gpg --delete-secret-key [Key_ID]
удаление открытого ключа:
sudo gpg --delete-key [Key_ID]
где [Key_ID] - это весь ключ, а не только 8 последних символов

25. Создадим Домен. Рейтинг хостингов в России показал, что timeweb занимает лидирующее положение. Туда и пойдем.

-5

Регистрация несложная. Сами разберетесь)

Настроим DNS

-6

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

26. Установим nginx
обновляем список пакетов
sudo apt update
Установим nginx
sudo apt install -y nginx

В операционной системе Ubuntu по умолчанию установлен файрвол — ufw.
откроем на текущей машине два порта: 80 и 443
sudo ufw allow 'Nginx Full'
открывает порт 22 — соединение по ssh, чтобы мы могли подключаться к серверу через консоль и при работающем файрволе
sudo ufw allow OpenSSH

включим файрвол
sudo ufw enable

запустим nginx и добавим его в автозапуск
sudo systemctl enable --now nginx

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

Перед этим нужно создать рабочие папки и файлы:

/var/www/frontend/
/var/log/nginx/sivnv/frontend-access.log
/var/log/nginx/sivnv/frontend-error.log

/var/log/nginx/sivnv/backend-access.log
/var/log/nginx/sivnv/backend-error.log

В командной строке введите:
sudo nano /etc/nginx/sites-available/default

Frontend (папку build) буду хранить по адресу /var/www/frontend/, так как сразу все нужные доступы прописываются. Пробовал оставлять в домашнем каталоге - замучился потом доступы прописывать. Причем нужно было прописать все доступы по всей цепочке всем каталогам и файлам. Кто хочет попробовать пройти этим путем - вот команда, которая прописывает все права доступа:
sudo chmod 777 .
вместо точки прописываете имя каталога или оставляете точку для текущего каталога.


Удалите содержимое этого файла и вставьте туда такую конфигурацию:

-7

upstream example-backend {
server 127.0.0.1:3001;
}
# Настройка фронтенда
server {
listen 80;
server_name sivnv.ru www.sivnv.ru;
access_log /var/log/nginx/sivnv/frontend-access.log;
error_log /var/log/nginx/sivnv/frontend-error.log;
root /var/www/frontend/;

location / {
try_files $uri $uri/ /index.html =404;
}
}

# Настройка бэкенда
server {
listen 80;
server_name api.sivnv.ru;
access_log /var/log/nginx/sivnv/backend-access.log;
error_log /var/log/nginx/sivnv/backend-error.log;

location / {
proxy_set_header Host $http_host;
# пока upgrade закомментил - вроде и без него работает
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";


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 $scheme;
proxy_pass http://example-backend;
}
}

Nginx позволяет изменять и тестировать конфигурацию «на лету». Для этого до перезапуска nginx введите команду:
sudo nginx -t

Если ошибок нет, то вот так будет написано.
Если ошибок нет, то вот так будет написано.

28. перезагрузим конфигурацию nginx:
sudo systemctl reload nginx
Более короткая команда:
sudo nginx -s reload
Проверяем работу - всё должно работать

29. Заливаем обновления с гитхаба
git pull origin main
pm2 restart app
или в моем случае pm2 restart server

30. Выпуск и подключение сертификата ssl

sudo apt update
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx
sudo systemctl reload nginx

Обновление сертификата (1 раз в три месяца)

sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

Проверить, что сертифиакт обновится можно командой
sudo certbot renew --dry-run

она симулирует процесс обновления сертификата

31. Чтоб была хоть какая то автоматизация создал исполняемый файл на сервере
nano deploy.sh
внутри него:

cd react-mesto-api-full-gha
git pull
cd frontend
yarn
yarn build
sudo rm -rf /var/www/frontend
sudo cp -f -r build/ /var/www/frontend/
cd ~
sudo nginx -s reload

Далее нужно сделать его исполняемым. Это делается вот такой командой:
sudo chmod +x deploy.sh
Запустить его можно так:
./deploy.sh

Если используете npm - пишите соответствующие команды вместо yarn: npm install, npm run build


P.S.

Потребовалось скопировать папку с локального компьютера на сервер. Вот такая команда:
scp -r .mongodb nikolay@alliance:~/alliance-club-bot