Rediacc может работать полностью на собственной инфраструктуре. Автономный Docker-образ включает сервер учётных записей, веб-портал, маркетинг-сайт и точку распределения CLI. Внешние зависимости от размещённых на Rediacc сервисов не требуются.
Docker образ
Загрузите автономный образ:
docker pull ghcr.io/rediacc/server:stable
Запустите со стандартными параметрами:
docker run -p 80:80 -p 443:443 ghcr.io/rediacc/server:stable
Образ предоставляет доступ к:
- Account API по адресу
/account/api/v1/ - Веб-портал по адресу
/account/ - Маркетинг-сайт по адресу
/ - Артефакты CLI по адресу
/releases/ - Бинарные файлы Renet по адресу
/bin/
Установка CLI с вашего сервера
Установите CLI непосредственно с вашего локального сервера. Скрипт установки автоматически определяет канал обновлений и направляет CLI на ваш сервер для получения обновлений.
curl -fsSL https://account.example.com/install.sh | \
REDIACC_SERVER_URL=https://account.example.com bash
Эта одиночная команда:
- Загружает бинарный файл CLI из конечной точки
/releases/вашего сервера - Запрашивает
/account/api/v1/.well-known/server-infoдля обнаружения канала обновлений - Записывает
server.jsonс URL вашего сервера, каналом обновлений и ключами шифрования - Настраивает
rdc updateдля проверки обновлений на вашем сервере
Переменная REDIACC_CHANNEL не требуется. Скрипт установки автоматически читает канал из конфигурации вашего сервера.
Конфигурация CLI с именованными конфигурациями
Если вы подключаетесь к нескольким серверам (локально, production, edge), именованные конфигурации держат каждое окружение изолированным:
# Создайте конфигурацию для вашего локального сервера
rdc config init --name myserver --server https://account.example.com
# Выполните вход, используя эту конфигурацию
rdc --config myserver subscription login
# Все команды с --config используют локальный сервер
rdc --config myserver machine query --name prod-1
Каждая именованная конфигурация хранит свой URL сервера учётных записей и токен подписки. Переключение конфигураций переключает весь контекст сервера.
Окружения без доступа в сеть
Для окружений без доступа в интернет установите как URL сервера, так и пользовательский URL релизов:
curl -fsSL https://account.example.com/install.sh | \
REDIACC_SERVER_URL=https://account.example.com \
REDIACC_RELEASES_URL=https://account.example.com/releases \
bash
CLI будет проверять account.example.com/releases/cli/stable/manifest.json на наличие обновлений вместо общедоступной CDN релизов.
Если сервер полностью в автономном режиме, установите CLI через npm из упакованного архива:
npm install -g https://account.example.com/npm/rediacc-cli-latest.tgz
Справочник переменных окружения
| Переменная | Используется | Назначение |
|---|---|---|
REDIACC_SERVER_URL | Скрипт установки | URL сервера учётных записей. Автоматически обнаруживает канал и ключи шифрования. |
REDIACC_RELEASES_URL | Скрипт установки, обновитель CLI | Пользовательская конечная точка релизов для бинарных файлов CLI. По умолчанию: https://releases.rediacc.com |
REDIACC_CHANNEL | Скрипт установки | Переопределить канал обновлений. Автоматически определяется с сервера, если не установлено. |
REDIACC_ACCOUNT_SERVER | Среда выполнения CLI | Переопределить URL сервера учётных записей для всех команд CLI. |
RDC_UPDATE_CHANNEL | Среда выполнения CLI | Переопределить канал обновлений для rdc update. |
Конфигурация сервера
Docker-образ локального сервера использует ту же переменную ENVIRONMENT, что и размещённый сервис. Установите её в переменных окружения Docker или конфигурации оркестрации:
ENVIRONMENT=production(по умолчанию): стандартные ограничения ресурсов; CLI, подключающиеся к этому серверу, по умолчанию используют канал обновлений stable. Имя значенияproductionэто устаревший идентификатор развёртывания. Оба режимаproductionиedgeимеют качество production.ENVIRONMENT=edge: 2X Community лимиты; CLI по умолчанию используют канал обновлений edge
См. Каналы релизов для подробностей о том, что предоставляет каждое окружение.
Что сервер сообщает CLI
Когда CLI подключается к вашему серверу, он запрашивает /.well-known/server-info для обнаружения:
- Открытый ключ E2E шифрования: для хранения конфигурации с нулевым знанием
- Минимальная версия CLI: блокирует подключение устаревших CLI
- Канал обновлений: сообщает CLI, какой канал релизов использовать для обновлений
- Окружение: какой профиль развёртывания использует сервер (standard-limits vs. edge-with-2X-limits)
Эта автоматическая конфигурация означает, что вам нужен только URL сервера. Всё остальное определяется автоматически.
Лицензирование для изолированных развёртываний
Изолированные и самостоятельно размещённые локальные серверы выдают лицензии локально, используя сертификат делегирования, подписанный главным ключом. Сертификат ограничивает локальный сервер лимитами его плана и создаёт цепь с очевидными следами изменений. См. Цепь лицензий и делегирование для криптографического дизайна (целостность цепи, обнаружение форков, доказательства аудита).
Этот раздел охватывает оперативную настройку: генерирование ключей, запрос сертификата, настройка автоматического обновления и процесс обновления в автономном режиме (изолированный от сети).
Одна подписка, одна локальная установка
Подписка может иметь максимум один активный сертификат делегирования одновременно. Каждая установка локального сервера применяет ежемесячные и машинные лимиты против собственного локального реестра выдачи, поэтому несколько активных сертификатов умножили бы эффективную квоту без возможного согласования.
Если вам нужны отдельные окружения (production, staging, DR, multi-region), купите одну подписку на установку. Применение единого активного сертификата кодифицирует этот договор: попытка создать второй активный сертификат возвращает 409 DELEGATION_CERT_ALREADY_ACTIVE с id существующего сертификата и инструкциями по обновлению (предпочтительно, сохраняет цепь) или отзыву и созданию (сбрасывает цепь).
1. Сгенерируйте пару ключей Ed25519 локального сервера
Локальный сервер использует отдельную пару ключей Ed25519 для подписи лицензий. Сертификат делегирования в вышестоящей системе авторизует этот конкретный открытый ключ.
# Сгенерируйте новую пару ключей
openssl genpkey -algorithm Ed25519 -out onprem-private.pem
openssl pkey -in onprem-private.pem -pubout -out onprem-public.pem
# Преобразуйте в base64 (формат, который ожидает локальный сервер в переменных окружения)
ON_PREMISE_PRIVATE_KEY=$(openssl pkey -in onprem-private.pem -outform DER | base64 -w 0)
ON_PREMISE_PUBLIC_KEY=$(openssl pkey -in onprem-private.pem -pubout -outform DER | base64 -w 0)
Сохраните приватный ключ вместе с другими секретами (например, в Docker secret или Kubernetes Secret). Он никогда не покидает локальный сервер.
2. Запросите сертификат делегирования из вышестоящей системы
Вы можете запросить сертификат из портала учётных записей вышестоящей системы тремя способами:
Вариант A: Самообслуживание клиента (рекомендуется). Войдите на портал вышестоящей системы как владелец организации или администратор и перейдите на /account/delegation-certs. Нажмите Create New, вставьте открытый ключ локального сервера (base64 SPKI), выберите срок действия (или примите значение по умолчанию для плана) и загрузите полученный файл .json.
Вариант B: Администратор (кросс-клиент). Поддержка Rediacc или администратор вышестоящей системы могут вызвать POST /admin/delegation-certs с теми же параметрами.
Вариант C: rdc CLI (планируется). Будущая команда CLI обернёт процесс портала.
Возвращённый .json выглядит так:
{
"payload": "eyJ2ZXJzaW9uIjoxLCJzdWJzY3JpcHRpb25JZCI6...",
"signature": "...",
"publicKeyId": "..."
}
Срок действия сертификата регулируется политикой валидности (значения по умолчанию и потолки для каждого плана, переопределение для каждой подписки, ограничено концом подписки + 3-дневный льготный период). Ответ также включает effectiveDays и reason, поэтому вы можете видеть, почему он выбрал это значение. См. Цепь лицензий - Политика валидности для полных правил.
3. Установите сертификат на локальный сервер
Сохраните загруженный .json в известный путь и укажите локальный сервер на него:
DELEGATION_CERT_PATH=/etc/rediacc/delegation-cert.json
Или, для эфемерных / Docker-secrets рабочих потоков, встройте сертификат в виде base64 в переменную окружения:
DELEGATION_CERT_BASE64=$(base64 -w 0 < delegation-cert.json)
4. Настройте проверку вышестоящей системы + автоматическое обновление (опционально, но рекомендуется)
Если ваш локальный сервер имеет исходящий HTTPS доступ к вышестоящей системе, установите автоматическое обновление, чтобы сертификат обновлялся перед истечением без ручного вмешательства:
# Требуется для /onprem/cert-upload для проверки загруженных сертификатов против главного ключа вышестоящей системы.
# Быстро падает при запуске, если UPSTREAM_API_KEY установлен без этого.
UPSTREAM_PUBLIC_KEY="<upstream master Ed25519 SPKI public key, base64>"
# Требуется для цикла автоматического обновления. Создайте через портал:
# Владелец организации/администратор → /account/delegation-certs → "Get auto-renew token"
# Это ЕДИНСТВЕННЫЙ способ получить api token с областью delegation:renew.
UPSTREAM_URL="https://www.rediacc.com"
UPSTREAM_API_KEY="rdt_..."
# Опциональная настройка (показаны значения по умолчанию).
AUTO_RENEW_INTERVAL_HOURS=24
RENEW_THRESHOLD_DAYS=14
Цикл автоматического обновления локального сервера запускается один раз при запуске, а затем в установленном интервале. Он использует адаптивный порог (min(env.RENEW_THRESHOLD_DAYS, ceil(certValidityDays / 3))), поэтому 15-дневный сертификат COMMUNITY обновляется за 5 дней до истечения вместо срабатывания обновления на день 1. 90-дневный сертификат BUSINESS обновляется за 14 дней до истечения (потолок, установленный в окружении).
Если обновление не удаётся, сертификат остаётся в использовании до естественного истечения. Ошибка откатывается на 1 час и записывается в ${DELEGATION_CERT_PATH}.status.json плюс открывается через GET /onprem/cert-status.
5. Обновление без выхода в сеть (нет исходящего HTTPS)
Если ваш локальный сервер не может связаться с вышестоящей системой, используйте ручной процесс передачи:
- Загрузите запрос обновления из портала администратора локального сервера. Как администратор локальной системы, обратитесь к
GET /onprem/renewal-request. Это возвращает манифест JSON, содержащий голову локальной цепи, делегированный открытый ключ и подпись Ed25519 с очевидным следом изменений из вашего приватного ключа локального сервера. - Передайте манифест вышестоящей системе через USB, зашифрованную электронную почту или любой внеполосный канал. Манифест небольшой (несколько КБ) и не содержит секретов.
- Обработайте манифест вышестоящей системе. Владелец организации/администратор открывает /account/delegation-certs → Upload renewal request → выбирает файл манифеста. Вышестоящая система проверяет подпись манифеста против
delegatedPublicKeyактивного сертификата (доказывает, что она пришла от держателя приватного ключа локального сервера), проверяет защиту от повторов (манифесты старше 7 дней отклоняются), затем выдаёт свежий сертификат. - Загрузите новый сертификат с портала вышестоящей системы в виде файла
.json. - Передайте сертификат обратно на локальный сервер.
- Загрузите на локальный сервер через портал администратора (
POST /onprem/cert-upload). Локальный сервер проверяет новый сертификат противUPSTREAM_PUBLIC_KEYи валидирует, чтоgenesisSequenceсертификата всё ещё связана с записью цепи в локальном реестре выдачи (продвижение последовательности во время передачи поддерживается - цепь расширяется естественно).
Этот весь цикл никогда не требует исходящего трафика сети с локального сервера.
Режимы отказа манифеста
| Код | Причина | Исправление |
|---|---|---|
NO_ACTIVE_CERT | Вышестоящая система не имеет активного сертификата для этой подписки | Выдайте новый сертификат через процесс создания вместо обновления |
DELEGATED_KEY_MISMATCH | Манифестный delegatedPublicKey отличается от активного сертификата | Манифест может быть повтором с другой установки локального сервера |
MANIFEST_SIGNATURE_INVALID | Подпись не проверяется против делегированного открытого ключа | Манифест был изменён при передаче, или вы сгенерировали его на другом локальном сервере |
MANIFEST_EXPIRED | Манифест старше 7 дней | Создайте свежий запрос обновления с локального сервера |
Режимы отказа загрузки сертификата
| Код | Причина | Исправление |
|---|---|---|
CHAIN_HEAD_BEHIND | genesisSequence нового сертификата впереди голова локальной цепи | Вышестоящая система находится на форкнутой цепи - расследуйте |
CHAIN_FORK_ON_UPLOAD | Хеш цепи в genesisSequence сертификата не совпадает с локальным реестром | Локальная цепь расходится с вышестоящей системой - расследуйте |
Signature verification failed | Сертификат не подписан настроенным UPSTREAM_PUBLIC_KEY | Проверьте, что UPSTREAM_PUBLIC_KEY совпадает с главным открытым ключом вышестоящей системы |
6. Состояние и мониторинг
Запросите состояние локального сертификата локального сервера в любое время:
curl https://onprem.example.com/account/api/v1/onprem/cert-status \
-H "Cookie: <admin session>"
Возвращает subscriptionId, planCode, validUntil, daysUntilExpiry загруженного сертификата, плюс блок autoRenew (enabled, lastSuccessAt, lastErrorAt, lastError). Подключите это в стек мониторинга, чтобы предупредить о устаревшем lastSuccessAt или ненулевом lastError.
Для резервного копирования и аудита администратор локального сервера может также загрузить текущий загруженный подписанный сертификат через GET /onprem/cert-current (требуется повышенная сессия).
Справочник переменных окружения сертификата делегирования
| Переменная | Требуется? | Назначение |
|---|---|---|
ON_PREMISE_MODE | Да | Установите на true для включения подмножества маршрутов локального сервера |
ON_PREMISE_PRIVATE_KEY | Да | Приватный ключ Base64 PKCS8 Ed25519 для делегированной подписи |
ON_PREMISE_PUBLIC_KEY | Да | Открытый ключ Base64 SPKI Ed25519 (должен совпадать с delegatedPublicKey сертификата) |
DELEGATION_CERT_PATH | Один из этих | Путь в файловой системе к подписанному сертификату JSON |
DELEGATION_CERT_BASE64 | Один из этих | Сертификат JSON в кодировке Base64 (альтернатива пути файла) |
UPSTREAM_PUBLIC_KEY | Требуется, если установлен UPSTREAM_API_KEY, или для работы /onprem/cert-upload | Base64 SPKI главного открытого ключа вышестоящей системы. Быстро падает при запуске, если отсутствует. |
UPSTREAM_URL | Для автоматического обновления | Базовый URL сервера учётных записей вышестоящей системы, например https://www.rediacc.com |
UPSTREAM_API_KEY | Для автоматического обновления | API-токен с областью delegation:renew. Создайте через портал - см. Шаг 4. |
AUTO_RENEW_INTERVAL_HOURS | Опционально | По умолчанию 24. Как часто проверять нужно ли обновление сертификата. |
RENEW_THRESHOLD_DAYS | Опционально | По умолчанию 14. Действует как потолок для адаптивного порога 1/3 валидности. |
Резюме модели угроз
Модель делегированного сертификата защищает от:
- Поддельные лицензии: локальный сервер может подписывать только в пределах своих лимитов плана; renet отклоняет всё выходящее за границы сертификата.
- Совместное использование сертификата между развёртываниями: расхождение цепи обнаруживается при обновлении (возвращает
CHAIN_FORK_DETECTED). - Обход квоты через мультиустановку: применяется вышестоящей системой через одиночный активный (один сертификат на подписку).
- Откат цепи: renet хранит самую высокую последовательность для каждой подписки и отклоняет любые данные с более низкой последовательностью.
- Скомпрометированные учётные данные вышестоящей системы: токен bootstrap
delegation:renewможет быть создан только через выделенную конечную точку портала и контролируется администратором. Токен предоставляет только обновление - он не может читать или изменять какой-либо другой ресурс. - Атаки повтора на манифесты: манифесты старше 7 дней отклоняются.
От чего это не защищает:
- Скомпрометированный приватный ключ локального сервера: утёкший приватный ключ позволяет злоумышленнику подписывать лицензии до
validUntilсертификата. Смягчение: ротируйте пару ключей (отозовите старый сертификат + создайте новый с новым ключом) и обращайтесь со всеми лицензиями, подписанными старым ключом, как с подозрительными. - Скомпрометированный главный ключ вышестоящей системы: это корень доверия. Процедуры ротации находятся вне области видимости здесь.