65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
import os
|
|
import subprocess
|
|
from datetime import datetime
|
|
|
|
from aiogram.types import BufferedInputFile
|
|
from loguru import logger
|
|
|
|
from config import ADMIN_ID, BACK_DIR, DB_NAME, DB_PASSWORD, DB_USER
|
|
|
|
|
|
async def backup_database():
|
|
from bot import bot
|
|
|
|
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,
|
|
)
|
|
logger.info(f"Бэкап базы данных создан: {BACKUP_FILE}")
|
|
except subprocess.CalledProcessError as e:
|
|
logger.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)
|
|
logger.info(f"Бэкап базы данных отправлен админу: {ADMIN_ID}")
|
|
except Exception as e:
|
|
logger.error(f"Ошибка при отправке бэкапа в Telegram: {e}")
|
|
|
|
try:
|
|
subprocess.run(
|
|
[
|
|
"find",
|
|
BACKUP_DIR,
|
|
"-type",
|
|
"f",
|
|
"-name",
|
|
"*.sql",
|
|
"-mtime",
|
|
"+3",
|
|
"-exec",
|
|
"rm",
|
|
"{}",
|
|
";",
|
|
],
|
|
check=True,
|
|
)
|
|
logger.info("Старые бэкапы удалены.")
|
|
except subprocess.CalledProcessError as e:
|
|
logger.error(f"Ошибка при удалении старых бэкапов: {e}")
|
|
|
|
del os.environ["PGPASSWORD"]
|