6 Private Links
Neulich gab es als Promo 50 Gigabyte kostenlosen Onlinespeicher bei Bitrix24.de. Eine sehr gute Gelegenheit die wichtigsten Daten aus dem Home-Server ins Internet zu kippen. Leider funktioniert das Mounten per Webdav wegen veralteter Cipher, die von Bitrix24 Verwendung finden und bei davfs2 schon entfernt wurden, nicht. Ein einfacher Upload mit curl geht aber auch so.
tar -czvf - -C path/to/important/files . | openssl aes-256-cbc -salt -k 'enc_passwd123!' -pbkdf2 | curl -T - -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc
Wir packen also alles aus dem lokalen Verzeichnis path/to/important/files
zusammen, verschlüsseln es mir einem ordentlichen Passwort und laden die Datei bei Bitrix24.de hoch.
Die Backup-Datei kann man testweise wieder herunterladen und mit der folgenden Zeile entschlüsseln und z.B. nach /tmp/restore
entpacken.
cat backup.tar.enc | openssl aes-256-cbc -d -salt -k 'enc_passwd123!' -pbkdf2 | tar -xzvf - -C /tmp/restore
Wenn man das ganze automatisieren will, will man vielleicht die alte, hochgeladene Datei vor dem nächsten Upload löschen.
curl -X DELETE -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc
Die Datei wandert bei Bitrix24.de leider nur in den Papierkorb und nimmt auch weiterhin Platz ein, bis sie entweder automatisch nach 30 Tagen gelöscht oder der Papierkorb von Hand geleert wird.
Um das ganze zu automatisieren und außerdem einen Mechanismus zum Chunken zu haben, habe ich aus dem ganzen ein Python-Script zusammengebastelt, das regelmäßig per Cron ausgeführt wird. Wichtig war mir hierbei, daß keine Daten auf die SSD zwischengespeichert werden, um diese zu schonen und außerdem den RAM-Verbrauch nicht explodieren zu lassen. Es wird also alles per Pipe durchgereicht, so dass die Chunksize maßgeblich für den RAM-Verbrauch ist.
import os
import subprocess
import sys
def create_backup(directory):
# Archiv erstellen und verschlüsseln
tar_process = subprocess.Popen(["tar", "-zcf", "-", directory], stdout=subprocess.PIPE)
encrypt_process = subprocess.Popen(["openssl", "aes-256-cbc", "-salt", "-k", "enc_passwd123!", "-pbkdf2"], stdin=tar_process.stdout, stdout=subprocess.PIPE)
# Chunk-Größe festlegen 100MB (in bytes)
chunk_size = 100 * 1024 * 1024
# Verzeichnisname des Backup-Verzeichnisses extrahieren
backup_directory, backup_dirname = os.path.split(os.path.normpath(directory))
print( f"backup_dirname={backup_dirname}" )
# Chunks erstellen und hochladen
chunk_number = 1
while True:
chunk = encrypt_process.stdout.read(chunk_size)
if not chunk:
break
# Chunk hochladen
upload_chunk(chunk, chunk_number, backup_dirname)
chunk_number += 1
# Aufräumen
encrypt_process.stdout.close()
encrypt_process.wait()
def upload_chunk(chunk, chunk_number, backup_dirname):
filename = f"backup_{backup_dirname}_{str(chunk_number).zfill(3)}"
delete_command = f"curl -X DELETE -u [email protected]:passwd123! 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"
subprocess.run(delete_command, shell=True)
upload_command = f"curl -i -X PUT -u [email protected]:passwd123! --data-binary @- 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"
subprocess.run(upload_command, input=chunk, shell=True)
# Kommandozeilenparameter überprüfen
if len(sys.argv) < 2:
print("Verzeichnis als Parameter angeben.")
sys.exit(1)
# Verzeichnis aus Kommandozeilenparameter extrahieren
directory = sys.argv[1]
# Beispielaufruf des Skripts
create_backup(directory)
Aufgerufen werden kann das Script einfach mit python3 <scriptname> path/to/important/files
.