Бекенд на C# Web Api

To Kaiten

Логирование и бекапы БД

Рассмотрим как включать логирование БД, смонтировать файлы логов на хост машину и включить автоматическое создание бекапов БД.

Логирование

Настройка конфига БД

Все настройки БД находятся в файле postgresql.conf внутри контейнера БД. Нужно отредактировать этот файл и перезапустить контейнер.

  • Заходим внутрь контейнера БД:

docker exec -it <CONTAINER ID> bash # CONTAINER ID - id контейнера БД
  • устанавливаем утилиту nano для редактирования файлов:

apt-get update
apt-get install nano
  • Открываем файл конфига:

nano /var/lib/postgresql/data/dbcase/postgresql.conf 
# Вместо dbcase у вас может быть другая папка!
  • Ищем эти строчки и убираем комментарии с них:

logging_collector = on
log_directory = 'log'              # каталог для хранения логов
log_filename = 'postgresql-%a.log' # имя файла с логами
log_statement = 'all'              # логировать все запросы (можно поменять на 'ddl' или 'mod')
log_min_error_statement = error    # логировать все ошибки
log_min_messages = warning         # минимальный уровень сообщений для логирования

log_statement = 'all' может логировать слишком много информации. Для dev среды можно оставить, но в prod лучше включать ddl или mod.

  • Перезапустите сервис:

docker compose -f docker-compose-dev.yml restart

После этих шагов логи будут записываться в директорию /var/lib/postgresql/data/dbcase/log/.

Монтирование логов на хост

Для того чтобы сохранять логи при перезапуске или остановке контейнера БД их можно смонтировать на хост. Для этого вносим изменения в compose файлы и добавляем новый volume:

Теперь логи будут храниться на локальной машине в директории docker/logs.

Бекапы

Bash Скрипт

Создаем файл postgresql-backup.sh в корневой директории приложения (там же где располагаются compose файлы). Редактируем файл следующим образом:

#!/bin/bash

PGUSER="agava"
PGPASSWORD="somestrongpassword"
PGHOST="localhost"
PGDATABASE="demo-webapi"

BACKUP_DIR="/home/DemoWebApi/postgresql-backup"

TIMESTAMP=$(date +"%F_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/${PGDATABASE}_$TIMESTAMP.sql"

docker exec -t postgres pg_dump -U $PGUSER -d $PGDATABASE > $BACKUP_FILE

find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm -f {} \;

echo "Backup completed: $BACKUP_FILE"

# how to restore:
# docker exec -i your_postgres_container_name psql -U $PGUSER -d $PGDATABASE < /path/to/backup_file.sql

Разберем скрипт:

  • PGUSER, PGPASSWORD, PGHOST, PGDATABASE — параметры для подключения к PostgreSQL. Необходимо указать такие же параметры, какие прописаны в файле appsettings.json. Единственное, PGHOST должен быть localhost.

  • BACKUP_DIR — директория, где будут храниться файлы резервных копий. Проверьте что директория существует.

  • TIMESTAMP — текущая дата и время, чтобы файлы резервных копий были уникальными и легко различимыми.

  • BACKUP_FILE — полный путь к файлу резервной копии, включающий имя базы данных и временную метку.

  • docker exec -t postgres pg_dump -U $PGUSER -d $PGDATABASE > $BACKUP_FILE — выполняет команду pg_dump внутри контейнера Docker с именем postgres, чтобы создать дамп базы данных demo-webapi и сохранить его в файл $BACKUP_FILE.

  • find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm -f {} \; — ищет в каталоге $BACKUP_DIR все файлы .sql, которым более 7 дней, и удаляет их.

  • echo "Backup completed: $BACKUP_FILE" — выводит сообщение об успешном создании резервной копии и указывает путь к ней.

Автоматический запуск

Приведенный выше скрипт можно запускать вручную, но гораздо лучше настроить автоматический запуск. Для этого воспользуемся утилитой cron.

  • Открываем редактор crontab:

crontab -e
  • Добавляем строку:

0 2 * * * /home/DemoWebApi/postgresql-backup.sh >> /var/log/postgresql-backup.log 2>&1
  • Сохраняем и закрываем редактор (можно через Ctrl + X).

Разбор строки:

  • 0 2 * * * — расписание:

    • 0 — минута (в начале часа),

    • 2 — час (2:00 ночи),

    • * * * — каждый день, каждый месяц, любой день недели.

  • /home/DemoWebApi/postgresql-backup.sh — путь к скрипту, который выполняет резервное копирование базы данных.

  • >> /var/log/postgresql-backup.log — добавляет вывод скрипта в файл лога /var/log/postgresql-backup.log.

  • 2>&1 — перенаправляет ошибки (stderr) в тот же лог, что и стандартный вывод (stdout), чтобы все сообщения записывались в один файл.


Автор документа: Артём Ветик