Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

Bash, rsync, Linux

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

Будем считать, что что Вы уже имеет доступ к серверу через ssh , а у вашего пользователя на сервере, который управляет сайтом есть права доступа, с помощью которых он может делать дамп базы данных.

Структура каталога со скриптами

Для выполнения резервирования медиа файлов и дампа базы данных потребуется написать несколько скриптов:

  • Основной скрипт
  • Скрипт для создания дампа, который будет выполняться на удалённом сервере
  • Скрипт для удаления дампа на удалённом сервере, чтобы не тратить зря драгоценное дисковое пространство

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

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

create_dump.sh

Когда пользователь входит на сервер, он оказывается в своей домашней директории. Поэтому и скрипты будем писать исходя из того, что находимся в данной домашней директории.

#!/bin/bash

# Запомним время создания дампа
current_date=$(date +"%Y_%m_%d_%H:%M:%S")

# Создадим директорию, куда сохраним дамп
mkdir db_dumps 
# создадим дамп
pg_dump database_name > ~/db_dumps/db_$current_date
# отключимся от сервера
exit

Я создаю директорию для дампа потому, что так проще будет скрипт для вызова rsync, просто сливаем весь дамп в какую-нибудь директорию и всё. При это другие версии дампа, которые мы скачали раннее не будут удаляться, даже если они не существуют в директории db_dumps.

remove_dump.sh

Скрипт для удаления дампа с удалённого сервера

#!/bin/bash

# удалим директорию с дампом базы данных
rm -rf db_dumps
# отключимся от сервера
exit

backup.sh

А теперь время для самого главного скрипта, который всё соберёт вместе

#!/bin/bash

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

# Создадим дампа базы данных
ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"

# Скачаем дамп в каталог backup
rsync -av --progress username@111.222.333.444:~/db_dumps ~/backup

# Скачаем медиа файлы в каталог backup
rsync -av --progress username@111.222.333.444:~/virtual_env/yourproject/media ~/backup

# Удалим дамп с удалённого сервера
ssh username@111.222.333.444  'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_REMOVE_DUMP"

В данном случае делаем подключение по ssh с указанием имени пользователя и IP адреса сервера.

Данная строка передаёт на исполнение на удалённом сервере скрипт create_dump.sh с вашего локального ПК

ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"
A
10 августа 2018 г. 6:05

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

10 августа 2018 г. 8:09

Добрый день!

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



A
10 августа 2018 г. 8:46

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

A
10 августа 2018 г. 8:54

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

я на баше не писатель, поэтому у меня так:
#!/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"

ну и потом крон.
и да, из такого бэкапа я восстанавливался.
10 августа 2018 г. 8:58

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

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

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

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

10 августа 2018 г. 9:01

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

A
10 августа 2018 г. 9:05

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

A
10 августа 2018 г. 9:11

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

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



10 августа 2018 г. 11:01

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

A
10 августа 2018 г. 11:34

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

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

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

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

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

10 августа 2018 г. 12:08

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

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
ДД
13 декабря 2018 г. 16:24
Дмитрий Дубовик

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
13 декабря 2018 г. 16:04
Metelev

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
YC
12 декабря 2018 г. 18:49
Yaroslav Chernetskyi

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
Последние комментарии
V
15 декабря 2018 г. 2:06
Vlad15007

Спасибо большое!Очень помогли!
11 декабря 2018 г. 21:01
Евгений Легоцкой

Не знаю, какой-там конкретно эффект и если честно не хочется fl studio ради того, чтобы посмотреть устанавливать, но из того, что увидел в интернете. Предполагаю, что то, что вы хотите с...
V
11 декабря 2018 г. 19:25
Vlad15007

Подскажите пожалуйста ( я новичок совсем)Можно ли организовать спрайт без этого окошка (как в fl studio fruity dance)?
11 декабря 2018 г. 15:06
Евгений Легоцкой

Что интересно, если написать так from <application_name>.<module_name> import <filename> ,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, ко...
11 декабря 2018 г. 14:52
Илья Чичак

Тут мне тоже есть что сказать=) Сами разрабы советуют импортировать следующим образом: from <application_name> import <module_name> Стоит избегать from . import &l...;
Сейчас обсуждают на форуме
17 декабря 2018 г. 17:55
Евгений Легоцкой

Просчитывать перекрытие точек и не отрисовывать те точки, которые перекрываются другими. У вас их просто слишком много, нужно смотреть, какие можно не отрисовывать без потери информативн...
R
16 декабря 2018 г. 14:41
RED_Spider

перевірено все працює http://doc.qt.io/qt-5/appicon.html Setting the Application Icon on Windows First, create an ICO format bitmap file that contains the icon image. This ca...
16 декабря 2018 г. 11:26
Евгений Легоцкой

Только статические методы и участники класса можно вызывать подобным образом Cell::sum У вас же они нестатические, чтобы их вызывать, нужно иметь объект Cell. Вы его, конечно, со...
q
15 декабря 2018 г. 23:02
qdu10719

Понял, спасибо большое
БГ
14 декабря 2018 г. 17:44
Булат Гиниятов

Большое всем спасибо за помощь! Использую вариант с QList.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы