[Начало](/ru/docs)[Установка](/ru/docs/installation)[Архитектура](/ru/docs/architecture)[Подключения](/ru/docs/integrations)[Первое ревью](/ru/docs/review)[Эксплуатация](/ru/docs/operations)[Приемка](/ru/docs/acceptance)

# Установка в своем контуре.

Поэтапный путь для инженера. Существующий GitLab остается на месте.

## Получите согласованный пакет

Запросите пакет и условия использования: исходный архив, wheel, образы нужной архитектуры, хеш-манифест, зависимости и список приемки. Проверьте происхождение и соответствие версии. Self-hosted описывает место установки, а не автоматически открытую лицензию. Цены и лицензионные условия согласуются отдельно.

[Запросить пакет](mailto:vasiliy.petrov@uwukl.com?subject=Null%20Review%3A%20self-hosted%20evaluation%20package)

## Подготовьте зависимости

- Linux x86_64 / amd64 для целевого корпоративного пилота; Python 3.12; Docker Compose 2.30.0 или новее. Профиль также допускает arm64, это отдельная цель проверки.

- Доверенная операторская среда с UID/GID 10001:10001 и локальным Docker socket. Socket доступен оператору, никогда Worker или коду из MR.

- Внешний PostgreSQL 18.6 с проверкой TLS verify-full. Отдельные БД и роли для служб, отдельный обычный владелец ContextForge.

- Уже загруженные и проверенные образы Null и ContextForge по неизменяемым ID. Установщик не скачивает и не собирает их.

- Корпоративный OIDC/Keycloak, сертификаты кабинета и ContextForge, DNS и сетевые разрешения. GitLab и runner готовятся отдельно.

- Приватные файлы 0600 и каталоги 0700, принадлежащие оператору. Без symlinks, секретов в Git и автоматического копирования чужого входа. Прямой запуск установки на macOS отклоняется; эмуляция на Mac не является замером native Linux.

## Как читать результат этапа

Команды ниже выполняются инженером из согласованного пакета, по одному этапу. Это шаблоны, не квитанция выполненной установки. Успешный этап не доказывает готовность модели, ContextForge или пилота.

| Этап | Что проверить перед следующим  |
| --- | --- |

| prepare | Приватный профиль и журнал в новой цели; значения совпадают с пакетом.  |

| preflight | Проверенные зависимости и привязки без запуска служб.  |

| allocate | Новые tenant и БД; затем отдельный официальный вход.  |

| configure / validate | Проекции служб и offline-проверка текущих образов.  |

| start | Службы запущены; полезная работа, версии и границы доступа проверяются отдельно.  |

## Подготовьте приватный профиль

Команды выполняются из распакованного source/sdist, совпадающего с установленным wheel. PILOT_PROFILE и PILOT_TARGET задаются оператором как абсолютные приватные пути; цель должна быть новой. Профиль связывает установку, архитектуру, source commit, локальные image IDs, runtime manifest, PostgreSQL, один или два tenant, HTTPS-кабинет, worker-профили, OIDC и ContextForge. Реальные значения предоставляются вместе с пакетом. Не подставляйте случайные хеши или токены.

## Первые три этапа

Это шаблоны действующих команд, не доказательство завершенной установки. Выполняйте по одному этапу и проверяйте его результат.

### prepare

```sh
set -eu
umask 077
: "${PILOT_PROFILE:?Set the private absolute profile path}"
: "${PILOT_TARGET:?Set the new absolute target path}"
python3.12 -B scripts/install_pilot.py --help
python3.12 -B scripts/install_pilot.py prepare \
  --profile "$PILOT_PROFILE" --target "$PILOT_TARGET"
```

### preflight

```sh
set -eu
: "${PILOT_TARGET:?Set the allocated absolute target path}"
python3.12 -B scripts/install_pilot.py apply \
  --target "$PILOT_TARGET" --stage preflight --consent
```

### allocate

```sh
set -eu
: "${PILOT_TARGET:?Set the allocated absolute target path}"
python3.12 -B scripts/install_pilot.py apply \
  --target "$PILOT_TARGET" --stage allocate --consent
```

prepare сохраняет приватный профиль и журнал. preflight проверяет среду и привязки. allocate создает новые tenant и базы.

## После allocate остановитесь для входа

Получите новые tenant IDs из приватного allocation metadata. Для каждого профиля отдельно создайте его внешний Codex volume и выполните официальный вход. Ожидаемое имя: null-review-codex-<allocated-id>-<profile_id>. Используйте операторский помощник из того же пакета. Установщик не создает, не ищет и не восстанавливает этот вход. Статус login сам по себе не доказывает успешный вызов модели.

```sh
set -eu
: "${NULL_TENANT_ID:?Use the newly allocated tenant ID}"
: "${NULL_CODEX_PROFILE:?Use the profile ID from the agreed profile}"
: "${NULL_ENGINE_IMAGE:?Use the accepted immutable engine image ID}"
scripts/codex-tenant --tenant "$NULL_TENANT_ID" \
  --profile "$NULL_CODEX_PROFILE" --image "$NULL_ENGINE_IMAGE" init
scripts/codex-tenant --tenant "$NULL_TENANT_ID" \
  --profile "$NULL_CODEX_PROFILE" --image "$NULL_ENGINE_IMAGE" login-browser
```

После официального входа проверьте его состояние. Команды используют только согласованный image ID; не подставляйте старый тег по умолчанию. Это не подтверждение полезного вызова модели.

```sh
set -eu
: "${NULL_TENANT_ID:?Use the newly allocated tenant ID}"
: "${NULL_CODEX_PROFILE:?Use the profile ID from the agreed profile}"
: "${NULL_ENGINE_IMAGE:?Use the accepted immutable engine image ID}"
scripts/codex-tenant --tenant "$NULL_TENANT_ID" \
  --profile "$NULL_CODEX_PROFILE" --image "$NULL_ENGINE_IMAGE" status
```

## Настройка, проверка, запуск

### configure

```sh
set -eu
: "${PILOT_TARGET:?Set the allocated absolute target path}"
python3.12 -B scripts/install_pilot.py apply \
  --target "$PILOT_TARGET" --stage configure --consent
```

### validate

```sh
set -eu
: "${PILOT_TARGET:?Set the allocated absolute target path}"
python3.12 -B scripts/install_pilot.py apply \
  --target "$PILOT_TARGET" --stage validate --consent
```

### start

```sh
set -eu
: "${PILOT_TARGET:?Set the allocated absolute target path}"
python3.12 -B scripts/install_pilot.py apply \
  --target "$PILOT_TARGET" --stage start --consent
```

configure создает отдельные проекции служб. validate запускает offline deployment-check без сети. start выполняет detached Compose up без build/pull. Это не проверка полезного ревью, миграций ContextForge или готовности пилота. Результат установщика сохраняет runtime_verified=false и pilot_ready=false.

## Если этап прерван

Не повторяйте этап с started/unknown и не удаляйте журнал, БД или каталог цели. Сохраните их для сверки фактических эффектов. Установщик create-only: нет автоматического resume, upgrade, rollback или принятия чужой установки. Повторный start тоже запрещен.

[Открыть плейбуки](/ru/docs/operations)

## Варианты размещения

| Вариант | Граница текущей поставки  |
| --- | --- |

| Один Linux Docker host + внешний PG | Текущий поэтапный bootstrap. Отдельная приемка после запуска.  |

| Корпоративные VM, reverse proxy и существующие GitLab/SSO | Согласованная топология и сетевой план, отдельный проект внедрения.  |

| Kubernetes / Helm | Готовый chart не поставляется. Не заменяйте им проверку реальных контрактов служб.  |

| Закрытый контур без интернета | Нужны полный offline bundle и доступная внутри модель. Текущий Codex CLI профиль не является air-gapped решением.  |
