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 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

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

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

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

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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