Долгий скрипт наконец закончил работу. Деплой завершился — или упал. Ночной бэкап отработал. AI-агент несколько минут разбирался с задачей и подготовил ответ.
Во всех этих случаях хочется одного: не следить за терминалом, а получить уведомление, когда произошло что-то важное.
Для этого можно использовать Депешер — сервис технических уведомлений для разработчиков. Он принимает события от скриптов, CI/CD, AI-агентов и других инструментов, а затем доставляет сообщения в Email, Telegram, Telegram-группу, Пачку, Depesher Desktop или сохраняет их в истории личного кабинета.
Отправить событие можно двумя способами:
- через Depesher CLI;
- обычным HTTP POST-запросом.
Главная идея в обоих случаях одна: источник сообщает, что произошло, а способ доставки настраивается отдельно.
Разберём несколько практических сценариев — от shell-скрипта до CI/CD и OpenAI Codex.
Как работает Депешер
Схема простая:

Входящий канал принимает событие от приложения или скрипта. Исходящий канал определяет, куда доставить уведомление.
После настройки отправителю не нужно знать детали Telegram Bot API, SMTP или настольных уведомлений. Он просто сообщает Депешеру о событии, а получателей и способы доставки можно менять отдельно.
Первое уведомление из командной строки
Для терминала и shell-скриптов удобнее всего использовать Depesher CLI.
CLI сам выполняет HTTP-запрос к нужному входящему каналу. URL и токен один раз сохраняются в конфигурации, после чего уведомления отправляются короткой командой.
После установки проверить CLI можно так:
depesher --version
Узнать расположение конфигурации:
depesher --config-path
Каждому входящему каналу в конфигурации задаётся короткое имя:
[[channel]]
name = "personal"
endpoint = "<URL входящего канала>"
content_type = "text/plain"
auth_token = ""
Теперь отправить уведомление можно одной командой:
depesher personal "Привет! Это уведомление из командной строки"
personal — локальное имя канала из конфигурации CLI. Оно не обязано совпадать с названием канала в личном кабинете.
Посмотреть все настроенные каналы:
depesher --list
Для разных сценариев можно завести отдельные имена:
personal
backup_ch
deploy_ch
codex_ch
Уведомление после бэкапа
Предположим, ночью или вручную запускается долгий бэкап:
./backup.sh && \
depesher backup_ch "Бэкап успешно завершён"
Оператор && означает, что уведомление отправится только в том случае, если backup.sh завершится с кодом 0.
Если для канала настроить текст по умолчанию:
[[channel]]
name = "backup_ch"
endpoint = "<URL входящего канала>"
content_type = "text/plain"
template = "Бэкап выполнен успешно!"
auth_token = ""
команда станет ещё короче:
depesher backup_ch
Если передать текст явно, он будет использован вместо template.
Такой сценарий подходит не только для бэкапов: тем же способом можно сообщать о завершении любой долгой команды или shell-скрипта.
CLI или HTTP
Выбор между CLI и прямым HTTP-запросом зависит в первую очередь от среды.
Для локального терминала, shell-скриптов и developer workflow удобнее CLI:
depesher personal "Задача завершена"
URL и токен при этом остаются в конфигурации и не дублируются в каждом скрипте.
В CI/CD, контейнере или приложении часто проще отправить обычный HTTP POST:
curl --request POST \
--header 'Content-Type: text/plain' \
--data-binary 'Deploy завершён' \
"$DEPESHER_URL"
$DEPESHER_URL лучше хранить в переменной окружения или secret-хранилище.
Если входящий канал защищён токеном:
curl --request POST \
--header 'Content-Type: text/plain' \
--header "Authorization: Bearer $DEPESHER_TOKEN" \
--data-binary 'Deploy завершён' \
"$DEPESHER_URL"
То есть различается только способ отправки:

