All posts

Рецепт домашнего сервера

 — #Deployment

Эта статья является продолжением моей предыдущей, где я разбирал вопросы развертки приложения на Nuxt 3 в облачном VPS от Amazon. Это было небольшое приложение, которое не требовало больших ресурсов у виртуальной машины. А теперь представим, что нам надо задеплоить еще бэкенд с базой данных и все это завернуто в контейнеры. И тут мой бесплатный инстанс EC2 (t2.micro) мог вспотеть, услышав все это. На самом деле он умрет уже на стадии создании образов Docker.

Поэтому я вспомнил про свой домашний ноутбук HP Pavilion 15, который пылится с тех пор как я использую MacBook (ну как не упомянуть данный факт). Данный лэптоп имеет 16гб ОЗУ, 500гб диска, 6 ядер, 1 сокет. Казалось бы все классно, но у нас есть проблемы Хьюстон. IP адресс моей потенциальной хост-машины серый, то есть к нему нет доступа из Интернета. Некоторые из вас посоветовали бы мне купить белый IP адресс, но тут тоже есть свои проблемы. Во-первых, я жмот. Во-вторых, у меня уже есть виртуальная машина с публичным и главное статичным IP адрессом. То есть, я решил использовать свой EC2 инстанс как обратный прокси.

reverse-proxy

И снова вопрос: если у нас серый IP адресс, то как виртуальная машина сможет перенаправлять к нам запросы? Не буду долго тянуть кота за яи... это можно сделать через VPN. Если вы не знаете как работает эта технология, то дальнейшее чтение бесполезно. Есть уже готовые и платные решения, но не забываем, что я жмот. Поэтому берем самый популярный бесплатный вариант - OpenVPN и делаем из нашего инстанса VPN сервер. В интернете очень много материала о том как настроить VPN сервер и клиент, а еще все это можно прочитать в официальной документации. Но есть причины, почему мне это не очень помогло. Моя виртуальная машина запущена на Debian 12, а в документации по установке OpenVPN Access Server этой операционки нет. При установке с пакетами для Debian 11 возникают ошибки с несовместимостью. Тут я захотел пересоздать свой инстанс на базе Ubuntu 22, но я успел найти bash-скрипт из репозитория, который настраивает VPN сервер для вас с созданием конфигурационного файла для клиента. Вообще! никогда не скачивайте баш скрипты на ваше устройство и тем более не запускайте их, не ознакомившись с исходниками. Перейдя по ссылке вы можете удостовериться, что с этим скриптом все в порядке: https://raw.githubusercontent.com/Nyr/openvpn-install/master/openvpn-install.sh

Устанавливаем и настраиваем VPN сервер

openvpn-logo

Введите на вашей виртуальной машине следующие команды:

wget https://git.io/vpn -O openvpn-install.sh
sudo bash ./openvpn-install.sh

Далее установщик будет спрашивать у вас какой порт по какому протоколу использовать, как назвать конфигурационный файл для клиента и остальные вопросы, которые вы должны выбрать для себя сами. Тут важно отметить, что для EC2 инстанса вы должны открыть тот порт, который будет использовать OpenVPN (обычно это 1194). Это можно сделать в настройках Security Group вашего инстанса.

security-group

Получив конфигурационный файл немедленно передаем его клиенту:

sudo scp user@ec2-instance:/путь_к_вашему_конфиг_файлу ~/путь_где_вы_будете_хранить

Теперь скачиваем VPN клиент с удобным GUI. Вот их список для разных устройств и операционных систем:

1.) iOS OpenVPN клиент — https://apps.apple.com/us/app/openvpn-connect-openvpn-app/id590379981

2.) Android OpenVPN клиент — https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=en

3.) Linux OpenVPN клиент — https://openvpn.net/vpn-server-resources/connecting-to-access-server-with-linux/

4.) Mac OS неофициальный клиент — https://tunnelblick.net/

5.) Mac OS официальный клиент (beta) — https://openvpn.net/downloads/openvpn-connect-v3-macos.dmg

6.) Windows OpenVPN клиент — https://openvpn.net/downloads/openvpn-connect-v3-windows.msi

Запускаем, вставляем конфигурационный файл и коннектимся. После этого наше устройство получит от VPN-сервера приватный IP адресс. Его можно увидеть в интерфейсе некоторых клиентских приложении. Но самый универсальный способ это написать команды по типу ipconfig/ifconfig в зависимости от вашей операционной системы и найти его среди сетевых интерфейсов utun/tun (Unix подобных системах) или в неизвестном адаптере на Windows.

macos-vpn-ip

windows-vpn-ip

Настраиваем обратный прокси-сервер

В роли обратного прокси будет выступать уже знакомый нам Nginx. О том, как установить, сконфигурировать и добавить сертификаты я показывал в прошлой статье. На этот раз я покажу как делать прокси на наш настоящий сервер.

nginx-proxy-config

Все можно копировать, кроме последнего. Там вы прописываете тот IP адресс, который вам выдал VPN сервер и порт, на котором будет запущено ваше приложение. После этого проверяете корректность ваших конфигов и перезапускаете Nginx.

Запускаем наше приложение

Момент истины. Я открываю консоль, захожу в свой проект, меняю порт на тот, который указал в "proxy_pass" и запускаю приложение. После того, как ввожу доменное имя в браузере я снова получаю тот результат, который был в прошлой статье.

Теперь наше приложение масштабировалось и может потреблять гораздо большее количество ресурсов, чем прежде. Cтало возможно запускать разные контейнеры, CI/CD и прочие разные штуки на одной машине.

finished-job

P.S. Но все это не без ложки дегтя. Мой сервер работает на Windows 11, а хуже ОС для администрирования я не знаю. В дальнейшем рассматривается переход на Linux.