# Справочник CLI

> Полный справочник всех команд и флагов Meridian CLI.

## Команды

### meridian deploy

Развернуть один сервер и получить ссылку для обмена подключением. Сервер становится и контроль-планом (панель Remnawave), и выходом. Deploy строит ту же рассмотренную топологию, что и `meridian setup`, применяет её с контрольными точками, проверяет реальный трафик через доставленную подписку и выводит страницу подключения и URL подписки. Повторный запуск того же команды возобновляет прерванное развёртывание или переразворачивает, сохраняя пути, ключи и пользователей.

```
meridian deploy [SERVER] [flags]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--sni HOST` | (авто) | Цель маскировки. Без него первое развёртывание пробует сайты из собственной подсети сервера, затем `www.google.com`, `dl.google.com`, `www.cloudflare.com` и использует первый, который несёт трафик; переразворачивание сохраняет сохранённую цель. Явный `--sni` никогда не меняется |
| `--domain DOMAIN` | (нет) | Ваш домен: XHTTP переносится на него и добавляется WSS, оба через CDN Cloudflare (XHTTP работает и без домена, на IP). Панель и страницы подключения остаются на IP-сертификате |
| `--hysteria2/--no-hysteria2` | вкл | Предлагать Hysteria2 на UDP/443, замаскированный salamander, как последний возврат. Использует сертификат домена или IP-сертификат без домена |
| `--fingerprint NAME` | chrome | Отпечаток TLS, который клиенты показывают на Reality, XHTTP и WSS (`chrome`, `firefox`, `safari`, `ios`, `android`, `edge`, `random`, `randomized`). Измените его, если ваш регион начнёт флагировать текущий; переразворачивание сохраняет сохранённое значение |
| `--client-name NAME` | default | Имя первого клиента |
| `--display-name NAME` | (нет) | Ярлык для страниц подключения |
| `--icon EMOJI_OR_URL` | (нет) | Значок страницы — эмодзи или URL изображения |
| `--color PALETTE` | ocean | Тема цвета страницы (ocean/sunset/forest/lavender/rose/slate) |
| `--user USER` | сохранено, иначе root | SSH пользователь (не-root требует passwordless sudo) |
| `--ssh-port PORT` | сохранено, иначе 22 | SSH порт |
| `--harden / --no-harden` | вкл | SSH только по ключу, fail2ban и файрвол UFW. `--no-harden` для серверов, общих с другими сервисами |
| `--warp / --no-warp` | выкл | Отправлять исходящий трафик через Cloudflare WARP |
| `--geo-block` / `--no-geo-block` | вкл | Блокировать российские домены и IP (`geosite:category-ru` + `geoip:ru`) на выходе. Xray JSON и Mihomo подписки уже отправляют их напрямую с устройства |
| `--client-ips / --no-client-ips` | выкл | Передавать Xray и панели реальный IP каждого клиента — для лимитов по IP и журналов подключений для каждого пользователя. Когда выключено, каждое TCP-соединение выглядит как приходящее с самого сервера |
| `--country CC` | реестр адреса | Двухбуквенный код страны, который показывается в названиях подключений и как флаг узла в панели. Без него при первом развёртывании Meridian спрашивает региональный интернет-реестр адреса сервера (через RDAP bootstrap IANA, без гео-IP сервиса); при повторном развёртывании сохраняется прежняя страна |
| `--yes` | | Пропустить диалоги подтверждения |
| `--json` | | Выдать окончательный результат развёртывания как конверт `meridian.output/v1` |
| `--events=jsonl` | | Потоком передавать типизированные события прогресса как JSONL на stderr |
| `--request FILE` | | Прочитать `deploy-request` JSON от файла; используйте `-` для stdin |
| `--dry-run` | | Компилировать и просмотреть развёртывание без SSH или локальных изменений |

Без IP, deploy запрашивает его. `local` развёртывает на машине, на которой вы находитесь. Deploy только переразворачивает сервер, который уже является выходом в вашей системе; добавляйте другие серверы с помощью `meridian node add`. Изменения дополняющие: удаление уже развёрнутого (например, отпадение `--domain`) отклоняется.

**Поток машина/UI**: `meridian api workflow deploy --json` возвращает отрисовываемый контракт мастера. UI собирает эти поля, проверяет их против `deploy-request`, затем запускает `meridian deploy --request deploy.json --json --events=jsonl`. Машинные развёртывания неинтерактивны: запрос должен содержать `yes: true` после подтверждения пользователем. `--dry-run --json` возвращает `deploy-plan` под `data`, чтобы UI мог просмотреть режим, порты и сгенерированные пути перед открытием SSH.

### meridian setup

Возобновляемый пошаговый мастер для одного сервера или многих: выходы, промежуточные серверы Realm, маршрутизирующие шлюзы с пулами отказоустойчивости и пользователи. Он написан для людей, которые никогда не настраивали VPN: каждый вопрос использует настоящий термин (выход, промежуточный сервер, SNI) и объясняет его в одном простом предложении с безопасным стандартом, который вы можете принять, нажав Enter.

```
meridian setup [--intent FILE|-] [--restart] [--yes]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--intent FILE` | (нет) | Начать с проверки из полного документа JSON топологии; используйте `-` для stdin |
| `--restart` | | Отбросить сохранённый прогресс настройки перед запуском |
| `--yes`, `-y` | | Одобрить проверку и применить без запроса |

