Files
freeradius/agent/INDEX.md
Georg K 0abfe348c1 feat(ci): skip .deb rebuild when version already published
build-deb now checks the Debian registry first and skips the slow source
compile+upload when the pinned version already exists. Add a force_deb
workflow_dispatch input to rebuild anyway, and make upload.sh idempotent
(HTTP 409 -> already published, skip).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 06:02:20 +03:00

108 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FreeRADIUS - обзор инфраструктуры
Профиль: infra-lite. Бизнес-логику самого FreeRADIUS здесь не описываем.
## Назначение
Сборка и поставка кастомного FreeRADIUS 3.2.x для hotspot/captive-portal сценариев.
Репозиторий не содержит сервиса - он упаковывает апстримный FreeRADIUS с
доп. модулем `rlm_raw` и накладывает конфиги под две среды выполнения.
## Версия - единый источник
`VERSION` (корень) = `3.2.8`. Из него CI выводит:
- `RADIUS_TAG=release_3_2_8` (тег исходников FreeRADIUS для сборки .deb),
- пин пакетов `3.2.8+git` (образ и hosted),
- `appVersion` чарта.
CI (`prepare`) падает, если `packaging/hosted/.env` (`FREERADIUS_TAG`) или
`charts/freeradius/Chart.yaml` (`appVersion`) разошлись с `VERSION`. Ветка
`rlm_raw` - отдельный параметр (`workflow_dispatch` input, дефолт `v3.2.4`).
## Артефакты (Gitea, owner `pub`)
| Артефакт | Реестр |
|----------|--------|
| `.deb` | `https://git.ahax86.ru/api/packages/pub/debian` (distribution `noble`, component `main`) |
| Образ | `git.ahax86.ru/pub/freeradius:<version>` (+ `latest`) |
| Hosted-бандл | `.../api/packages/pub/generic/freeradius-hosted/<version>/freeradius-hosted.tar.gz` |
| Helm-чарт | `https://git.ahax86.ru/api/packages/pub/helm` |
Соглашение: локальный alias helm-репо - `ahax86` (`helm repo add ahax86 ...`).
## Релизный поток (`.gitea/workflows/release.yaml`, `workflow_dispatch`)
```
prepare ──► build-deb ──► build-image ──► package-helm
└──► package-hosted
```
- `.deb` - источник истины: `build-image` и `package-hosted` имеют `needs: build-deb`
И дополнительно проверяют, что версия `3.2.8+git` уже опубликована в Debian-реестре
(GET `dists/noble/main/binary-amd64/Packages`), иначе fail.
- `build-deb` пропускает долгую пересборку, если версия уже в реестре. Принудительно -
input `force_deb=true`. Заливка идемпотентна: `upload.sh` пропускает HTTP 409 (уже есть).
- Авторизация: репо-секреты `PACKAGES_USER` / `PACKAGES_TOKEN` (Gitea token, scope
`write:package`).
- Раннер: `ubuntu-latest` с доступным Docker.
## Режимы развёртывания
- Kubernetes (`charts/freeradius/`): продуктовый Helm-чарт. Образ из `build-image`.
Конфиги `default`/`rest` - в ConfigMap; `sql` - тоже в ConfigMap, но пароль БД не
хранится там, а подставляется в рантайме через `$ENV{DB_PASSWORD}` из Secret
(`db.password` или `db.existingSecret`). `entrypoint.sh` копирует `/configs/*` в
`/etc/freeradius`. Сертификаты на PVC (`persistence`). nodeSelector/tolerations -
конфигурируемые (по умолчанию пусто). Установка - из Helm-реестра Gitea.
- Hosted / bare-metal (`packaging/hosted/install.sh`, root): ставит запиненные .deb из
Debian-реестра Gitea (`apt-mark hold`), подставляет хосты/порты/креды в конфиги через
`sed` из `.env_cnf`, ставит systemd-юнит и cron на ежемесячный перевыпуск сертификатов
(`cron/radius-renew.sh`). `update.sh` бампит версию пакета (`unhold` -> install -> hold).
Для приватного реестра - `DEB_AUTH="user:token"`.
## Внешние зависимости и хосты
- Gitea: `git.ahax86.ru`, owner `pub`. Образы - container registry, .deb - Debian-реестр,
чарт - Helm-реестр, hosted - generic-пакет. GPG-ключ apt-репо:
`https://git.ahax86.ru/api/packages/pub/debian/repository.key`.
- PostgreSQL `radius_db` (схема RADIUS: `radacct`, `radcheck`, `nas`, ...). В k8s -
`postgresql-pgbouncer:6432`, юзер `admin`; в hosted - из `.env_cnf`.
- REST API `hotspotter` (k8s: `hotspotter:8080`, эндпоинт `radius/auth`). Используется
как fallback-авторизация NAS, когда клиента нет в таблице `nas`.
## Сетевые порты
- Auth/acct: 31812 / 31813 (см. site `default`, `values.yaml` `service.*`, `.env_cnf`).
- В k8s публикуются Service'ом (по умолчанию NodePort 31812/31813).
## Инварианты
- Клиенты (NAS) резолвятся динамически: site `dynamic-clients` ищет NAS по `shortname`
(= `NAS-Identifier`) в таблице `nas`; если нет - идёт `rest` к `hotspotter`. Статический
`clients.conf` минимален.
- Включён модуль `delay` (delay_reject); удалены `eap`, `inner-tunnel`, `proxy_rate_limit`
(синхронно в образе и hosted).
- Модуль `rlm_raw` обязателен: конфиги используют `%{raw:...}` (Called-Station-Id,
NAS-Identifier). Без него сборка/конфиг не работают.
- Сертификаты в k8s переживают рестарты через PVC; `entrypoint.sh` копирует дефолтные
только если каталог `certs` пуст.
## Риски и known warts
- Образ при сборке тянет .deb из Debian-реестра Gitea - предполагается публичный read для
owner `pub`. Если реестр приватный, сборку образа надо чинить (read-токен/buildkit secret),
а на нодах нужен `DEB_AUTH` для apt.
- Повторная заливка той же версии .deb обрабатывается: `build-deb` её пропускает, а
`upload.sh` не падает на HTTP 409. Переиздать изменённое содержимое той же версии нельзя -
нужно либо bump `VERSION`, либо удалить пакет в Gitea. `force_deb` только пересобирает.
- Пароль БД: в hosted - в `.env_cnf` (gitignored, `*.env_cnf`); в k8s - в Secret. В git не
попадает.
## Рабочие правила
- Менять конфиги/версии осознанно: одно изменение часто нужно отразить и в чарте
(`charts/freeradius/`), и в hosted (`packaging/hosted/`), и в образе (`packaging/image/`).
- Версию менять только в `VERSION` (плюс синхронно `.env`/`Chart.yaml`, иначе CI упадёт).
- Прод-выкладка только вручную через Gitea Actions и только по команде пользователя.
- Долгоживущие решения дописывать сюда. Держать обзор кратким и актуальным.