Архитектура
На этой странице описывается внутреннее устройство Rediacc: архитектура из двух инструментов, обнаружение адаптера, модель безопасности и структура конфигурации.
Обзор полного стека
Трафик поступает из интернета через обратный прокси в изолированные Docker-демоны, каждый из которых опирается на зашифрованное хранилище:
Каждый репозиторий получает собственный Docker-демон, loopback IP-подсеть (/26 = 64 IP-адреса) и LUKS-зашифрованный BTRFS-том. Сервер маршрутов обнаруживает запущенные контейнеры на всех демонах и передаёт конфигурацию маршрутизации в Traefik.
Архитектура из двух инструментов
Rediacc использует два бинарных файла, работающих совместно через SSH:
- rdc работает на вашей рабочей станции (macOS, Linux или Windows). Он считывает локальную конфигурацию, подключается к удаленным машинам по SSH и вызывает команды renet.
- renet работает на удаленном сервере с привилегиями root. Он управляет LUKS-зашифрованными образами дисков, изолированными Docker-демонами, оркестрацией сервисов и конфигурацией обратного прокси.
Каждая команда, которую вы вводите локально, транслируется в SSH-вызов, выполняющий renet на удаленной машине. Вам никогда не нужно подключаться к серверам по SSH вручную.
Советы для операторов см. в разделе rdc vs renet. Также вы можете использовать rdc ops для запуска локального кластера VM для тестирования, см. Экспериментальные VM.
Конфигурация
Всё состояние CLI хранится в плоских JSON-файлах конфигурации в ~/.config/rediacc/.
Локальный адаптер (по умолчанию)
Режим по умолчанию для самостоятельного размещения. Всё состояние хранится в файле конфигурации на вашей рабочей станции (например, ~/.config/rediacc/rediacc.json).
- Прямые SSH-подключения к машинам
- Не требуются внешние сервисы
- Один пользователь, одна рабочая станция
- Конфигурация по умолчанию создаётся автоматически при первом использовании CLI. Именованные конфигурации создаются с помощью
rdc config init --name <name>
Облачный адаптер (экспериментальный)
Активируется автоматически, когда конфигурация содержит поля apiUrl и token. Использует API Rediacc для управления состоянием и командной работы.
- Состояние хранится в облачном API
- Многопользовательские команды с ролевым доступом
- Веб-консоль для визуального управления
- Настраивается с помощью
rdc auth login
Примечание: Команды облачного адаптера являются экспериментальными. Включите их, установив переменную
REDIACC_EXPERIMENTAL=1.
Оба адаптера используют одни и те же команды CLI. Адаптер влияет только на то, где хранится состояние и как работает аутентификация.
Пользователь rediacc
При выполнении rdc config machine setup renet создает системного пользователя rediacc на удаленном сервере:
- UID: 7111
- Оболочка:
/sbin/nologin(не может входить через SSH) - Назначение: Владеет файлами репозиториев и выполняет функции Rediaccfile
Пользователь rediacc не может быть доступен через SSH напрямую. Вместо этого rdc подключается как SSH-пользователь, которого вы настроили (например, deploy), а renet выполняет операции с репозиториями через sudo -u rediacc /bin/sh -c '...'. Это означает:
- Вашему SSH-пользователю нужны привилегии
sudo - Все данные репозитория принадлежат
rediacc, а не вашему SSH-пользователю - Функции Rediaccfile (
up(),down()) выполняются от имениrediacc
Такое разделение обеспечивает единообразное владение данными репозитория независимо от того, какой SSH-пользователь управляет им.
Изоляция Docker
Каждый репозиторий получает собственный изолированный Docker-демон. При монтировании репозитория renet запускает выделенный процесс dockerd с уникальным сокетом:
/var/run/rediacc/docker-{networkId}.sock
Например, репозиторий с идентификатором сети 2816 использует:
/var/run/rediacc/docker-2816.sock
Это означает:
- Контейнеры из разных репозиториев не могут видеть друг друга
- Каждый репозиторий имеет собственный кеш образов, сети и тома
- Docker-демон хоста (если есть) полностью отделен
Функции Rediaccfile автоматически получают переменную DOCKER_HOST, указывающую на правильный сокет.
Когда AI-агент входит в репозиторий через rdc term connect -r <repo>, действует та же изоляция: сессия выполняется от имени непривилегированного пользователя rediacc (UID 7111), в отдельном пространстве имён монтирования, с DOCKER_HOST, ограниченным сокетом демона этого единственного репозитория. Подход «сначала форк» сочетает эту изоляцию во время выполнения с примитивом CoW-клонирования: агент работает с форком на каждую задачу, никогда не с grand-репозиториями (продакшн). См. Безопасность и ограничения AI-агентов для полной модели песочницы, семантики переопределений и границы ответственности разработчика для учётных данных внешних сервисов.
Структура путей демона
Данные и конфигурация Docker хранятся внутри точки монтирования репозитория, обеспечивая полную изоляцию каждого демона от хоста и других репозиториев.
Структура для каждого репозитория:
{datastore}/mounts/{guid}/.rediacc/docker/data/ # Корень данных Docker
{datastore}/mounts/{guid}/.rediacc/docker/config/ # Конфигурация Docker
Автономная структура (демоны без привязки к точке монтирования репозитория):
{datastore}/standalone/{N}/.rediacc/docker/data/
{datastore}/standalone/{N}/.rediacc/docker/config/
Общий путь среды выполнения (без изменений):
/run/rediacc/docker-{N}.sock
Эта унифицированная структура устраняет коллизии монтирования в режимах только для чтения и чтения-записи, которые возникали, когда пути демона были разделены между файловой системой хоста и зашифрованным томом. Как демоны репозиториев, так и автономные демоны следуют одинаковой структуре каталогов, поэтому инструменты и диагностика работают одинаково в обоих случаях.
Шифрование LUKS
Репозитории представляют собой LUKS-зашифрованные образы дисков, хранящиеся в хранилище данных сервера (по умолчанию: /mnt/rediacc). Каждый репозиторий:
- Имеет случайно сгенерированную парольную фразу шифрования (“учетные данные”)
- Хранится как файл:
{datastore}/repos/{guid}.img - Монтируется через
cryptsetupпри доступе
Учетные данные хранятся в вашем файле конфигурации, но никогда на сервере. Без учетных данных данные репозитория не могут быть прочитаны. При включении автозапуска на сервере хранится вторичный LUKS-ключевой файл для автоматического монтирования при загрузке.
Структура конфигурации
Каждая конфигурация является плоским JSON-файлом, хранящимся в ~/.config/rediacc/. Конфигурация по умолчанию: rediacc.json; именованные конфигурации используют имя в качестве имени файла (например, production.json). Вот аннотированный пример:
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"version": 1,
"ssh": {
"privateKeyPath": "/home/you/.ssh/id_ed25519"
},
"machines": {
"prod-1": {
"ip": "203.0.113.50",
"user": "deploy",
"port": 22,
"datastore": "/mnt/rediacc",
"knownHosts": "203.0.113.50 ssh-ed25519 AAAA..."
}
},
"storages": {
"backblaze": {
"provider": "b2",
"vaultContent": { "...": "..." }
}
},
"repositories": {
"webapp": {
"repositoryGuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"credential": "base64-encoded-random-passphrase",
"networkId": 2816
}
},
"nextNetworkId": 2880,
"universalUser": "rediacc"
}
Ключевые поля:
| Поле | Описание |
|---|---|
id | Уникальный идентификатор этого файла конфигурации |
version | Версия схемы файла конфигурации |
ssh.privateKeyPath | Приватный SSH-ключ, используемый для всех подключений к машинам |
machines.<name>.user | Имя пользователя SSH для подключения к машине |
machines.<name>.knownHosts | SSH-ключи хоста из ssh-keyscan |
repositories.<name>.repositoryGuid | UUID, идентифицирующий зашифрованный образ диска |
repositories.<name>.credential | Парольная фраза шифрования LUKS (не хранится на сервере) |
repositories.<name>.networkId | Определяет IP-подсеть (2816 + n*64), назначается автоматически |
nextNetworkId | Глобальный счётчик для назначения идентификаторов сети |
universalUser | Переопределение системного пользователя по умолчанию (rediacc) |
Этот файл содержит конфиденциальные данные (пути к SSH-ключам, учетные данные LUKS). Он хранится с правами
0600(чтение/запись только для владельца). Не делитесь им и не добавляйте в систему контроля версий.