Przeglądaj źródła

[IMP] postgres backup

robert 5 lat temu
rodzic
commit
9f959d62a7
2 zmienionych plików z 54 dodań i 18 usunięć
  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 google.auth.transport.requests import Request
 from docker.errors import NotFound, APIError
 from docker.errors import NotFound, APIError
 from datetime import datetime, timedelta
 from datetime import datetime, timedelta
-from io import BytesIO
+from io import FileIO, BytesIO
 
 
 BACKUP_AGE = 30
 BACKUP_AGE = 30
 DOCKER_SOCK = 'unix://var/run/docker.sock'
 DOCKER_SOCK = 'unix://var/run/docker.sock'
@@ -192,6 +192,45 @@ def create_postgres_backup(database, docker_client):
     
     
     return (True, tmp_file)
     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):
 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:
     if service == None:
         return None
         return None
 
 
     backup_name = os.path.basename(backup_path)
     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 = {
     backup_metadata = {
         'name': backup_name,
         '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()
         result = service.files().create(body=backup_metadata, media_body=backup_media).execute()
         return result.get('id')
         return result.get('id')
     except Exception:
     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
         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))
     log('Eliminando copia temporal de los archivos adjuntos: %s' % os.path.basename(backup_path))
     os.remove(backup_path)
     os.remove(backup_path)
     
     
@@ -322,22 +361,19 @@ def run_backup():
     create_tmp_path()
     create_tmp_path()
 
 
     for index, db in enumerate(databases):
     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
             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)
         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)
         time.sleep(1)
 
 
@@ -346,4 +382,4 @@ def run_backup():
     end_time = datetime.now() - start_time
     end_time = datetime.now() - start_time
     log('Backup finalizado en %s' % str(end_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
 p11
 NsS'token'
 NsS'token'
 p12
 p12
-Vya29.GlwgBxJPmNnCR9YNP-6Y1pndcskTNmVip7-8PKGilS1GK1jcf5tqZKqTwiEoFQVQMCxk464bD0KLRRKMvr5tXc1vqvD9mnXokdd7EthxiA3k9u2bpSzS5YnbSKYM5w
+Vya29.GlwhB_Kn4cDCXYAjr6yowb4FE9wPdvefD1baWU7u7N0TWFLwwDdQBJG_MKWt3yzISvF2yoGWNMj-z_o7Mlp-2MwpgFiA6Q8-EaPQmTMRF02iVKsy4cufsPPFUhLMng
 p13
 p13
 sS'_refresh_token'
 sS'_refresh_token'
 p14
 p14
@@ -42,7 +42,7 @@ p20
 cdatetime
 cdatetime
 datetime
 datetime
 p21
 p21
-(S'\x07\xe3\x06\x06\x0f\x08\x01\x02\x81\x9c'
+(S'\x07\xe3\x06\x07\r.\x05\x00kR'
 p22
 p22
 tp23
 tp23
 Rp24
 Rp24