Первый вопрос — язык (English, Русский, فارسی, 中文), предвыбранный из вашего терминала и запомненный в `~/.config/meridian/preferences.json`; `--lang` или `MERIDIAN_LANG` пропускают его. Затем мастер проходит по серверам (IP, `user@IP:port` или `local` для этой машины), что делает каждый сервер, методы подключения, маршрутизация (спрашивается только если у вас есть маршрутизирующий шлюз), пользователи, сводка на простом языке и применение. Варианты выбора — это списки: перемещайтесь стрелками (или нажмите номер варианта), отмечайте пункты чек-листа клавишей Пробел, нажмите `?` для подробностей, Enter для подтверждения, Esc для возврата назад и Ctrl+C для выхода. Везде, где список предлагает «Другое», можно ввести собственное значение. В текстовых полях также можно ввести `back`, `details`, `save` или `quit` (или те же слова на вашем языке). Для сайта для маскировки мастер сначала сканирует собственную сеть выхода (около минуты) и показывает эти сайты раньше общеизвестных. Задайте `MERIDIAN_PLAIN_PROMPTS=1`, чтобы получить нумерованные запросы (они включаются автоматически, когда терминал не может отрисовать списки). Запуск `meridian` без команды в терминале, до того как существует VPN, предлагает запустить мастер. Прогресс сохраняется в `~/.config/meridian/setup.json` после каждого этапа, поэтому запуск `meridian setup` снова возобновляет; пароли и приватные ключи никогда не сохраняются там. `--intent` не заменяет существующий черновик, если `--restart` также не указан. Когда применение успешно, setup проверяет каждый узел и подписку и выводит страницу подключения каждого пользователя.

### meridian plan

Показать, что изменит `meridian apply`, сравнивая топологию в `~/.config/meridian/cluster.yml` с живыми серверами и панелью. Ничего не меняется.

```
meridian plan [--json]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--json` | | Выдать план как конверт `meridian.output/v1` для CI и UI клиентов |

Вывод показывает хеш плана, подсчёты ресурсов по типам и любые ресурсы, которые нужно исправить или не удалось наблюдать. JSON `data` содержит `plan_hash`, `converged`, `resources[]`, `drifted_resources[]`, `observation_errors[]` и `state_changes[]`.

**Коды выхода**:
- `0` — сходится, нечего делать
- `1` — нечего планировать (нет серверов, или неиспользуемое локальное состояние)
- `2` — ожидающие изменения (запустите `meridian apply`)
- `3` — требуемые доказательства (панель, SSH, локальное состояние) были недоступны

Не редактируйте топологию в `cluster.yml` вручную. Измените её с помощью `meridian setup`, `deploy`, `client add`, `node add` или `relay add`.

### meridian apply

Применить рассмотренную топологию в `cluster.yml` на ваши серверы. Apply показывает хеш плана и подсчёт ресурсов, просит подтверждение, затем применяет точный показанный план с контрольными точками. Прерванное применение возобновляется там, где остановилось.

```
meridian apply [--yes] [--json]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--yes`, `-y` | | Пропустить подтверждение |
| `--json` | | Выдать окончательный результат применения как конверт `meridian.output/v1` |

JSON `data` содержит `plan_hash`, `generation` и `actions[]` с `status: "converged" | "applied" | "failed" | "unknown" | "skipped"`. JSON режим никогда не спрашивает: без `--yes` возвращает `MERIDIAN_CONFIRMATION_REQUIRED` с хешем плана и выходит `2`. Неудавшийся ресурс выходит `3`; исправьте причину и снова запустите apply. Если локальное состояние не может быть сохранено после удалённых изменений, apply выходит `3` и говорит это; исправьте разрешения `~/.config/meridian`, затем запустите `plan` и `apply` снова.

Удаления тоже применяются: всё, что покинуло топологию (пользователи, пути протокола, выходы, промежуточные серверы, маршрутизирующие шлюзы), удаляется после того как всё, что осталось в плане, сходится, и `plan` выводит это первым. Контрольный сервер уходит только через `meridian teardown`.

### meridian client

Управлять людьми, которые подключаются.

```
meridian client add NAME [NAME...] [--json]
meridian client show NAME [--repair-page] [--json]
meridian client list [--json]
meridian client enable NAME [--json]
meridian client disable NAME [--json]
meridian client reissue NAME [--yes] [--json]
meridian client remove NAME [--yes] [--json]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--json` | | Выдать результат как конверт `meridian.output/v1` (все команды client) |
| `--repair-page` | | Переопубликовать страницу подключения клиента (`client show`) |
| `--yes`, `-y` | | Подтвердить `client reissue` или `client remove`; требуется с `--json` |

**`client add`** — добавляет одного или нескольких людей в топологию, применяет её и выводит страницу подключения и URL подписки каждого человека. Страница строится из их подлинной подписки, поэтому промежуточные серверы и Hysteria2 появляются при наличии. Имена уже в топологии или уже в панели отклоняются. Имена могут быть на любом алфавите (`client add Биба 王小明`): страницы и вывод показывают их так, как они введены, а панель, которая принимает только латинские буквы, цифры, `-` и `_`, получает транслитерированное имя пользователя (`biba`, `wangxiaoming`). Другие команды client принимают любую из форм. Если ссылка подписки клиента не может быть построена, клиент всё ещё добавляется и команда выходит `3`; отсутствующая страница подключения одна — это предупреждение (исправьте её с помощью `client show --repair-page`).

