Отказ веб-сервиса: порядок реагирования
Регламент действий при недоступности размещённого сервиса — от подтверждения оповещения до подтверждения восстановления
miki/otkaz-veb-servisa-poryadok-reagirovaniya · v1
Регламент действий при недоступности размещённого сервиса — от подтверждения оповещения до подтверждения восстановления
Когда применять. Получено оповещение о недоступности веб-сервиса либо отказ замечен самостоятельно.
Порядок построен так, чтобы каждый шаг отсекал целый класс причин, а не проверял наугад. Пропуск первых трёх шагов — самая частая потеря времени: диагностируют приложение, когда недоступна сеть.
1. Подтверждение оповещения
Прежде чем диагностировать сервер, убедиться, что маршрут до него существует.
curl -s -o /dev/null -w '%{http_code}\n' https://github.com- Код 200 — связь есть, продолжать
- Пустой ответ — устранять связь, сервер ни при чём
Открыть status.equiply.ru. При её отказе в Telegram поступает отдельное оповещение от watchdog.
curl -s -o /dev/null -w '%{http_code}\n' https://status.equiply.ru- Мониторинг отвечает — оповещению можно доверять
- Не отвечает — наблюдение за сайтами прекращено, это самостоятельный инцидент
Мониторинг наблюдает мир из одной точки. Рабочая станция — вторая независимая.
curl -sS -o /dev/null -w 'код %{http_code}, время %{time_total}s\n' https://ДОМЕН- Результат совпал с оповещением — отказ подтверждён
- Сервис открывается — проверять маршрут от мониторинга, а не сервис
Масштаб определяет объект восстановления. Один домен — восстанавливается приложение. Несколько доменов одного сервера — восстанавливается сервер, поочерёдная проверка сайтов бессмысленна.
2. Оценка масштаба
Заголовок содержит ответ: «netcup: не отвечают 3 из 16 сайтов» либо «ttinv.ru не отвечает».
- Указан сервер — переходить к серверу
- Указан домен — переходить к его проекту
python3 -c "import yaml,pathlib; d=yaml.safe_load(pathlib.Path('/home/mike/Projects/arch-hq/registry/servers.yml').read_text()); [print(s['name'], [x['host'] for x in (s.get('sites') or [])]) for s in d['servers']]"3. Идентификация проекта
Задача уже создана в репозитории затронутого проекта, в её тексте перечислено всё семейство.
repo-for --all ДОМЕН- Возвращён arch-hq — репозиторий не установлен, диагностика только по логам
4. Подключение к серверу
Параметры доступа находятся в ~/.ssh/config и порождаются из реестра серверов.
ssh netcup # либо servicest4, brave- Подключение не устанавливается — перейти к шагу о недоступности сервера
Остаётся панель управления хостингом и перезагрузка. Ссылки на панели в реестре ОТСУТСТВУЮТ — известный пробел.
5. Установление причины
docker ps --format '{{.Names}}\t{{.Status}}' | grep -v healthy- Контейнер отсутствует в выводе — он не запущен, проверить docker ps -a
docker logs --tail 200 --timestamps КОНТЕЙНЕР 2>&1 | tail -60- Искать строки error, failed, denied, exit code
- Журнал пуст — проверить docker inspect КОНТЕЙНЕР --format '{{.State}}'
df -h / && free -m && docker system df- Свободно менее 10% — причина установлена
docker ps --format '{{.Names}}\t{{.RunningFor}}' | sort -k2Дальнейшие действия принимает человек. Ниже перечислено допустимое, а не предписанное. Автоматическое восстановление промышленной среды не применяется: видов отказа много, а сценарий автоматического исправления один.
6. Восстановление
Наименее затратное действие, если причина в зависшем процессе, а не в коде.
docker compose restart СЕРВИС- НЕ применять docker compose down — приводит к потере томов и кэшей
- НЕ применять docker system prune без фильтра
Исправить в локальной копии, отправить в main. Развёртывание выполняется автоматически.
7. Подтверждение восстановления
Мониторинг фиксирует восстановление и направляет отдельное сообщение.
- Оповещение не поступило в течение 5 минут — проверить сервис вручную
В том репозитории, где она создана. Указать установленную причину и выполненные действия.
gh issue close НОМЕР -R mikey-semy/РЕПОЗИТОРИЙ -c 'причина: … ; выполнено: …'Не реализовано на текущий момент — перечень приводится намеренно:
- ссылки на панели управления хостингом для случая недоступности SSH
- учёт ложных срабатываний: каждое падение считается новым
- окно тишины на время развёртывания — собственное изменение способно вызвать оповещение
- приоритет по владельцу: простой клиентского сервиса равнозначен собственному
Пересмотр — после месяца эксплуатации. Фиксировать следует не то, что сработало, а то, чего недоставало в момент инцидента.

