Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу

Архитектура

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

Архитектура

Если вы не уверены, какой инструмент использовать, см. rdc vs renet.

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

Архитектура из двух инструментов

Rediacc использует два бинарных файла, работающих совместно через SSH:

Архитектура из двух инструментов

  • rdc работает на вашей рабочей станции (macOS, Linux или Windows). Он считывает локальную конфигурацию, подключается к удаленным машинам по SSH и вызывает команды renet.
  • renet работает на удаленном сервере с привилегиями root. Он управляет LUKS-зашифрованными образами дисков, изолированными Docker-демонами, оркестрацией сервисов и конфигурацией обратного прокси.

Каждая команда, которую вы вводите локально, транслируется в SSH-вызов, выполняющий renet на удаленной машине. Вам никогда не нужно подключаться к серверам по SSH вручную.

Режимы работы

Rediacc поддерживает три режима, каждый из которых определяет, где хранится состояние и как выполняются команды.

Режимы работы

Локальный режим

Режим по умолчанию для самостоятельного размещения. Всё состояние хранится в ~/.rediacc/config.json на вашей рабочей станции.

  • Прямые SSH-подключения к машинам
  • Не требуются внешние сервисы
  • Один пользователь, одна рабочая станция
  • Контекст создается с помощью rdc context create-local

Облачный режим (экспериментальный)

Использует API Rediacc для управления состоянием и командной работы.

  • Состояние хранится в облачном API
  • Многопользовательские команды с ролевым доступом
  • Веб-консоль для визуального управления
  • Контекст создается с помощью rdc context create

Примечание: Команды облачного режима являются экспериментальными. Включите их с помощью rdc --experimental <command> или установив переменную REDIACC_EXPERIMENTAL=1.

Режим S3

Хранит зашифрованное состояние в S3-совместимом бакете. Сочетает самостоятельное размещение локального режима с переносимостью между рабочими станциями.

  • Состояние хранится в бакете S3/R2 как state.json
  • Шифрование AES-256-GCM с мастер-паролем
  • Переносимость: любая рабочая станция с учетными данными бакета может управлять инфраструктурой
  • Контекст создается с помощью rdc context create-s3

Все три режима используют одни и те же команды CLI. Режим влияет только на то, где хранится состояние и как работает аутентификация.

Пользователь rediacc

При выполнении rdc context setup-machine 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 (prep(), 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, указывающую на правильный сокет.

Шифрование LUKS

Репозитории представляют собой LUKS-зашифрованные образы дисков, хранящиеся в хранилище данных сервера (по умолчанию: /mnt/rediacc). Каждый репозиторий:

  1. Имеет случайно сгенерированную парольную фразу шифрования (“учетные данные”)
  2. Хранится как файл: {datastore}/repos/{guid}.img
  3. Монтируется через cryptsetup при доступе

Учетные данные хранятся в вашем локальном config.json, но никогда на сервере. Без учетных данных данные репозитория не могут быть прочитаны. При включении автозапуска на сервере хранится вторичный LUKS-ключевой файл для автоматического монтирования при загрузке.

Структура конфигурации

Вся конфигурация хранится в ~/.rediacc/config.json. Вот аннотированный пример:

{
  "contexts": {
    "production": {
      "name": "production",
      "mode": "local",
      "apiUrl": "local://",
      "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"
}

Ключевые поля:

ПолеОписание
mode"local", "s3" или не указано для облачного режима
apiUrl"local://" для локального режима, URL API для облачного режима
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 (чтение/запись только для владельца). Не делитесь им и не добавляйте в систему контроля версий.