Найти в Дзене

Вы абсолютно правы! Я описал концепцию, но не показал конкретную реализацию Backup Manager

Вы абсолютно правы! Я описал концепцию, но не показал конкретную реализацию Backup Manager. Исправляюсь: 1. Специализированный Backup Manager Dockerfile FROM postgres:15 # Установка необходимых утилит RUN apt-get update && apt-get install -y \ curl \ python3 \ python3-pip \ && rm -rf /var/lib/apt/lists/* # Установка MinIO Client RUN curl https://dl.min.io/client/mc/release/linux-amd64/mc \ -o /usr/local/bin/mc && \ chmod +x /usr/local/bin/mc # Установка Python библиотек для работы с Docker API RUN pip3 install docker python-crontab # Создание директорий для скриптов RUN mkdir -p /opt/backup-manager/scripts \ /opt/backup-manager/config \ /opt/backup-manager/logs # Копирование скриптов COPY scripts/ /opt/backup-manager/scripts/ COPY config/ /opt/backup-manager/config/ # Настройка прав RUN chmod +x /opt/backup-manager/scripts/*.sh WORKDIR /opt/backup-manager CMD ["python3", "/opt/backup-manager/main.py"] 2. Основной скрипт Backup Manager main.py `python #!/usr/bin/env python3

Вы абсолютно правы! Я описал концепцию, но не показал конкретную реализацию Backup Manager. Исправляюсь:

1. Специализированный Backup Manager Dockerfile

FROM postgres:15

# Установка необходимых утилит

RUN apt-get update && apt-get install -y \

curl \

python3 \

python3-pip \

&& rm -rf /var/lib/apt/lists/*

# Установка MinIO Client

RUN curl https://dl.min.io/client/mc/release/linux-amd64/mc \

-o /usr/local/bin/mc && \

chmod +x /usr/local/bin/mc

# Установка Python библиотек для работы с Docker API

RUN pip3 install docker python-crontab

# Создание директорий для скриптов

RUN mkdir -p /opt/backup-manager/scripts \

/opt/backup-manager/config \

/opt/backup-manager/logs

# Копирование скриптов

COPY scripts/ /opt/backup-manager/scripts/

COPY config/ /opt/backup-manager/config/

# Настройка прав

RUN chmod +x /opt/backup-manager/scripts/*.sh

WORKDIR /opt/backup-manager

CMD ["python3", "/opt/backup-manager/main.py"]

2. Основной скрипт Backup Manager

main.py

`python

#!/usr/bin/env python3

import os

import logging

import docker

import subprocess

import json

from datetime import datetime

class BackupManager:

def init(self):

self.setup_logging()

self.docker_client = docker.from_env()

self.minio_endpoint = os.getenv('MINIO_ENDPOINT', 'minio:9000')

self.minio_access_key = os.getenv('MINIO_ACCESS_KEY')

self.minio_secret_key = os.getenv('MINIO_SECRET_KEY')

self.bucket_name = os.getenv('MINIO_BUCKET', 'postgres-backups')

def setup_logging(self):

logging.basicConfig(

level=logging.INFO,

format='%(asctime)s - %(levelname)s - %(message)s',

handlers=[

logging.FileHandler('/opt/backup-manager/logs/backup.log'),

logging.StreamHandler()

]

)

self.logger = logging.getLogger(name)

def discover_postgres_containers(self):

"""Обнаружение всех PostgreSQL контейнеров в Swarm"""

try:

containers = self.docker_client.containers.list(

filters={'label': ['postgres.tenant']}

)

pg_containers = []

for container in containers:

# Проверяем, что контейнер действительно PostgreSQL

if 'postgres' in container.image.tags[0].lower():

container_info = {

'id': container.id,

'name': container.name,

'image': container.image.tags[0],

'labels': container.labels,

'network': self.get_container_network(container)

}

pg_containers.append(container_info)

self.logger.info(f"Discovered {len(pg_containers)} PostgreSQL containers")

return pg_containers

except Exception as e:

self.logger.error(f"Error discovering containers: {e}")

return []

def get_container_network(self, container):

"""Получение сети контейнера"""

try:

networks = container.attrs['NetworkSettings']['Networks']

return list(networks.keys())[0] if networks else 'default'

except:

return 'default'

def execute_physical_backup(self, container_name, network):

"""Выполнение физического бэкапа"""

try:

cmd = [

'/opt/backup-manager/scripts/physical-backup.sh',

container_name,

network

]

result = subprocess.run(cmd, capture_output=True, text=True)

if result.returncode == 0:

self.logger.info(f"Physical backup successful for {container_name}")