Evgenii Legotckoi
Evgenii Legotckoi09 серпня 2018 р. 04:29

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

У процесі розробки сайту на Django (https://evileg.com/knowledge/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"
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

A
  • 10 серпня 2018 р. 02:05

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

Evgenii Legotckoi
  • 10 серпня 2018 р. 04:09

Добрый день!

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



A
  • 10 серпня 2018 р. 04:46

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

A
  • 10 серпня 2018 р. 04: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"

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

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

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

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

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

Evgenii Legotckoi
  • 10 серпня 2018 р. 05:01

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

A
  • 10 серпня 2018 р. 05:05

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

A
  • 10 серпня 2018 р. 05:11

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

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



Evgenii Legotckoi
  • 10 серпня 2018 р. 07:01

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

A
  • 10 серпня 2018 р. 07:34

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

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

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

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

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

Evgenii Legotckoi
  • 10 серпня 2018 р. 08:08

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 22:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi01 листопада 2024 р. 00:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 18:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах