### Summary of Changes - **Added `ermnvldmr` Platform Documentation (English & Russian)**: - `_index.md`: Overview and navigation cards - `architecture.md`: End-to-end architecture (Packer, Cloud-Init, K3s, Flux v2, Cloudflare) with Mermaid diagram - `golden-image.md`: Packer QEMU build pipeline, S3 storage & quota pruning - `deployment-gitops.md`: Declarative Flux GitOps, release pipelines, fast-track deploys, and automated `/version.json` rollout validation - `operations.md`: SSH access, SOPS + Age secret encryption, PostgreSQL storage, S3 backups, and Cloudflare configuration - **Deprecated Section Cleanup**: - Deleted obsolete `services/docs/content/en/root/` and `services/docs/content/ru/root/`
6.6 KiB
6.6 KiB
title, weight, type
| title | weight | type |
|---|---|---|
| Архитектура и потоки данных | 2 | docs |
Архитектура инфраструктуры ermnvldmr.com объединяет запекание неизменяемых образов ОС, автономную bootstrap-инициализацию через cloud-init и декларативную GitOps-синхронизацию Flux в единую надежную модель развертывания.
1. Общая схема системы
flowchart TD
subgraph GitHub ["Инфраструктура GitHub"]
Repo["Git-репозиторий (ветка next)"]
Workflows["GitHub Actions пайплайны"]
GHCR["GitHub Container Registry (GHCR)"]
end
subgraph S3 ["Объектное S3-хранилище"]
GoldenImage["Packer Golden Image (.qcow2)"]
Backups["Ежедневные бэкапы PostgreSQL"]
end
subgraph Cloud ["Облачная инфраструктура / Платформа Compute"]
subgraph VM ["Виртуальная машина Compute"]
subgraph OS ["Debian 12 Bookworm"]
CloudInit["Cloud-Init First-Boot"]
UFW["Файрвол UFW (80, 443, 22)"]
SSD["Постоянный SSD (/dev/vdb /var/lib/rancher/k3s/storage)"]
end
subgraph K3s ["Кластер K3s (Single-Node)"]
Flux["Оператор Flux v2"]
Traefik["Traefik Ingress (HostPort 80/443)"]
CertManager["Cert-Manager (Let's Encrypt Prod)"]
subgraph Apps ["Сервисы кластера (com-ermnvldmr)"]
WWW["www (React 19 SSG + Nginx)"]
Docs["docs (Hugo + Hextra + Nginx)"]
Postgres["PostgreSQL 16 StatefulSet"]
Umami["Сервер аналитики Umami"]
BackupCron["CronJob бэкапа Postgres в S3"]
end
end
end
end
subgraph Edge ["Cloudflare Edge"]
CF["Прокси Cloudflare (Full Strict)"]
end
Users["Пользователи"] --> CF
CF --> Traefik
Traefik --> WWW
Traefik --> Docs
Traefik --> Umami
Umami --> Postgres
BackupCron --> Backups
Workflows --> GHCR
Workflows --> GoldenImage
Repo --> Flux
Flux --> Apps
2. Фазы жизненного цикла платформы
Фаза 1: Сборка Golden Image (Packer)
- Автоматический запуск: GitHub Actions выполняет
.github/workflows/ci-next-build-golden-image.yml. - QEMU-виртуализация: Packer запускает виртуальную установку Debian 12 с автоматизацией preseed (
preseed.cfg). - Инициализация:
- Установка системных утилит (
curl,git,htop,fail2ban,ufw,qemu-guest-agent,isc-dhcp-client). - Настройка
/etc/cloud/ds-identify.cfgсpolicy: enabledдля гарантированного старта cloud-init. - Предустановка бинарного файла K3s (
INSTALL_K3S_SKIP_ENABLE=true,INSTALL_K3S_SKIP_START=true) в/usr/local/bin/k3s. - Сброс идентичности хоста (
/etc/machine-id, DBus ID, ключи SSH, сетевые кэши).
- Установка системных утилит (
- Сжатие и загрузка в S3: Образ конвертируется в
qcow2, старые образы вdev/images/автоматически удаляются для соблюдения квот хранилища, и готовый образ загружается в объектное S3-хранилище.
Фаза 2: Автономный первый запуск (Cloud-Init)
При создании виртуальной машины с метаданными ci/cloud-init/user-data.template.yaml:
- Настройка пользователей и сети:
- Создание пользователя
adamс публичным SSH-ключом и правами sudo без пароля. - Отключение парольной аутентификации и прямого доступа root по SSH.
- Конфигурация fallback DNS-серверов (
1.1.1.1,8.8.8.8,77.88.8.8).
- Создание пользователя
- Харденинг ядра и безопасность:
- Применение правил sysctl (защита от SYN Flood, запрет ICMP redirects, фильтрация обратного пути rp_filter).
- Настройка UFW: открыты только порты 22 (SSH), 80 (HTTP Traefik) и 443 (HTTPS Traefik), настроена внутренняя маршрутизация подсетей K3s Pods (
10.42.0.0/16) и Services (10.43.0.0/16). - Включение службы Fail2ban.
- Подключение постоянного SSD:
- Определение вторичного диска
/dev/vdb. - Автоматическое форматирование в
ext4с меткойk3s-storage, если диск не был отформатирован. - Монтирование в
/var/lib/rancher/k3s/storageи добавление записи в/etc/fstab.
- Определение вторичного диска
- Запуск K3s и GitOps-движка:
- Старт службы
k3s.serviceс активным ServiceLB. - Создание секрета
flux-system/sops-ageс ключом дешифрования. - Установка CRD и контроллеров Flux v2.
- Применение корневого манифеста синхронизации (
GitRepository+Kustomization), привязанного к веткеnext.
- Старт службы
Фаза 3: Непрерывная доставка и синхронизация (GitOps)
- Контроллер Flux:
- Опрашивает ветку
nextкаждую 1 минуту. - Применяет Kustomize-оверлеи из
ci/k8s/clusters/production. - Дешифрует секреты
*.sops.yamlпрямо внутри кластера с помощью ключа Age. - Гарантирует бесшовный rollout подов (
maxUnavailable: 0,maxSurge: 1).
- Опрашивает ветку
- Сетевой уровень и TLS:
- Traefik слушает порты 80 и 443.
- Cert-Manager валидирует HTTP-01 ACME challenge от Let's Encrypt через правила Ingress.
- Прокси Cloudflare работает в режиме Full (strict), обеспечивая максимальный уровень безопасности.