**`client show`** — выводит страницу подключения, URL подписки, статус, трафик и время последнего видения. `--repair-page` переопубликовывает отсутствующую страницу; если это не удаётся, ссылки всё ещё показаны с предупреждением и выходом `3`.

**`client list`** — выводит клиентов со статусом, трафиком, временем создания и последним временем видения. С `--json` возвращает подсчёты `data.summary` и `data.clients[]`.

**`client enable` / `client disable`** — возобновить или приостановить клиента немедленно. Отключённый клиент остаётся отключённым, пока вы не выполните `client enable`: применения (включая переразворачивание, `client add`, `node add` и `relay add`) статус клиента не меняют.

**`client reissue`** — заменяет ссылки клиента после утечки. Remnawave выдаёт новый идентификатор подписки и новые ключи, поэтому старый URL подписки, страница подключения и ссылки перестают работать. Meridian сначала удаляет старую страницу, затем публикует новую и выводит новые ссылки. Статус, лимиты, срок действия и лимит устройств HWID остаются такими, как заданы в панели; незнакомые устройства удалите там. Запрашивает подтверждение, если не дан `--yes`, и отклоняет имена, которых нет среди ваших клиентов. Если новую страницу не удалось опубликовать, ссылки всё равно показываются с предупреждением и выходом `3` (исправьте с помощью `client show --repair-page`).

**`client remove`** — удаляет клиента из топологии, удаляет пользователя панели и его страницу подключения. Запрашивает подтверждение, если не дан `--yes`. Последний клиент не может быть удалён. Не удаляйте пользователей в панели напрямую; Meridian воссоздаёт любого клиента, который осталась в топологии, при следующем применении.

### meridian server

Управлять сохранёнными SSH серверами (`~/.config/meridian/servers.json`).

```
meridian server add [USER@]IP[:PORT]|local [--name NAME] [--user USER] [--ssh-port PORT]
meridian server list
meridian server remove NAME_OR_IP [--yes]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--name NAME` | (нет) | Имя для отображения сервера |
| `--user/-u USER` | root | SSH пользователь |
| `--ssh-port PORT` | 22 | SSH порт |
| `--yes`, `-y` | | Пропустить подтверждение удаления (`server remove`) |

Имена и адреса должны быть уникальны; `server add` отклоняет коллизии вместо переориентирования существующего сервера. `server remove` удаляет только сохранённый профиль и отклоняет, пока сервер всё ещё имеет роль в вашей топологии.

### meridian node

Управлять серверами выхода. Первый сервер развёртывается с помощью `meridian deploy` (или `meridian setup`); добавляйте дополнительные выходы с помощью `meridian node add`.

```
meridian node add [USER@]IP[:PORT] [flags]
meridian node list [--json]
meridian node remove NAME_OR_IP [--yes] [--force]
meridian node replace EXIT [USER@]NEW_IP[:PORT] [--name NAME] [--yes]
meridian node sni EXIT NEW_SNI [--yes]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--name NAME` | (авто) | Дружественное имя для узла |
| `--user USER` | сохранено, иначе root | SSH пользователь на узле |
| `--ssh-port PORT` | сохранено, иначе 22 | SSH порт на узле (`node add`, `node replace`) |
| `--sni HOST` | www.google.com | Цель маскировки Reality для этого узла |
| `--domain DOMAIN` | (нет) | Домен узла: XHTTP переносится на него и добавляется WSS, оба через CDN Cloudflare; Hysteria2 использует его сертификат |
| `--country CC` | реестр адреса | Страна в названиях подключений; задайте её, если реестр ошибается (anycast или арендованные диапазоны) |
| `--harden / --no-harden` | вкл | Затвердевание ОС, SSH и файрвола. Все серверы всегда его сохраняют; `--no-harden` отклоняется |
| `--yes` | | Пропустить диалоги подтверждения |
| `--force` | | `node remove`: также удалить цепочки промежуточных серверов, которые маршрутизируют к этому выходу |
| `--json` | | Выдать `node list` как конверт `meridian.output/v1` |

**`node add`** — подключается по SSH, добавляет сервер как выход в вашу топологию и применяет рассмотренный план (затвердевание, Docker, Xray, регистрация панели). Существующие клиенты получают новый выход при следующем обновлении подписки.

**`node list`** — выводит узлы с живым статусом панели, версией Xray и трафиком. Если статус панели недоступен, настроенные узлы показаны как `unknown` и команда выходит `3`.

**`node remove`** — удаляет выход или маршрутизирующий шлюз из вашей топологии. Выводит каждый ресурс, который будет удален (панель узла и профиль, контейнер узла, правила файрвола, опубликованные Hosts), запрашивает подтверждение и применяет именно это рассмотрение; сервер остается в сохраненных серверах. Отклоняется для контрольного сервера (используйте `meridian teardown`), пока промежуточные серверы всё ещё маршрутизируют к выходу (удалите их сначала или передайте `--force`), пока через него работает маршрутизирующий шлюз, и когда результат нарушит топологию (например пустой пул исходящих связей или исходящий выход по умолчанию). Правила маршрутизации, ограниченные удаленным шлюзом, удаляются с ним.

