- Shell 93.6%
- Go Template 6.4%
| .forgejo/workflows | ||
| docs | ||
| images | ||
| README.md | ||
| актуальная схема.md | ||
| старая схема.md | ||
lxc-build
Сборка образов для системных LXC-контейнеров Incus: базовый образ Leap 16 (артефакт CI, раздаётся складом) — и архивная ролевая часть, которая больше не развивается.
Статус (2026-10-13): схема изменилась и уже работает. Актуальная схема — базовый образ как артефакт CI
(раздаётся складом skld00) + init-файлы в git с провижинингом через cloud-init: новый сервис = один файл,
отдельные образы под сервисы не собираются — актуальная схема.md. Ролевая часть этого репозитория
(роль-образы victoriametrics, victorialogs, пайплайн build-roles.yml) в архиве: как она работала, что
давала и чего стоила — старая схема.md.
Первые два сервиса живут по новой схеме: инстансы victorialogs1 (VictoriaLogs) и victoriametrics1 (VictoriaMetrics) на skld00
подняты декларациями из homelab-deploy/servers/skld00/services/ через хостовый контур reconcile.sh.
Что остаётся живым: базовый образ leap16-base и его пайплайн, склад skld00
(https://172.20.50.1:8443, паспорт homelab-deploy/servers/skld00/), зеркала leap16-oss/leap16-non-oss
в Хражевнике и личный rpm-md с -loc-пакетами.
Схема пайплайнов — как у остальных сборок (bin-build, container-build, pacman-pkg-build):
ручной workflow_dispatch, job-контейнер из Nora, пакеты — из Хражевника, доверие к step-ca.
Запуск (2 кнопки)
Forgejo → Build/lxc-build → Actions → Build Role Images → Run workflow:
- role — выпадающий список:
all(по умолчанию, все роли матрицей) или конкретная роль (см. таблицу ниже); - force_rebuild — оставить false: скип-гейт сам решит, что уже собрано.
Базовый образ — там же, Build LXC Base Image (Leap 16), вход только force_rebuild.
Повторный запуск с той же меткой — зелёный скип (как «уже собрано» в container-build).
Два пайплайна
| Build LXC Base Image | Build Role Images | |
|---|---|---|
| Что собирает | leap16-base из пакетов Хражевника (zypper --root → rpm) |
роль-образы: готовая база со склада + готовые -loc-пакеты одной rpm-транзакцией |
| Метка | git_sha + sha256 repomd leap16-oss/leap16-non-oss |
на роль: git_sha + fingerprint базы + sha256 repomd личного rpm-md |
| Скип-гейт | по тройке свойств образа | по четвёрке (+ role) |
| Публикация | алиас leap16-base, откат leap16-base-prev, две версии |
алиас = имя роли, откат <role>-prev, две версии |
| Приёмка | структурная: метаданные, члены тарболла, генерация | структурная + launch на складе: инстанс acc-<роль>-<прогон> поднимается, systemd, пробы роли из checks.txt, инстанс удаляется |
| Новая сущность | — | каталог images/roles/<имя>/ (включая checks.txt) + строка в options: дропдауна |
Импорт всегда без --reuse (reuse-семантика deleteImagesByAliases удаляет прежний образ
при совпадении набора алиасов — несовместимо с держанием отката); перенавеску алиаса делает сам
import, ротацию ведёт CI.
Роли
| Роль | Пакет | Что даёт | Алиас на складе |
|---|---|---|---|
victoriametrics |
victoriametrics-loc |
single-node TSDB, порт 8428 | victoriametrics |
victorialogs |
victorialogs-loc |
single-node log DB, порт 9428 | victorialogs |
| далее: следующий близнец |
Новая роль = 5 файлов + 1 строка (пайплайны не плодятся): каталог images/roles/<имя>/
с packages.txt, units.txt, repos/*.repo, meta/ (metadata.yaml + templates) и checks.txt
(пробы для приёмки launch-ом, по строке на проверку), плюс строка
в options: дропдауна build-roles.yml. Механика общая: images/roles/build-role.sh
(ROLE=<имя>), юниты включаются симлинками в multi-user.target.wants (в -loc-пакетах нет
systemd-preset — репорт владельцу пакетов; пока сборка кладёт симлинки сама).
Документация
актуальная схема.md— как система работает сейчас (база-артефакт + init-файлы, обновление, живость, GC);старая схема.md— архив: роль-образы в CI, что давали и чего стоили;docs/step-1-distro.md— выбор базы (Leap 16 / Slowroll), правило «по хосту», KMP, репозитории;docs/step-2-sborka-i-sklad.md— формат образа, склад артефактов на skld00;docs/podgotovka.md— чек-лист подготовки (исторический: открытые вопросы в нём закрыты);docs/role-images-vm-vl.md— решение по VM/VL (вариант B) + постскриптум реализации;images/leap16/README.md— рецепт и грабли базового образа;images/roles/victoriametrics/README.md— устройство первого роль-образа;images/roles/victorialogs/README.md— вторая роль (близнец VM) и её приёмка.
Общая схема системы и справочник проверенных фактов — в ../lxc-base/doc/
(design.md, facts.md), только чтение.
Зафиксированные решения
| Вопрос | Решение |
|---|---|
| База | Leap 16 (специальная, для Leap Micro-хостов); Slowroll — позже |
| Репозитории внутри контейнера | Хражевник: leap16-oss + leap16-non-oss (rpm-md, pull-through) + личный rpm-md для ролей; апстрима в пути нет |
| Сборщик | не distrobuilder для LXC: свой скрипт (zypper --root → rpm), т.к. distrobuilder требует chroot/mknod; distrobuilder остаётся для ВМ-образов |
| Роль-образ (вариант Б) | не пересборка с нуля: export готовой базы со склада → одна rpm-транзакция готовых пакетов → repack. Метка включает fingerprint базы — движение базы = автопересборка ролей |
| CI | job-контейнер nora.panelka.yadr01.internal/opensuse/leap:16.0 (root с полным subuid/subgid → верные gid) |
| MAC | в образ не берём: apparmor/selinux-policy не ставятся, MAC навешивает хост |
| Сеть в контейнере | udev + systemd-networkd + systemd-resolved в образе, профиль eth0.network как в официальном рецепте 16.0 |
| CA внутри образа | update-ca-certificates --root "$R" из окружения сборки + hashed-каталог для libzypp |
| Шаблоны метаданных | meta/templates/*.tpl → обязаны лежать в ./templates/ метатарболла, иначе launch падает |
| Публикация | склад skld00; доверие CI — постоянный клиентский сертификат (INCUS_CONF, секреты SKLD00_CLIENT_CRT/SKLD00_CLIENT_KEY), одноразовый токен не годится |
Состав
images/leap16/ базовый образ: packages.txt, repos/, meta/ (+templates/), files/, build.sh, README.md
images/roles/ build-role.sh (общий) + каталог роли на каждую роль
.forgejo/workflows/ build-leap16-base.yml — база; build-roles.yml — все роли (один, роль — дропдаун)
docs/ документация решений
План
| Шаг | Что | Статус |
|---|---|---|
| 1 | Репозиторий и точка входа пайплайна | сделано |
| 2 | Зеркало Leap 16 в Хражевнике (leap16-oss, leap16-non-oss) |
сделано, remote'ы живые |
| 3 | Рецепт базового образа images/leap16/ |
сделано |
| 4 | Публикация в Incus-склад | сделано 2026-10-11 |
| 5 | Приёмка launch-ом и починка базового образа | сделано 2026-10-11: три дефекта закрыты |
| 6 | Роль-образы: общий пайплайн + первая роль | сделано 2026-10-12: victoriametrics опубликована зелёным прогоном |
| 7 | Роль victorialogs (близнец VM) |
сделано 2026-10-12: заведена, принята launch-ом локально, опубликована зелёным прогоном |
| 8 | Приёмка launch-ом в CI (сейчас — ручная/структурная) и init-файлы в homelab-deploy | приёмка launch-ом в ролевом пайплайне — сделана; приёмка базового пайплайна расширена (cloud-init, seed-шаблоны, защитные элементы); init-файлы — в homelab-deploy/servers/skld00/services/ |
| 9 | Модернизация базы под init-файлы (cloud-init + seed-шаблоны, маркер загрузки, lxc-healthcheck, манифест/release, проверки) |
сделано 2026-10-13: опубликована (76,99 МиБ против 50,03 МиБ), приёмка launch-ом пройдена |
| 10 | GitOps-агент узла skld00 (webhook :9002 + sync-state.sh + reconcile.sh) |
сделано 2026-10-13: хук на push, системный юнит под root, выключатель /etc/lxc-automation.off |
| 11 | Первые сервисы из init-файлов: victorialogs1 (VictoriaLogs), victoriametrics1 (VictoriaMetrics) |
сделано 2026-10-13: обе строки create ok, пробы сервисов прошли |
| 12 | Путь recreate: снапшот датасета и инстанса → пересоздание → проба → откат | ждёт |
| 13 | Ночной контур обновления (zypper dup со снапшотом) и GC снапшотов (rollback_window/N=3) |
ждёт |