Статус доступа: публичная регистрация ещё не открыта. Сейчас можно попробовать интерактивное демо и локальные учебные примеры. Адрес https://app.ontik.ru в коде предназначен для будущего запуска; в собственной тестовой установке используйте адрес своего backend.
WindowsLinuxmacOS

Запуск задачи ещё не означает успешную копию

Планировщик запустил резервное копирование ночью, но утром обнаружилось, что места на диске не хватило. Смотреть журнал каждого запуска вручную неудобно. Полезнее отправлять краткий итог: какая задача закончилась, с каким результатом и где искать подробности.

Ontik принимает итог, но не создаёт резервную копию и не проверяет её восстановление. Эти проверки выполняет ваша программа или система резервного копирования.

Какие сигналы действительно полезны

  • Задача завершилась с ненулевым кодом.
  • Проверка целостности или пробное восстановление не прошли.
  • Размер или свежесть копии отличаются от ожидаемых.
  • Ожидаемый запуск не состоялся — если это обнаружила внешняя система.

Если сервер выключен и скрипт вообще не запустился, он не сможет отправить уведомление о собственном отсутствии. Контроль пропущенных запусков требует отдельного watchdog или мониторинга; встроенного контроля heartbeat в текущем MVP Ontik нет.

Учебный пример на Python

Скачайте ↓ Скачать backup_watch.py. Нужен Python 3, сторонние пакеты не требуются. Обёртка запускает указанную команду и составляет событие по её коду завершения. По умолчанию HTTP выключен: JSON выводится в терминал.

"""Учебная обёртка: по умолчанию печатает событие без HTTP-запроса."""
import json
import os
import subprocess
import sys
import urllib.request

def notify(payload):
    if os.environ.get("ONTIK_DRY_RUN", "1") == "1":
        print(json.dumps(payload, ensure_ascii=False, indent=2))
        return
    key = os.environ["ONTIK_API_KEY"]
    base = os.environ.get("ONTIK_BASE_URL", "https://app.ontik.ru").rstrip("/")
    body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
    request = urllib.request.Request(base + "/v1/events", data=body,
        headers={"Content-Type": "application/json", "X-Ontik-Key": key})
    with urllib.request.urlopen(request, timeout=10) as response:
        print("Ontik:", response.status)

def main():
    command = sys.argv[1:]
    if not command:
        print("Usage: python backup_watch.py COMMAND [ARGS...]", file=sys.stderr)
        return 2
    try:
        result = subprocess.run(command, check=False)
        code = result.returncode
    except OSError:
        code = 127
    payload = {
        "event": "Ошибка резервного копирования" if code else "Резервная копия завершена",
        "meta": {"job": "nightly-backup", "exit_code": code,
                 "result": "failed" if code else "completed"},
    }
    try:
        notify(payload)
    except Exception as error:
        print("Не удалось отправить событие:", type(error).__name__, file=sys.stderr)
    return code

if __name__ == "__main__":
    sys.exit(main())

Безопасная проверка ошибки — команда ничего не копирует и намеренно возвращает код 1:

Выберите свою платформу. Код Python остаётся одним и тем же; отличаются команды запуска и переменные окружения.

Windows · PowerShell

python --version
$env:ONTIK_DRY_RUN = "1"
python backup_watch.py python -c "import sys; sys.exit(1)"

Linux · Bash

python3 --version
export ONTIK_DRY_RUN="1"
python3 backup_watch.py python3 -c "import sys; sys.exit(1)"

macOS · Zsh / Bash

python3 --version
export ONTIK_DRY_RUN="1"
python3 backup_watch.py python3 -c "import sys; sys.exit(1)"

Откройте терминал в папке скачанного файла. Для Windows также подойдёт py -3, если команда python недоступна. Вложенная учебная команда должна использовать установленный у вас Python.

Для проверки успеха замените sys.exit(1) на sys.exit(0). Вы увидите разные заголовки и exit_code. Ненулевой код самой обёртки в первом тесте ожидаем.

Как подключить реальную задачу

После открытия доступа создайте проект, включите Web Push, сохраните ключ в окружении и замените учебную команду на ваш штатный скрипт резервного копирования. Переменные окружения для вашей платформы:

Выберите свою платформу. Код Python остаётся одним и тем же; отличаются команды запуска и переменные окружения.

Windows · PowerShell

$env:ONTIK_API_KEY = "pk_live_КЛЮЧ_ПРОЕКТА"
$env:ONTIK_BASE_URL = "https://app.ontik.ru"
$env:ONTIK_DRY_RUN = "0"

Linux · Bash

export ONTIK_API_KEY="pk_live_КЛЮЧ_ПРОЕКТА"
export ONTIK_BASE_URL="https://app.ontik.ru"
export ONTIK_DRY_RUN="0"

macOS · Zsh / Bash

export ONTIK_API_KEY="pk_live_КЛЮЧ_ПРОЕКТА"
export ONTIK_BASE_URL="https://app.ontik.ru"
export ONTIK_DRY_RUN="0"

Для собственной тестовой установки укажите её backend вместо будущего публичного адреса. Подключайте обёртку в том окружении, где команда выполнялась раньше: должны сохраниться рабочий каталог, доступы и аргументы.

Исключение при отправке уведомления не превращает успешное копирование в неудачное. Пример сохраняет исходный код задачи, а ошибку уведомления отдельно пишет в stderr.

Что проверить перед использованием

Код 0 — только утверждение команды об успешном завершении. Надёжность копии проверяют восстановлением и проверкой целостности. Добавьте эти шаги в свой процесс до отправки итогового события.

В Ontik передавайте job_id, результат, длительность и ссылку на журнал. Полный лог, пути с секретами и содержимое копии не нужны. Если API недоступен, этот простой пример не хранит локальную очередь повторов. Для важных задач добавьте её на стороне источника.

Посмотрите, какое событие увидит команда

В демо можно изменить параметры и получить карточку события с имитацией уведомления. Аккаунт и разрешение браузера не нужны.

Попробовать пример →Инструкция подключения →

Связанный сценарий: как использовать Ontik для этой задачи.

Заявки с сайта без Telegram →Уведомление о завершении Python-скрипта →Уведомления о деплое для команды →

Вопрос по примеру? info@ontik.ru