first commit
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
## 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 <<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 сервера для надсилання пошти.
|
||||
|
||||
```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
|
||||
```
|
||||
Reference in New Issue
Block a user