Каждый домашний сервер, NAS или умный дом рано или поздно превращается в свалку глючных конфигов, мёртвых проектов и забытых бэкапов. Разбираемся, как отличить рабочий технотреш от безнадёжного говна — и что с этим делать.
Ты купил Raspberry Pi, поставил на него Home Assistant, добавил пару Zigbee-датчиков, настроил автоматизации. Всё работало. Месяц. Потом появились глюки. Потом ты обновил систему, и половина устройств перестала отвечать. Потом ты нашёл на GitHub форк оригинального драйвера, который якобы решает проблему, но он требует Python 3.7, а у тебя уже 3.11. Потом ты потратил выходные на переустановку всего с нуля. И вот — у тебя снова «работает», но ты уже не помнишь, что именно ты сделал, чтобы оно заработало. И главное — ты точно знаешь, что через месяц всё снова развалится.
Это не баг. Это говно. Не в смысле «плохо», а в смысле — накопившийся технотреш, который никто не убирал. Говно — это не то, что не работает. Говно — это то, что работает, но ты не знаешь как, и боишься трогать.
В этой статье не будет советов «как сделать идеально». Идеально не бывает. Будем разбираться, как отличить говно от рабочего решения, как его локализовать, и главное — как не дать ему захватить всю твою инфраструктуру.
Не всё старое — говно. Не всё костыльное — говно. Есть конкретные признаки, по которым можно диагностировать проблему.
Типичная ситуация: ты нашёл на форуме конфиг, скопировал, оно заработало. Ты не понимаешь, что делает половина параметров, но «работает же». Через полгода ты обновляешь систему, и оно перестаёт работать. Ты начинаешь копаться, и выясняется, что этот конфиг был написан для версии софта трёхлетней давности, и половина параметров уже deprecated.
Пример: конфиг для Zigbee2MQTT, в котором прописаны каналы, которые давно не используются, но «работает же». Или Docker Compose с кучей legacy-сервисов, которые никто не удалял, потому что «а вдруг пригодится».
Как проверить: попробуй объяснить, как работает твоя система, другу, который в теме. Если не можешь — это говно.
Хорошая система работает сама. Говно требует постоянного пинка. Примеры:
Если ты тратишь больше часа в месяц на поддержание системы в рабочем состоянии — это говно. Не важно, насколько круто оно выглядит на бумаге.
Ты когда-то настроил WireGuard, всё работало, и ты благополучно забыл, как это делал. Через год тебе нужно добавить новое устройство, и ты начинаешь копаться в старых заметках, но там только обрывки команд и никакого объяснения, почему именно так.
Говно не документируется. Оно живёт в голове, пока не забудется, или пока не сломается.
Как проверить: попробуй восстановить систему с нуля по своим заметкам. Если не получается — это говно.
Ты единственный, кто знает, как это работает. Если ты уедешь в отпуск, система умрёт. Если ты забудешь пароль от роутера, никто не сможет его восстановить. Если ты потеряешь ноутбук с ключами SSH, доступ к серверу будет утерян навсегда.
Говно не масштабируется. Оно не передаётся. Оно живёт только в одном экземпляре.
Последний коммит в репозитории был три года назад. Последний релиз софта — два года назад. Документация не обновлялась с версии 1.0. Но «работает же».
Проблема не в том, что софт старый. Проблема в том, что он не развивается. Рано или поздно он перестанет работать с новыми версиями зависимостей, или в нём найдут критическую уязвимость, и ты не сможешь её закрыть.
Пример: старые версии Home Assistant, которые не поддерживают новые интеграции, или прошивки для роутеров, в которых есть уязвимости, но нет патчей.
Говно не появляется само по себе. Оно — результат конкретных решений и компромиссов. Разберём основные источники.
Ты ставишь временное решение, чтобы протестировать идею. Оно работает, и ты забываешь о нём. Через год ты уже не помнишь, что это было временное решение, и оно становится частью инфраструктуры.
Пример: ты поднял VPN на роутере через PPTP, потому что «быстро и просто». Через год ты понимаешь, что PPTP небезопасен, но у тебя уже десяток устройств, которые подключаются через него, и переделать всё — слишком сложно.
Ты боишься обновлять систему, потому что «работает же». Ты отключаешь автоматические обновления, чтобы ничего не сломалось. Через год ты понимаешь, что твоя система отстала от жизни на несколько версий, и обновление теперь — это большой и рискованный проект.
Пример: старые версии Proxmox, которые не поддерживают новые версии ядра, или Ubuntu 18.04, которая давно вышла из поддержки.
Ты не читаешь документацию. Ты не смотришь примеры. Ты не спрашиваешь советов. Ты делаешь по-своему, потому что «я сам разберусь». В итоге ты изобретаешь велосипед, который уже давно изобрели до тебя, но с кучей багов и костылей.
Пример: ты пишешь свой скрипт для бэкапов вместо того, чтобы использовать готовые решения вроде Borg или Restic. Через год ты понимаешь, что твой скрипт не умеет делать инкрементальные бэкапы, не проверяет целостность данных, и вообще работает через раз.
Ты используешь софт, потому что он бесплатный, а не потому что он хороший. Ты миришься с его недостатками, потому что «бесплатно же». В итоге ты тратишь больше времени на борьбу с багами, чем сэкономил на лицензии.
Пример: бесплатные версии софта с ограниченным функционалом, которые не подходят для твоих задач, но ты всё равно их используешь, потому что «бесплатно». Или open-source проекты, которые заброшены, но ты продолжаешь их использовать, потому что «бесплатно».
Ты тратишь месяцы на планирование идеальной инфраструктуры. Ты рисуешь диаграммы, пишешь документацию, продумываешь каждый шаг. В итоге ты так и не начинаешь, потому что идеального решения не существует.
Пример: ты планируешь идеальную сеть с VLAN, VPN, брандмауэрами и мониторингом, но так и не подключаешь ни одного устройства, потому что «ещё не всё готово».
Говно не исчезнет само. Его нужно активно вычищать. Вот несколько стратегий.
Раз в квартал устраивай «день уборки». Проверяй все сервисы, которые у тебя запущены. Удаляй то, что не используется. Обновляй то, что устарело. Документируй то, что осталось.
Что проверять:
docker ps -a). Удаляй остановленные и неиспользуемые.apt list --installed или dpkg -l). Удаляй то, что не нужно.crontab -l). Удаляй мёртвые задачи.netstat -tulnp или ss -tulnp). Закрывай ненужные порты.Если ты делаешь что-то вручную чаще раза в месяц — автоматизируй. Примеры:
Документируй всё. Но не в виде отдельных заметок, которые никто не читает, а как часть инфраструктуры. Примеры:
Правило: если ты не можешь объяснить, как работает твоя система, за 5 минут — это говно.
Не вноси изменения в продакшен без тестирования. Используй:
Чем сложнее система — тем больше в ней говна. Упрощай. Примеры:
Правило: если ты не можешь объяснить, как работает твоя система, за 30 секунд — она слишком сложная.
Проблема: NAS на базе старого ПК с FreeNAS. Запущен пять лет назад. Никто не обновлял. Бэкапы не делаются. Доступ по SMB тормозит. Никто не знает, что там внутри.
Диагноз: классическое говно. Работает, но никто не знает как. Бэкапов нет. Обновлений нет. Документации нет.
Решение:
Результат: система стала прозрачной, обновляемой и поддерживаемой.
Проблема: умный дом на базе Home Assistant. Десятки интеграций, половина из которых не работает. Автоматизации написаны на YAML, который никто не понимает. Zigbee-сеть глючит. Обновления отключены, потому что «работает же».
Диагноз: говно в чистом виде. Работает, но никто не знает как. Обновлений нет. Документации нет. Поддержка невозможна.
Решение:
Результат: система стала поддерживаемой, обновляемой и документированной.
Проблема: самописный скрипт на Python для мониторинга серверов. Скрипт запускается по cron, шлёт уведомления на почту. Никто не знает, как он работает. Скрипт падает раз в неделю, и его приходится перезапускать вручную.
Диагноз: говно. Работает, но ненадёжно. Документации нет. Поддержка невозможна.
Решение:
Результат: система стала надёжной, документированной и поддерживаемой.
Иногда говна настолько много, что проще всё переделать с нуля. Как понять, что пора:
Стратегия перезапуска:
Пример: переезд с одного гипервизора на другой. Не переноси все виртуальные машины сразу. Начни с одной, протестируй, убедись, что всё работает, потом переноси остальные.
Говно не появляется само по себе. Оно — результат наших решений. Вот несколько правил, которые помогут не стать источником говна:
Говно — это не приговор. Это сигнал, что систему пора приводить в порядок. Не игнорируй его. Чисти регулярно. И тогда твоя инфраструктура будет работать как часы, а не как свалка технотреша.