Хостим свой сайт на Raspberry Pi
2025-03-01
Содержание
Доброго времени суток! В этой статье рассмотрим процесс настройки Raspberry Pi 4 для хостинга своего веб сайта.
Определение IP-адреса
- Для начала, нужно убедиться что IP-адрес, который вам выделяет провайдер совпадает с вашим реальным IP в мировой паутине. Для этого нужно сравнить IP-адрес в вашем роутере с адресом, определяемым сервисами определения IP, например https://2ip.ru(в новой вкладке). Если они совпадают, то поздравляю - вы счастливый владелец уникального публичного IP-адреса, если же они различаются, то скорее всего ваш провайдер применяет технологию Carrier-Grade NAT (CGNAT), которая позволяет множеству пользователей совместно использовать один или несколько публичных IP-адресов в целях их экономии. Данная проблема обычно решается провайдером за деньги, в моем случае с Ростелекомом за 150 рублей плюсом в месяц к тарифу.
- После получения от провайдера "белого" IP адреса, необходимо в настройках роутера пробросить порт 80 из внутренней (локальной) сети в мировую паутину. Для этого нужно зайти в панель администрирования роутера (обычно адрес 192.168.0.1 или 192.168.1.1, пользователь admin, пароль admin) и выбрать пункт, связанный с перенаправлением портов. Чаще всего искать по ключевому слову NAT. В случае моего роутера RV6699 от Ростелеком это выглядит примерно так:
- Просто пробросить порты в моем RV6699 оказалось недостаточно, потребовалось еще добавить Raspberry в DMZ (Demilitarized Zone) — это функция, которая позволяет выделить устройство в локальной сети в отдельную зону, открытую для доступа из интернета. Проверить доступность портов извне можно с помощью сервиса https://www.yougetsignal.com/tools/open-ports/(в новой вкладке).
Регистрация доменного имени
-
Конечно можно обойтись и без уникального доменного имени, просто заходя на сайт по полученному вами от провайдера белому IP-адресу, типа http://82.208.123.241(в новой вкладке), но гораздо приятнее иметь нормальное человеческое имя, например http://code-core.ru(в новой вкладке). Чтобы заполучить такую красоту придется немного раскошелиться. В сети существует достаточно много различных сервисов получения доменного имени как платных, так и бесплатных. Помятуя о пословице про бесплатный сыр я выбрал сервис регистрации доменных имен [РЕГ.РУ] https://www.reg.ru(в новой вкладке), который позволяет заполучить доменное имя в зоне RU.
-
Процесс регистрации доменного имени интуитивно понятен, никаких особых подводных камней нет. Заходим на сайт https://www.reg.ru(в новой вкладке), регистрируемся (придется указать свои персональные данные), далее выбираем Заказать
- вводим желаемое имя домена
- выбираем наиболее приглянувшееся и кликаем "Подобрать"
- далее переходим в заказ, все дополнительные опции пока можно отключить и оплачиваем
- Поздравляю, вы стали счастливым владельцем уникального доменного имени за 119 рублей в год (скромно промолчим, что это только за 1 года, далее...). Осталось лишь настроить ваш сервер в Малинке, к чему мы сейчас и перейдем.
Конфигурация Raspberry Pi
-
Открываем PowerShell (или Windows Terminal): Win + X выбираем Windows PowerShell (Администратор) или Windows Terminal (Администратор), или можно в любом месте нажать правую кнопку мыши с зажатым Shift и выбрать Открыть окно PowerShell здесь.
-
Подключаемся к Малинке
ssh user@ip
где user и ip - имя пользователя и ip адрес вашей Raspberry Если у вас включена авторизация по паролю, то малинка попросит вас его ввести, если вы используете авторизации на оcнове ssh-ключей, то пароль вводить не нужно.
-
Для начала обновим все компоненты системы
sudo apt update && sudo apt upgrade -y
-
Я предпочитаю устанавливать все пакеты с помощью Chocolatey(в новой вкладке) - это менеджер пакетов для операционных систем Windows, который позволяет устанавливать, обновлять и управлять программным обеспечением с помощью командной строки. Ближайший родственник Chocolatey 'это всем известный apt в Linux.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
-
После завершения установки перезапускаем PowerShell или вручную добавляем путь к Chocolatey в переменную среды
PATH
:$env:Path += ";$($env:ALLUSERSPROFILE)\chocolatey\bin"
-
Проверяем установку Chocolatey:
choco --version
-
Если все Ok, то устанавливаем Node.js.
choco install nodejs
-
Для хостинга веб сервера будем использовать Nginx. Устанавливаем его:
sudo apt install nginx -y
-
Устанавливаем Git и проверяем его установку:
sudo apt install git -y git --version
-
Устанавливаем pm2 - это продвинутый менеджер процессов для Node.js, который позволяет запускать, управлять и мониторить приложения Node.js в фоновом режиме. Он обеспечивает автоматическую перезагрузку приложений при падении, балансировку нагрузки, мониторинг ресурсов и многое другое.
sudo npm install -g pm2
-
Предполагается, что вы уже имеете некий веб-сервер на Node.js, если еще нет, то тут... я вкратце расписал основные шаги для его разработки.
-
Чтобы перенести ваш веб сервер из репозитория GitHub на ваш Raspberry клонируем репозиторий:
git clone https://github.com/username/my_blog.git
где username - ваш логин на GitHub, а my_blog - название вашего репозитория
-
Переходим в созданную директорию:
cd my_blog
-
Устанавливаем зависимости:
npm install
-
Собираем сервер:
npm run build
-
Запускаем и убеждаемся в его работоспособности:
npm start
-
Далее нужно прописать конфигурацию Nginx, для чего нужно создать новый конфигурационный файл в директории
/etc/nginx/sites-available/
sudo nano /etc/nginx/sites-available/my_blog
и скопировать в него следующее содержимое:
# Блок для обработки запросов по IP server { listen 80 default_server; # Обработка всех запросов по умолчанию server_name your_ip_address; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } # Блок для обработки запросов с доменного имени server { listen 80; server_name some-domain.ru www.some-domain.ru; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
вместо your_ip_address нужно ввести внешний IP-адрес вашего Raspberry Pi, а вместо some-domain.ru - доменное имя, полученное на РЕГ.РУ. Если у вас нет доменного имени, то этот блок можно не вставлять.
-
Далее создаем символическую ссылку (это аналог ярлыка в Windows) на наш конфигурационный файл:
sudo ln -s /etc/nginx/sites-available/my_blog /etc/nginx/sites-enabled/
Эта команда создает ярлык файла конфигурации сайта my_blog, расположенного в папке sites-available, в папку sites-enabled. Дело в том, что Nginx по умолчанию использует конфигурации, размещенные в папке sites-enabled, а в sites-available хранятся вообще все конфигурации, даже неактивные. Использование ссылки позволяет использовать сайт, не перемещая его в sites-enabled.
-
После создания ссылки проверяем конфигурацию:
sudo nginx -t
Если все нормально, то дожно появиться сообщение:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
-
Перезапускаем Nginx:
sudo systemctl restart nginx
-
Проверяем работоспособность сервера:
curl http://your_ip_address
-
Теперь давайте добавим сайт в менеджер PM2:
pm2 start npm --name "my_blog" -- start
-
Перезапускаем PM2 и добавляем его в автозагрузку:
pm2 save pm2 startup sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u admin --hp /home/admin
-
Перезагружаем Raspberry Pi:
sudo reboot now
и убеждаемся, что все работает.
Автоматичесикий деплой