Бекенд на C# Web Api
Логирование и бекапы БД
Рассмотрим как включать логирование БД, смонтировать файлы логов на хост машину и включить автоматическое создание бекапов БД.
Все настройки БД находятся в файле 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 # минимальный уровень сообщений для логированияПерезапустите сервис:
docker compose -f docker-compose-dev.yml restartПосле этих шагов логи будут записываться в директорию /var/lib/postgresql/data/dbcase/log/.
Для того чтобы сохранять логи при перезапуске или остановке контейнера БД их можно смонтировать на хост. Для этого вносим изменения в compose файлы и добавляем новый volume:

Теперь логи будут храниться на локальной машине в директории docker/logs.
Создаем файл 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), чтобы все сообщения записывались в один файл.
Автор документа: Артём Ветик