Уведомления из CI/CD
В CI/CD уведомление особенно полезно после сборки или деплоя.
Обычно DEPESHER_URL и, при необходимости, DEPESHER_TOKEN достаточно сохранить в secrets или защищённых переменных CI, а после выполнения job отправить готовое сообщение:
curl --fail \
--silent \
--show-error \
--max-time 15 \
--output /dev/null \
--request POST \
--header 'Content-Type: text/plain' \
--data-binary "$notification" \
"$DEPESHER_URL"
Если на runner уже установлен Depesher CLI, тот же вызов можно сократить до:
depesher deploy_ch "$notification"
Для одноразовых и контейнерных runner’ов прямой HTTP-запрос обычно проще: не требуется устанавливать дополнительную утилиту.
Само уведомление не должно повторять страницу pipeline. Достаточно информации, по которой сразу понятно, что произошло:
backend / production
Deploy завершился с ошибкой.
Commit: 91d2aef
Pipeline: #1842
Проект, окружение, commit, статус и ссылка на pipeline обычно дают достаточно контекста, чтобы решить, нужно ли открывать CI.
Уведомление после работы OpenAI Codex
С AI-агентами такой подход особенно удобен.
Codex может несколько минут изучать проект, менять код, запускать тесты и ждать завершения команд. Следить всё это время за терминалом необязательно: после завершения хода агент может вызвать внешний обработчик через настройку notify.
Для этого используется событие agent-turn-complete.
Создадим обработчик:
~/.codex/notify-depesher.py
Например:
import json
import subprocess
import sys
DEPESHER_BIN = "/home/user/.local/bin/depesher"
DEPESHER_CHANNEL = "codex_ch"
event = json.loads(sys.argv[1])
if event.get("type") != "agent-turn-complete":
raise SystemExit(0)
message = (
event.get("last-assistant-message")
or "Codex завершил ход"
)
subprocess.run(
[DEPESHER_BIN, DEPESHER_CHANNEL, message],
check=False,
)
В Depesher CLI для этого заранее создаётся канал codex_ch:
[[channel]]
name = "codex_ch"
endpoint = "<URL входящего канала Codex>"
content_type = "text/plain"
auth_token = ""
А в ~/.codex/config.toml подключается обработчик:
notify = ["python3", "/home/user/.codex/notify-depesher.py"]
Путь должен быть абсолютным.
После завершения хода Codex передаст обработчику JSON с данными события. Скрипт берёт last-assistant-message и отправляет его через Depesher CLI.
Получается такая цепочка:

Важно: agent-turn-complete означает завершение хода агента, а не гарантированное успешное выполнение всей задачи. Результат нужно оценивать по финальному ответу Codex.
При этом обработчику не приходится хранить URL и токен: они остаются в конфигурации Depesher CLI. Если способ доставки изменится, Python-скрипт переписывать не нужно.
Тот же принцип подходит и для других AI-инструментов — Claude Code, Cursor и собственных агентов, — если они позволяют вызвать hook, callback или shell-команду после завершения работы.
Событие, а не второй лог
Техническое уведомление не должно копировать весь stdout приложения.
Обычно достаточно ответить на четыре вопроса:
- что произошло;
- где;
- каков результат;
- где смотреть подробности.
Например:
backend / production: deploy завершился с ошибкой
(exit code 1). Pipeline #1842.
Несколько строк здесь полезнее нескольких сотен строк лога.
Подробности остаются в CI, journald, файле или системе мониторинга. Уведомление сообщает только о событии, которое заслуживает внимания.
По той же причине источнику лучше не привязываться непосредственно к Telegram или другому конкретному каналу доставки.
Для одного скрипта прямой вызов Telegram Bot API действительно может быть проще. Но со временем источников становится больше: бэкапы, CI/CD, серверы, AI-агенты, автоматизации.
Если каждый из них самостоятельно занимается доставкой, в разных местах начинают дублироваться токены, API-вызовы и настройки.
С Депешером источник отвечает только за событие:
задача завершена
а вопрос доставки решается отдельно:
куда отправить это событие?
Сегодня это может быть Telegram, завтра — Email или Desktop. Код источника при этом менять не требуется.
Итог
Чтобы узнать о завершении бэкапа, деплоя или работы AI-агента, не обязательно постоянно следить за терминалом или встраивать механизм доставки в каждый скрипт.
Для локальных сценариев удобно использовать Depesher CLI:
depesher personal "Задача завершена"
Для CI/CD и приложений — обычный HTTP POST.
В обоих случаях принцип один: источник сообщает о событии, а Депешер отвечает за его доставку.