[PYTHON] Skript zum Sichern von Ordnern auf dem Server in Google Drive

Überblick

Dies ist ein Python-Skript, das die Ordner auf dem Server komprimiert und in Google Drive speichert. Es soll regelmäßig ausgeführt werden und hat auch die Funktion, alte Sicherungsdateien zu löschen, damit Google Drive nicht voll wird.

Das GitHub-Repository ist hier.

Ich verwende dieses Skript, um die gespeicherten Daten auf dem Minecraft-Server zu sichern, aber ich dachte, es könnte auch für andere Zwecke verwendet werden, also schrieb ich es in Qiitas Artikel. Ich führe dieses Skript übrigens unter AWS EC2 aus (Betriebssystem ist Ubuntu).

Installieren Sie die Module, die für die Verwendung der Google Drive-API mit pip erforderlich sind, damit es funktioniert.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Ganzer Code

Das große Bild des Codes ist unten.

import pickle
import os.path
import datetime
import shutil
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaFileUpload


# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive']
#Anzahl der Generationen, die das Backup ergänzen
GENERATIONS = 3
#Datenverzeichnis sichern
DATA_DIR = '/home/minecraft/server/'
#Der Name des Ordners, den Sie sichern möchten
DATA_NAME = 'newworld'
#Google Drive-Ordner-ID zum Speichern von Sicherungsdaten(Erscheint in der URL)
PARENT_ID = 'xxxxxx'

def main():
    '''
Hauptfunktion
    '''
    #Anmeldeinformationen abrufen
    creds = get_creds()
    #Einen Service erstellen
    service = build('drive', 'v3', credentials=creds)
    #Überprüfen von Dateien, die bereits hochgeladen wurden
    existing_files = get_existing_files(service)
    if len(existing_files) >= (GENERATIONS - 1):
        #Wenn es mehr als nötig gespeichert ist, löschen Sie das alte
        delete_unnecessary_files(service,existing_files)
    #Zippen Sie die hochzuladenden Dateien
    file_to_upload = create_zip_file()
    #Datei hochladen
    upload_file(service)

def get_creds():
    '''
    1.Anmeldeinformationen abrufen
    '''
    creds = None
    #Versuchen Sie, die Authentifizierungsdatei zu öffnen
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    #Wenn Sie versagen, erstellen Sie eine neue
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    return creds

def get_existing_files(service):
    '''
    2.Holen Sie sich eine vorhandene Sicherungsdatei
    '''
    # Call the Drive v3 API
    query = "'" + PARENT_ID + "' in parents"
    results = service.files().list(fields="nextPageToken, files(id, name, createdTime)", q=query).execute()
    items = results.get('files', [])

    if not items:
        return {}
    else:
        return items

def delete_unnecessary_files(service,existing_files):
    '''
    3.Löschen Sie Sicherungsdateien, die Sie nicht mehr aufbewahren müssen
    '''
    #Holen Sie sich die Erstellungszeit jeder Datei und konvertieren Sie sie in ein Datum / Uhrzeit-Objekt
    for f in existing_files:
        f['datetime_createdTime'] = datetime.datetime.strptime(f['createdTime'], '%Y-%m-%dT%H:%M:%S.%fZ')
    #Nach Erstellungsdatum sortieren
    sorted_files = sorted(existing_files, key=lambda x: x['datetime_createdTime'])          
    delete_len = len(sorted_files) - (GENERATIONS - 1)
    for i in range(delete_len):
        service.files().delete(fileId=sorted_files[i]['id']).execute()

def create_zip_file():
    '''
    4.Speichern Sie den Ordner, den Sie sichern möchten, in zip
    '''
    shutil.make_archive(DATA_DIR + DATA_NAME, 'zip', root_dir=DATA_DIR + DATA_NAME)

