Окно обслуживания (maintenance window) — это запланированный временной интервал, в течение которого Tracker.ru продолжает проверять URL, но не отправляет уведомления о падении. Алерты о down-статусе подавляются для проверок, попавших в окно; downtime внутри окна не учитывается как незапланированный простой.
Это нужно, чтобы плановые работы — деплои, миграции БД, обновление инфраструктуры, ротация TLS-сертификатов, ночные перезагрузки — не превращались в шквал ложных алертов в Telegram и не портили статистику uptime. Вы заранее декларируете «вот в этот час сайт может быть недоступен», и мониторинг это уважает.
4 типа окон
Поле type принимает одно из четырёх значений (enum в миграции 2026_02_13_204016_create_maintenance_windows_table.php). Тип определяет, какие дополнительные поля обязательны:
| Тип | Когда повторяется | Обязательные поля | Пример |
|---|---|---|---|
once |
Один раз | scheduled_date, start_time, duration_minutes |
Миграция БД 12 мая 03:00, 90 минут |
daily |
Каждый день | start_time, duration_minutes |
Ночной бэкап в 02:00, 30 минут |
weekly |
Каждую неделю в указанный день | day_of_week (0–6, 0=воскресенье), start_time, duration_minutes |
По воскресеньям в 04:00, 60 минут |
monthly |
Каждый месяц в указанное число | day_of_month (1–31), start_time, duration_minutes |
1-го числа в 03:00, 120 минут |
Поле start_time хранится как TIME (HH:MM:SS), duration_minutes — unsignedSmallInteger (до 65535 минут, на практике редко больше суток). active = true по умолчанию — окно можно временно деактивировать без удаления, поставив active = false (полезно, когда плановое ТО приостановлено).
Если day_of_month указан больше, чем дней в текущем месяце (31 в феврале), окно в этом месяце просто не активируется — без ошибки.
Как настроить
На странице URL в личном кабинете найдите блок «Окна обслуживания». Нажмите «Добавить окно», в форме:
- Выберите тип (
once,daily,weekly,monthly). - Заполните обязательные для этого типа поля (см. таблицу выше).
- Укажите время начала и длительность в минутах.
- Нажмите «Сохранить».
Окно становится активным сразу. Список окон у URL отображается с указанием типа и расписания; неактивные окна показаны серым.
API
Окнами обслуживания можно управлять через REST API. Эндпоинт принимает тип, время и длительность; поля валидируются по тому же контракту, что и UI.
# Еженедельное окно: каждое воскресенье 04:00 на 60 минут
curl -X POST https://tracker.ru/api/v1/urls/123/maintenance-windows \
-H "Authorization: Bearer <api_token>" \
-H "Content-Type: application/json" \
-d '{
"type": "weekly",
"day_of_week": 0,
"start_time": "04:00:00",
"duration_minutes": 60,
"active": true
}'
# Разовое окно: миграция 12 мая 03:00 на 90 минут
curl -X POST https://tracker.ru/api/v1/urls/123/maintenance-windows \
-H "Authorization: Bearer <api_token>" \
-H "Content-Type: application/json" \
-d '{
"type": "once",
"scheduled_date": "2026-05-12",
"start_time": "03:00:00",
"duration_minutes": 90
}'
API доступен на тарифах с включённым has_api (Pro). Для управления через UI наличие API не требуется.
Часовой пояс
Все значения start_time интерпретируются в часовом поясе вашего профиля (User.tz, по умолчанию Europe/Moscow). Это касается и UI (форма показывает локальное время), и Go-чекеров (функция IsURLInMaintenance(urlID, userTz) принимает TZ юзера и применяет его к расписанию окна).
Практические следствия:
- Один пользователь — один TZ. Если у вашей команды разные часовые пояса, окно работает по TZ владельца URL.
- Переход на летнее время. Россия летнее время не использует, проблема возникает только для пользователей с TZ европейских стран. В моменты перевода стрелок окна смещаются вместе с локальным временем.
- Окно через полночь. Если
start_time = 23:30,duration_minutes = 60— окно закроется в 00:30 следующих суток. Поведение корректное.
Часовой пояс профиля меняется в /my/profile и применяется к новым проверкам со следующего раунда.
Поведение алертов
Что происходит внутри окна:
- Проверки идут как обычно. TCP/HTTP-чекеры не останавливаются — мы продолжаем собирать историю в
check_log, считать статистику. - Уведомления о
downне отправляются. Если URL упал внутри окна, алерт в Telegram/MAX/Email/Webhook не уходит. ФункцияIsURLInMaintenanceвызывается перед отправкой в каждом из notification-воркеров (telegram, email, webhook). - Recovery-уведомления тоже не отправляются, если первый успешный чек после восстановления попадает в окно. Это нужно, чтобы не отчитываться об «успешном восстановлении» прямо в середине деплоя — реальное состояние ещё не подтверждено.
Когда окно заканчивается:
- Если URL к этому моменту восстановился — поведение зависит от того, был ли отправлен
down-алерт ДО окна. Если падение случилось внутри окна и закончилось внутри окна — пользователь не получит ни алерта, ни recovery (ровно то, что мы и хотим). - Если падение пережило окно и продолжается после — следующая проверка после окончания окна снова пройдёт через стандартный пайплайн уведомлений и
down-алерт уйдёт.
Лимиты по тарифу
Количество окон обслуживания на одного пользователя ограничено тарифом (поле max_maintenance_windows в PlanSeeder):
| Тариф | Максимум окон |
|---|---|
| Free | 0 |
| Basic | 3 |
| Pro | 10 |
Лимит проверяется через PlanLimitService::canAddMaintenanceWindow при создании окна. На Free-тарифе функция полностью отключена — для регулярного использования нужен Basic или Pro. На Basic трёх окон достаточно для типового сценария «ежедневный бэкап + еженедельная ротация + разовая миграция»; на Pro десять окон закрывают и более сложные расписания.
Лимит считается по всем URL пользователя суммарно: одна точка может иметь несколько окон, но общее количество не должно превышать тарифный лимит.
Связанные статьи
- /docs/features/tcp-monitoring — TCP-мониторинг портов баз данных и очередей.
- /docs/features/keyword-check — проверка ключевого слова в HTML-ответе.
- /docs/notifications/telegram — настройка Telegram-уведомлений.
- /docs/notifications/webhooks — Webhook с подписью HMAC-SHA256.