Evgenii Legotckoi
Evgenii LegotckoiAug. 9, 2018, 4:29 a.m.

Bash script for creating and downloading a dump of a database and media files from a remote server

During the development of the site on Django had to start to understand the Bash scripts to automate routine tasks. For example, creating and downloading a database dump from a site, as well as reserving media files.

We assume that you already have access to the server via ssh , and your user on the server that manages the site has access rights, with which he can dump the database.


Directory structure with scripts

To perform backup of media files and a database dump, you will need to write several scripts:

  • The main script
  • A script to create a dump that will be executed on a remote server
  • Script to delete the dump on a remote server, so as not to waste valuable disk space

Структура будет следующей

./remote-scripts/create_dump.sh
./remote-scripts/remove_dump.sh
./backup.sh

create_dump.sh

When a user enters the server, it appears in its home directory. Therefore, we will write scripts based on the fact that we are in the given home directory.

#!/bin/bash

# Let's remember the time of creating a dump
current_date=$(date +"%Y_%m_%d_%H:%M:%S")

# Create a directory where we will save the dump
mkdir db_dumps 
# create a dump
pg_dump database_name > ~/db_dumps/db_$current_date
# disconnect from the server
exit

I create a directory for the dump, because it's easier to have a script to call rsync, just merge the entire dump into some directory and everything. However, other versions of the dump that we downloaded earlier will not be deleted, even if they do not exist in the db_dumps directory.

remove_dump.sh

Script to remove the dump from a remote server

#!/bin/bash

# delete the directory with the database dump
rm -rf db_dumps
# disconnect from the server
exit

backup.sh

And now the time for the most important script, which will collect everything together

#!/bin/bash

# Пути к скриптам
REMOTE_SCRIPTS_PATH="remote-scripts"
SCRIPT_PATH_CREATE_DUMP="create_dump.sh"
SCRIPT_PATH_REMOVE_DUMP="remove_dump.sh"

# Let's create a database dump
ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"

# Download the dump to the backup directory
rsync -av --progress username@111.222.333.444:~/db_dumps ~/backup

# Download media files to the backup directory
rsync -av --progress username@111.222.333.444:~/virtual_env/yourproject/media ~/backup

# Delete the dump from the remote server
ssh username@111.222.333.444  'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_REMOVE_DUMP"

In this case, we make a connection using ssh with the username and IP address of the server.

This line sends to the remote server the script create_dump.sh from your local PC

ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

A
  • Aug. 10, 2018, 2:05 a.m.

Приветствую! а почему pg_dump, а не Django'вское dumpdata?

Evgenii Legotckoi
  • Aug. 10, 2018, 4:09 a.m.

Добрый день!

Основной причиной я бы назвал то, что даже не обратил внимания на данный функционал в Django, как-то мимо прошло это. А потому, что сразу привык использовать функционал самой базы данных, да и нет необходимости дампить по отдельности приложения. Для бэкапа мне всё равно нужна вся база данных.



A
  • Aug. 10, 2018, 4:46 a.m.

так ./manage.py dumpdata > db.json дампит всю бд. но привычка это да, согласен

A
  • Aug. 10, 2018, 4:54 a.m.

не нашел как редактировать комент...

я на баше не писатель, поэтому у меня так:
#!/bin/bash
echo "Backup started"
date
cd /.
cd /home/user
source env/bin/activate
cd django-project/src
backup_file="production.json"
time_stamp=$(date +%d%m%g%H%M%S)
archive_file="$production_$time_stamp.zip"
python manage.py dumpdata --exclude auth.permission --exclude contenttypes > production.json
zip $archive_file /home/user/django-project/src/production.json
echo
echo "Backup finished"

ну и потом крон.
и да, из такого бэкапа я восстанавливался.
Evgenii Legotckoi
  • Aug. 10, 2018, 4:58 a.m.

да да. я понял, что оно может дампить всю базу, просто если функционал БД позволяет дампить всю базу и нет необходимости в дополнительном функционале, то и искать нет необходимости что-то ещё. Просто dumpdata, следуя документации, может дампить приложения по отдельности.

А если отдельно одно приложение дампить средствами БД, то придётся поразбираться дополнительно, ну или использовать dumpdata.
В использовании dumpdata пожалуй есть один неоспоримый плюс, независимость написания команды для дампа от самой базы данных. Впрочем... у нас много джангистов используют что-то иное, чем PostgreSQL? У меня сложилось впечатление, что для PostgreSQL гораздо больше плюшек под Django.
Evgenii Legotckoi
  • Aug. 10, 2018, 5 a.m.

Единственное, в чём недостаток этого dumpdata, по моему мнению в том, что он скорее всего будет медленнее работать, чем средства БД, как никак дополнительная обвязка на питоне. Может быть критично для выконагруженных сервисов.

Вы храните дамп на продакшен сервере? Или тоже скачиваете куда-нибудь?

Evgenii Legotckoi
  • Aug. 10, 2018, 5:01 a.m.

Редактирование комментариев я пока не прикручивал к сожалению, редактирование есть только на форуме. увы.

A
  • Aug. 10, 2018, 5:05 a.m.

медленно, особенно на больших объемах - совсем печаль. я храню, но только на локальных проектах.

A
  • Aug. 10, 2018, 5:11 a.m.

один вопрос меня мучает уже давно...это не даже не про бэкап.

если в созданную джангой таблицу базы данных средствами пострес добавить новую запись, что, как и где надо сделать со счечиком объектов джанги, чтобы ей не было больно при добавлении нового объекта? сорри за офтоп, уж давно мучает...



Evgenii Legotckoi
  • Aug. 10, 2018, 7:01 a.m.

Поточнее пожалуйста, не совсем понял про счётчик объектов Джанги.

A
  • Aug. 10, 2018, 7:34 a.m.

допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок.

далее, лично в моем случае , я открываю adminer, и в эту таблицу добавляю еще одну запись. зачем, не помню, эскперимента ради, наверное. потом снова идем в админку, пытаемся добавить еще объект, и получаем ошибку, что объект с таким id уже существует.
т.е. как я понимаю, счетчик объектов у django свой, и если кто по незнанию, или еще  как-то добавил объект мимо нее в таблицу, можно огрести неприятностей?
Evgenii Legotckoi
  • Aug. 10, 2018, 7:46 a.m.

Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто.

Пробовали добавить запись через adminer, перезапустить сайт полностью, и только потом  добавить ещё одну запись через Джанго?
A
  • Aug. 10, 2018, 8:06 a.m.

не, с тех пор боюсь делать такое)

Evgenii Legotckoi
  • Aug. 10, 2018, 8:08 a.m.

Ну я же не предлагаю на боевом сервере )))

Comments

Only authorized users can post comments.
Please, Log in or Sign up
e
  • ehot
  • March 31, 2024, 2:29 p.m.

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
B

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
B

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
a
a_vlasovApril 14, 2024, 6:41 a.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел ДорофеевApril 14, 2024, 2:35 a.m.
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrexApril 4, 2024, 4:47 a.m.
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
AC
Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

Follow us in social networks