Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу
Ограниченное время: Программа Design Partner — тариф BUSINESS навсегда

Архитектура

Как работает Rediacc: архитектура из двух инструментов, обнаружение адаптера, модель безопасности и структура конфигурации.

Архитектура

На этой странице описывается внутреннее устройство 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 '...'. Это означает:

  1. Вашему SSH-пользователю нужны привилегии sudo
  2. Все данные репозитория принадлежат rediacc, а не вашему SSH-пользователю
  3. Функции Rediaccfile (up(), down()) выполняются от имени rediacc

Такое разделение обеспечивает единообразное владение данными репозитория независимо от того, какой SSH-пользователь управляет им.

Изоляция Docker

Каждый репозиторий получает собственный изолированный Docker-демон. При монтировании репозитория renet запускает выделенный процесс dockerd с уникальным сокетом:

Изоляция Docker

/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). Каждый репозиторий:

  1. Имеет случайно сгенерированную парольную фразу шифрования (“учетные данные”)
  2. Хранится как файл: {datastore}/repos/{guid}.img
  3. Монтируется через 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>.knownHostsSSH-ключи хоста из ssh-keyscan
repositories.<name>.repositoryGuidUUID, идентифицирующий зашифрованный образ диска
repositories.<name>.credentialПарольная фраза шифрования LUKS (не хранится на сервере)
repositories.<name>.networkIdОпределяет IP-подсеть (2816 + n*64), назначается автоматически
nextNetworkIdГлобальный счётчик для назначения идентификаторов сети
universalUserПереопределение системного пользователя по умолчанию (rediacc)

Этот файл содержит конфиденциальные данные (пути к SSH-ключам, учетные данные LUKS). Он хранится с правами 0600 (чтение/запись только для владельца). Не делитесь им и не добавляйте в систему контроля версий.