**`node replace`** — перемещает один выход на другой сервер. `EXIT` это ID выхода или сохранённое имя его сервера или IP; новый сервер использует тот же синтаксис цели как `node add` (сохранённое имя или `local` работает тоже) и сохраняется как `server add`. Выход сохраняет свой ID, ключи Reality, пути протокола, SNI, настройки WARP и geo, и каждый промежуточный сервер, который указывает на него, поэтому пользователи, подключённые через промежуточные серверы, продолжают работать, и прямые пользователи получают новый адрес на их следующем обновлении подписки. Рассмотрение выводит список что будет развёрнуто на новом сервере и каждый ресурс очищен на старом (контейнер узла, изображение и директория; его файлы nginx, правила файрвола и сертификаты); Docker и сохранённый сервер остаются. Отклоняется для контрольного сервера (перемещение панели изменит каждый URL подписки) и для нового сервера который уже имеет роль.

**`node sni`** — задаёт Reality-пути выхода новый SNI маскировки. `EXIT` — ID выхода или сохранённое имя его сервера или IP. Отклоняет имена `apple.com` и `icloud.com` и `www.microsoft.com`, проверяет по SSH, что выход открывает новый сайт по TLS 1.3 с HTTP/2, показывает рассмотрение (промежуточные серверы, которые следуют SNI выхода; те, что сохраняют свой; шлюзы маршрутизации на этом пути; что будет удалено), подтверждает и применяет. Старое имя заменяется, а не остаётся рядом: приложения переключатся при следующем обновлении подписки (каждые 6 часов) или при ручном обновлении, а до этого не смогут подключиться через Reality. XHTTP, WSS и Hysteria2 не меняются. Используйте, когда `meridian test --probe` сообщает, что SNI маскировки заблокирован.

### meridian relay

Управлять промежуточными серверами — TCP-форвардерами Realm, которые дают пользователям внутреннюю точку входа на выход за границей. Промежуточные серверы несут трафик Reality.

```
meridian relay add [USER@]RELAY_IP[:PORT] --exit EXIT [flags]
meridian relay list [--exit EXIT] [--json]
meridian relay remove RELAY [--exit EXIT] [--yes]
meridian relay sni RELAY NEW_SNI [--exit EXIT] [--yes]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--exit/-e EXIT` | (требуется для add) | IP или имя сервера выхода |
| `--name NAME` | (авто) | Дружественное имя для промежуточного сервера (например, "ru-moscow") |
| `--port/-p PORT` | 443 | Порт слушания на промежуточном сервере |
| `--sni HOST` | цель выхода | Цель маскировки Reality для этого промежуточного сервера; пропустите, чтобы использовать цель выхода |
| `--user/-u USER` | сохранено, иначе root | SSH пользователь на промежуточном сервере |
| `--ssh-port PORT` | сохранено, иначе 22 | SSH порт на промежуточном сервере (`relay add`) |
| `--yes/-y` | | Пропустить диалоги подтверждения |
| `--json` | | Выдать `relay list` (`data.relays[]`) как конверт `meridian.output/v1` |

**`relay add`** — добавляет одноузловой промежуточный сервер в вашу топологию и применяет её. Клиенты получают его при следующем обновлении подписки. Для цепей с несколькими узлами используйте `meridian setup`.

**`relay remove`** — `RELAY` это IP промежуточного сервера, сохранённое имя или ID цепочки. Отбрасывает каждую цепь через этот сервер (сузить с `--exit`), выводит то, что будет удалено (Realm юниты, правила файрвола, слушатель со стороны выхода, опубликованные Hosts), подтверждает и применяет рассмотренное удаление. Серверы остаются в сохраненных серверах.

**`relay sni`** — задаёт новый SNI маскировки цепочкам через сервер (или одной цепочке по ID; сузить с `--exit`). Отклоняет те же имена, что и `node sni`, проверяет, что выход открывает сайт (собственное имя промежуточного сервера обслуживает Reality-слушатель на выходе), показывает рассмотрение, подтверждает и применяет. SNI самого выхода снова привязывает промежуточный сервер к выходу. Приложения переключатся при следующем обновлении подписки.

Для проверки хопов промежуточного сервера запустите `meridian check RELAY`.

### meridian route

Отправлять выбранные направления с выхода через Cloudflare WARP, напрямую или никуда, впереди исходящего по умолчанию выхода.

```
meridian route add EXIT VALUE... --via warp|direct|block [--name ID] [--json]
meridian route list [EXIT] [--json]
meridian route remove EXIT ROUTE [--yes] [--json]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--via ACTION` | (требуется для add) | `warp`, `direct`, или `block` |
| `--name ID` | действие, пронумеровано | ID маршрута показанный через `route list` и используемый через `route remove` |
| `--yes/-y` | | Пропустить подтверждение удаления (требуется с `--json`) |
| `--json` | | Выдать конверт `meridian.output/v1` (`data.override` для add/remove, `data.exits[]` для list) |

`EXIT` это ID выхода, сохранённое имя сервера или IP. Каждый `VALUE` это домен (поддомены включены), `geosite:NAME` или `geoip:NAME`; один маршрут держит один вид.

**`route add`** — добавляет маршрут к выходу в вашу топологию и применяет его. Маршруты совпадают в порядке который они были добавлены. Маршрут `warp` на выходе без WARP настраивает WARP только для того маршрута; остальной трафик остаётся прямым.

