# Работа в CLI

## Обзор

Консольный клиент [tuna](https://tuna.am/docs/guides/install/install-cli.md) позволяет взаимодействовать с [Job](https://tuna.am/docs/monitors/types/job.md) и [Heartbeat](https://tuna.am/docs/monitors/types/heartbeat.md) мониторами напрямую из терминала или скриптов.

Основные команды:

* `tuna monitor ping` — отправка сигнала Heartbeat монитору
* `tuna monitor exec` — выполнение команды с отслеживанием Job монитора
* `tuna monitor status` — просмотр статуса мониторов

***

## Авторизация

Для просмотра статуса монитора необходим [API-ключ](https://tuna.am/docs/guides/api.md). Его можно передать несколькими способами:

**Переменная окружения**

```bash
export TUNA_API_KEY=your-api-key
tuna monitor ping YOUR_MONITOR_ID

```

**Флаг**

```bash
tuna monitor ping YOUR_MONITOR_ID --api-key=your-api-key

```

**Конфиг файл**

```bash
# Сохранить ключ в конфиг
tuna config save-api-key your-api-key

# Теперь можно использовать без явного указания ключа
tuna monitor ping YOUR_MONITOR_KEY

```

***

## monitor ping

Отправляет сигнал для Heartbeat монитора.

### Синтаксис

```bash
tuna monitor ping MONITOR_ID [флаги]

```

### Параметры

| Параметр     | Описание                                     | По умолчанию |
| ------------ | -------------------------------------------- | ------------ |
| `MONITOR_ID` | Ключ монитора (обязательный)                 | —            |
| `--state`    | Состояние: `ping`, `start`, `finish`, `fail` | `ping`       |
| `--message`  | Дополнительное сообщение                     | —            |
| `--host`     | Имя хоста отправителя                        | hostname     |

### Примеры

#### Простой ping

```bash
tuna monitor ping MONITOR_ID

```

#### С указанием хоста

```bash
tuna monitor ping MONITOR_ID --host=server-01

```

#### С сообщением

```bash
tuna monitor ping MONITOR_ID --message="All systems operational"

```

#### Разные состояния

```bash
# Начало работы
tuna monitor ping MONITOR_ID --state=start

# Успешное завершение
tuna monitor ping MONITOR_ID --state=finish

# Ошибка
tuna monitor ping MONITOR_ID --state=fail

```

### Использование в crontab

```bash
# Heartbeat каждые 5 минут
*/5 * * * * /usr/local/bin/tuna monitor ping MONITOR_ID --host=gitlab-runner

```

### Использование в systemd

```ini
# /etc/systemd/system/heartbeat.service
[Unit]
Description=Send heartbeat to Tuna

[Service]
Type=oneshot
ExecStart=/usr/local/bin/tuna monitor ping MONITOR_ID

```

```ini
# /etc/systemd/system/heartbeat.timer
[Unit]
Description=Heartbeat timer

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min

[Install]
WantedBy=timers.target

```

***

## monitor exec

Выполняет команду и автоматически отслеживает Job монитор. При запуске отправляется сигнал `start`, при успешном завершении — `finish`, при ошибке — `fail`.

### Синтаксис

```bash
tuna monitor exec MONITOR_ID [флаги] -- COMMAND [ARGS...]

```

### Параметры

| Параметр      | Описание                      | По умолчанию |
| ------------- | ----------------------------- | ------------ |
| `MONITOR_ID`  | Ключ монитора (обязательный)  | —            |
| `--host`      | Имя хоста выполнения          | hostname     |
| `--no-stdout` | Не отправлять вывод на сервер | false        |

### Примеры

#### Простой запуск

```bash
tuna monitor exec MONITOR_ID -- ./backup.sh

```

#### С указанием хоста

```bash
tuna monitor exec MONITOR_ID --host=backup-server -- ./backup.sh

```

#### Без отправки логов

```bash
tuna monitor exec MONITOR_ID --no-stdout -- ./backup.sh

```

#### Команда с аргументами

```bash
tuna monitor exec MONITOR_ID -- pg_dump -U postgres -d mydb -f /backups/dump.sql

```

#### Команда с пайпом

```bash
tuna monitor exec MONITOR_ID -- bash -c 'pg_dump mydb | gzip > /backups/dump.sql.gz'

```

### Использование в crontab

```bash
# Backup каждую ночь в 3:00
0 3 * * * /usr/local/bin/tuna monitor exec MONITOR_ID -- /scripts/backup.sh

# Очистка логов каждый час
0 * * * * /usr/local/bin/tuna monitor exec MONITOR_ID -- /scripts/cleanup.sh

```

### Логирование

При использовании `monitor exec` система захватывает stdout и stderr выполняемой команды. Логи можно просмотреть в веб-интерфейсе в истории событий монитора.

![скриншот с сообщением в message](/docs/img/monitors/event.png)

Для отключения отправки логов используйте флаг `--no-stdout`:

```bash
tuna monitor exec MONITOR_ID --no-stdout -- ./command.sh

```

### Обработка сигналов

`monitor exec` корректно обрабатывает сигналы Unix:

* При получении SIGINT, SIGTERM, SIGHUP — сигнал передаётся дочернему процессу
* При завершении дочернего процесса с ненулевым кодом — отправляется `fail`
* При корректном завершении (exit code 0) — отправляется `finish`

***

## monitor status

Показывает статус мониторов команды. Для просмотра статуса необходим [API-ключ](https://tuna.am/docs/guides/api.md).

### Синтаксис

```bash
tuna monitor status [MONITOR_ID] [флаги]

```

### Параметры

| Параметр    | Описание                                | По умолчанию    |
| ----------- | --------------------------------------- | --------------- |
| `KEY`       | Ключ конкретного монитора (опционально) | —               |
| `--api-key` | API ключ для авторизации                | `$TUNA_API_KEY` |

### Примеры

#### Статус всех мониторов

```bash
tuna monitor status

```

#### Статус конкретного монитора

```bash
tuna monitor status MONITOR_ID

```

***

## Практические примеры

### Backup PostgreSQL с мониторингом

```bash
#!/bin/bash
# /scripts/backup-postgres.sh

BACKUP_DIR="/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="production"

tuna monitor exec MONITOR_ID --host=pg-prod-replica-1 -- bash -c "
    pg_dump -U postgres $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

    # Удаление старых бэкапов (старше 7 дней)
    find $BACKUP_DIR -name '*.sql.gz' -mtime +7 -delete
"

```

### Синхронизация файлов

```bash
#!/bin/bash
# /scripts/sync-files.sh

tuna monitor exec MONITOR_ID -- rsync -avz --delete /data/ backup-server:/backups/data/

```

### Мониторинг сервиса в Docker

```bash
#!/bin/bash
# healthcheck.sh внутри контейнера

# Проверка здоровья приложения
if curl -sf http://localhost:8080/health > /dev/null; then
    tuna monitor ping MONITOR_ID --message="healthy"
else
    tuna monitor ping MONITOR_ID --state=fail --message="unhealthy"
fi

```

### Мониторинг GitLab Runner

```bash
# В crontab на машине с GitLab Runner
*/5 * * * * /usr/local/bin/tuna monitor ping MONITOR_ID --host=raspberry-pi --message="Runner active"

```
