Сервер на коленке для простых задач: Raspberry Pi + Portainer
Периодически всплывают задачи, для которых необходим постоянно запущенное приложение, но по тем или иным причинам тебе не хочется использовать для этого VDSки. Например, он должно потреблять ничтожно мало процессорного времени и при этом периодически что-то выполнять раз в N часов: бэкапы, боты и т. д.
Для таких случаев я приноровился использовать Raspberry Pi c веб-приложеним Portainer для более удобного управления своими приложениями. С помощью этих двух инструментов можно держать дома полтора десятка простеньких веб-сервисов, баз данных, Телеграм ботов для личных нужд.
Raspberry Pi
Это, наверное, один из самых известных одноплатных компьютеров, которые можно питать от USB C разъема и использовать без активного охлаждения для не особо требовательных задач.
На него есть огромное множество дистрибутивов Linux, с графической оболочкой и без. Есть даже версии Android и Windows 10/11 для тех, кому хочется особо пострадать.
Последнюю (на момент написания статьи) версию "Малинки" я в руках не держал. У меня Raspberry Pi 4B 8 Gb. Её хватает для большинства задач в качестве сервера. Если хочется графическую оболочку, то лучше посмотреть в сторону 5-й версии, где уже и загрузку с SSD можно сделать и подключить доп. перефирию через PCI-E.
Я использую ее с SD картой на 128 Гб, на которой установлена Ubuntu Server 24.04 LTS.
Самый простой вариант установки - Rpi Imager. Утилита есть на все возможные системы в нашей галактике и прямо в ней можно найти Ubuntu Server нужной версии, чтобы не скачивать ее отдельно.
Замечу, что в ней сразу можно указать имя пользователя и пароль, а также запуск SSH сервера (который нам позже пригодится) и подключение к Wi-Fi. Но будьте готовы, что SSH и Wi-Fi не заведется сразу после установки. Не имею представления с чем это связано, но после установки до настройку лучше проводить с помощью внешнего монитора и проводной клавиатуры. Wi-Fi настраивал по инструкции отсюда.
После подключения к Wi-Fi мы можем подключиться к "Малинке" по ssh. IP адрес можно найти в админке роутера или через ip a
ssh user@your_ip_here
Docker + Portainer
Docker
Самый удобный вариант использования практически любого сервера - использовать переносимые Docker контейнеры.
Чтобы установить Docker на RPi с Ubuntu, можно воспользоваться стандартным скриптом:
curl https://get.docker.com | sudo sh docker info
Portainer
В целом, если вам не лень заходить на сервер руками, то на этом можно остановиться, но мне удобнее смотреть на веб-интерфейс со статистикой и полезной инфой о том, что происходит на устройстве, поэтому следующим шагом будет установка Portainer.
Это платформа для управления контейнерами с огромным числом функций. Самая базовая и самая главная для меня - удобный интерфейс, чтобы следить за тем, что происходить в нашей песочнице.
Для установки Portainer на официальном сайте предлагается использовать docker образ, чтобы развернуть его всего за пару отдельных команд: https://docs.portainer.io/start/install-ce/server/docker/linux
Но как по мне лучше все это написать в одном docker compose файле, чтобы все настройки наглядно отображались в одном месте:
services: portainer: image: portainer/portainer-ce:lts ports: - 8000:8000 - 9443:9443 restart: always volumes: - portainer_data:/data - /var/run/docker.sock:/var/run/docker.sock volumes: portainer_data:
docker compose up -d
Сохраняем в удобном месте и получаем запущенный Portainer, в который мы можем идти через обычный браузер на порту 9443.
Разработка и развертывание приложений
Развертывание готовых контейнеров
Для работы с контейнерами в Portainer у нас есть дво пункта меню - отдельные контейнеры и стеки.
Соответственно, для простых одиночных вещей удобнее настраивать отдельные контейнеры. Если у нас есть docker-compose.yaml на 10 контейнеров с healthcheck и очередностью запуска, то наш выбор - стек. Стеки соответственно поднимают контейнеры.
Другие вкладки отвечают за работу с образами, сетями, хранилищами и хостами доступными Docker.
По умолчанию образы берутся из глобального Docker Hub, но можно указать и собственные реестры (например, если разворачиваете для в рабочей сети).
Разработка
Т. к. Raspberry Pi построена на базе ARM процессора, то компилируемые программы не совместимы с обычными компьютерами. Например, если вы пишите серверное приложение на C++ или Go, то учтите, что его нужно собирать специально под ARM64 платформу.
Скриптовые языки типа Python чувствуют себя в этом плане гораздо лучше, т. к. у них обычно используются мультиплатформенные образы, а т. к. скрипты не надо компилировать, они переносятся as-is.
Для сборки под несколько платформ на обычном ПК нам понадобится buildx:
docker buildx create --name multiarch --driver docker-container --use docker buildx build --platform=linux/amd64,linux/arm6 4 . -t some_tag --push
Так мы можем собрать приложение под две платформы и сразу запушить в публичный Docker Hub.
Теперь мы можем развернуть наше приложение на RPi.
Не сильно сложнее чем развернуть на хостинге, а оно все тут под рукой.
P. S.
Есть у Portainer еще одна полезная фича, которой я активно пользуюсь - подключение нескольких железок к одной панели через агентов.
- У вас есть несколько железок, которые можно приспособить под разные нужды.
- На все ставим Linux и Docker
- На самую слабую ставим основной Portainer (из шагов выше)
- На остальные ставим агенты
Таким образом получаем дополнительные среды (Environments), которыми можем управлять из одной админ панели.
У меня так подключен Orange Pi Zero 3, на котором отдельно запущены Телеграм боты с менее требовательными ресурсами.
Также все описанные манипуляции можно произвести с несколькими виртуальными хостингами, чтобы связать ресурсы в одной панели управления.