# Docker — Backup (Резервное копирование данных)

Эта страница описывает способы резервного копирования данных Docker-проектов. Здесь разобраны методы backup контейнерных данных, volumes и баз данных, а также способы восстановления данных. Материал рассчитан на начинающих и помогает понять, **как защитить данные Docker-приложений от потери при сбоях, обновлениях или ошибках администрирования**.

---

# Почему резервное копирование важно

Docker-контейнеры можно легко пересоздать, но **данные приложения могут быть потеряны**, если они не вынесены в volumes или не сохраняются отдельно.

Резервное копирование особенно важно для:

* баз данных
* пользовательских файлов
* загрузок
* конфигураций приложения
* логов

Даже небольшая ошибка (например, удаление volume) может привести к потере данных.

---

# Что нужно резервировать

В Docker-проектах обычно нужно делать backup:

| Тип данных       | Пример             |
| ---------------- | ------------------ |
| Базы данных      | MySQL, PostgreSQL  |
| Docker volumes   | данные контейнеров |
| Файлы приложения | uploads, storage   |
| Конфигурации     | .env, config       |

---

# Backup базы данных из контейнера

Самый распространённый способ — использовать встроенные утилиты базы данных.

---

## Backup MySQL

```bash id="kvx7ep"
docker compose exec mysql mysqldump -u root -p database_name > backup.sql
```

Эта команда:

1. подключается к контейнеру MySQL
2. делает дамп базы
3. сохраняет файл `backup.sql`

---

## Backup PostgreSQL

```bash id="ecv8u4"
docker compose exec postgres pg_dump -U postgres database_name > backup.sql
```

---

# Backup Docker Volume

Если данные хранятся в volume, можно сделать архив.

---

## Создание backup volume

```bash id="fd9n6h"
docker run --rm \
  -v volume_name:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/volume_backup.tar.gz /data
```

### Что делает команда

| Параметр             | Назначение           |
| -------------------- | -------------------- |
| -v volume_name:/data | подключает volume    |
| -v $(pwd):/backup    | папка для сохранения |
| tar czf              | создаёт архив        |

В результате появится файл:

```text id="f6a6fy"
volume_backup.tar.gz
```

---

# Восстановление volume

Чтобы восстановить данные из backup:

```bash id="op9dpp"
docker run --rm \
  -v volume_name:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/volume_backup.tar.gz -C /
```

Данные будут восстановлены в volume.

---

# Backup директории проекта

Иногда нужно сохранить весь Docker-проект.

---

## Архив проекта

```bash id="zuybb6"
tar -czf project_backup_$(date +%Y%m%d).tar.gz /opt/flamy_projects/site1
```

Архив будет содержать:

* docker-compose.yml
* Dockerfile
* исходный код
* конфигурации

---

# Backup пользовательских файлов

Если приложение хранит файлы в директории:

```text id="0nh8k0"
/var/www/storage
```

Можно сделать backup так:

```bash id="reye7v"
tar -czf storage_backup.tar.gz storage/
```

---

# Backup через rsync

`rsync` часто используется для копирования backup на другой сервер.

```bash id="tbj02p"
rsync -avz /opt/flamy_projects user@backup-server:/backup/docker_projects
```

Это позволяет хранить резервные копии **на отдельном сервере**.

---

# Автоматизация backup (cron)

Backup можно запускать автоматически.

Пример cron-задачи:

```bash id="t8gmyc"
crontab -e
```

Добавить строку:

```text id="zslg7o"
0 3 * * * /usr/local/bin/docker_backup.sh
```

Это будет запускать backup каждый день в 03:00.

---

# Пример простого backup-скрипта

```bash id="f3khr0"
#!/bin/bash

DATE=$(date +%Y%m%d)

docker compose exec mysql mysqldump -u root -psecret db > backup_$DATE.sql

tar -czf docker_backup_$DATE.tar.gz /opt/flamy_projects/site1
```

Скрипт делает:

* дамп базы
* архив проекта

---

# Проверка backup

Очень важно проверять резервные копии.

Проверить архив:

```bash id="tk4s3d"
tar -tzf backup.tar.gz
```

Проверить SQL-дамп:

```bash id="kchp9s"
head backup.sql
```

---

# Типичные ошибки при backup

## Backup только контейнеров

Контейнеры легко пересоздаются, поэтому важно сохранять **данные**, а не контейнеры.

---

## Отсутствие автоматического backup

Ручной backup часто забывают делать.

Лучше использовать cron.

---

## Хранение backup на том же сервере

Если сервер выйдет из строя, backup тоже может быть потерян.

Лучше хранить копии:

* на другом сервере
* в облаке
* в S3-хранилище

---

# Рекомендуемая стратегия backup

Минимальная стратегия:

* ежедневный backup базы данных
* ежедневный backup volumes
* хранение копий минимум 7 дней

---

# Краткая памятка

```bash id="22r5v7"
docker compose exec mysql mysqldump > backup.sql   # backup MySQL
docker compose exec postgres pg_dump > backup.sql  # backup PostgreSQL

docker run -v volume:/data alpine tar czf backup.tar.gz /data   # backup volume

tar -czf project_backup.tar.gz project/            # архив проекта
rsync -avz project backup-server:/backup           # копирование backup
```