Linux
July 31

Резервное копирование Docker контейнеров 

Предисловие

Эта статья была создана с помощью Chat GPT-4 на основе моей большой беседы с ней и отладки скрипта, а затем отредактирована мной. Я добился рабочего результата, но это касается только моего конкретного случая. Эта статья в первую очередь для того чтобы я сохранил свой собственный best way для достижения результата В статье могут быть ошибки, поэтому, пожалуйста, не рассматривайте её как единственно верное решение или истину в последней инстанции.

Введение

Резервное копирование Docker контейнеров является критически важным для обеспечения сохранности данных и конфигураций ваших приложений. В этой статье мы рассмотрим, как настроить автоматическое резервное копирование Docker контейнеров и конфигурационных файлов, используя скрипт bash и docker-backup. Также включим шаги по загрузке резервных копий на FTP-сервер для дополнительной безопасности.

Подготовка:
Docker Installation Guide
Docker Compose Installation Guide
lftp Official Site
Go Installation Guide
docker-backup on GitHub

Шаг 1: Установка необходимых инструментов

Прежде чем приступить к созданию резервных копий, убедитесь, что у вас установлены необходимые инструменты: docker, docker-compose, lftp, и docker-backup.

Установка lftp

Для загрузки резервных копий на FTP-сервер установите lftp:

sudo apt-get update
sudo apt-get install lftp

Установка Go

Для установки Go выполните следующие шаги:

1. Скачайте Go:

wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz

2. Распакуйте архив и установите Go:

sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz

3. Добавьте Go в PATH:

echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
source ~/.profile

Установка docker-backup

Скачайте и установите docker-backup с GitHub:

git clone https://github.com/muesli/docker-backup.git
cd docker-backup
go build
sudo mv docker-backup /usr/local/bin/

Шаг 2: Создание директории для резервных копий

Создайте директорию, в которой будут храниться резервные копии:

mkdir -p /root/backup

Шаг 3: Создание скрипта резервного копирования

Создайте скрипт резервного копирования, который будет выполнять все необходимые операции, включая создание резервных копий контейнеров, копирование файлов docker-compose.yml и загрузку на FTP-сервер.

Скрипт резервного копирования

Создайте файл /root/docker-backup/backup_script.sh и вставьте в него следующий код:

#!/bin/bash

# Директория для сохранения резервных копий
BACKUP_DIR="/root/backup"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR_TIMESTAMP="$BACKUP_DIR/$TIMESTAMP"

# Убедитесь, что директория для резервных копий существует
mkdir -p $BACKUP_DIR_TIMESTAMP/easyappointments
mkdir -p $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy

# Создание резервных копий всех контейнеров и томов
cd /root/docker-backup
./docker-backup backup easyappointments-easyappointments-1 --tar
./docker-backup backup easyappointments-mysql-1 --tar
./docker-backup backup n8n-docker-caddy-caddy-1 --tar
./docker-backup backup n8n-docker-caddy-postgres-1 --tar
./docker-backup backup n8n-docker-caddy-n8n-1 --tar

# Перемещение созданных резервных копий в соответствующие директории
mv alextselegidis_easyappointments-latest-easyappointments-easyappointments-1.tar $BACKUP_DIR_TIMESTAMP/easyappointments/
mv mysql-8.0-easyappointments-mysql-1.tar $BACKUP_DIR_TIMESTAMP/easyappointments/
mv caddy-latest-n8n-docker-caddy-caddy-1.tar $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/
mv postgres-13-n8n-docker-caddy-postgres-1.tar $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/
mv docker.n8n.io_n8nio_n8n-n8n-docker-caddy-n8n-1.tar $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/

# Копирование файлов docker-compose.yml
cp /root/easyappointments/docker-compose.yml $BACKUP_DIR_TIMESTAMP/easyappointments/
cp /root/n8n-docker-caddy/docker-compose.yml $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/

# Загрузка резервных копий и docker-compose.yml файлов на FTP-сервер с временными метками
FTP_SERVER="storagebox.com"
FTP_USERNAME="username"
FTP_PASSWORD="password"

# Создание директории на FTP сервере
lftp -u $FTP_USERNAME,$FTP_PASSWORD $FTP_SERVER <<EOF
mkdir -p backup/easyappointments
mkdir -p backup/n8n-docker-caddy
quit
EOF

# Загрузка резервных копий
for file in $BACKUP_DIR_TIMESTAMP/easyappointments/*.tar; do
  BASENAME=$(basename $file)
  lftp -u $FTP_USERNAME,$FTP_PASSWORD -e "put $file -o /backup/easyappointments/${TIMESTAMP}_$BASENAME; quit" $FTP_SERVER
done

for file in $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/*.tar; do
  BASENAME=$(basename $file)
  lftp -u $FTP_USERNAME,$FTP_PASSWORD -e "put $file -o /backup/n8n-docker-caddy/${TIMESTAMP}_$BASENAME; quit" $FTP_SERVER
done

# Загрузка docker-compose.yml файлов с временными метками
lftp -u $FTP_USERNAME,$FTP_PASSWORD -e "put $BACKUP_DIR_TIMESTAMP/easyappointments/docker-compose.yml -o /backup/easyappointments/${TIMESTAMP}_docker-compose.yml; quit" $FTP_SERVER
lftp -u $FTP_USERNAME,$FTP_PASSWORD -e "put $BACKUP_DIR_TIMESTAMP/n8n-docker-caddy/docker-compose.yml -o /backup/n8n-docker-caddy/${TIMESTAMP}_docker-compose.yml; quit" $FTP_SERVER

echo "Backup completed and uploaded to FTP at $TIMESTAMP" >> /var/log/backup.log

Шаг 4: Настройка прав и создание задачи cron

Убедитесь, что у скрипта есть права на выполнение:

chmod +x /root/docker-backup/backup_script.sh

Добавьте задачу cron для автоматического выполнения скрипта, например, каждый день в 6 утра:

crontab -e

Добавьте следующую строку в файл crontab:

0 6 * * * /root/docker-backup/backup_script.sh >> /var/log/backup.log 2>&1

Заключение

Теперь у вас настроено автоматическое резервное копирование Docker контейнеров и файлов docker-compose.yml, с загрузкой резервных копий на FTP-сервер. Этот скрипт гарантирует, что у вас всегда будет актуальная резервная копия ваших контейнеров и конфигураций, которая может быть использована для восстановления в случае необходимости.