STEADRUN

Рецепты подключения

Обновлено 02.10.2026

Примеры ниже можно копировать как есть, только замените ВАШ-UUID на UUID из карточки проверки. Что значат адреса /start и /fail, написано на странице о пингах.

Для Laravel есть отдельная страница. Там пакет steadrun/laravel-monitor отправляет пинги сам.

Crontab

Проще всего отправить пинг после задачи, если она завершилась без ошибки.

0 3 * * * /home/deploy/backup.sh && curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID

Чтобы о падении приходил алерт сразу, а не после grace-периода, добавьте /fail через ||:

0 3 * * * /home/deploy/backup.sh && curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID || curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID/fail

Есть тонкость. /fail уйдёт и тогда, когда бэкап прошёл, но не отправился сам пинг об успехе. Если нужен ещё и текст ошибки в алерте, используйте обёртку из следующего раздела.

Bash-обёртка для любой команды

Обёртка запускает команду, отправляет /start в начале, успех или /fail в конце. При ошибке в алерт попадут последние 10 КБ вывода команды. Сохраните её как /usr/local/bin/steadrun-wrap:

#!/usr/bin/env bash
# Использование: steadrun-wrap https://steadrun.ru/ping/ВАШ-UUID команда [аргументы…]
url="$1"
shift

curl -fsS -m 10 --retry 3 -o /dev/null "$url/start"

output=$("$@" 2>&1)
code=$?

if [ "$code" -eq 0 ]; then
    curl -fsS -m 10 --retry 3 -o /dev/null "$url"
else
    printf '%s\n' "$output" | tail -c 10000 | curl -fsS -m 10 --retry 3 -o /dev/null --data-binary @- "$url/fail"
fi

printf '%s\n' "$output"
exit "$code"

Сделайте её исполняемой и оберните задачу в crontab:

chmod +x /usr/local/bin/steadrun-wrap
0 3 * * * /usr/local/bin/steadrun-wrap https://steadrun.ru/ping/ВАШ-UUID /home/deploy/backup.sh

Обёртка возвращает код выхода команды и печатает её вывод, так что логи и письма от cron останутся как были. Вывод держится в памяти до конца команды. Для задач, которые печатают гигабайты, лучше писать вывод в файл и отправлять его хвост.

systemd timer

Если задачи запускаются таймерами systemd, создайте файл /etc/systemd/system/backup.service

[Unit]
Description=Ночной бэкап базы

[Service]
Type=oneshot
ExecStart=/usr/local/bin/steadrun-wrap https://steadrun.ru/ping/ВАШ-UUID /home/deploy/backup.sh

и файл /etc/systemd/system/backup.timer

[Unit]
Description=Ночной бэкап базы в 03:00

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

Включите таймер:

systemctl daemon-reload
systemctl enable --now backup.timer

В Steadrun создайте проверку типа «Cron» с выражением 0 3 * * *. OnCalendar считается в часовом поясе сервера, укажите в проверке его же. Persistent=true запустит пропущенную задачу после перезагрузки сервера. Такой пинг придёт не по расписанию. Это нормально, следующий Steadrun будет ждать в обычное время.

Docker

Если задача работает в контейнере, который запускается по расписанию, пингуйте из его точки входа:

#!/bin/sh
# entrypoint.sh, адрес пинга — в переменной окружения STEADRUN_PING_URL
curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/start" || true

if /app/backup.sh; then
    curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL" || true
else
    curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/fail" || true
    exit 1
fi
docker run --rm -e STEADRUN_PING_URL=https://steadrun.ru/ping/ВАШ-UUID my-backup-image

|| true нужен, чтобы сбой пинга не ронял задачу, если в скрипте включён set -e. В образах на Alpine curl нет. Поставьте его (apk add --no-cache curl) или используйте встроенный wget:

wget -q -T 10 -O /dev/null "$STEADRUN_PING_URL"

Для воркера в контейнере, который работает постоянно, нужна проверка типа «Очередь» и пинг из цикла:

#!/bin/sh
while true; do
    do-work
    curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL" || true
    sleep 60
done

Kubernetes CronJob

Сначала положите адрес пинга в секрет:

kubectl create secret generic steadrun --from-literal=backup-ping-url=https://steadrun.ru/ping/ВАШ-UUID

Затем CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup
spec:
  schedule: "0 3 * * *"
  timeZone: "Europe/Moscow"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: backup
              image: registry.example.com/backup:latest
              command: ["/bin/sh", "-c"]
              args:
                - |
                  curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/start" || true
                  if /app/backup.sh; then
                    curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL" || true
                  else
                    curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/fail" || true
                    exit 1
                  fi
              env:
                - name: STEADRUN_PING_URL
                  valueFrom:
                    secretKeyRef:
                      name: steadrun
                      key: backup-ping-url

