Использование одноплатных компьютеров, таких как Raspberry Pi Zero 2 W, для сетевых задач требует высокой стабильности. Однако даже настроенные системы сталкиваются с неожиданными сбоями служб, процессов или контейнеров Docker. В подобных ситуациях многие пользователи полагаются на системы оповещения, которые лишь информируют о проблеме, но не решают её. Оптимальным решением становится создание скрипта для «самолечения» сервера, который работает в фоновом режиме и берет на себя базовые задачи по восстановлению работоспособности.

Ограничения стандартных инструментов и логика автоматизации
Для реализации проекта автор использовал Raspberry Pi Zero 2 W, на котором развернуты Unbound и Pi-Hole для обработки DNS-запросов, а также дополнительные контейнеры Docker для мониторинга и дашбордов. Отдельно от Docker был развернут Tailscale для удаленного доступа. Основная сложность заключается в том, что некоторые службы не отображаются в графических дашбордах, и при их отказе удаленное управление становится невозможным. Использование системного планировщика Systemd позволяет запускать скрипт при загрузке ОС, обеспечивая фоновый мониторинг без лишней нагрузки на ресурсы устройства.
Принципы работы скрипта восстановления
Скрипт, разработанный с помощью ИИ-инструментов, выполняет последовательную проверку состояния системы с определенным интервалом. Важно, что он не перезагружает сервер при первой же ошибке: сначала проверяется активность Docker и статус отдельных контейнеров. Если служба не запущена, скрипт инициирует перезапуск. Аналогичные проверки проводятся для Pi-Hole, Unbound и Tailscale.
Дополнительно предусмотрена проверка внешнего сетевого подключения. Если критически важные службы остаются недоступными после ряда проверок, скрипт записывает информацию в лог-файл и лишь в крайнем случае выполняет перезагрузку всей системы. Использование таймера позволяет избежать постоянного нахождения скрипта в оперативной памяти, что критично для скромных ресурсов Raspberry Pi Zero 2 W.

Преимущества перед штатными политиками перезапуска Docker
Хотя Docker поддерживает внутренние политики перезапуска (restart policies), они ограничены рамками самих контейнеров и не учитывают состояние системы в целом. Предложенный скрипт выступает в роли дополнительного защитного слоя:
- Осуществляет мониторинг служб, установленных вне контейнеров, таких как Tailscale.
- Проверяет фактическую работоспособность DNS-резолвера и Pi-Hole с помощью реальных DNS-запросов.
- Анализирует сетевую связность, выполняя PING внешних узлов.
- Ведет лог-файлы, которые позволяют проанализировать причину сбоя даже после того, как автоматизация вернула систему в рабочее состояние.
Такой подход избавляет от необходимости тратить время на рутинные проверки через SSH, такие как перезапуск «зависших» сервисов или диагностика сети. Скрипт не делает сервер полностью неуязвимым к любым поломкам, но автоматизирует базовое устранение неполадок, позволяя администратору сосредоточиться на более сложных задачах, а не на тривиальной перезагрузке процессов.

Почему стоит использовать «сторожевой» скрипт
Когда вы строите сеть вокруг Raspberry Pi Zero 2 W, ваша главная цель — аптайм. В идеальных условиях сервер не должен испытывать простоев, но реальность далека от идеала. Глючный процесс или сбойный Docker-контейнер могут сделать всю сеть неработоспособной. Если вы находитесь за своим ПК и у вас открыта панель мониторинга, вы можете увидеть, какие контейнеры «упали», но это лишь пассивная реакция. Хуже того: если на Raspberry Pi настроен ваш основной DNS, то при сбое системы у вас пропадает возможность даже быстро погуглить решение проблемы. Инцидент уже произошел, и вы вынуждены вручную возвращать работоспособность сервера.

Службы, развернутые вне контейнеров, такие как Tailscale, представляют особую проблему. Они не отображаются в стандартных дашбордах мониторинга. Если Tailscale «падает», вы теряете удаленный доступ к устройству, находясь вне дома. Именно поэтому нужен механизм, который не просто оповещает, а активно ищет и устраняет сбои. Скрипт — это простейший способ превратить ваш SBC в самовосстанавливающуюся систему. Он легок, поддается гибкой настройке и идеально подходит для запуска при загрузке системы.

Тонкости реализации и ограничения ресурсов
Выбор Raspberry Pi Zero 2 W продиктован его эффективностью, однако это накладывает ограничения. Устройство отлично справляется с DNS-стеком, но такие тяжелые инструменты мониторинга, как Uptime Kuma или Grafana, могут оказаться для него избыточными и слишком «тяжелыми» для оперативной памяти. Созданный скрипт — это мудрое решение, так как он потребляет минимум ресурсов, работая в фоне с фиксированными интервалами. Это избавляет от необходимости держать в памяти «тяжелые» графические системы наблюдения.
Алгоритм работы скрипта включает в себя несколько этапов:

- Проверка Docker: Скрипт сначала определяет, запущен ли движок Docker, а затем инспектирует статус каждого контейнера, перезапуская только те, что вышли из строя.
- DNS-валидация: Pi-Hole и Unbound проверяются не только на факт «запущенного процесса», но и через отправку реального DNS-запроса. Если запрос не проходит — скрипт принимает меры.
- Анализ Tailscale: Процесс может присутствовать в списке активных задач, но при этом быть нефункциональным. Скрипт анализирует состояние сервиса и при необходимости перезапускает его для восстановления связи.
- Сетевой контроль: Даже если всё ПО запущено, интернет может отсутствовать. Скрипт выполняет пинг внешних узлов, чтобы убедиться в наличии связи с глобальной сетью.
- Логирование и перезагрузка: Скрипт сохраняет результаты всех проверок в лог-файл. Перезагрузка всей системы — это крайняя мера, применяемая только в том случае, если несколько попыток восстановления сервисов не дали результата.
SSH — для важного, автоматика — для рутины
При работе с одноплатными компьютерами SSH — это первый инструмент, который вы осваиваете, так как у устройства нет собственного экрана. Однако использование терминала для решения тривиальных задач вроде перезапуска «зависшего» процесса — это пустая трата времени. Скрипт берет на себя всю «черную» работу, оставляя вам готовую базу в виде логов для последующего анализа. Это не делает сервер неуязвимым к серьезным сбоям, но избавляет от необходимости заниматься рутиной. Если возникнет более сложная проблема, вы сможете прочитать лог, увидеть, на каком этапе произошел отказ, и, если потребуется, применить более продвинутые действия — например, полное пересоздание контейнеров. Помните, что конфигурации у всех разные, поэтому скрипт — это каркас, который нужно адаптировать под ваш конкретный набор Docker-контейнеров и предустановленного ПО.






