Примеры ниже можно копировать как есть, только замените ВАШ-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 секунд. Путь к сайту замените на свой.