رفع الملفات إلى "/"
هذا الالتزام موجود في:
59
pg_s3_migrator.py
Normal file
59
pg_s3_migrator.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import subprocess
|
||||
import boto3
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
PROGRESS_FILE = "psql_progress.json"
|
||||
|
||||
def update_progress(status, message, percent=0):
|
||||
with open(PROGRESS_FILE, "w") as f:
|
||||
json.dump({"status": status, "message": message, "percent": percent}, f)
|
||||
|
||||
def backup_pg_to_s3():
|
||||
# جلب متغيرات البيئة
|
||||
DB_HOST = os.getenv("DB_HOST", "localhost")
|
||||
DB_NAME = os.getenv("DB_NAME")
|
||||
DB_USER = os.getenv("DB_USER")
|
||||
DB_PASS = os.getenv("DB_PASS")
|
||||
|
||||
S3_BUCKET = os.getenv("DEST_BUCKET")
|
||||
S3_ENDPOINT = os.getenv("DEST_ENDPOINT")
|
||||
S3_ACCESS = os.getenv("DEST_ACCESS")
|
||||
S3_SECRET = os.getenv("DEST_SECRET")
|
||||
|
||||
filename = f"backup_{DB_NAME}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.sql.gz"
|
||||
|
||||
update_progress("running", f"جاري بدء النسخ الاحتياطي لقاعدة {DB_NAME}...", 10)
|
||||
|
||||
# إعداد S3 Client
|
||||
s3 = boto3.client("s3",
|
||||
aws_access_key_id=S3_ACCESS,
|
||||
aws_secret_access_key=S3_SECRET,
|
||||
endpoint_url=S3_ENDPOINT
|
||||
)
|
||||
|
||||
# أمر pg_dump مع الضغط
|
||||
os.environ['PGPASSWORD'] = DB_PASS
|
||||
dump_cmd = f"pg_dump -h {DB_HOST} -U {DB_USER} {DB_NAME} | gzip"
|
||||
|
||||
try:
|
||||
process = subprocess.Popen(dump_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
update_progress("running", "جاري رفع الملف إلى S3 مباشرة...", 50)
|
||||
|
||||
s3.upload_fileobj(process.stdout, S3_BUCKET, filename)
|
||||
|
||||
process.stdout.close()
|
||||
process.wait()
|
||||
|
||||
if process.returncode == 0:
|
||||
update_progress("completed", f"تم رفع النسخة الاحتياطية {filename} إلى S3 بنجاح ✅", 100)
|
||||
else:
|
||||
update_progress("error", f"خطأ في pg_dump: {process.stderr.read().decode()}", 0)
|
||||
except Exception as e:
|
||||
update_progress("error", str(e), 0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
backup_pg_to_s3()
|
||||
المرجع في مشكلة جديدة
حظر مستخدم