Files
Vitalii Litvinchuk 6deed0469a first commit
2026-05-04 23:15:09 +03:00

5.7 KiB

1. docker-compose.yml

Файл конфігурації контейнерів бази даних та сервісу бекапу.

services:
  db:
    image: mysql:latest
    container_name: mysql-container-2
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: qwerty-1
      MYSQL_DATABASE: OrdersDB
    ports:
      - "3306:3306"
    volumes:
      - sqladvanced_mysql_data:/var/lib/mysql

  backup-service:
    build: ./backup
    container_name: mysql-backup-runner
    environment:
      MYSQL_ROOT_PASSWORD: qwerty-1
      SFTP_HOST: "192.168.3.142"
      SFTP_USER: "vitaliilitvinchuk"
      EMAIL_TO: "vitalii.litvinchuk@oa.edu.ua"
    volumes:
      - ~/.ssh/id_rsa_docker:/root/.ssh/id_rsa:ro

volumes:
  sqladvanced_mysql_data:
    external: true

2. backup/Dockerfile

Інструкції для створення образу контейнера бекапу.

# Використовуємо стабільну Ubuntu 22.04
FROM ubuntu:22.04

# Вимикаємо інтерактивні запити під час встановлення пакетів
ENV DEBIAN_FRONTEND=noninteractive

# 1. Встановлюємо всі необхідні пакети одним шаром
# mysql-client - для дампу (сумісний з mysql:latest)
# lftp - для SFTP передачі
# msmtp - для надсилання пошти
# ca-certificates - критично для TLS/SSL (Gmail)
# cron - для автоматизації щохвилини
# openssh-client - для SSH-ключів
RUN apt-get update && apt-get install -y \
    mysql-client \
    lftp \
    msmtp \
    msmtp-mta \
    ca-certificates \
    cron \
    openssh-client \
    && rm -rf /var/lib/apt/lists/*

# 2. Налаштовуємо SSH для роботи з ключами
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh

# 3. Копіюємо конфігураційні файли
# Файл налаштування пошти
COPY msmtprc /etc/msmtprc
RUN chmod 600 /etc/msmtprc

# Скрипт бекапу
COPY backup.sh /usr/local/bin/backup.sh
RUN chmod +x /usr/local/bin/backup.sh

# 4. Створюємо файли логів з правильними правами доступу
RUN touch /var/log/msmtp.log && chmod 666 /var/log/msmtp.log
RUN touch /var/log/backup.log && chmod 666 /var/log/backup.log

# 5. Налаштовуємо Cron (запуск щохвилини)
# ВАЖЛИВО: додаємо ". /etc/environment;", щоб Cron бачив паролі з docker-compose
RUN echo "* * * * * . /etc/environment; /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1" | crontab -

# 6. Команда запуску контейнера:
# - зберігаємо поточні змінні оточення в /etc/environment (щоб їх бачив Cron)
# - запускаємо демон cron у фоновому режимі (флаг -f)
CMD ["sh", "-c", "printenv > /etc/environment && cron -f"]

3. backup/backup.sh

Скрипт, який виконує створення дампу, завантаження на диск та надсилання пошти.

#!/bin/bash

# --- НАЛАШТУВАННЯ ---
REMOTE_DIR="/Volumes/Just/sql advanced/lab2-1/backups"

# Новий формат: рік-місяць-день_години-хвилини-секунди
DATE=$(date +%Y-%m-%d_%H-%M-%S)
FILENAME="OrdersDB_${DATE}.sql"
BACKUP_PATH="/tmp/$FILENAME"

echo "Starting dump of OrdersDB ($DATE)..."

# 1. Створення дампу бази даних
# Додано --set-gtid-purged=OFF для сумісності з mysql:latest
# Додано --single-transaction для уникнення помилок консистентності
mysqldump -h db -u root -p$MYSQL_ROOT_PASSWORD \
    --set-gtid-purged=OFF \
    --single-transaction \
    OrdersDB > $BACKUP_PATH

if [ $? -eq 0 ]; then
    echo "Dump created: $FILENAME. Uploading to Mac..."
    
    # 2. Завантаження через SFTP
    lftp -u $SFTP_USER, sftp://$SFTP_HOST <<EOF
    set sftp:connect-program "ssh -a -x -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
    cd "$REMOTE_DIR"
    put "$BACKUP_PATH"
    quit
EOF

    if [ $? -eq 0 ]; then
        echo "Upload successful. Sending email..."
        
        # 3. Надсилання сповіщення
        # Ми додаємо вивід помилок msmtp у змінну, щоб побачити їх, якщо лист не піде
        EMAIL_LOG=$(echo -e "Subject: Backup Success: OrdersDB ($DATE)\n\nВітаю! Резервна копія $FILENAME успішно збережена на зовнішній диск." | msmtp $EMAIL_TO 2>&1)
        
        if [ $? -eq 0 ]; then
            echo "Email sent!"
        else
            echo "Email error: $EMAIL_LOG"
        fi
    else
        echo "SFTP Error!"
        echo -e "Subject: Backup FAILED: SFTP Error ($DATE)\n\nПомилка передачі файлу $FILENAME на диск." | msmtp $EMAIL_TO
    fi
    
    # Видаляємо тимчасовий файл
    rm "$BACKUP_PATH"
else
    echo "MySQL Dump Error!"
    echo -e "Subject: Backup FAILED: SQL Error ($DATE)\n\nНе вдалося створити дамп бази OrdersDB. Перевірте логі контейнера." | msmtp $EMAIL_TO
fi

4. backup/msmtprc

Налаштування SMTP сервера для надсилання пошти.

defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp.log

account        oa_mail
host           smtp.gmail.com
port           587
from           vitalii.litvinchuk@oa.edu.ua
user           vitalii.litvinchuk@oa.edu.ua
password       krkrvyobreydoenh 

account default : oa_mail