# Конфигурация и ForcAD ## Где хранится Обычный запуск: `./target/release/mirror-tool --config mirror.toml`. Шаблон — `mirror.example.toml`; файл выбирается флагом `--config`. Локальное демо этого проекта использует `data/demo/mirror.toml`, а изменения из панели — `data/demo/state.json`. Оба файла исключены из Git. Это тестовая конфигурация loopback с публичным тестовым паролем, не конфигурация для игры. В `[web]` задаётся `state_file`. Относительный путь считается от каталога TOML. После первого сохранения из UI список команд/сервисов загружается из state-файла, а сеть, мониторинг, web и scoreboard — по-прежнему из TOML. Изменение `[[teams]]` или `[[services]]` в TOML не заменяет существующее сохранённое состояние. Чтобы заново импортировать стартовую топологию, остановите процесс, переместите state-файл в резервную копию и запустите процесс снова. Не удаляйте рабочее состояние во время работы. ## ForcAD 1. В начало TOML, **перед секциями**, добавьте адрес своей команды: ```toml main_team_ip = "192.0.2.10" ``` 2. Добавьте секцию с адресом scoreboard вашей авторизованной игры: ```toml [scoreboard] kind = "forcad" url = "http://scoreboard.example:8080" poll_interval_ms = 3000 stale_after_ms = 15000 ``` Это примеры адресов, их нужно заменить. Используется Engine.IO 4 / Socket.IO namespace `/game_events`; URL задаётся корневой, без `/socket.io`, query и токенов. ForcAD-соединение постоянное; `poll_interval_ms` не означает новый handshake каждые 3 секунды. После изменения TOML нужен перезапуск процесса. 3. Через «Команды» добавьте IP каждой команды и **точное имя из scoreboard**. Название сервиса тоже должно совпадать с именем задания в scoreboard. IP существующей команды менять нельзя: добавьте новую и выберите её в маршруте. Для прямого IP у custom-прокси отдельная команда не нужна. 4. В настройках сервиса (клик по названию) задайте адрес/порт слушателя и реальный upstream-порт. Например, прокси `0.0.0.0:18080`, сервис команд `8080`. Кружок выбирает primary; строка — реплику. Затем включите прокси. 5. Робот включает автоматический выбор **из назначенных реплик**. Статус TCP, свежесть scoreboard и cooldown влияют на решение. Открытые TCP-сессии сохраняют прежний upstream, новые используют выбранный. Системные маршруты не меняются. Кнопка ⓘ показывает состояние scoreboard и краткую инструкцию. Верхняя полоска сервиса относится к своей команде (`main_team_ip`), а не к выбранному upstream. Серый статус означает отсутствие свежих данных, а не успех checker. Пароль обычного процесса задаётся в `MIRROR_PASSWORD` (минимум 12 символов), не в TOML. Тестовый fixture для настоящей игры не используйте; запускайте бинарник напрямую с собственным конфигом и паролем. Реальная игра этой проверкой не затрагивалась. ## Повторяемое локальное демо ```sh python3 scripts/ui_fixture.py target/release/mirror-tool --data-dir data/demo ``` Утилита сохраняет существующий TOML/state и не перезаписывает их. Без `--data-dir` всё состояние временное. Для отдельной проверки используйте `--port-offset 100`: панель 16800, proxy 18181, echo upstream 18182. Не запускайте второй fixture на тех же портах или с той же папкой состояния. Смещение применяется к новому шаблону; у существующего TOML порты остаются как записано в файле.