Как сделать бекап базы данных postgres на удалённом сервере? Раньше я делал все руками. Я пробирался на сервер по ssh и запускал заранее подготовленные команды. Но теперь я стал поумнее и сделал задание для планировщика. Оно отрабатывает по расписанию и не нужно думать о своевременном создании бекапа. Покажу вам свой фирменный скрипт на bash. Он работает с контейнером докер. Мы сделаем бекап и вытащим файл с базой за пределы контейнера. Потом вы сможете скачать файл через FTP или утилитой rsync. Создайте файл backup.sh.
#!/usr/bin/bash
DATABASE_NAME='';
if [ -n "$1" ]
then
#echo db_name: $1;
DATABASE_NAME=$1;
else
echo No parameter db_name found
exit 1
fi
APP_PATH='';
if [ -n "$2" ]
then
#echo app_path: $2;
APP_PATH=$2;
else
echo No parameter app_path found
exit 1
fi
DOCKER_SERVICE_NAME='';
if [ -n "$3" ]
then
#echo docker_service_name: $3;
DOCKER_SERVICE_NAME=$3;
else
echo No parameter docker_service_name found
exit 1
fi
#exit 1;
DB_NAME=$(grep -v '^#' ${APP_PATH}/.env.local | grep -e "DB_POSTGRES_NAME" | sed -e 's/.*=//');
DB_PASS=$(grep -v '^#' ${APP_PATH}/.env.local | grep -e "DB_POSTGRES_PASS" | sed -e 's/.*=//');
FILE=${DATABASE_NAME}_db_$(date +%Y-%m-%d).sql;
BACKUP_DIR=~/backup_files/db/${DATABASE_NAME}/;
#echo $FILE;
#echo $DB_NAME;
#echo $DB_PASS;
#exit 1;
# переходим в папку проекта
cd ${APP_PATH}
# бекап базы данных, замените user на своего пользователя БД
docker compose exec ${DOCKER_SERVICE_NAME} pg_dump "dbname=${DB_NAME} password=${DB_PASS}" -U user -C -F p -b -v -E UTF8 -f ${FILE}
mkdir -p ${BACKUP_DIR}
# копирование файла из контейнера
docker cp ${DOCKER_SERVICE_NAME}:/${FILE} ${BACKUP_DIR}
# удаление файла из контейнера
docker compose exec ${DOCKER_SERVICE_NAME} rm -f ${FILE}
Я не стал удалять exit. Перед запуском скрипта проверьте все этапы. Для это разблокируйте exit 1. Вообще не должно быть ошибок! Теперь про особенности скрипта. Вы должны передать 3 параметра:
Теперь посмотрите как должна выглядеть задача для крона
# в воскресенье в полночь
0 0 * * 0 ~/cron/backup.sh db_name ~/you_apps/app sevice-app-db
# каждые 2 минуты для проверки
#*/2 * * * * ~/cron/backup.sh db_name ~/you_apps/app sevice-app-db