Узнайте, как автоматизировать резервное копирование Django dumpdata в S3 без SSH. Одна команда для дампа, загрузки и выгрузки — настройте прямо сейчас.
Если вы используете cookiecutter-django на DigitalOcean и до сих пор заходите по SSH для каждого снятия дампа данных, эта статья для вас. Я покажу, как свернуть шесть ручных шагов в одну локальную команду: dump → pull → upload в S3. Никаких промежуточных действий.
Каждый раз перед миграцией или рискованным изменением схемы приходилось: заходить на сервер, переходить в папку проекта, запускать dumpdata внутри контейнера, копировать файл наружу, скачивать через scp, вручную загружать в S3. Шесть шагов — идеальная почва для ошибок copy-paste.
Наивный 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Почему эти флаги важны:
В контейнеризированном проекте команда должна выполняться внутри сервиса 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Две детали, которые вас укусят:
Вот полный пайплайн — 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-сессий, никаких промежуточных файлов на сервере.
С настроенным 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.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →