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

Установка On-Premise

Запуск сервера аккаунтов и дистрибуции CLI на собственной инфраструктуре.

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 напрямую с вашего on-premise сервера. Скрипт установки автоматически определяет канал обновлений и настраивает CLI для проверки обновлений на вашем сервере.

curl -fsSL https://account.example.com/install.sh | \
  REDIACC_SERVER_URL=https://account.example.com bash

Эта единственная команда:

  1. Загружает бинарный файл CLI с эндпоинта /releases/ вашего сервера
  2. Запрашивает /account/api/v1/.well-known/server-info для определения канала обновлений
  3. Записывает server.json с URL вашего сервера, каналом обновлений и ключами шифрования
  4. Настраивает rdc update для проверки обновлений на вашем сервере

Переменная REDIACC_CHANNEL не нужна. Скрипт установки считывает канал из конфигурации вашего сервера автоматически.

Конфигурация CLI с именованными конфигами

Для пользователей, подключающихся к нескольким серверам (on-premise, production, edge), именованные конфиги изолируют каждое окружение:

# Create a config for your on-premise server
rdc config init --name myserver --server https://account.example.com

# Log in using that config
rdc --config myserver subscription login

# All commands with --config use the on-premise server
rdc --config myserver machine query --name prod-1

Каждый именованный конфиг хранит собственный URL сервера аккаунтов и токен подписки. Переключение конфига переключает весь контекст сервера.

Изолированные окружения (air-gapped)

Для окружений без доступа к интернету задайте как 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.

Конфигурация сервера

On-premise Docker-образ использует ту же переменную ENVIRONMENT, что и облачный сервис. Задайте её в конфигурации Docker или оркестратора:

  • ENVIRONMENT=production (по умолчанию): стандартные лимиты, клиентам рекомендуется stable-канал обновлений
  • ENVIRONMENT=edge: удвоенные лимиты Community, клиентам рекомендуется edge-канал обновлений

Подробности о том, что предоставляет каждое окружение, см. в Каналы релизов.

Что сервер сообщает CLI

При подключении CLI к вашему серверу он запрашивает /.well-known/server-info для определения:

  • Открытый ключ E2E-шифрования: для хранения конфигурации с нулевым разглашением
  • Минимальная версия CLI: блокирует устаревшие CLI от подключения
  • Канал обновлений: указывает CLI, какой канал релизов использовать для обновлений
  • Окружение: является ли это production или edge развёртыванием

Такая автоконфигурация означает, что пользователям нужен только URL сервера. Всё остальное определяется автоматически.

Лицензирование для изолированных развёртываний

Изолированные и самостоятельно размещённые on-premise серверы выдают лицензии локально с использованием сертификата делегирования, подписанного вышестоящим мастер-ключом. Сертификат ограничивает on-premise сервер лимитами его плана и создаёт защищённую от подделки цепочку. См. Цепочка лицензий и делегирование для изучения криптографической конструкции (целостность цепочки, обнаружение форков, доказательства аудита).

В этом разделе описывается операционная настройка: генерация ключей, запрос сертификата, настройка автообновления и офлайн-поток продления (air-gapped).

Одна подписка - одна on-premise установка

Подписка может иметь не более одного активного сертификата делегирования одновременно. Каждая on-premise установка соблюдает ежемесячные лимиты и лимиты по машинам согласно собственному локальному реестру выдачи, поэтому несколько активных сертификатов умножили бы эффективную квоту без возможности согласования.

Если вам нужны отдельные окружения (production, staging, DR, мультирегион), приобретите по одной подписке на каждую установку. Принудительное соблюдение единственного активного сертификата закрепляет этот договор: попытка создать второй активный сертификат возвращает 409 DELEGATION_CERT_ALREADY_ACTIVE с идентификатором существующего сертификата и инструкциями по продлению (рекомендуется - сохраняет цепочку) или отзыву-и-созданию (сбрасывает цепочку).

1. Генерация пары ключей Ed25519 для on-premise

On-premise сервер использует отдельную пару ключей Ed25519 для подписи лицензий. Сертификат делегирования вышестоящего сервера авторизует именно этот открытый ключ.

# Generate a fresh keypair
openssl genpkey -algorithm Ed25519 -out onprem-private.pem
openssl pkey -in onprem-private.pem -pubout -out onprem-public.pem

# Convert to base64 (the format the on-premise expects in env vars)
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). Он никогда не покидает on-premise сервер.

2. Запрос сертификата делегирования у вышестоящего сервера

Вы можете запросить сертификат у вышестоящего портала тремя способами:

Вариант A - самообслуживание Customer (рекомендуется). Войдите на вышестоящий портал как владелец или Admin организации и перейдите в /account/delegation-certs. Нажмите Create New, вставьте открытый ключ on-premise (base64 SPKI), выберите срок действия (или примите значение по умолчанию для плана) и скачайте получившийся файл .json.

Вариант B - Admin (межклиентский). Служба поддержки Rediacc или системный администратор вышестоящего сервера может использовать POST /admin/delegation-certs с теми же параметрами.

Вариант C - CLI rdc (планируется). Будущая команда CLI обернёт поток портала.

Возвращаемый .json выглядит так:

{
  "payload": "eyJ2ZXJzaW9uIjoxLCJzdWJzY3JpcHRpb25JZCI6...",
  "signature": "...",
  "publicKeyId": "..."
}

Срок действия сертификата определяется политикой валидности (значения по умолчанию и потолки для каждого плана, переопределение для каждой подписки, ограниченное датой окончания подписки + 3 дня льготного периода). Ответ также содержит effectiveDays и reason, чтобы вы могли видеть, почему было выбрано именно это значение. Полные правила см. в Цепочка лицензий - Политика валидности.

3. Установка сертификата на on-premise сервер

Сохраните загруженный .json по известному пути и укажите на него on-premise серверу:

DELEGATION_CERT_PATH=/etc/rediacc/delegation-cert.json

Или для рабочих процессов с эфемерными контейнерами или Docker secrets встройте сертификат в base64 в переменную окружения:

DELEGATION_CERT_BASE64=$(base64 -w 0 < delegation-cert.json)

4. Настройка проверки вышестоящего сервера + автообновление (необязательно, но рекомендуется)

Если ваш on-premise сервер имеет исходящий HTTPS-доступ к вышестоящему серверу, настройте автоматическое продление, чтобы сертификат обновлялся до истечения срока действия без ручного вмешательства:

# Required for /onprem/cert-upload to verify uploaded certs against the upstream master key.
# Fails-fast at boot if UPSTREAM_API_KEY is set without this.
UPSTREAM_PUBLIC_KEY="<upstream master Ed25519 SPKI public key, base64>"

# Required for the auto-renew loop. Mint via the portal:
#   Org owner/admin → /account/delegation-certs → "Get auto-renew token"
# This is the ONLY way to obtain a delegation:renew-scoped api token.
UPSTREAM_URL="https://www.rediacc.com"
UPSTREAM_API_KEY="rdt_..."

# Optional tuning (defaults shown).
AUTO_RENEW_INTERVAL_HOURS=24
RENEW_THRESHOLD_DAYS=14

Цикл автообновления on-premise запускается один раз при загрузке, а затем с заданным интервалом. Он использует адаптивный порог (min(env.RENEW_THRESHOLD_DAYS, ceil(certValidityDays / 3))), поэтому 15-дневный COMMUNITY сертификат продлевается при 5 оставшихся днях, а не сразу. 90-дневный BUSINESS сертификат продлевается при 14 оставшихся днях (применяется потолок из переменной окружения).

Если продление не удаётся, сертификат продолжает использоваться до естественного истечения срока. Ошибка регистрируется в ${DELEGATION_CERT_PATH}.status.json и доступна через GET /onprem/cert-status, с откатом на 1 час между попытками.

5. Продление в изолированном окружении (без исходящего HTTPS)

Если ваш on-premise сервер не может обратиться к вышестоящему, используйте поток ручной передачи:

  1. Загрузите запрос на продление с портала администратора on-premise. Будучи root системы on-premise, обратитесь к GET /onprem/renewal-request. Это возвращает JSON-манифест с текущей вершиной локальной цепочки, делегированным открытым ключом и защищённой от подделки подписью Ed25519 от вашего закрытого ключа on-premise.
  2. Передайте манифест на вышестоящий сервер через USB, зашифрованную почту или любой внеполосный канал. Манифест невелик (несколько КБ) и не содержит секретов.
  3. Обработайте манифест на вышестоящем сервере. Владелец/Admin организации открывает /account/delegation-certs -> Upload renewal request -> выбирает файл манифеста. Вышестоящий сервер проверяет подпись манифеста по delegatedPublicKey активного сертификата (доказывает, что он исходит от владельца закрытого ключа on-premise), проверяет защиту от воспроизведения (манифесты старше 7 дней отклоняются), затем выдаёт новый сертификат.
  4. Скачайте новый сертификат с портала вышестоящего сервера в виде файла .json.
  5. Передайте сертификат обратно на on-premise сервер.
  6. Загрузите на on-premise через локальный портал администратора (POST /onprem/cert-upload). On-premise сервер проверяет новый сертификат по UPSTREAM_PUBLIC_KEY и подтверждает, что genesisSequence сертификата по-прежнему связывается с записью в локальном реестре выдачи (продвижение цепочки в процессе транзита поддерживается - цепочка расширяется естественным образом).

