Автоматический бэкап PostgreSQL с пингом в мониторинг

Настроим pg_dump + curl + cron внутри Docker-контейнера

Зачем это нужно

Бэкапы баз данных — обязательная часть любой надёжной инфраструктуры. Но ещё важнее быть уверенным, что бэкап действительно выполняется каждый день. Мы настроим автоматический экспорт базы PostgreSQL с помощью pg_dump, а затем отправим HTTP-пинг в ваш мониторинг-сервис, чтобы быть уверенным, что задача сработала.

Шаг 1: Dockerfile

Создаём Docker-образ, в котором установлены PostgreSQL клиент, curl и cron:

FROM debian:bookworm

RUN apt-get update && \
    apt-get install -y postgresql-client cron curl && \
    mkdir /backup

COPY backup.sh /backup/backup.sh
RUN chmod +x /backup/backup.sh

COPY crontab.txt /etc/cron.d/pgbackup
RUN chmod 0644 /etc/cron.d/pgbackup && crontab /etc/cron.d/pgbackup

CMD ["cron", "-f"]

Что здесь происходит: мы устанавливаем нужные утилиты, копируем скрипт и расписание в контейнер, и запускаем cron как основной процесс.

Шаг 2: Скрипт backup.sh

Скрипт, который делает дамп базы и отправляет сигнал в мониторинг:

#!/bin/bash
START_URL="https://ev.okchecker.ru/p/<api-key>/backup-db?status=start"
SUCCESS_URL="https://ev.okchecker.ru/p/<api-key>/backup-db?status=success"
FAIL_URL="https://ev.okchecker.ru/p/<api-key>/backup-db?status=fail"

curl -fsS "$START_URL" || true

if pg_dump -U postgres -h db -F c -f "/backups/db_$(date +%F_%H-%M-%S).sql"; then
  curl -fsS "$SUCCESS_URL" || true
else
  curl -fsS "$FAIL_URL" || true
fi

Здесь мы используем pg_dump для создания файла с дампом, а после — отправляем пинг (HTTP GET-запрос) в наш мониторинг.

Шаг 3: crontab.txt

0 2 * * * root /backup/backup.sh >> /var/log/cron.log 2>&1

Эта строка говорит cron: «запускай скрипт каждый день в 02:00». Все логи сохраняются в /var/log/cron.log.

Шаг 4: docker-compose.yml

Оркестрируем всё с помощью Docker Compose:

version: '3.8'
services:
  postgres:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data

  backup:
    build: ./backup
    environment:
      PGPASSWORD: mypass
    depends_on:
      - postgres
    volumes:
      - ./backups:/backup

volumes:
  pgdata:

Важно: переменная PGPASSWORD нужна для pg_dump, чтобы он мог подключиться к базе без интерактива.

Проверка

Соберите контейнер и убедитесь, что бэкап работает и в вашем мониторинге появляется пинг каждый день. Например:

docker-compose up --build -d

Итог

Теперь у вас есть надёжная схема: бэкап работает каждый день, и вы получаете подтверждение в monitoring-сервис. Если что-то пойдет не так — вы узнаете об этом первым.

Начать мониторинг