From e585142490157037574fa2a32e17590accf76cbf Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 26 Feb 2023 18:36:42 +0200 Subject: [PATCH] folder backup --- Dockerfile | 3 +- bin/folder-restore | 3 + src/Appwrite/Platform/Services/Tasks.php | 4 +- src/Appwrite/Platform/Tasks/FolderBackup.php | 33 ++++++--- src/Appwrite/Platform/Tasks/FolderRestore.php | 67 +++++++++++++++++++ 5 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 bin/folder-restore create mode 100644 src/Appwrite/Platform/Tasks/FolderRestore.php diff --git a/Dockerfile b/Dockerfile index df77b6976f..bfc7ac600b 100755 --- a/Dockerfile +++ b/Dockerfile @@ -133,7 +133,8 @@ RUN chmod +x /usr/local/bin/doctor && \ chmod +x /usr/local/bin/worker-messaging && \ chmod +x /usr/local/bin/worker-webhooks && \ chmod +x /usr/local/bin/worker-usage && \ - chmod +x /usr/local/bin/folder-backup + chmod +x /usr/local/bin/folder-backup && \ + chmod +x /usr/local/bin/folder-restore # Letsencrypt Permissions RUN mkdir -p /etc/letsencrypt/live/ && chmod -Rf 755 /etc/letsencrypt/live/ diff --git a/bin/folder-restore b/bin/folder-restore new file mode 100644 index 0000000000..d66367b77a --- /dev/null +++ b/bin/folder-restore @@ -0,0 +1,3 @@ +#!/bin/sh + +php /usr/src/code/app/cli.php folder-restore $@ \ No newline at end of file diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index ddf4caf335..a65b97f646 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -16,6 +16,7 @@ use Appwrite\Platform\Tasks\Vars; use Appwrite\Platform\Tasks\Version; use Appwrite\Platform\Tasks\VolumeSync; use Appwrite\Platform\Tasks\FolderBackup; +use Appwrite\Platform\Tasks\FolderRestore; class Tasks extends Service { @@ -35,6 +36,7 @@ class Tasks extends Service ->addAction(SDKs::getName(), new SDKs()) ->addAction(VolumeSync::getName(), new VolumeSync()) ->addAction(Specs::getName(), new Specs()) - ->addAction(FolderBackup::getName(), new FolderBackup()); + ->addAction(FolderBackup::getName(), new FolderBackup()) + ->addAction(FolderRestore::getName(), new FolderRestore()); } } diff --git a/src/Appwrite/Platform/Tasks/FolderBackup.php b/src/Appwrite/Platform/Tasks/FolderBackup.php index 2e76d3c013..20a38d5f66 100644 --- a/src/Appwrite/Platform/Tasks/FolderBackup.php +++ b/src/Appwrite/Platform/Tasks/FolderBackup.php @@ -17,7 +17,7 @@ class FolderBackup extends Action public function __construct() { $this - ->desc('Folder backup and restore process') + ->desc('Folder backup process') ->callback(fn() => $this->action()); } @@ -29,12 +29,9 @@ class FolderBackup extends Action gc_enable(); $time = 0; while (!connection_aborted() || PHP_SAPI == "cli") { - $now = DateTime::now(); - - $now = new \DateTime(); $now->setTimezone(new \DateTimeZone(date_default_timezone_get())); - $next = new \DateTime($now->format("Y-m-d 12:10:0.0")); + $next = new \DateTime($now->format("Y-m-d 16:35.0")); $next->setTimezone(new \DateTimeZone(date_default_timezone_get())); $sleep = $next->getTimestamp() - $now->getTimestamp(); @@ -52,6 +49,7 @@ class FolderBackup extends Action $folders = [ 'cert' => APP_STORAGE_CERTIFICATES, + 'config' => APP_STORAGE_CONFIG, ]; $remote = getDevice('/'); @@ -61,16 +59,15 @@ class FolderBackup extends Action $filename = $key . '-' . date("Y-m-d") . '.tar.gz'; $source = $local->getRoot() . '/' . $filename; $destination = '/' . $key . '/' . $filename; - $content = $local->getRoot() . '/*'; -// for ($i = 0; $i < 1000; $i++) { -// file_put_contents($root->getRoot() . '/' . $i . '.txt', ''); -// } +// for ($i = 0; $i < 1000; $i++) { +// file_put_contents($local->getRoot() . '/' . $i . '.txt', ''); +// } $stdout = ''; $stderr = ''; Console::execute( - 'tar --exclude ' . $filename . ' -zcf ' . $source . ' ' . $content, + 'cd ' . $folder . ' && tar --exclude ' . $filename . ' -zcf ' . $source . '*', '', $stdout, $stderr @@ -78,7 +75,21 @@ class FolderBackup extends Action try { $local->transfer($source, $destination, $remote); - console::info("backing up local $source to $remote->getName() $destination"); + console::info("backing up local $source to {$remote->getName()} $destination"); + + /** + * Clean up + */ + $now = new \DateTime(); + $now->setTimezone(new \DateTimeZone(date_default_timezone_get())); + for ($i = 0; $i < 20; $i++) { + $now->sub(\DateInterval::createFromDateString('1 days')); + if ($i >= 10) { + $destination = '/' . $key . '/' . $key . '-' . $now->format("Y-m-d") . '.tar.gz'; + console::info("Trying to delete from {$remote->getName()} $destination"); + $remote->delete($destination); + } + } } catch (\Exception $e) { Console::error($e->getMessage()); } diff --git a/src/Appwrite/Platform/Tasks/FolderRestore.php b/src/Appwrite/Platform/Tasks/FolderRestore.php new file mode 100644 index 0000000000..a022b5da37 --- /dev/null +++ b/src/Appwrite/Platform/Tasks/FolderRestore.php @@ -0,0 +1,67 @@ +desc('Folder restore process') + ->callback(fn() => $this->action()); + } + + public function action(): void + { + + $folders = [ + 'cert' => APP_STORAGE_CERTIFICATES, + 'config' => APP_STORAGE_CONFIG, + ]; + + $folder = \strtolower(Console::confirm('Please enter the folder you wish to restore')); + $date = Console::confirm('Please enter the date of the backup file in datetime format(Y-m-d)'); + + if (!array_key_exists($folder, $folders)) { + console::Error('Unknown folder given'); + exit; + } + + if (!is_a(\DateTime::createFromFormat("Y-m-d", $date), 'DateTime')) { + console::Error('Unknown date format'); + exit; + } + + $remote = getDevice('/'); + $local = new Local(); + $filename = $folder . '-' . $date . '.tar.gz'; + $destination = $folders[$folder] . '/' . $filename; + $source = '/' . $folder . '/' . $filename; + + try { + $remote->transfer($source, $destination, $local); + + $stdout = ''; + $stderr = ''; + Console::execute( + 'cd ' . $folders[$folder] . ' && tar -xf ' . $filename, + '', + $stdout, + $stderr + ); + + console::info("restoring from {$remote->getName()} $source to $destination"); + } catch (\Exception $e) { + Console::error($e->getMessage()); + } + } +}