# Лимиты и квоты

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

---

## Сервисы на репозиторий

Каждый репозиторий поддерживает до **61 сервиса**, работающего одновременно.

Это жёсткий лимит, определяемый адресным пространством сети, выделенным каждому репозиторию. Каждый сервис получает собственный выделенный частный IP-адрес, а адресный блок каждого репозитория вмещает ровно 61 слот для сервисов.

Если вы приближаетесь к этому лимиту, объедините мелкие сервисы (например, перенесите вспомогательные контейнеры или агенты мониторинга в отдельный репозиторий с собственными границами изоляции) или проведите рефакторинг для уменьшения числа независимо работающих процессов в рамках одного приложения.

---

## Репозитории на машину

Жёсткого ограничения со стороны Rediacc нет. Практический лимит зависит от ресурсов вашей машины:

| Ресурс | Влияние |
|--------|---------|
| Дисковое пространство | Каждый репозиторий представляет собой зашифрованный образ диска. Машина с 1 ТБ доступного хранилища может содержать множество репозиториев, но суммарный размер всех образов должен помещаться в пул хранилища данных. |
| Оперативная память | Каждый работающий репозиторий запускает собственный Docker daemon и контейнеры. Потребление памяти зависит от ваших рабочих нагрузок. |
| Процессор | Параллельные операции с репозиториями (запуск, резервное копирование, форк) создают временную нагрузку на процессор. |

**Типичные развёртывания** запускают от 10 до 50 репозиториев на машину без проблем. Машины с 32 ГБ и более оперативной памяти и 500 ГБ и более хранилища регулярно обслуживают 100+ репозиториев.

### Общесистемный лимит сетевых идентификаторов

Каждому репозиторию назначается уникальный **сетевой идентификатор** (число, используемое для расчёта диапазона частных IP-адресов). Этот пул общий для всех машин и репозиториев, управляемых одной конфигурацией Rediacc.

| Лимит | Значение |
|-------|----------|
| Всего доступных сетевых идентификаторов | ~261 944 |
| Область действия | На конфигурацию (общая для всех машин в конфигурации) |

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

---

## Форки

Ограничения на количество активных форков репозитория нет. Каждый форк является полной копией с механизмом копирования при записи, собственным зашифрованным хранилищем, сетевыми адресами и Docker daemon. Форки потребляют дисковое пространство пропорционально данным, записанным в них после создания (а не полному размеру родительского репозитория).

---

## Внешние порты

### Постоянно активные порты

Порты открываются только после настройки публичного IP-адреса командой `rdc config infra set --public-ipv4`. До этого момента на машине нет открытых портов. После настройки:

| Порт | Протокол | Назначение |
|------|----------|------------|
| 80 | TCP | HTTP: обрабатывается Traefik; возвращает 404 для ненастроенных доменов, не передаётся ни одному сервису |
| 443 | TCP | HTTPS: аналогично; запросы без совпадающего маршрута отклоняются на уровне прокси |
| 10000–10010 | TCP | Динамический диапазон для управляемой Rediacc TCP-переадресации |

HTTP/HTTPS отличаются от необработанных TCP-портов: хотя порты 80 и 443 открыты, каждый запрос проверяется обратным прокси по явной таблице маршрутизации. Без настроенного сервиса и соответствующего домена код приложения недоступен и данные не раскрываются.

### Опциональная TCP/UDP-переадресация

Все остальные порты (базы данных, кеши, брокеры сообщений, DNS, почта) **закрыты по умолчанию** и должны быть явно открыты. Это сводит к минимуму поверхность атаки машины.

Чтобы открыть порт конкретного сервиса:

```yaml
labels:
  - "rediacc.tcp_ports=5432"   # expose PostgreSQL from this container
  - "rediacc.udp_ports=53"     # expose DNS from this container
```

Чтобы открыть порт на уровне машины (доступный всем сервисам):

```bash
rdc config infra set -m server-1 --tcp-ports 25,587,993   # mail server
rdc config infra push -m server-1
```

> Никогда не открывайте порты баз данных или кешей наружу без конкретной необходимости. Используйте автоматические HTTPS-маршруты для веб-сервисов и оставляйте сервисы хранения внутренними.

---

## Хранилище данных

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

- **Минимальный рекомендуемый размер**: 50 ГБ
- **Максимальный размер**: ограничен вашим диском. Один пул может занимать весь диск.
- **Изменение размера**: используйте `rdc datastore resize` для расширения существующего пула. Уменьшение не поддерживается.
- **Файловая система**: Rediacc использует BTRFS для снимков с копированием при записи и эффективного форкинга. Требуется машина с ядром **Linux 6.1 или новее** для полной стабильности в продуктивной среде.

У каждого образа репозитория есть фиксированный максимальный размер, задаваемый при создании (по умолчанию: 10 ГБ). Используйте `rdc repo resize` для расширения отдельного репозитория. Сумма максимальных размеров всех репозиториев не может превышать размер пула хранилища данных.

---

## HTTP-маршруты

Каждый сервис с меткой `rediacc.service_port` автоматически получает один HTTPS-маршрут. Ограничения на количество сервисов с маршрутами нет (с учётом максимума в 61 сервис на репозиторий).

Wildcard-сертификаты TLS выпускаются для каждого репозитория при первом развёртывании через Let's Encrypt (вызов Cloudflare DNS-01). Let's Encrypt устанавливает лимит в **50 сертификатов на зарегистрированный домен в неделю**. Поскольку Rediacc использует один wildcard-сертификат на репозиторий (а не на сервис), развёртывание с более чем 50 новыми репозиториями за одну неделю может достичь этого лимита.

Форки используют существующий wildcard-сертификат родительского репозитория и не расходуют квоту сертификатов.

---

## Контрольная точка / восстановление (CRIU)

Живая миграция через CRIU имеет следующие ограничения:

- **Опционально**: контрольные точки создаются только для контейнеров с меткой `rediacc.checkpoint=true`. Базы данных и сервисы без состояния исключаются по умолчанию и запускаются заново при восстановлении.
- **Требование к ядру**: Linux 6.1 или новее на исходной и целевой машине.
- **Сетевой режим**: CRIU требует режим хостовой сети. Контейнеры с пользовательскими сетевыми конфигурациями не могут быть сохранены в контрольную точку.
- **Память**: размер данных контрольной точки равен резидентной памяти сохраняемого процесса. Большие наборы данных в памяти (например, приложение Node.js, кеширующее 4 ГБ данных) создают файлы контрольных точек размером 4 ГБ.
- **TCP-соединения**: Приложения должны быть готовы к потере соединений при восстановлении. Активные TCP-соединения **не** сохраняются, восстановленный процесс видит сокеты как закрытые и должен переподключиться. Это применимо как к восстановлению на той же машине, так и к межмашинному восстановлению.
- **Живой форк на той же машине не поддерживается**: `rdc repo fork --parent X --tag Y --checkpoint` успешно захватывает контрольную точку, но последующий `rdc repo up` на той же машине терпит неудачу с `criu failed: type RESTORE errno 0`, пока родитель ещё работает. Это вызвано upstream-багами CRIU [checkpoint-restore/criu#478](https://github.com/checkpoint-restore/criu/issues/478) и [checkpoint-restore/criu#514](https://github.com/checkpoint-restore/criu/issues/514), которые взаимодействуют с `network_mode: host`. Для сохранения состояния процесса на месте на той же машине используйте `rdc repo down --checkpoint` + `rdc repo up`. Для живой миграции используйте `rdc repo push --checkpoint` на другую машину.

---

## Резервное копирование

| Лимит | Значение |
|-------|----------|
| Назначений резервного копирования на репозиторий | Без ограничений |
| Одновременных задач резервного копирования | 1 на репозиторий (задачи ставятся в очередь при одновременном запуске) |
| Частота резервного копирования | Минимальный интервал не установлен; ограничено пропускной способностью вашего хранилища. Используйте `rdc config backup-strategy set --name <name> --bwlimit "6M"` для ограничения скорости загрузки |
| Хранение | Контролируется вашим провайдером хранилища (S3, Cloudflare R2 и др.). Rediacc не устанавливает политики хранения. |
| Резервное копирование между машинами | Поддерживается; на целевой машине должно быть достаточно места в хранилище данных |

---

## CLI и API

| Лимит | Значение |
|-------|----------|
| Одновременных команд `rdc` к одной машине | Без ограничений (каждая команда открывает собственное SSH-соединение) |
| Параллелизм запуска репозиториев по умолчанию | 3 (настраивается через `--concurrency`) |
| Тайм-аут SSH-соединения | 30 секунд для первоначального подключения |
| Длительность сессии `rdc` | Без тайм-аута; длительные операции поддерживают соединение активным |

---

## Поддерживаемые версии ОС

Удалённые машины должны работать на одной из следующих ОС для соответствия требованиям Rediacc к ядру, файловой системе и сетевой изоляции. Этот список является авторитетным CI-протестированным набором (матрица Bridge Workers) и должен оставаться синхронизированным с [Требованиями](/en/docs/requirements):

| ОС | Минимальная версия | Ядро по умолчанию | Примечания |
|----|-------------------|-------------------|------------|
| Ubuntu | 24.04 LTS *(рекомендуется)* | 6.8 | AppArmor по умолчанию. |
| Debian | 13 (Trixie); 12 Bookworm также работает | 6.12 (6.1 на Debian 12) | |
| Fedora | 43 | 6.12 | SELinux enforcing по умолчанию. |
| openSUSE Leap | 16.0 | 6.4+ | AppArmor по умолчанию. |
| Oracle Linux | 10 (UEK) | UEK 7+ | UEK сохраняет btrfs; SELinux enforcing по умолчанию. |

**Минимально требуемое ядро: 6.1.** Машины с более старыми ядрами отклоняются при настройке с понятным сообщением об ошибке.

> **Почему ядро 6.1?** Rediacc использует BTRFS для зашифрованного хранения репозиториев и форкинга с копированием при записи. Linux 6.1 представил критические улучшения BTRFS, которые значительно сокращают время монтирования для больших хранилищ данных, улучшают производительность удаления снимков и исправляют проблемы целостности данных, присутствовавшие в более ранних ядрах. Ядро 6.1 также необходимо для хуков сетевой изоляции на уровне ядра, которые обеспечивают изоляцию между репозиториями, прозрачно переписывая вызовы `bind()` и блокируя соединения между репозиториями.

> **Почему не Rocky Linux 10 / стандартное ядро RHEL 10?** Стандартное ядро RHEL 10 поставляется без модуля `btrfs` (`modprobe btrfs` завершается ошибкой "Module btrfs not found"). Зашифрованный бэкенд хранилища Rediacc не может работать без btrfs. **Oracle Linux 10 является единственной RHEL-совместимой целью в списке поддерживаемых систем**, поскольку по умолчанию использует Unbreakable Enterprise Kernel (UEK), который сохраняет btrfs. Полное объяснение см. в [Требованиях: Почему UEK?](/en/docs/requirements).

### Матрица функций ядра

Операторы могут использовать эту матрицу для быстрого просмотра того, что каждая CI-протестированная ОС предоставляет из коробки. Все пять удовлетворяют каждому требованию; матрица является операторской справочной информацией, а не критерием отбора.

| ОС | Модуль btrfs | cgroups v2 | Landlock (ABI 1 и выше) | Хуки eBPF cgroup |
|----|--------------|------------|-------------------------|-----------------|
| Ubuntu 24.04 | встроенный | unified hierarchy | да (5.13+) | да |
| Debian 13 | встроенный | unified hierarchy | да | да |
| Fedora 43 | встроенный | unified hierarchy | да | да |
| openSUSE Leap 16.0 | встроенный | unified hierarchy | да | да |
| Oracle Linux 10 (UEK) | встроенный (через UEK) | unified hierarchy | да | да |