© 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"

Комментарии

10 августа 2018 г. 6:05

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

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

Добрый день!

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



Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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.

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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

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

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



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

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

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

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

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

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 октября 2018 г. 21:36
Allyans .

C++ - Тест 001. Первая программа и типы данных

  • Результат 60баллов,
  • Очки рейтинга-1
15 октября 2018 г. 11:25
Екатерина Самойлова

C++ - Тест 002. Константы

  • Результат 33баллов,
  • Очки рейтинга-10
15 октября 2018 г. 11:17
Екатерина Самойлова

C++ - Тест 006. Перечисления

  • Результат 80баллов,
  • Очки рейтинга4
Последние комментарии
10 октября 2018 г. 9:50
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Если и начинать писать о плагинах, то нужно тогда с Qt Creator начинать, там наверняка будет одинаковый принцип, но по Qt Creator хотя бы информация есть.
10 октября 2018 г. 9:48
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

О плагинах к QtCreator в целом, тоже интересно.
10 октября 2018 г. 9:46
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

ну типа того, создание программы, функционал которой можно расширять плагинами, и, в перспективе, создание API.
10 октября 2018 г. 8:31
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Типо как в Qt Creator? Самому бы интересно было о таком почитать. В данный момент я бы мог написать только о написании плагинов для Qt Designer. С этим есть некоторый опыт.
Сейчас обсуждают на форуме
15 октября 2018 г. 12:45
Allyans .

QGraphicsItem change color

Хорошо)
11 октября 2018 г. 10:13
Arrow

Работа с WebView в QML

Нашел в чем проблема. Пишу на случай если кому-то попадется такое же счастье с WebView как и мне. Проблема как оказалась с Debug версией, так как в Release и Profile все работает (...
10 октября 2018 г. 12:49
Виталий Антипов

Кто что делает на Qt?

Работаем по локальной сети. Файл базы, схемы и фото лежат на сервере. Чтобы не было проблем при одновременной работе с одним файлом, все запросы обернул в транзакции, как указано в документаци...
10 октября 2018 г. 11:21
Arrow

Редактирование записи на форуме

Добрый день! К сожалению встретил небольшой баг на форуме. При создании записи на форуме и вставке кода, через соответствующую кнопку номера строк проставляются верно, но каждый...
10 октября 2018 г. 9:46
Arrow

Настройка Qt Creator для Android

Я Genymotion  ставил с VBox в комплекте для личного использования, после добавил из списка телефон с нужным API. Запустил его и при компиляции Qt Creator сам нашел его и все запустилось...
Присоединяйтесь к нам в социальных сетях