**`route list`** — показывает каждый исходящий выход по умолчанию и его маршруты в порядке совпадения.

**`route remove`** — удаляет один маршрут и применяет изменение; его направления следуют исходящему по умолчанию выхода снова. WARP остаётся установленным на сервере но ничего не несёт пока маршрут или `--warp` не используется снова.

### meridian fleet

Здоровье серверов и инвентарь с живой панели, а также обновление Remnawave.

```
meridian fleet status [--json]
meridian fleet inventory [--json]
meridian fleet upgrade [--tested] [--yes]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--json` | | Выдать результат как конверт `meridian.output/v1` (`status`, `inventory`) |
| `--tested` | | `fleet upgrade`: не обращаться ни к Docker Hub, ни к GitHub; Remnawave возвращается к версиям, с которыми протестирован этот релиз Meridian, а уже обновлённый Realm остаётся |
| `--yes`, `-y` | | `fleet upgrade`: пропустить подтверждение |

**`fleet status`** — здоровье панели, биения сердца узла, слушатели промежуточных серверов и подсчёты клиентов. Отсутствующие объявленные клиенты понижают здоровье; отключённые, ограниченные или истёкшие клиенты подсчитываются но это ваш выбор, не неисправность. Достижимый слушатель промежуточного сервера только доказывает TCP, поэтому непроверенные маршруты через промежуточные серверы сохраняют здоровье `unknown`; используйте `meridian test` для проверки полного пути. Выход `0` означает здоровый, `4` понижение и `3` неизвестный.

**`fleet inventory`** — ваши настроенные серверы, роли, узлы и промежуточные серверы с живым статусом панели при достижимости. Никогда не выводит токен API панели или секретные пути. Если живой статус недоступен, настроенный инвентарь всё ещё показан с предупреждениями и команда выходит `3`. Используйте `plan --json` для решения, имеет ли apply работу.

**`fleet upgrade`** — переводит Remnawave на самый новый релиз, не дожидаясь обновления Meridian. Команда запрашивает у Docker Hub самые новые релизы backend, узла и страницы подписки в рамках основной версии, которую поддерживает этот релиз Meridian (предрелизы и другие основные версии пропускаются), закрепляет каждый по его мультиархитектурному дайджесту и сохраняет выбор в `cluster.yml`, чтобы последующие применения его сохраняли. Более новое закрепление в следующем релизе Meridian снова берёт верх. `--tested` оставляет только версии, с которыми протестирован этот релиз. PostgreSQL и Valkey всегда остаются на закреплённых версиях Meridian. Если в парке есть промежуточные серверы, то же самое делается для Realm: самый новый релиз на GitHub в протестированной основной версии сохраняется вместе с sha256, который GitHub публикует для каждого архива, и каждый промежуточный сервер проверяет его перед установкой. Затем она читает образы backend, страницы подписки, PostgreSQL, Valkey и узла, которые запускает каждый сервер (read-only `docker inspect` по SSH) и показывает каждое как `current`, `upgrade`, `install` или сохранённое. Политика версий та же, что использует setup: более новый тег версии или плавающий тег (`latest`, `3`), который вы выбрали, сохраняется и сообщается, никогда не понижается. Основная версия PostgreSQL никогда не перемещается на месте — старая основная продолжает работать и команда объясняет дамп-и-восстановление которое ей нужно. После вашего подтверждения она применяет рассмотренный план и запускает `meridian check` на каждом сервере. Сервер чьи изображения не могут быть прочитаны останавливает команду с выходом `3` перед всеми изменениями; если apply сходится но сервер всё ещё запускает старое изображение, она выходит `3` тоже.

### meridian check

Проверить здоровье сервера, или сможет ли новый сервер запустить Meridian. Что проверяется зависит от роли сервера в вашей системе:

- **Ещё не в системе** — проверки перед развёртыванием: достижимость цели маскировки и DNS, доступность и внешняя достижимость портов 443, DNS домена, ОС, диск и часы. Ничего не установлено; кратосрочный слушатель тестирует файрвол, когда порт 443 свободен. DNS использует собственный разрешитель сервера.
- **Контроль, выход или шлюз маршрутизации** — подключение панели, SSH (или локальный доступ), контейнеры (включая здоровье страницы подписки), все скомпилированные публичные и внутренние порты, TLS сертификаты и дисковое пространство. Запустите с другой машины, контроль-сервер также получает проверку потока данных: загрузка ~50 КБ, которая предупреждает, когда она зависает примерно после 16–24 КБ (дросселирование, измеренное с того места, где вы находитесь).
- **Промежуточный сервер** — каждый хоп Realm на сервере: сервис активен и может достичь следующего хопа, и публичный вход цепи принимает TCP с вашей машины.

Без сервера проверяется каждый сервер в системе.

```
meridian check [SERVER] [--domain NAME] [--sni HOST] [--user USER]
               [--ssh-port PORT] [--ai] [--json]
```

`--domain` и `--sni` применяются к серверам, ещё не развёрнутым: проверяют, что домен разрешается на сервер и что конкретная цель маскировки достижима. `--user` и `--ssh-port` переопределяют сохранённого SSH пользователя и порт. `--ai` копирует готовый для AI диагностический запрос в буфер обмена. `--json` выводит один конверт `meridian.output/v1` с отчётом по сервёрам и областям.

