Найти в Дзене

echo "Starting physical backup for ${CONTAINER_NAME} at $(date

{ echo "Starting physical backup for ${CONTAINER_NAME} at $(date)" mkdir -p ${BACKUP_DIR} # Выполнение pg_basebackup через сеть Docker export PGPASSWORD=${POSTGRES_PASSWORD} pg_basebackup \ -h ${CONTAINER_NAME} \ -U postgres \ -D ${BACKUP_DIR} \ -F tar \ -X stream \ -P \ -v if [ $? -eq 0 ]; then echo "Physical backup completed successfully" # Архивирование tar -czf ${BACKUP_DIR}.tar.gz -C ${BACKUP_DIR} . # Загрузка в MinIO /usr/local/bin/mc alias set minio-backup ${MINIO_ENDPOINT} ${MINIO_ACCESS_KEY} ${MINIO_SECRET_KEY} /usr/local/bin/mc cp ${BACKUP_DIR}.tar.gz minio-backup/${MINIO_BUCKET}/${CONTAINER_NAME}/physical/ # Очистка rm -rf ${BACKUP_DIR} ${BACKUP_DIR}.tar.gz echo "Backup uploaded to MinIO and local files cleaned" else echo "Physical backup failed" exit 1 fi } >> ${LOG_FILE} 2>&1 4. Docker Compose для Backup Manager yaml version: '3.8' services: backup-manager: build: context: . dockerfile: Dockerfile volumes: - backup_data:/backup - backup_logs:/opt/backup-manager/

{

echo "Starting physical backup for ${CONTAINER_NAME} at $(date)"

mkdir -p ${BACKUP_DIR}

# Выполнение pg_basebackup через сеть Docker

export PGPASSWORD=${POSTGRES_PASSWORD}

pg_basebackup \

-h ${CONTAINER_NAME} \

-U postgres \

-D ${BACKUP_DIR} \

-F tar \

-X stream \

-P \

-v

if [ $? -eq 0 ]; then

echo "Physical backup completed successfully"

# Архивирование

tar -czf ${BACKUP_DIR}.tar.gz -C ${BACKUP_DIR} .

# Загрузка в MinIO

/usr/local/bin/mc alias set minio-backup ${MINIO_ENDPOINT} ${MINIO_ACCESS_KEY} ${MINIO_SECRET_KEY}

/usr/local/bin/mc cp ${BACKUP_DIR}.tar.gz minio-backup/${MINIO_BUCKET}/${CONTAINER_NAME}/physical/

# Очистка

rm -rf ${BACKUP_DIR} ${BACKUP_DIR}.tar.gz

echo "Backup uploaded to MinIO and local files cleaned"

else

echo "Physical backup failed"

exit 1

fi

} >> ${LOG_FILE} 2>&1

4. Docker Compose для Backup Manager

yaml

version: '3.8'

services:

backup-manager:

build:

context: .

dockerfile: Dockerfile

volumes:

- backup_data:/backup

- backup_logs:/opt/backup-manager/logs

networks:

- swarm-network

environment:

- MINIO_ENDPOINT=minio:9000

- MINIO_ACCESS_KEY=backup-user

- MINIO_SECRET_KEY=backup-password

- MINIO_BUCKET=postgres-backups

- POSTGRES_PASSWORD=your-postgres-password

deploy:

mode: replicated

replicas: 1

placement:

constraints:

- node.role == manager

labels:

- "backup.manager=true"

# MinIO сервис

minio:

image: minio/minio

ports:

- "9000:9000"

- "9001:9001"

environment:

- MINIO_ROOT_USER=minioadmin

- MINIO_ROOT_PASSWORD=minioadmin

volumes:

- minio_data:/data

command: server /data --console-address ":9001"

networks:

- swarm-network

deploy:

mode: replicated

replicas: 1

volumes:

backup_data:

backup_logs:

minio_data:

networks:

swarm-network:

external: true

name: swarm-network

5. API для взаимодействия с n8n

scripts/backup-api.py

python

from flask import Flask, request, jsonify

from main import BackupManager

import threading

app = Flask(name)

backup_manager = BackupManager()

@app.route('/backup/run', methods=['POST'])

def run_backup():

data = request.json

backup_type = data.get('type', 'all')

containers = data.get('containers', []) # Опционально: конкретные контейнеры

# Запуск в отдельном потоке чтобы не блокировать

thread = threading.Thread(

target=backup_manager.run_scheduled_backup,

args=(backup_type,)

)

thread.start()

return jsonify({

'status': 'started',

'backup_type': backup_type,

'message': 'Backup process started in background'

})

@app.route('/backup/status', methods=['GET'])

def get_status():

# Возвращает статус последнего бэкапа

return jsonify({'status': 'implement_status_check'})

@app.route('/backup/containers', methods=['GET'])

def list_containers():

containers = backup_manager.discover_postgres_containers()

return jsonify({'containers': containers})

if name == 'main':

app.run(host='0.0.0.0', port=5000)

6. Использование из n8n

В n8n теперь можно использовать HTTP запросы:

· POST http://backup-manager:5000/backup/run

json

{

"type": "physical",

"containers": ["tenant1-db", "tenant2-db"]

}

`

· GET http://backup-manager:5000/backup/containers - для получения списка всех БД

Этот Backup Manager будет:

· ✅ Автоматически обнаруживать все PostgreSQL контейнеры

· ✅ Выполнять физические и логические бэкапы

· ✅ Загружать в MinIO

· ✅ Предоставлять API для n8n

· ✅ Вести логи и отчеты