Evgenii Legotckoi
Evgenii LegotckoiТам. 9, 2018, 4:29 Т.Ж.

Қашықтағы серверден дерекқор дампін және медиа файлдарын жасауға және жүктеп алуға арналған Bash сценарийі

В процессе разработки сайта на 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, 2:05 Т.Ж.

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

Evgenii Legotckoi
  • Там. 10, 2018, 4:09 Т.Ж.

Добрый день!

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



A
  • Там. 10, 2018, 4:46 Т.Ж.

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

A
  • Там. 10, 2018, 4: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, 4:58 Т.Ж.

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

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

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

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

Evgenii Legotckoi
  • Там. 10, 2018, 5:01 Т.Ж.

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

A
  • Там. 10, 2018, 5:05 Т.Ж.

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

A
  • Там. 10, 2018, 5:11 Т.Ж.

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

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



Evgenii Legotckoi
  • Там. 10, 2018, 7:01 Т.Ж.

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

A
  • Там. 10, 2018, 7:34 Т.Ж.

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

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

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

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

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

Evgenii Legotckoi
  • Там. 10, 2018, 8:08 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз