77 lines
2.5 KiB
PHP
77 lines
2.5 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* Rotational Backup for ALL-INKL.COM
|
||
|
|
*
|
||
|
|
* Copyright (c) 2018 Helmut Kaczmarek <email@helmutkaczmarek.de>
|
||
|
|
*
|
||
|
|
* This program is free software: you can redistribute it and/or modify
|
||
|
|
* it under the terms of the GNU General Public License as published by
|
||
|
|
* the Free Software Foundation, either version 3 of the License, or
|
||
|
|
* (at your option) any later version.
|
||
|
|
*
|
||
|
|
* This program is distributed in the hope that it will be useful,
|
||
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
|
* GNU General Public License for more details.
|
||
|
|
*
|
||
|
|
* You should have received a copy of the GNU General Public License
|
||
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
*
|
||
|
|
* Features:
|
||
|
|
* Creates the following folder structure and rotates it:
|
||
|
|
* current -> /path/to/backup/daily.0
|
||
|
|
* daily.0
|
||
|
|
* daily.1
|
||
|
|
* daily.2
|
||
|
|
* daily.3
|
||
|
|
* daily.4
|
||
|
|
* daily.5
|
||
|
|
* daily.6
|
||
|
|
* daily.7
|
||
|
|
*
|
||
|
|
* Usage:
|
||
|
|
* If the script is to be executed automatically via KAS cron job, it must
|
||
|
|
* be accessible on the web. Alternatively, it can be run manually via
|
||
|
|
* shell with the following command: "php /path/to/script.php"
|
||
|
|
*
|
||
|
|
* Pitfall wrong PHP CLI version, then e.g.
|
||
|
|
* "/usr/bin/php81 /path/to/script.php" for PHP 8.1
|
||
|
|
*
|
||
|
|
* Restore folder(s):
|
||
|
|
* rsync -avz --progress /backup/folder/ /folder/to/be/restored
|
||
|
|
*
|
||
|
|
* @author Helmut Kaczmarek <email@helmutkaczmarek.de>
|
||
|
|
* @link https://www.helmutkaczmarek.de
|
||
|
|
* @todo You could also back up the directories to a remote server via
|
||
|
|
* SSH. However, at this point one would probably no longer be dependent on
|
||
|
|
* the "trimmed" KAS cron jobs from ALL-INKL.COM. A bash script and crontab
|
||
|
|
* would of course be the first choice in this case.
|
||
|
|
*/
|
||
|
|
|
||
|
|
// Configuration variables
|
||
|
|
$SRC = "/www/htdocs/v0xxxxx/public_websites/";
|
||
|
|
$DEST = "/www/htdocs/v0xxxxx/backup/public_websites";
|
||
|
|
$NUM_BACKUPS = 7;
|
||
|
|
|
||
|
|
// Creating the directories
|
||
|
|
for ($i = 0; $i <= $NUM_BACKUPS; $i++) {
|
||
|
|
mkdir($DEST . '/daily.' . $i, 0777, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Delete the oldest backup
|
||
|
|
system('rm -rf ' . $DEST . '/daily.' . $NUM_BACKUPS);
|
||
|
|
|
||
|
|
// Rotation of backups
|
||
|
|
for ($i = $NUM_BACKUPS - 1; $i >= 0; $i--) {
|
||
|
|
$prev = $i + 1;
|
||
|
|
system('mv ' . $DEST . '/daily.' . $i . ' ' . $DEST . '/daily.' . $prev);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Creating the new backup
|
||
|
|
system('rsync -arl --delete --stats --link-dest=' . $DEST . '/daily.1 ' . $SRC . ' ' . $DEST . '/daily.0');
|
||
|
|
|
||
|
|
// Symlink to the latest backup
|
||
|
|
unlink($DEST . '/current');
|
||
|
|
symlink($DEST . '/daily.0', $DEST . '/current');
|
||
|
|
|
||
|
|
?>
|