Explorar o código

[IMP] postgres backup

robert %!s(int64=5) %!d(string=hai) anos
pai
achega
9f959d62a7
Modificáronse 2 ficheiros con 54 adicións e 18 borrados
  1. 52 16
      backup.py
  2. 2 2
      token.pickle

+ 52 - 16
backup.py

@@ -14,7 +14,7 @@ from google_auth_oauthlib.flow import InstalledAppFlow
 from google.auth.transport.requests import Request
 from docker.errors import NotFound, APIError
 from datetime import datetime, timedelta
-from io import BytesIO
+from io import FileIO, BytesIO
 
 BACKUP_AGE = 30
 DOCKER_SOCK = 'unix://var/run/docker.sock'
@@ -192,6 +192,45 @@ def create_postgres_backup(database, docker_client):
     
     return (True, tmp_file)
 
+'''
+'''
+def create_postgres_backup_v2(database, docker_client):
+    pg_container = get_pg_container(docker_client)
+
+    if pg_container is None or pg_container.status == 'exited':
+        return None
+
+    log('Creando copia de seguridad de la base de datos: %s' % database)
+
+    backup_file_name = '%s_database_%s.tar' % (database, datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
+    command = 'pg_dump -U %s -d %s -F tar -C -b -c -f %s' % (POSTGRES_USER, database, backup_file_name)
+    
+    result = pg_container.exec_run(command)
+
+    if result.exit_code == -1:
+        log('Error al crear la copia de seguridad de la base de datos: %s' % database)
+        return None
+
+    (backup_file, _) = pg_container.get_archive('/%s' % backup_file_name)
+
+    tmp_file_path = os.path.abspath(os.path.join('./tmp', backup_file_name))
+    tmp_file_stream = FileIO(tmp_file_path, mode='w')
+
+    for chunk in backup_file:
+        tmp_file_stream.write(chunk)
+
+    tmp_file_stream.seek(0)
+    tmp_file_stream.close()
+
+    tmp_tar = tmp_file_path.replace(os.path.basename(tmp_file_path), 'tmp.tar')
+    os.rename(tmp_file_path, tmp_tar)
+
+    tar = tarfile.open(tmp_tar, mode='r')
+    tar.extractall('./tmp')
+
+    os.remove(tmp_tar)
+    return tmp_file_path
+
 '''
 '''
 def create_odoo_filestore_backup(folder_name):
@@ -244,12 +283,12 @@ def upload_postgres_to_drive(backup_file_name, backup_folder_id, docket_client,
 
 '''
 '''
-def upload_filestore_to_drive(backup_path, backup_folder_id, service):
+def upload_backup_to_drive(backup_path, backup_folder_id, service):
     if service == None:
         return None
 
     backup_name = os.path.basename(backup_path)
-    log('Subiendo copia de seguridad de los archivos adjuntos: %s' % backup_name)
+    log('Subiendo copia de seguridad: %s' % backup_name)
     
     backup_metadata = {
         'name': backup_name,
@@ -261,7 +300,7 @@ def upload_filestore_to_drive(backup_path, backup_folder_id, service):
         result = service.files().create(body=backup_metadata, media_body=backup_media).execute()
         return result.get('id')
     except Exception:
-        log('Error al subir copia de seguridad de los archivos adjuntos: %s' % backup_name)
+        log('Error al subir copia de seguridad: %s' % backup_name)
         return None
 
 '''
@@ -285,7 +324,7 @@ def delete_postgres_backup(backup_name, docker_client):
 
 '''
 '''
-def delete_filestore_backup(backup_path):
+def delete_backup_path(backup_path):
     log('Eliminando copia temporal de los archivos adjuntos: %s' % os.path.basename(backup_path))
     os.remove(backup_path)
     
@@ -322,22 +361,19 @@ def run_backup():
     create_tmp_path()
 
     for index, db in enumerate(databases):
-        log('Procesando %d de %d' % (index, len(databases)))
+        log('Creado copias: %d de %d' % (index, len(databases)))
         
-        (backup_ok, backup_name) = create_postgres_backup(db, docker_client)
-
-        if not backup_ok:
-            if backup_name:
-                delete_postgres_backup(backup_name, docker_client)
+        pg_bkp_path = create_postgres_backup_v2(db, docker_client)
 
+        if not pg_bkp_path:
             continue
         
-        upload_postgres_to_drive(backup_name, folder_id, docker_client, service)
-        delete_postgres_backup(backup_name, docker_client)
+        upload_backup_to_drive(pg_bkp_path, folder_id, docker_client, service)
+        delete_backup_path(pg_bkp_path, docker_client)
 
         filestore_path = create_odoo_filestore_backup(db)
-        upload_filestore_to_drive(filestore_path, folder_id, service)
-        delete_filestore_backup(filestore_path)
+        upload_backup_to_drive(filestore_path, folder_id, service)
+        delete_backup_path(filestore_path)
 
         time.sleep(1)
 
@@ -346,4 +382,4 @@ def run_backup():
     end_time = datetime.now() - start_time
     log('Backup finalizado en %s' % str(end_time))
 
-run_backup()
+run_backup()

+ 2 - 2
token.pickle

@@ -23,7 +23,7 @@ asS'_id_token'
 p11
 NsS'token'
 p12
-Vya29.GlwgBxJPmNnCR9YNP-6Y1pndcskTNmVip7-8PKGilS1GK1jcf5tqZKqTwiEoFQVQMCxk464bD0KLRRKMvr5tXc1vqvD9mnXokdd7EthxiA3k9u2bpSzS5YnbSKYM5w
+Vya29.GlwhB_Kn4cDCXYAjr6yowb4FE9wPdvefD1baWU7u7N0TWFLwwDdQBJG_MKWt3yzISvF2yoGWNMj-z_o7Mlp-2MwpgFiA6Q8-EaPQmTMRF02iVKsy4cufsPPFUhLMng
 p13
 sS'_refresh_token'
 p14
@@ -42,7 +42,7 @@ p20
 cdatetime
 datetime
 p21
-(S'\x07\xe3\x06\x06\x0f\x08\x01\x02\x81\x9c'
+(S'\x07\xe3\x06\x07\r.\x05\x00kR'
 p22
 tp23
 Rp24