Без поля timeZone расписание считается в часовом поясе контроллера Kubernetes, обычно это UTC. В Steadrun укажите тот же часовой пояс, что в CronJob.

Kubernetes перезапускает упавший Job, по умолчанию до шести раз. Каждая попытка с ошибкой отправит /fail. Алерт при этом придёт один, а если повторная попытка пройдёт, придёт сообщение о восстановлении.

GitHub Actions

Адрес пинга сохраните в секрете репозитория STEADRUN_PING_URL (Settings → Secrets and variables → Actions).

name: Nightly backup

on:
  schedule:
    - cron: "0 0 * * *" # GitHub считает расписание в UTC, это 03:00 по Москве

jobs:
  backup:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - run: curl -fsS -m 10 --retry 3 -o /dev/null "${{ secrets.STEADRUN_PING_URL }}/start"
      - run: ./scripts/backup.sh
      - if: success()
        run: curl -fsS -m 10 --retry 3 -o /dev/null "${{ secrets.STEADRUN_PING_URL }}"
      - if: failure()
        run: curl -fsS -m 10 --retry 3 -o /dev/null "${{ secrets.STEADRUN_PING_URL }}/fail"

В Steadrun создайте проверку типа «Cron» с выражением 0 0 * * * и часовым поясом UTC.

GitLab CI

Расписание задаётся в интерфейсе: Build → Pipeline schedules. Там же можно выбрать часовой пояс, укажите его же в проверке Steadrun. Адрес пинга сохраните в переменной STEADRUN_PING_URL (Settings → CI/CD → Variables).

backup:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
  script:
    - curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/start"
    - ./scripts/backup.sh
    - curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL"
  after_script:
    - if [ "$CI_JOB_STATUS" = "failed" ]; then curl -fsS -m 10 --retry 3 -o /dev/null "$STEADRUN_PING_URL/fail"; fi

after_script выполняется и после ошибки в script, а CI_JOB_STATUS говорит, чем закончилась задача.

Python

С библиотекой requests:

import traceback

import requests

PING_URL = "https://steadrun.ru/ping/ВАШ-UUID"


def ping(path="", body=None):
    try:
        requests.post(PING_URL + path, data=body, timeout=10)
    except requests.RequestException:
        pass  # сбой пинга не должен ронять задачу


ping("/start")
try:
    run_backup()
except Exception:
    ping("/fail", traceback.format_exc()[-10000:].encode())
    raise
else:
    ping()

.encode() нужен для текста на русском. Строку requests отправляет в кодировке Latin-1 и на кириллице падает с ошибкой.

Node.js

Встроенный fetch есть в Node.js 18 и новее. Пример в формате ES-модуля (файл .mjs):

const PING_URL = 'https://steadrun.ru/ping/ВАШ-UUID';

async function ping(path = '', body) {
  try {
    await fetch(PING_URL + path, { method: 'POST', body, signal: AbortSignal.timeout(10_000) });
  } catch {
    // сбой пинга не должен ронять задачу
  }
}

await ping('/start');
try {
  await runBackup();
  await ping();
} catch (err) {
  await ping('/fail', String(err?.stack ?? err).slice(-10000));
  throw err;
}

PHP без фреймворка

Без расширений, через file_get_contents (нужна включённая настройка allow_url_fopen, обычно она включена):

<?php

const PING_URL = 'https://steadrun.ru/ping/ВАШ-UUID';

function steadrun_ping(string $path = '', string $body = ''): void
{
    @file_get_contents(PING_URL . $path, false, stream_context_create(['http' => [
        'method' => 'POST',
        'header' => 'Content-Type: text/plain',
        'content' => $body,
        'timeout' => 10,
    ]]));
}

steadrun_ping('/start');
try {
    run_backup();
    steadrun_ping();
} catch (Throwable $e) {
    steadrun_ping('/fail', substr((string) $e, -10000));
    throw $e;
}

@ глушит предупреждение, если Steadrun недоступен, чтобы сбой пинга не уронил задачу.

1С-Битрикс

Если агенты Битрикса работают на cron, пинг добавляется к строке со скриптом агентов. Обычно он запускается каждую минуту. Как перевести агенты на cron и проверить их, написано в руководстве «Агенты 1С-Битрикс на cron».

* * * * * php -f /home/bitrix/www/bitrix/php_interface/cron_events.php && curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID

В Steadrun создайте проверку типа «Cron» с выражением * * * * *. Grace-период нужен с запасом на самый долгий агент, например 600 секунд. Путь к сайту замените на свой.

Что дальше

  • Laravel: пакет для Scheduler, очередей и воркеров.
  • Пинги: ответы сервера, лимиты и время выполнения задачи.