Отсутствующие доказательства никогда не рассматриваются как успех. Выход `0` означает, что все проверки прошли, `4` означает найденные проблемы, `3` означает требуемые доказательства были недоступны, и `2` означает недопустимый ввод. Каждая неудача выводит её исправление. Используйте `meridian test` для передачи реального трафика через весь маршрут.

### meridian scan

Найти цели маскировки на собственной сети сервера, используя закреплённый выпуск RealiTLScanner. Meridian проверяет его SHA-256 контрольную сумму перед запуском и удаляет удалённое рабочее пространство после этого.

```
meridian scan [SERVER] [--user USER] [--ssh-port PORT]
```

RealiTLScanner сканирует IPv4 диапазоны; IPv6-только сервер выходит `3`. Выбор результата выводит команду для его использования — он не изменяет развёрнутую топологию. Пропуск выходит `0`, недопустимый выбор выходит `2`, нет подходящих целей выходит `4` и сканер или ошибки загрузки выходят `3`.

### meridian test

Протестировать доставленный VPN-трафик с вашего устройства. SSH не требуется.

Полный тест выбирает активного клиента, получает точный JSON Xray, который Remnawave доставляет им, и пропускает реальный трафик через автоматический возврат и через каждый путь целевого сервера. Первый запуск может потратить до 120 секунд на загрузку и проверку закреплённого времени выполнения Xray. Проверки трафика вращают независимых наблюдателей IP и сравнивают их с прямым запросом, поэтому отключение наблюдателя неубедительно вместо ложной неудачи. `MERIDIAN_CONNECT_TEST_URL` переопределяет наблюдателя для контролируемых окружений.

Отключение панели, HTTP `429` или HTTP `5xx` делает подписку недоступной, поэтому запуск выходит `3`. Любое другое отклонение подписки, такое как `400` или `422`, это завершённый отказ и выходит `4`.

```
meridian test [SERVER|DOMAIN] [--domain NAME] [--sni NAME]
              [--client NAME] [--basic] [--probe] [--timeout SECONDS] [--json]
```

Без указания цели `test` проверяет сохранённый сервер, на котором запущен, или ваш единственный сохранённый сервер. Если их несколько, он по очереди проверяет каждую публичную точку входа ваших серверов (каждый выход, затем точку входа каждого промежуточного сервера) и завершается с худшим результатом; тогда `--json` возвращает по одному результату на сервер в `data.results`.

`--client` тестирует конкретного активного клиента. `--basic` запускает только сетевые и TLS проверки без загрузки Xray и не может проверить пути только UDP; не может быть объединено с `--client` (выход `2`). `--timeout` (по умолчанию `5`, диапазон `1`–`30`) ограничивает каждую сетевую операцию, отдельно от первой загрузки Xray.

Выход `0` означает каждая проверка прошла, `4` означает тест нашёл проблемы и `3` означает требуемые доказательства были недоступны. `--json` выдаёт конверт `meridian.output/v1` с каждой проверкой и находкой.

Каждый путь сообщает время до первого байта. Когда путь не удаётся, Meridian открывает простое TCP соединение к его конечной точке, чтобы сказать, **подключается ли, но без трафика** (сервер отвечает, но сессия прокси не несёт ничего: неправильные учётные данные или сессия разорвана) или **недостижим** (ничего не отвечает на этом порту). С `--json`, `data.transports` содержит результат каждого пути (`ok`, `no_traffic`, `unreachable`, `failed`, `egress_mismatch`, `inconclusive`, `invalid`) и `first_byte_ms`.

#### Взгляд цензора: `meridian test --probe`

`--probe` смотрит на сервер так, как активный зондировщик, чтобы проверить, раскрывает ли развёртывание себя, вместо отправки трафика. Работает на любом IP или домене и применяет более строгие проверки, когда цель принадлежит вашей сохранённой топологии.

Проверки следуют реальному развёртыванию: публичное и внутреннее раскрытие портов, поведение HTTP/TLS, консистентность и маскировка SNI, обычные пути прокси и панели, улучшения WebSocket, обратный DNS, HTTP/2, устаревшие версии TLS и настроенные домены. `--sni` переопределяет SNI для общих TLS зондов. Слушатели только UDP сообщаются как нуждающиеся в полной `meridian test` вместо предположения.

`--probe` также отвечает на вопрос «что блокируется?». Он открывает TLS к серверу с его маскировочным SNI; если это не удаётся, он повторяет попытку без SNI и открывает реальный сайт маскировки напрямую, затем сообщает, выглядит ли блокировано **IP сервера** или **маскировочный SNI**. Если реальный сайт тоже не может быть достигнут, результат неубедителен вместо вывода. На контроль-сервере он также загружает скрипт страницы подключения ~50 КБ и следит за передачей, которая зависает примерно после 16–24 КБ, что является тем, как дросселируемые иностранные IP ведут себя. Когда путь WSS проходит через CDN, та же загрузка выполняется через CDN. Эти результаты имеют значение только, когда вы их запускаете из цензурируемой сети. `--probe` не может быть объединён с `--basic`, `--client` или `--domain`. Коды выхода такие же как `test`; пропущенные проверки никогда не сообщаются как прохождения.