def upload_file(service):
    '''
    5.Datei hochladen
    '''
    today_str = datetime.datetime.now().strftime("%D").replace("/","-")
    file_metadata = {'name': today_str + '.zip','parents':[PARENT_ID]}
    media = MediaFileUpload(DATA_DIR + DATA_NAME + '.zip', mimetype='application/zip')
    results = service.files().create(body=file_metadata,media_body=media,fields='id').execute()

if __name__ == '__main__':
    main()

Codebeschreibung

1. Abrufen von Authentifizierungsinformationen

Für den Teil zur Erfassung von Authentifizierungsinformationen wird das Element Offizielles Beispiel der Google Drive-API unverändert verwendet.

Wenn Sie es zum ersten Mal ausführen, wird der Browser geöffnet und Sie werden um Erlaubnis zur Authentifizierung gebeten. Wenn der Authentifizierungsablauf abgeschlossen ist, werden die Authentifizierungsinformationen in "token.pickle" gespeichert, sodass Sie sich ab dem nächsten Mal nicht mehr beim Browser authentifizieren müssen.

2. Holen Sie sich eine vorhandene Sicherungsdatei

Rufen Sie die bereits als Backup gespeicherte Datei im Ordner von Google Drive ab. Offizielles Beispiel der Google Drive-API Ich versuche, die Dateien unter einen bestimmten Ordner zu bringen, indem ich das Objekt leicht ändere. Ich werde.

3. Löschen Sie Sicherungsdateien, die Sie nicht mehr aufbewahren müssen

Löschen Sie nicht benötigte Dateien, damit Google Drive nicht voll wird. Die im vorherigen Schritt erfassten Dateidaten auf Google Drive werden in der Reihenfolge der Upload-Zeit sortiert und die älteste gelöscht.

4. Packen Sie den Sicherungsordner in eine Zip-Datei

Korrekt. Ich benutze Shututil.

5. Laden Sie die Datei hoch

Laden Sie die Zip-Datei hoch. Durch Optimieren der Metadaten der Datei versuche ich, sie in einen bestimmten Ordner hochzuladen.

Apropos

Das obige Skript wird automatisch ausgeführt, wenn der Server gestartet wird

Ich habe das obige Skript ausgeführt, wenn der Server gestartet wird. Es gibt verschiedene Möglichkeiten, dies zu tun, aber ich habe cron verwendet. Insbesondere habe ich folgendes in "crontab" geschrieben.

@reboot python3 /home/minecraft/tools/backup.py

Durch Hinzufügen von "@ reboot" wird es beim Booten ausgeführt.

Recommended Posts

Skript zum Sichern von Ordnern auf dem Server in Google Drive
Senden Sie mithilfe von Google Cloud Messaging für Chrome eine Nachricht vom Server an die Chrome-Erweiterung
So deaktivieren Sie den Browser-Cache auf dem einfachen HTTP-Server von Python
Speichern Sie Bilder im Web mit Python (Colab) auf einem Laufwerk.
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
ls -R auf Google Drive
So stellen Sie cron für reguläres Python-Scraping auf dem Sakura-Server ein.
Ein Hinweis zum Überprüfen der Verbindung zum Lizenzserver-Port
Der Tag, an dem Chainer auf der GPU CentOS Edition (bis zur CPU) ausgeführt wird
Die höflichste Art, das Google Maps SDK für iOS zu verwenden
Einstellungen, die beim Starten des Linux-Servers centos7 vorgenommen werden müssen
Python-Skript für KiCad-Pre-Place-Footprint fast entsprechend dem Layout des Schaltplans
Hosten Sie die Netzwerkbibliothek Mirror for Unity auf einem Linux-Server
Laden Sie die Bilder und Videos herunter, die in den Tweets enthalten sind, die Ihnen auf Twitter gefallen haben, und laden Sie sie auf Google Drive hoch
Hinweise zur Verwendung von matplotlib auf dem Server
Stellen Sie mit Ihrem Smartphone eine Verbindung zum VPN her und schalten Sie den Server aus / ein
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
In Dataflow implementiert, um die hierarchische Struktur von Google Drive in Google Cloud Storage zu kopieren