Skip to content

Instantly share code, notes, and snippets.

@ifgeny87
Created July 12, 2022 12:04
Show Gist options
  • Select an option

  • Save ifgeny87/8cc4e6e548a6923d63ad1091f224c3b5 to your computer and use it in GitHub Desktop.

Select an option

Save ifgeny87/8cc4e6e548a6923d63ad1091f224c3b5 to your computer and use it in GitHub Desktop.
PG dump & restore in Docker containers
# Скрипт выполняет бэкап на удаленном сервере, скачивает дамп и разворачивает на локальной БД
# Операции dump и restore выполняются внутри контейнера с БД чтобы сохранить версию
HOST="server.pro"
PORT=1234
NOW=$(date +"%Y-%m-%d_%H%M%S")
ARCNAME="database_${NOW}.dump"
REMOTE_DIR="/tmp"
REMOTE_CONTAINER="app_database_1"
REMOTE_DB="db_name"
REMOTE_DB_USER="db_user"
LOCAL_DIR="/tmp/backups"
LOCAL_CONTAINER="app_dev_db_1"
LOCAL_DB="dev_db_name"
LOCAL_DB_USER="developer"
echo "# [`date +%H:%M:%S`] Backup"
# Выполняется дамп через pg_dump, который находится в контейнере
ssh $HOST -p $PORT "docker exec $REMOTE_CONTAINER pg_dump -U $REMOTE_DB_USER -F c -b $REMOTE_DB > ${REMOTE_DIR}/${ARCNAME}"
echo "# [`date +%H:%M:%S`] Gzip"
# Оригнал .dump файла будет удален
ssh $HOST -p $PORT "gzip ${REMOTE_DIR}/${ARCNAME}"
echo "# [`date +%H:%M:%S`] Copy backup to localhost"
scp -P $PORT $HOST:${REMOTE_DIR}/${ARCNAME}.gz ${LOCAL_DIR}/${ARCNAME}.gz
echo "# [`date +%H:%M:%S`] Remove backup file from remote server"
# Не забываем удалить дамп на сервере
ssh $HOST -p $PORT "rm ${REMOTE_DIR}/${ARCNAME}.gz"
echo "# [`date +%H:%M:%S`] Restore backup in docker container"
# Выполняется восстановление через pg_restore, который находится в контейнере
gunzip -c ${LOCAL_DIR}/${ARCNAME}.gz | docker exec -i $LOCAL_CONTAINER pg_restore --no-owner -U $LOCAL_DB_USER --clean -d $LOCAL_DB
echo "# [`date +%H:%M:%S`] Update value to dev"
# выполняем SQL скрипт чтобы затереть креды и продовые данные
docker exec -i $LOCAL_CONTAINER psql -U $LOCAL_DB_USER $LOCAL_DB < $(dirname $0)/dev_update.sql
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment