Docker-уведомления

Уведомления о сбоях Docker-контейнеров на телефон.

Контейнер упал, рестартнулся или не прошёл health check — зашифрованный push на телефон за одну команду.

Зачем Nerve для Docker

Docker-контейнеры падают тихо. Restart policy скрывает crash. Unhealthy-контейнер отдаёт ошибки. Nerve отправляет зашифрованный push на телефон в момент сбоя — без дашбордов и email-рассылок.

Отслеживание docker events

docker events --filter event=die --format '{{.Actor.Attributes.name}} exited' \
  | while read -r line; do echo "$line" | nerve send; done

Cron: проверка unhealthy-контейнеров

# /etc/cron.d/nerve-docker-check
*/2 * * * * root docker ps --filter "health=unhealthy" --format "unhealthy: {{.Names}}" \
  | nerve send --severity critical 2>/dev/null || true

Docker Compose: watcher-сервис

services:
  app:
    image: my-app:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      retries: 3

  nerve-watcher:
    image: alpine:latest
    depends_on:
      - app
    environment:
      - NERVE_DSN=nerve://TOKEN:[email protected]
    entrypoint: /bin/sh -c
    command: |
      apk add --no-cache curl docker-cli &&
      while true; do
        UNHEALTHY=$(docker ps --filter "health=unhealthy" --format "{{.Names}}")
        if [ -n "$UNHEALTHY" ]; then
          echo "unhealthy: $UNHEALTHY" | nerve send --severity critical
        fi
        sleep 120
      done

Логи упавшего контейнера

CONTAINER="my-app"
docker wait "$CONTAINER" && \
  docker logs --tail 20 "$CONTAINER" 2>&1 \
  | nerve send --severity critical

Быстрый старт

go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
export NERVE_DSN="nerve://TOKEN:[email protected]"
echo "container my-app exited with code 137" | nerve send

FAQ

Что считать инцидентом

Не каждый restart контейнера требует push. Для dev-сервера это может быть нормой. Для production полезнее алертить на restart loop, exited контейнер, unhealthy status или заполнение /var/lib/docker.

docker ps --filter "health=unhealthy" --format '{{.Names}}' \
  | while read -r name; do
      echo "Docker unhealthy: $name on $(hostname)" | nerve send --severity critical
    done

Compose project name

Если на сервере несколько compose-проектов, добавляйте project name в сообщение. Иначе на телефоне будет непонятно, какой именно web или worker упал.

Как получить уведомление о падении контейнера?

Используйте docker events или cron-скрипт, проверяющий docker ps на unhealthy/exited контейнеры, и передайте вывод в nerve send.

Nerve работает с Docker Compose?

Да. Сохраните NERVE_DSN как переменную окружения и добавьте watcher-сервис или cron-проверку.

Уведомления зашифрованы?

Да. Payload шифруется end-to-end. Relay видит только шифротекст.