# ENVIRONMENT — точное окружение разработки (снято 2026-10-18)

## Runtime (НЕ переживает сброс песочницы — ставить заново)

```bash
bash scripts/setup-env.sh --with-db     # идемпотентный бутстрап
# или вручную:
apt-get update && apt-get install -y php-cli php-sqlite3 php-mbstring php-xml php-curl php-intl php-zip
```

| Компонент | Значение |
|---|---|
| PHP | 8.2.34 (cli, NTS) |
| Расширения | sqlite3, pdo_sqlite, mbstring, xml (libxml/SimpleXML/xmlreader/xmlwriter), curl, intl, zip, opcache |
| Python | 3.11 (в песочнице: /opt/arena-python/bin/python3) — только для scripts/_*.py-дрелей |
| Git | системный (в песочнице есть) |
| Composer | НЕ нужен в runtime (stdlib-only, ADR-001); тесты несут собственный bootstrap |
| БД | SQLite WAL, `var/data/iya.sqlite3` (dev), создаётся `php bin/iya migrate` |

## Чего в песочнице НЕТ (и обходы)

* **curl** → python3 `urllib`/`http.client` (готовые хелперы в `scripts/_beta_journey.py`, `_p14_edge_check.py`).
* **ps/pkill** → скан `/proc/[0-9]*/cmdline`; ВАЖНО: паттерн grep собирать из частей (`"bin/iy""a ser""ve"`) или bracket-regex (`i[y]a serv`) — иначе kill-петля убивает собственный шелл (проверено на себе).
* **docker** → сборка образа валидируется в CI (`.github/workflows/ci.yml`, job `docker`).
* **sqlite3 CLI** → `php -r 'new PDO("sqlite:var/data/iya.sqlite3")'`.
* **Сеть из PHP** иногда доступна (worker target-checks в dev ВЫКЛЮЧЕНЫ: `TARGET_CHECK_BUDGET=0` в `.env` — не включать без нужды).

## Конфигурация

* `.env` **отслеживается в git** (dev-значения): `APP_ENV=development`,
  `DEV_ALLOW_HOST_OVERRIDE=true` (позволяет `?_host=` в дриллах),
  `ADMIN_REQUIRE_2FA=false`, `RATE_LIMIT_*=600:60` и пр., `TARGET_CHECK_BUDGET=0`.
* ЛОВУШКИ Config (подробно RESILIENCE-PLAYBOOK §6.3):
  1. `.env` имеет приоритет над реальными env-переменными (B-005) — дриллы
     временно ПЕРЕПИСЫВАЮТ .env (с бэкапом и восстановлением);
  2. ключ, которого нет в `Config::defaults()`, молча игнорирует env —
     новые ключи регистрировать там.
* Прод: `ADMIN_REQUIRE_2FA=true`, `RATE_LIMIT_DEFAULT_ENFORCE=true`,
  `IP_BLOCKS_ENFORCE=true`, `TARGET_CHECK_BUDGET=20`, `TRUSTED_PROXIES=<ваш proxy>`.

## Демо-данные (`php bin/iya seed`)

* Админ: `demo@iya.ru` / `Demo-Password-2026!` (dev: 2FA не требуется).
* 1 субдомен + 12 ссылок (redirect/page/card/file/qr/ab/targeting/...).
* Поле логина — `identifier` (не email!); CSRF-поле — `_token`.

## Запуск

```bash
php bin/iya serve --host=127.0.0.1 --port=8080   # php -S + dev-router, 4 воркера
php bin/iya worker --once                        # ingest/rollups/outbox/alerts/ip-intel/target-checks
php bin/iya doctor                               # самодиагностика окружения
```

Мультитенантность в dev: `?_host=<name>.iya.ru` или HTTP-заголовок `Host:`
(apex `iya.ru`, swarm `agent-swarm.iya.ru`, тенанты `*.iya.ru`).

## Гейты здоровья (сверять с REWORK-STATE §0)

```bash
php tests/run.php | tail -2          # 483 tests, 3109 assertions, 0 failures
php bin/iya lint | tail -1           # checked 223 files, 0 failures
php scripts/build_i18n.php --check   # full coverage: 42/66 locales
python3 scripts/_beta_journey.py     # 13 passed, 0 failed (сервер на 8080)
python3 scripts/_p14_edge_check.py   # 12 passed, 0 failed (сам поднимает серверы)
```

## Бюджет снапшота (критично!)

`du -sh /home/user` после каждого чекпоинта; **лимит ≈128 МБ** (превышение
МОЛЧА обрезается). Экономия: `git gc` (сжимал .git 28M→5.4M), чистка
`var/test/* var/cache/*` и старых логов, один versioned-тарболл локально
(история — в /mnt/oss), `rm P12_PRE.tar.gz` после ротации.
