Хостим свой сайт на Raspberry Pi

2025-03-01

raspberry

Содержание

Доброго времени суток! В этой статье рассмотрим процесс настройки 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 от Ростелеком это выглядит примерно так:

reg.ru

  • Просто пробросить порты в моем RV6699 оказалось недостаточно, потребовалось еще добавить Raspberry в DMZ (Demilitarized Zone) — это функция, которая позволяет выделить устройство в локальной сети в отдельную зону, открытую для доступа из интернета. Проверить доступность портов извне можно с помощью сервиса https://www.yougetsignal.com/tools/open-ports/(в новой вкладке).

reg.ru

Регистрация доменного имени

  • Конечно можно обойтись и без уникального доменного имени, просто заходя на сайт по полученному вами от провайдера белому IP-адресу, типа http://82.208.123.241(в новой вкладке), но гораздо приятнее иметь нормальное человеческое имя, например http://code-core.ru(в новой вкладке). Чтобы заполучить такую красоту придется немного раскошелиться. В сети существует достаточно много различных сервисов получения доменного имени как платных, так и бесплатных. Помятуя о пословице про бесплатный сыр я выбрал сервис регистрации доменных имен [РЕГ.РУ] https://www.reg.ru(в новой вкладке), который позволяет заполучить доменное имя в зоне RU.

  • Процесс регистрации доменного имени интуитивно понятен, никаких особых подводных камней нет. Заходим на сайт https://www.reg.ru(в новой вкладке), регистрируемся (придется указать свои персональные данные), далее выбираем Заказать

reg.ru

  • вводим желаемое имя домена

reg.ru

  • выбираем наиболее приглянувшееся и кликаем "Подобрать"

reg.ru

  • далее переходим в заказ, все дополнительные опции пока можно отключить и оплачиваем

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

    и убеждаемся, что все работает.

    Автоматичесикий деплой