Зачем это нужно
Бэкапы баз данных — обязательная часть любой надёжной инфраструктуры. Но ещё важнее быть уверенным, что бэкап действительно выполняется каждый день. Мы настроим автоматический экспорт базы 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-сервис. Если что-то пойдет не так — вы узнаете об этом первым.