`meridian probe [SERVER|DOMAIN] [--sni NAME] [--timeout SECONDS] [--json]` — то же самое, что `meridian test IP --probe`.

### meridian doctor

Собрать системные диагностики для отчётов об ошибках.

```
meridian doctor [SERVER] [--sni HOST] [--user USER] [--ssh-port PORT] [--ai]
```

`--sni` выбирает цель маскировки для диагностики, `--user` и `--ssh-port` переопределяют сохранённого SSH пользователя и порт, и `--ai` копирует отредактированный, готовый к AI отчёт в буфер обмена вместо печати шаблона проблемы.

Doctor следует ролям сервера: сервер, который работает только как промежуточный, не диагностируется как выход, и маршрутизирующие шлюзы помечены отдельно. Отсутствующие инструменты или потерянное SSH подключение делают отчёт неубедительным (выход `3`); уже собранные секции всё ещё показаны.

### meridian logs

Показать последние журналы сервера в отредактированном виде, не входя на него.

```
meridian logs [SERVER] [--lines N] [--grep TEXT] [--component NAME]
              [--user USER] [--ssh-port PORT]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--lines`, `-n N` | `100` | Сколько строк показать из каждого журнала (`1`–`10000`) |
| `--grep`, `-g TEXT` | | Только строки с этим текстом; без учёта регистра, ищется буквально, а не как регулярное выражение |
| `--component`, `-c NAME` | все | Только `node`, `panel`, `nginx` или `relay`; повторите, чтобы выбрать несколько |

`logs` читает то, что запускают роли сервера: выходы и маршрутизирующие шлюзы показывают контейнер узла Remnawave, управляющий сервер показывает контейнеры панели (бэкенд, база данных, Valkey, страница подписки), оба показывают журнал ошибок nginx, а промежуточные серверы показывают журнал своих юнитов Realm. `--user` и `--ssh-port` переопределяют сохранённого SSH пользователя и порт.

Каждая строка проходит ту же редакцию, что и в `meridian doctor`: токены, пароли, ключи, UUID, идентификаторы подписок и секретные пути панели и страницы подключения заменяются на `[REDACTED]`, поэтому вывод безопасно вставлять в отчёт об ошибке. Строки печатаются простым текстом, управляющие символы терминала удалены.

Сервер без роли в системе или `--component`, который он не запускает, завершается с кодом `2` до подключения. Журнал, который не удалось прочитать (нет контейнера, потеряно SSH подключение), показывается как недоступный, и команда завершается с кодом `3`.

### meridian panel

Показать URL админ-панели Remnawave и имя администратора, и что Meridian управляет там против того что ваше для изменения.

```
meridian panel [--show-password]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--show-password` | | Также выведите пароль администратора |

Правки на статус клиента, лимиты трафика, истечение и описания, и пользователи которых вы создали в панели выживают каждого применения. Правки узлов, профилей, Hosts, отрядов и шаблонов Meridian создала возвращаются при следующем применении; `meridian plan` показывает их сначала.

### meridian teardown

Удалить Meridian с сервера.

```
meridian teardown [SERVER] [--user USER] [--ssh-port PORT] [--yes]
```

При одиночном развёртывании сервера teardown удаляет всё, что создал Meridian: панель, узел, конфигурацию nginx, сертификаты, промежуточные серверы и правила файрвола на сервере, а затем локальный `cluster.yml` и сохранённый профиль сервера. Docker, системные пакеты, настройки SSH и fail2ban остаются, а nginx продолжает работать, если он ещё обслуживает ваши собственные сайты. Также удаляет 3x-ui из Meridian 3.x. При нескольких серверах teardown отклоняет сервер, который всё ещё имеет роль в топологии.

`--yes` пропускает подтверждение; проверки ролей всё ещё запускаются первыми. Отклонение выходит `1`. Неизвестное имя сервера, или ноль или несколько возможных целей выходит `2` вместо запроса.

### meridian update

Обновить CLI на последний выпуск своей основной версии на PyPI. Новая основная версия только анонсируется; `--major` переходит на неё после прочтения вами заметок о выпуске. Бета-версия следует за более новыми бета-версиями своей основной версии, а затем стабильным выпуском. Meridian пытается uv, pipx и pip, и только сообщает успех, когда активная команда `meridian` показывает новую версию. Выход `0` означает уже текущий или обновлённый; `3` означает обновление или его проверка не удалась. Обновление CLI не изменяет ваши серверы.

```
meridian update [--major]
```

### meridian studio

Открыть Meridian Studio, экспериментальный браузерный UI, с его локальным Engine API. Сервер привязывается только к `127.0.0.1`.

```
meridian studio [--port PORT] [--assets-dir DIRECTORY] [--no-open]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--port PORT` | 7391 | Локальный порт от 0 до 65535; `0` выбирает любой свободный порт |
| `--assets-dir DIRECTORY` | упакованные ресурсы | Использовать встроенный директорий ресурсов Studio вместо упакованной копии |
| `--no-open` | | Выводить локальный URL без открытия браузера |

Studio выводит и открывает адрес вида `http://127.0.0.1:7391/studio/#k=…`. Часть после `#k=` — это ключ, который меняется при каждом запуске: пользоваться Engine может только вкладка браузера, открытая по этому адресу, поэтому другие программы и другие пользователи на этом же компьютере не смогут. Держите адрес в тайне. После перезапуска Studio откройте новый адрес, который он выведет.

