## 1. docker-compose.yml Файл конфігурації контейнерів бази даних та сервісу бекапу. ```yaml 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 Інструкції для створення образу контейнера бекапу. ```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 Скрипт, який виконує створення дампу, завантаження на диск та надсилання пошти. ```bash #!/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 <&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 сервера для надсилання пошти. ```text 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 ```