Весь этот цикл не требует исходящего сетевого трафика с on-premise сервера.

Коды ошибок манифеста

КодПричинаРешение
NO_ACTIVE_CERTУ вышестоящего сервера нет активного сертификата для этой подпискиВыдайте новый сертификат через поток создания вместо продления
DELEGATED_KEY_MISMATCHdelegatedPublicKey манифеста отличается от активного сертификатаМанифест может быть воспроизведением с другой on-premise установки
MANIFEST_SIGNATURE_INVALIDПодпись не проходит проверку по делегированному открытому ключуМанифест был изменён при передаче, или вы сгенерировали его на другом on-premise сервере
MANIFEST_EXPIREDМанифест старше 7 днейСгенерируйте новый запрос на продление с on-premise сервера

Коды ошибок загрузки сертификата

КодПричинаРешение
CHAIN_HEAD_BEHINDgenesisSequence нового сертификата опережает вершину локальной цепочкиВышестоящий сервер находится на форкнутой цепочке - проведите расследование
CHAIN_FORK_ON_UPLOADХеш цепочки при genesisSequence сертификата не совпадает с локальным реестромЛокальная цепочка разошлась с вышестоящей - проведите расследование
Signature verification failedСертификат не подписан настроенным UPSTREAM_PUBLIC_KEYПроверьте, что UPSTREAM_PUBLIC_KEY совпадает с мастер-ключом вышестоящего сервера

6. Статус и мониторинг

Запросите состояние локального сертификата on-premise в любое время:

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.

Для резервного копирования и аудита администратор on-premise может также загрузить текущий подписанный сертификат через GET /onprem/cert-current (требует расширенной сессии).

Справочник переменных окружения сертификата делегирования

ПеременнаяОбязательна?Назначение
ON_PREMISE_MODEДаУстановите true для включения подмножества on-premise маршрутов
ON_PREMISE_PRIVATE_KEYДаЗакрытый ключ Ed25519 PKCS8 в base64 для делегированной подписи
ON_PREMISE_PUBLIC_KEYДаОткрытый ключ Ed25519 SPKI в base64 (должен совпадать с delegatedPublicKey сертификата)
DELEGATION_CERT_PATHОдно из двухПуть в файловой системе к подписанному JSON сертификата
DELEGATION_CERT_BASE64Одно из двухJSON сертификата в base64 (альтернатива пути к файлу)
UPSTREAM_PUBLIC_KEYОбязательна, если задан UPSTREAM_API_KEY, или для работы /onprem/cert-uploadОткрытый ключ SPKI вышестоящего мастер-ключа в base64. Быстрый сбой при запуске, если отсутствует.
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 от срока действия.

Краткое описание модели угроз

Модель сертификата делегирования защищает от:

  • Поддельных лицензий: on-premise может подписывать только в пределах лимитов плана; renet отклоняет всё, что выходит за рамки сертификата.
  • Общего использования сертификата на нескольких установках: расхождение цепочки обнаруживается при продлении (возвращает CHAIN_FORK_DETECTED).
  • Обхода квоты через несколько установок: обеспечивается на вышестоящем сервере принципом единственного активного сертификата (один сертификат на подписку).
  • Отката цепочки: renet хранит максимальный виденный номер последовательности для каждой подписки и отклоняет любой блоб с меньшим номером.
  • Скомпрометированных учётных данных вышестоящего сервера: токен delegation:renew при начальной настройке можно получить только через специальный эндпоинт портала с ограничением для Admin. Токен предоставляет только право продления - он не может читать или изменять другие ресурсы.
  • Атак воспроизведения на манифесты: манифесты старше 7 дней отклоняются.

От чего это не защищает:

  • Скомпрометированный закрытый ключ on-premise: утечка закрытого ключа позволяет злоумышленнику подписывать лицензии до validUntil сертификата. Меры по снижению риска: смените пару ключей (отзовите старый сертификат и создайте новый с новым ключом) и считайте все лицензии, подписанные старым ключом, подозрительными.
  • Скомпрометированный мастер-ключ вышестоящего сервера: это корень доверия. Процедуры ротации выходят за рамки данного документа.