Без `--port` Studio использует порт 7391 или, если он занят, следующий свободный порт до 7400. Так черновик, который браузер сохраняет для Studio, остаётся на месте и при следующем запуске. Если явно указанный `--port` занят, Studio завершается с понятной ошибкой; то же происходит, если нет ресурсов. Явно указанный каталог ресурсов должен содержать `studio/index.html`.

### meridian api

Проверить машиночитаемые контракты позади JSON вывода для скриптов и UI клиентов.

```
meridian api schemas [--json] [--include-schemas]
meridian api commands [--json] [--include-schemas]
meridian api schema NAME [--envelope|--json]
meridian api workflow NAME [--json]
```

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--json` | | Выдать каталог как конверт `meridian.output/v1` |
| `--include-schemas` | | Включить полные JSON Schemas (подразумевает JSON вывод) для `api schemas` или `api commands` |
| `--envelope`, `--json` | | Обернуть `api schema NAME` в конверт `meridian.output/v1` вместо вывода сырой схемы |

**`api schemas`** — выводит имена схем, такие как `output-envelope`, `deploy-request`, `deploy-result`, `deploy-plan`, `plan-envelope`, `apply-envelope`, `client-list-envelope`, `fleet-status-envelope` и `event`.

**`api commands`** — выводит контракты команд: argv, схемы конверта и данных, возможные статусы и результаты, значения кодов выхода, все опции, которые принимает команда (`machine_flags`), и `interrupt_behavior`. Аргументы, опции и описания читаются из самого CLI. Ctrl-C выходит `130` без конверта JSON (`interrupt_behavior: "exit_130_without_envelope"`).

**`api schema NAME`** — выводит одну JSON Schema, например `meridian api schema output-envelope`.

**`api workflow NAME`** — выводит отрисовываемый UI поток работы, например `meridian api workflow deploy --json`.

### meridian help

Рассказать об Meridian ИИ-агенту или показать справку по одной команде.

```
meridian help [agents | COMMAND...]
```

**`meridian help agents`** выводит руководство в формате Markdown для ИИ-агентов: что делает Meridian, как связаны ваши серверы и их рассмотренная топология, где хранится состояние, правила безопасной работы с CLI (неинтерактивные флаги, конверты JSON, план перед применением, подтверждение перед удалением, ссылки как секреты), коды выхода и типовые задачи. Вывод всегда в чистом Markdown, так что агент может прочитать его из канала.

**`meridian help COMMAND`** показывает ту же справку, что и `meridian COMMAND --help`, например `meridian help node add`. Без аргументов выводит справку верхнего уровня. Неизвестная тема завершается с кодом `2`.

## Глобальные параметры

Глобальные параметры идут перед командой, например `meridian --quiet doctor`. Параметры команд, такие как `test --json`, идут после неё.

| Флаг | Описание |
|------|-------------|
| `--version`, `-v` | Показать версию CLI и выйти |
| `--verbose` | Включить отладочное логирование |
| `--quiet`, `-q` | Подавить вывод прогресса |
| `--lang CODE` | Язык для мастера setup: `en`, `ru`, `fa` или `zh` (по умолчанию: сохранённый выбор, иначе спрашивается) |
| `--json` | Запросить конверт JSON из команды, которая его поддерживает; другие команды явно падают |
| `--install-completion` | Установить завершение оболочки для текущей оболочки |
| `--show-completion` | Выводить скрипт завершения для текущей оболочки |

JSON вывод использует конверт `meridian.output/v1` (`schema`, `command`, `operation_id`, `status`, `summary`, `data`, `warnings`, `errors`). Он поддерживается каждой командой, у которой есть `--json`: deploy, plan, apply, check, test, probe, все команды client и route, статус/инвентарь серверов, списки узлов и промежуточных серверов и команды api. Глобальный `--json` и собственный `--json` команды взаимозаменяемы. Секреты отредактированы перед выходом JSON из процесса. Запустите `meridian api commands --json` для открытия контрактов.

## Обычные параметры сервера

Они повторяются по командам; каждая команда принимает только параметры, указанные в её собственном разделе.

| Флаг | Использовано |
|------|---------|
| `SERVER` аргумент | deploy, check, scan, test, doctor, logs, teardown, node add, relay add, server add |
| `--user`, `-u USER` | deploy, check, node add, relay add, server add, scan, doctor, logs, teardown |
| `--ssh-port PORT` | deploy, check, node add, relay add, server add, scan, doctor, logs, teardown |
| `--sni HOST` | deploy, check, node add, relay add, test, doctor |
| `--domain DOMAIN` | deploy, check, node add, test |

Команды client используют API панели напрямую и не принимают сервер. `test` запускается с вашего устройства и не использует SSH.

## Разрешение сервера

Сервер указывается первым, как в `ssh`: IP, сохранённое имя, `user@host:port` или `local` — запуск на текущей машине без SSH. `--user` и `--ssh-port` дополняют то, чего нет в цели, и не должны ей противоречить. Пустой пользователь или порт означают сохранённое значение, а если его нет — `root` и `22`. Без сервера Meridian использует локальный режим (при запуске на развёрнутом сервере) или единственный сохранённый сервер. Если кандидатов нет или их несколько, команда завершается с кодом `2`, а не задаёт вопрос.
