50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
import logging
|
|
import os
|
|
import subprocess
|
|
from datetime import datetime
|
|
|
|
from aiogram.types import BufferedInputFile
|
|
|
|
from bot import bot
|
|
from config import ADMIN_ID, DB_NAME, DB_PASSWORD, DB_USER, BACK_DIR
|
|
|
|
|
|
async def backup_database():
|
|
|
|
USER = DB_USER
|
|
HOST = "localhost"
|
|
BACKUP_DIR = BACK_DIR
|
|
DATE = datetime.now().strftime("%Y-%m-%d-%H%M%S")
|
|
BACKUP_FILE = f"{BACKUP_DIR}/{DB_NAME}-backup-{DATE}.sql"
|
|
|
|
os.environ['PGPASSWORD'] = DB_PASSWORD
|
|
|
|
try:
|
|
subprocess.run(
|
|
['pg_dump', '-U', USER, '-h', HOST, '-F', 'c', '-f', BACKUP_FILE, DB_NAME],
|
|
check=True
|
|
)
|
|
logging.info(f"Бэкап базы данных создан: {BACKUP_FILE}")
|
|
except subprocess.CalledProcessError as e:
|
|
logging.error(f"Ошибка при создании бэкапа базы данных: {e}")
|
|
return
|
|
|
|
try:
|
|
with open(BACKUP_FILE, 'rb') as backup_file:
|
|
backup_input_file = BufferedInputFile(backup_file.read(), filename=os.path.basename(BACKUP_FILE))
|
|
await bot.send_document(ADMIN_ID, backup_input_file)
|
|
logging.info(f"Бэкап базы данных отправлен админу: {ADMIN_ID}")
|
|
except Exception as e:
|
|
logging.error(f"Ошибка при отправке бэкапа в Telegram: {e}")
|
|
|
|
try:
|
|
subprocess.run(
|
|
['find', BACKUP_DIR, '-type', 'f', '-name', '*.sql', '-mtime', '+7', '-exec', 'rm', '{}', ';'],
|
|
check=True
|
|
)
|
|
logging.info("Старые бэкапы удалены.")
|
|
except subprocess.CalledProcessError as e:
|
|
logging.error(f"Ошибка при удалении старых бэкапов: {e}")
|
|
|
|
del os.environ['PGPASSWORD']
|