Всем привет, хотел бы поделиться своим проектом.
Selenite — минималистичная серверная ОС для запуска контейнеров в формате compose-стеков.
Во многом проект был вдохновлён Talos Linux, который предназначен исключительно для запуска Kubernetes. Selenite, в свою очередь, реализует похожие идеи, но предназначен для запуска контейнерных приложений, описанных в compose.yaml, средствами Podman Compose.
Идея проекта в том, чтобы максимально сократить необходимость администрирования ОС, повысить безопасность и оставить системе одну основную задачу — запуск контейнерных приложений.
Управление
Управления сервером происходит через ssh, но ssh через предоставляется ограниченный набор команд, доступ к которым регулируется через RBAC.
Например, стек можно развернуть, передав compose.yaml:
ssh server stack deploy myapp < compose.yaml
Основные особенности
Система достаточно минимальна
В ней находится только необходимое для выполнения своей задачи — запуска контейнеров.
Система обновляется атомарно одним цельным образом
Благодаря этому:
- обновление не может остановиться на середине и оставить систему в потенциально сломанном состоянии;
- состав компонентов фиксирован, поэтому проще отслеживать уязвимости и понимать, какие версии пакетов входят в конкретный образ;
- можно удобно откатить обновление при необходимости.
Конфигурация системы декларативна
Конфигурация системы описывается одним YAML-файлом и применяется целиком.
Например, конфигурация может выглядеть так:
access:
users:
- name: alice
roles: [root]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice@example.com
- name: bob
roles: [viewer]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... bob@example.com
roles:
- name: viewer
rules:
- resources: ["stack"]
verbs: ["list"]
- resources: ["stack/*"]
verbs: ["get"]
- resources: ["machine/info"]
verbs: ["get"]
netbird:
enabled: true
setup_key: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
sysctl:
params:
net.ipv4.ip_unprivileged_port_start: 80
memory:
zram:
enabled: true
size: ram/4
compression: zstd
swap_priority: 100
В конфигурации описаны пользователи и их роли, параметры подключения к NetBird, sysctl-параметры и настройки zram.
Применить эту конфигурацию можно простой командой:
ssh server machine config apply < config.yml
Минимальная поверхность атаки
Вместо полноценного интерактивного shell используется ограниченный API через SSH. Доступ к операциям регулируется через RBAC, а контейнеры запускаются через rootless Podman (что в некоторых ситуациях имеет свои особенности).
Статус проекта
Проект пока находится в разработке. На данный момент есть только редакция cloud для запуска в виртуальных машинах — то есть Selenite можно запустить в Proxmox или на VPS/VDS-сервере. В будущем, возможно, появится версия для запуска на железе, но пока особой необходимости в этом не вижу.
В ближайшее время, скорее всего, получится закончить установщик и описать различные способы установки в документации.
Из планов на будущее:
- вынести некоторые функции (NetBird, Grafana Loki) в опциональные расширения, так как они явно нужны не всем;
- добавить больше опций в конфигурацию, поскольку текущих явно маловато.
Итого
Хотелось бы получить мнение сообщества и обратную связь. Насколько вообще интересна подобная ОС вместо классического Linux? Какого функционала, на ваш взгляд, не хватает?