Архитектура
Если вы не уверены, какой инструмент использовать, см. 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 '...'. Это означает:
- Вашему SSH-пользователю нужны привилегии
sudo - Все данные репозитория принадлежат
rediacc, а не вашему SSH-пользователю - Функции Rediaccfile (
prep(),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, указывающую на правильный сокет.
Шифрование LUKS
Репозитории представляют собой LUKS-зашифрованные образы дисков, хранящиеся в хранилище данных сервера (по умолчанию: /mnt/rediacc). Каждый репозиторий:
- Имеет случайно сгенерированную парольную фразу шифрования (“учетные данные”)
- Хранится как файл:
{datastore}/repos/{guid}.img - Монтируется через
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>.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(чтение/запись только для владельца). Не делитесь им и не добавляйте в систему контроля версий.