Об этом проекте

Персональный репозиторий homelab, в котором весь кластер рассматривается как инфраструктура в коде (infrastructure-as-code). Стек работает на k3s, где Ansible playbooks, роли и inventory являются редактируемым источником истины; отрендеренная директория Docker Compose существует только на хосте Raspberry Pi. В репозитории задокументировано, что миграция с Docker Compose на k3s была завершена 2026-08-14, когда Docker был удален с основного узла сервера, а пошаговая запись об этом сохранена в папке архива в качестве истории. Описаны три хоста. daniel-box является control plane k3s и запускает почти все рабочие нагрузки, включая Traefik edge, Authelia SSO и OIDC issuer, Pi-hole DNS, хранилище Longhorn, CrowdSec и публичный эндпоинт WireGuard; на нем же запускается Ansible. daniel-server — это агентный узел k3s с Intel iGPU, используемым для транскодирования Jellyfin/Tdarr, хранилищем LVM и обработкой выключения UPS/NUT. daniel-pi — единственный оставшийся Docker-хост, доступный только в локальной сети (LAN), на котором запущен второй экземпляр WireGuard и небольшой стек утилит. Ingress централизован на Traefik и маршрутизируется через CRD IngressRoute, при этом Authelia ограничивает доступ к защищенным маршрутам через middleware forward-auth и выдает OIDC-токены для поддерживающих их приложений. Cloudflare проксирует публичные имена хостов, в то время как локальные имена разрешаются с помощью Pi-hole в локальной сети. В README отмечено, что сегментация сети не применяется повсеместно: только несколько ролей определяют NetworkPolicies, и там, где политики существуют, CNI кластера применяет только правила ingress. Развертывание разделено на Docker play и k8s play, которые управляются списком containers_list для каждого хоста. Docker play разрешает граф зависимостей с помощью пользовательских фильтров toposort и деклараций upstream в meta/deps.yml для каждой роли, поэтому зависимости запускаются первыми, а тегированные запуски подтягивают неудовлетворенные зависимости. k8s play выполняет топологическую сортировку ролей и выводит связи с Traefik (для установки CRD) и Authelia (для middleware) из самих шаблонов ролей, с явным depends_on для связей, которые не содержатся в шаблоне. Фильтры проходят модульное тестирование через pytest в pre-commit хуке. Задокументированы команды для развертывания одного сервиса, сухого запуска (dry run), всего стека или цели Pi, а также отдельные плейбуки для запуска и бутстрапа. Сквозные задачи включают секреты, зашифрованные с помощью SOPS/age и расшифровываемые во время выполнения, с использованием gitleaks в pre-commit и внеполосным резервным копированием ключей; наблюдаемость через Prometheus, Grafana, Loki и Tempo с дашбордами, предоставляемыми как код; запланированные бэкапы Longhorn в Backblaze B2 с задокументированным многоуровневым хранением томов и процедурами аварийного восстановления; pull-запросы через Renovate для закрепленных версий образов и ревизий хуков; а также инструменты безопасности, включая Authelia TOTP/OIDC, CrowdSec с агентами на каждом узле, fail2ban и UFW с запретом входящего трафика по умолчанию. Контроль качества осуществляется через инструмент pre-commit, охватывающий линтинг YAML/JSON, ansible-lint, gitleaks, валидацию отрендеренных шаблонов, синхронизацию реестра ротации секретов, ruff и pytest. Включены инструкции по добавлению новых сервисов, будь то роли k8s, генерирующие манифесты Deployment/Service/IngressRoute/PVC, или роли Docker для Pi.