feat: SHA-256 checksums (#15) and S3 storage backend (#16)
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
#15 — Backup Integrity Verification: - Compute SHA-256 hash after archive creation, store in checksum column - "Verify Integrity" toolbar button re-computes and compares - Hash logged in backup step log #16 — S3-Compatible Storage: - S3Uploader with AWS Signature V4 (no SDK dependency, pure cURL) - Single PUT for files <= 100 MB, multipart upload for larger files - Multipart: 10 MB parts, abort on failure, XML completion - Works with AWS S3, Wasabi, Backblaze B2, MinIO (custom endpoints) - Profile form fields: endpoint, region, access key, secret key, bucket, path - showon conditional visibility (only shown when remote_storage=s3) - Akeeba importer maps S3 credentials from Akeeba profiles - Added to BackupEngine createUploader() factory Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS `#__mokobackup_profiles` (
|
||||
`exclude_dirs` TEXT NOT NULL COMMENT 'Newline-separated directory paths to exclude',
|
||||
`exclude_files` TEXT NOT NULL COMMENT 'Newline-separated filename patterns to exclude',
|
||||
`exclude_tables` TEXT NOT NULL COMMENT 'Newline-separated table names to exclude',
|
||||
`remote_storage` VARCHAR(20) NOT NULL DEFAULT 'none' COMMENT 'none, ftp, google_drive',
|
||||
`remote_storage` VARCHAR(20) NOT NULL DEFAULT 'none' COMMENT 'none, ftp, google_drive, s3',
|
||||
`ftp_host` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`ftp_port` INT(5) UNSIGNED NOT NULL DEFAULT 21,
|
||||
`ftp_username` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
@@ -22,6 +22,12 @@ CREATE TABLE IF NOT EXISTS `#__mokobackup_profiles` (
|
||||
`gdrive_client_secret` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`gdrive_refresh_token` VARCHAR(512) NOT NULL DEFAULT '',
|
||||
`gdrive_folder_id` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`s3_endpoint` VARCHAR(512) NOT NULL DEFAULT '' COMMENT 'S3 endpoint URL (blank = AWS default)',
|
||||
`s3_region` VARCHAR(50) NOT NULL DEFAULT 'us-east-1',
|
||||
`s3_access_key` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`s3_secret_key` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`s3_bucket` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`s3_path` VARCHAR(512) NOT NULL DEFAULT '/backups',
|
||||
`remote_keep_local` TINYINT(1) NOT NULL DEFAULT 1 COMMENT 'Keep local copy after upload',
|
||||
`include_kickstart` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Include standalone restore.php in archive',
|
||||
`notify_email` VARCHAR(512) NOT NULL DEFAULT '' COMMENT 'Comma-separated notification emails',
|
||||
@@ -54,6 +60,7 @@ CREATE TABLE IF NOT EXISTS `#__mokobackup_records` (
|
||||
`backupend` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`filesexist` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`remote_filename` VARCHAR(512) NOT NULL DEFAULT '',
|
||||
`checksum` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'SHA-256 hash of archive',
|
||||
`log` MEDIUMTEXT NOT NULL COMMENT 'Step-by-step backup log',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_profile` (`profile_id`),
|
||||
|
||||
Reference in New Issue
Block a user