[Blog](https://tuna.am/en/blog.md)|[tuna-cli releases](https://tuna.am/en/blog/tags/releases)

# tuna-cli 0.39 — интерфейс в терминале у всех команд

October 29 · 8 min

В [tuna-cli 0.36](https://tuna.am/en/blog/cli-v0-36-tui.md) у туннелей появился полноэкранный интерфейс в терминале. В **0.39** он есть почти у всех команд: у `tuna start` и `tuna run` — сводный экран всех туннелей, у `tuna trigger` — лента срабатываний, у `tuna domain`, `tuna monitor` и других команд управления — таблица, в которой можно создавать, смотреть и удалять ресурсы. Инспектор теперь включается и выключается клавишей, без перезапуска туннеля.

## Общие правила

* **Интерфейс включается сам**, когда команда запущена в терминале. Без терминала, с `--log=stdout`, в CI и у ИИ-агентов вывод прежний, текстовый, поэтому скрипты не ломаются. Выключить интерфейс вручную — переменной `TUNA_TUI=0`.
* **Выход — только `Ctrl+C`.** `q` и `Esc` возвращают назад из деталей и карточек.
* **Подсказки внизу экрана** показывают только клавиши, которые работают на текущем экране и для текущей строки.
* **Команды управления** — `tuna domain`, `endpoint`, `tunnel`, `api-key`, `monitor` и `ssh-session` — без подкоманды открывают таблицу в терминале, а без терминала печатают справку. Подкоманды вроде `tuna domain list` работают как раньше и теперь выводят в stdout таблицу, которую удобно передавать по пайпу.

## Туннели

### HTTP: инспектор по клавише

Лента запросов и метрики — rpm, p50 и p90, число ответов 4xx и 5xx — остались на месте. `Enter` открывает детали запроса, `r` повторяет его, `/` фильтрует ленту. Новое — клавиша `I`: она включает и выключает инспектор, как флаг `--inspect`, но без перезапуска туннеля. Когда инспектор выключен, веб-инспектор останавливается, история запросов очищается, а главным экраном становится лог.

### TCP: соединения и трафик

У `tuna tcp` инспектора нет, поэтому главный экран — лог туннеля. Над ним строка со счётчиками: активные и все соединения, входящий и исходящий трафик.

### Postgres и Redis

Слева сессии, справа — запросы и ответы выбранной сессии, включая ошибки. `Tab` переключает панели, `Esc` возвращает к списку сессий, `y` копирует запрос. `l` переключает между сессиями и логом. Инспектор у Postgres и Redis включён всегда: ради разбора запросов эти туннели и нужны, а без него есть `tuna tcp`. `tuna redis` устроен так же.

### SSH: запись сессий по клавише

`tuna ssh` показывает инструкцию для подключения и ленту сессий. `Enter` на активной сессии открывает её просмотр в реальном времени, `Ctrl+C` возвращает к ленте. `R` включает и выключает запись новых сессий, как флаг `--record-session`. `k` копирует строку для `known_hosts`, `c` — команду `ssh`.

### Protected App

`tuna app` подключает локальный сервис к [защищённому приложению](https://tuna.am/en/docs/apps.md). На экране — аккаунт, адрес и сервис, куда идут запросы, ниже — лог. `c` копирует адрес, `o` открывает его в браузере, `Q` показывает QR-код.

## Триггеры

[`tuna trigger`](https://tuna.am/en/docs/tunnels/trigger.md) запускает команду на входящий вебхук или письмо. Теперь каждое срабатывание видно в ленте: время, источник, код выхода и длительность. `Enter` открывает детали со stdout и stderr команды — сразу видно, почему деплой упал.

У `tuna trigger smtp` источник в ленте — `от кого → кому · тема` письма.

## Несколько туннелей: start и run

### tuna start

[`tuna start`](https://tuna.am/en/docs/tunnels/guides/multi-tunnels.md) запускает туннели из конфига и показывает их на сводном экране: тип, статус, адрес и инспектор. Внизу — лента запросов выбранного туннеля, у Postgres и Redis — его лог. `I` включает и выключает инспектор HTTP-туннеля прямо со сводного экрана. `Enter` открывает полноценный интерфейс туннеля со всеми его клавишами, `Ctrl+C` возвращает к списку. Если tuna есть что сказать, например при ошибке, `L` открывает его собственный лог. Упавший туннель перезапускается сам, как раньше.

### tuna run

[`tuna run`](https://tuna.am/en/docs/tunnels/guides/run.md) запускает приложение и сам открывает туннель на каждый порт, который оно начинает слушать. Приложение — первая строка таблицы, ниже — его вывод. `Enter` открывает живой терминал приложения со вводом: горячие клавиши Vite и других dev-серверов работают. `R` перезапускает приложение, не трогая туннели. У туннеля внизу — его лента запросов. `L` показывает лог самого tuna: в нём видно, какие порты нашлись и какие туннели открылись.

Флаги `--http` и `--tcp` у `tuna run` удалены: тип туннеля определяется сам. Порт, который не отвечает по HTTP за 10 секунд, получает TCP-туннель.

## Управление ресурсами

### Домены

`tuna domain` открывает таблицу доменов. `n` резервирует поддомен или добавляет свой домен: для поддомена сразу подставлено случайное имя, после резерва открывается карточка с подсказкой, что делать дальше — DNS-запись для своего домена и команда туннеля. `Enter` открывает карточку домена со статусом и историей проверки, `t` запускает туннель на выбранном домене прямо из таблицы.

Для скриптов появились подкоманды `tuna domain get`, `revalidate` и `redirect`, а `tuna domain reserve example.com` добавляет свой домен.

### TCP-порты

`tuna endpoint` работает так же: `n` резервирует порт, карточка показывает команду туннеля, `c` копирует `host:port`, `t` запускает туннель на порту. Локальный порт в команде подставляется по имени порта: для `postgres` — 5432, для `redis` — 6379, для `mysql` — 3306.

### Активные туннели

`tuna tunnel` показывает все запущенные туннели команды, список обновляется раз в 5 секунд. `Enter` открывает карточку туннеля, `d` останавливает его.

### API-ключи

`tuna api-key` показывает ключи команды. `e` меняет описание ключа, `d` удаляет ключ. Если удаляется ключ, под которым работает сам CLI, клиент предупредит об этом. Новые ключи по-прежнему выпускаются в [личном кабинете](https://my.tuna.am/api_keys?lang=en).

### Мониторы

`tuna monitor` показывает [мониторы](https://tuna.am/en/docs/monitors.md) со статусами, они обновляются раз в 10 секунд. `Enter` открывает карточку с последними событиями, `p` ставит монитор на паузу и возобновляет его. Для скриптов появились подкоманды `get`, `events`, `pause`, `resume` и `delete`.

### Записанные SSH-сессии

`tuna ssh-session` показывает [записанные сессии](https://tuna.am/en/docs/tunnels/ssh.md#ssh-session-recording). `Enter` проигрывает запись, `x` экспортирует её в GIF.

## Фоновые сервисы

`tuna service` показывает туннели, установленные как [фоновые сервисы](https://tuna.am/en/docs/tunnels/guides/service.md). `n` создаёт сервис, `e` меняет его команду, `s`, `x` и `R` запускают, останавливают и перезапускают, `d` удаляет сервис и отзывает его ключ, `Enter` открывает логи.

Сам `tuna service` тоже переделан. На Linux без sudo он ставит пользовательский сервис `systemd --user` и включает linger, чтобы туннель пережил выход из SSH и перезагрузку. Кроме systemd, поддерживается OpenRC (Alpine, Gentoo). Для скриптов появились `tuna service list`, `tuna service logs -f` и `tuna service edit`: последняя меняет аргументы туннеля без переустановки. Каждый сервис получает свой ключ, привязанный к адресу туннеля, если адрес задан, а `uninstall` отзывает этот ключ.

## Что проверить при обновлении

* **Флаг `--location` устарел.** Новые поддомены и порты живут в общей зоне, и сервер находит их без `location`. Если флаг задан, CLI предупредит. Для имён, зарезервированных в зонах `ru` и `nl`, флаг пока нужен.
* **Списки выводятся в stdout.** `tuna domain list`, `endpoint list`, `tunnel list`, `api-key list` и `monitor status` печатают таблицу в stdout, а не строки лога в stderr. Если скрипт разбирал старый формат, переведите его на флаг `--json`: с ним `list` у `domain`, `endpoint`, `tunnel`, `api-key`, `session`, `ssh-session` и `bastion ls` печатают массив JSON, а пустой список — `[]`.
* **`tuna service install` сразу запускает сервис и выключает инспектор.** Отдельный `tuna service start` после установки не нужен. Инспектор в сервисе выключен (`--inspect=false`), если его не включили явно. `tuna start` сервисом не ставится — создайте по сервису на каждый туннель.
* **На Linux без sudo сервис ставится пользовательским.** Раньше `install` требовал root и создавал системный юнит. Если нужен системный сервис, запускайте `install` через `sudo`.
* **Токен заменили сессия и API-ключи.** `tuna login` теперь входит через браузер, а на серверах и в CI используется API-ключ: `TUNA_API_KEY` и `--api-key` вместо `TUNA_TOKEN` и `--token`. Старый токен пока работает, но CLI предупреждает о замене. Что поменялось и что сделать — в [отдельном посте](https://tuna.am/en/blog/sessions-and-api-keys.md).
* **`tuna run` без `--http` и `--tcp`.** Уберите эти флаги из скриптов.
* **У `tuna postgres` и `tuna redis` нет флага `--inspect`.** Инспектор у них включён всегда, переменная `TUNA_INSPECT` на них не влияет. Если скрипт запускал их с `--inspect=false`, переведите его на `tuna tcp`.

Вместе с CLI вышел Tuna Desktop 0.3 с входом через сессию и полем «Домен» в форме туннеля, про него — [отдельный пост](https://tuna.am/en/blog/desktop-v0-3.md).

Подробнее про клавиши каждого экрана — в разделе [Интерфейс в терминале](https://tuna.am/en/docs/tunnels/tui.md), полный список изменений — в [журнале изменений](https://tuna.am/en/changelog.md).

## Leave feedback

If you enjoy using Tuna, or on the contrary you are not happy with something, please [leave feedback](https://my.tuna.am/?show_feedback=1&lang=en).

![](/blog/img/2024-08-22/feedback.gif)

## News

We announce new features and posts on our [Telegram channel](https://t.me/tuna_am). Subscribe so you don't miss anything.

## Help

We value our users and carefully review every request. If you have any problems with tuna, please contact us in one of the following ways:

* [Email](mailto:info@tuna.am)
* [Telegram community](https://telegram.me/+Kgbtt0_gJwI5ZmEy)

Categories: [tuna-cli releases](https://tuna.am/en/blog/tags/releases)

[← newer🔑 Вход через сессии и API-ключи вместо токена](https://tuna.am/en/blog/sessions-and-api-keys.md)[older →🐟 Tuna Desktop 0.3 — вход через сессию и любой домен у туннеля](https://tuna.am/en/blog/desktop-v0-3.md)
