ГлавнаяБлогАвтоматизация бэкапов Django dumpdata в S3 одной командой
Python

Автоматизация бэкапов Django dumpdata в S3 одной командой

Узнайте, как автоматизировать резервное копирование Django dumpdata в S3 без SSH. Одна команда для дампа, загрузки и выгрузки — настройте прямо сейчас.

Al
Редакция Algolitalgolit.ru
5 мин чтения9 июля 2026 г.

Проблема: ручные бэкапы Django отнимают время

Если вы используете cookiecutter-django на DigitalOcean и до сих пор заходите по SSH для каждого снятия дампа данных, эта статья для вас. Я покажу, как свернуть шесть ручных шагов в одну локальную команду: dump → pull → upload в S3. Никаких промежуточных действий.

Каждый раз перед миграцией или рискованным изменением схемы приходилось: заходить на сервер, переходить в папку проекта, запускать dumpdata внутри контейнера, копировать файл наружу, скачивать через scp, вручную загружать в S3. Шесть шагов — идеальная почва для ошибок copy-paste.

Шаг 1: правильный dumpdata

Наивный manage.py dumpdata > data.json выгружает всё, включая таблицы, которые не нужны в portable fixture и вызовут проблемы при loaddata в другом окружении:

python manage.py dumpdata \
    --natural-foreign --natural-primary \
    --exclude auth.permission \
    --exclude contenttypes \
    --exclude admin.logentry \
    --exclude sessions.session \
    --indent 2 \
    -o data.json

Почему эти флаги важны:

  • --natural-foreign --natural-primary — заменяют жёстко заданные первичные ключи на естественные. Без этого перезагрузка фикстуры в окружение с другими PK может молча сломать связи.
  • Исключение contenttypes, auth.permission, admin.logentry, sessions.session — эти таблицы либо авто-генерируются Django при свежей установке, либо являются операционным шумом. Их включение раздувает дамп и вызывает конфликты loaddata.
  • --indent 2 — делает вывод diff-табельным в git, если вы версионируете снапшоты.

Шаг 2: запуск внутри Docker правильно

В контейнеризированном проекте команда должна выполняться внутри сервиса django, а не на хосте:

docker compose -f docker-compose.production.yml exec -T django python manage.py dumpdata \
    --natural-foreign --natural-primary \
    --exclude auth.permission \
    --exclude contenttypes \
    --exclude admin.logentry \
    --exclude sessions.session \
    --indent 2 > data.json

Две детали, которые вас укусят:

  • Флаг -T отключает TTY. Без него exec выделяет псевдотерминал, что при скриптовом или piped SSH может вставить символы возврата каретки ( ) в вывод, молча повредив JSON. Всегда используйте -T для неинтерактивных дампов.
  • Перенаправление происходит справа от пайпа. Поскольку docker compose exec передаёт свой stdout, перенаправление > захватывает вывод чисто снаружи контейнера — не нужен отдельный docker compose cp.

Шаг 3: всё в один алиас

Вот полный пайплайн — SSH, дамп и стрим результата в локальный файл — одним алиасом:

alias dumpdata='ssh username@your-droplet-ip "cd ~/root/project && docker compose -f docker-compose.production.yml exec -T django python manage.py dumpdata --natural-foreign --natural-primary --exclude auth.permission --exclude contenttypes --exclude admin.logentry --exclude sessions.session --indent 2" > ~/Downloads/data.json'

Запустите dumpdata локально, и весь удалённый пайплайн выполнится, положив чистый data.json в папку Downloads. Никаких ручных SSH-сессий, никаких промежуточных файлов на сервере.

Шаг 4: отправка в S3

С настроенным AWS CLI (aws configure или именованный профиль):

aws s3 cp ~/Downloads/data.json s3://your-bucket/backups/data-$(date +%Y%m%d-%H%M%S).json

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

Если credentials не настроены, aws s3 cp упадёт с "Unable to locate credentials". Исправьте:

aws configure --profile your-profile

Использование именованного профиля вместо дефолтного стоит лишних нажатий, если вы управляете бэкапами для нескольких клиентов или проектов — это делает область действия credentials явной.

Финальный однострочник

alias dumpdata='ssh username@your-droplet-ip "cd ~/root/project && docker compose -f docker-compose.production.yml exec -T django python manage.py dumpdata --natural-foreign --natural-primary --exclude auth.permission --exclude contenttypes --exclude admin.logentry --exclude sessions.session --indent 2" > ~/Downloads/data.json && aws s3 cp ~/Downloads/data.json "s3://your-bucket/backups/data-$(date +%Y%m%d-%H%M%S).json" --profile your-profile'

Одна команда. Удалённый дамп, локальная выгрузка, загрузка в S3 с меткой времени.

Что дальше

Алиас удобен для ручных бэкапов, но у него нет обработки ошибок. Если SSH-соединение оборвётся или дамп вернётся пустым, вы счастливо загрузите испорченный файл. Следующий шаг — небольшой bash-скрипт с set -euo pipefail, проверкой размера файла перед загрузкой и cron-задачей на самом droplet, чтобы бэкапы выполнялись по расписанию.

Практический вывод: добавьте этот алиас в ваш .bashrc или .zshrc прямо сейчас. Замените username, ip, пути и bucket на свои. Следующий бэкап займёт одну секунду — просто наберите dumpdata.

#django#dumpdata#бэкапы#S3#docker
Al
Редакция Algolit

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

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →