{"id":293223,"date":"2026-05-31T12:58:13","date_gmt":"2026-05-31T12:58:13","guid":{"rendered":"https:\/\/en-za.wordpress.org\/plugins\/cloudscale-free-backup-and-restore\/"},"modified":"2026-08-26T14:36:39","modified_gmt":"2026-08-26T14:36:39","slug":"cloudscale-backup-restore","status":"publish","type":"plugin","link":"https:\/\/it.wordpress.org\/plugins\/cloudscale-backup-restore\/","author":23459506,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.2.700","stable_tag":"3.2.700","tested":"7.0.4","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"CloudScale Backup & Restore","header_author":"CloudScale","header_description":"No-nonsense WordPress backup and restore. Backs up database, media, plugins and themes into a single zip. Scheduled or manual, with safe restore and maintenance mode.","assets_banners_color":"","last_updated":"2026-08-26 14:36:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/cloudscale.consulting","header_author_uri":"https:\/\/cloudscale.consulting","rating":0,"author_block_rating":0,"active_installs":0,"downloads":705,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.2.526":{"tag":"3.2.526","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.548":{"tag":"3.2.548","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.592":{"tag":"3.2.592","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.594":{"tag":"3.2.594","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.600":{"tag":"3.2.600","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.604":{"tag":"3.2.604","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.605":{"tag":"3.2.605","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.617":{"tag":"3.2.617","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.627":{"tag":"3.2.627","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.637":{"tag":"3.2.637","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.639":{"tag":"3.2.639","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.653":{"tag":"3.2.653","author":"andrewjbaker","date":"2026-08-05 18:19:28"},"3.2.654":{"tag":"3.2.654","author":"andrewjbaker","date":"2026-08-05 18:30:14"},"3.2.698":{"tag":"3.2.698","author":"andrewjbaker","date":"2026-08-25 08:33:13"},"3.2.700":{"tag":"3.2.700","author":"andrewjbaker","date":"2026-08-26 14:36:39"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3555613,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3555613,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.2.526","3.2.548","3.2.592","3.2.594","3.2.600","3.2.604","3.2.605","3.2.617","3.2.627","3.2.637","3.2.639","3.2.653","3.2.654","3.2.698","3.2.700"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3555507,"resolution":"1","location":"assets","locale":"","width":1280,"height":980},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3555507,"resolution":"2","location":"assets","locale":"","width":1280,"height":790}},"screenshots":{"1":"Schedule and settings panel showing configurable backup interval in days, run-at hour, retention count, folder sizes, and system information including detected backup and restore methods.","2":"Manual backup panel with individual component checkboxes and live progress bar, plus the full backup history table showing stored backups with type badges, age, and Download \/ Restore DB \/ Delete actions."}},"plugin_section":[262246],"plugin_tags":[151,153,1281,152,265189],"plugin_category":[59],"plugin_contributors":[258042],"plugin_business_model":[],"class_list":["post-293223","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-backup","plugin_tags-database","plugin_tags-maintenance-mode","plugin_tags-restore","plugin_tags-scheduled-backup","plugin_category-utilities-and-tools","plugin_contributors-andrewjbaker","plugin_committers-andrewjbaker"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cloudscale-backup-restore\/assets\/icon-128x128.png?rev=3555613","icon_2x":"https:\/\/ps.w.org\/cloudscale-backup-restore\/assets\/icon-256x256.png?rev=3555613","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cloudscale-backup-restore\/assets\/screenshot-1.jpg?rev=3555507","caption":"Schedule and settings panel showing configurable backup interval in days, run-at hour, retention count, folder sizes, and system information including detected backup and restore methods."},{"src":"https:\/\/ps.w.org\/cloudscale-backup-restore\/assets\/screenshot-2.jpg?rev=3555507","caption":"Manual backup panel with individual component checkboxes and live progress bar, plus the full backup history table showing stored backups with type badges, age, and Download \/ Restore DB \/ Delete actions."}],"raw_content":"<!--section=description-->\n<p><strong>Most backup plugins fail exactly when you need them most: on your biggest site, or the site that's grown since you installed them.<\/strong> All-in-One WP Migration's free version caps imports at 512MB (its Unlimited extension costs $69\/year to remove the cap). Duplicator's free version starts failing and timing out around 500MB, with no chunking until you upgrade to Pro. UpdraftPlus has no hard site-size limit, but its free version is restricted to a single cloud storage destination, so you're stuck with whatever free-tier space that one provider gives you.<\/p>\n\n<p><strong>CloudScale Backup &amp; Restore has no site-size limit, no destination limit, and no plan wall.<\/strong> It reads your database in 500-row chunks and never loads the whole thing into memory, so a 50MB site and a 50GB site back up the same way, reliably, without hitting your host's memory limit or execution timeout. It backs up to five destinations at once, for free: Amazon S3, Google Drive, Dropbox, Microsoft OneDrive, and CloudScale's own Managed Cloud Backup, and every destination you enable gets a copy of every backup.<\/p>\n\n<h4>Any Size, No Limits<\/h4>\n\n<ul>\n<li>Streams the database in 500-row chunks via <code>$wpdb<\/code>; never loads the full database into memory, regardless of size<\/li>\n<li><code>set_time_limit(0)<\/code> and <code>ignore_user_abort(true)<\/code> on every backup and restore, so PHP's execution-time limit never cuts a large operation off mid-run<\/li>\n<li>Restore uses a character-level SQL parser that correctly handles quoted strings, escaped characters and multi-line <code>INSERT<\/code> statements, on files of any size<\/li>\n<li>System Info panel shows exactly which backup and restore method, and memory limits, your server is using<\/li>\n<\/ul>\n\n<h4>Back Up to Five Destinations at Once<\/h4>\n\n<ul>\n<li>Amazon S3, Google Drive, Dropbox and Microsoft OneDrive, using your own accounts, free, with no destination limit<\/li>\n<li>CloudScale Managed Cloud Backup: $5\/month for 750GB of off-site storage on Amazon S3 Glacier Instant Retrieval, no separate cloud account needed<\/li>\n<li>Configurable retention: keep the last N backups on every destination, deleted automatically after each run. Managed copies are additionally capped at 90 days in storage, enforced even if the site stops running; your own cloud destinations follow whatever lifecycle rules you set on your own bucket<\/li>\n<li>Every destination you enable receives every backup automatically<\/li>\n<\/ul>\n\n<h4>What It Backs Up<\/h4>\n\n<p>Choose any combination, packaged into one <code>.zip<\/code> with a descriptive filename (for example <code>backup_db-media-plugins_2026-02-21_09-10-00.zip<\/code>) that reflects exactly what it contains:<\/p>\n\n<ul>\n<li>Full WordPress database: all tables, all data<\/li>\n<li>Media uploads folder (<code>\/wp-content\/uploads\/<\/code>)<\/li>\n<li>Plugins folder (<code>\/wp-content\/plugins\/<\/code>)<\/li>\n<li>Themes folder (<code>\/wp-content\/themes\/<\/code>)<\/li>\n<li>Optional Site Root Extras: root-level files like <code>php.ini<\/code>, <code>robots.txt<\/code>, favicon, <code>.well-known\/<\/code>, and search-engine verification files<\/li>\n<li>Optional Server Config Snapshot: read-only reference copies of your nginx\/Apache config, PHP runtime settings and MySQL variables<\/li>\n<li>Post-restore environment comparison flags PHP version, missing extensions, lower memory\/upload limits, or MySQL version differences between the backup's original server and the one you restored onto<\/li>\n<li>Every zip includes <code>backup-meta.json<\/code>: plugin version, creation timestamp, WordPress version, site URL, table prefix, and which components were included, so you can verify a backup without restoring it<\/li>\n<\/ul>\n\n<p><strong>Automatic backups are off by default.<\/strong> Run your first backup manually to confirm everything works on your server, then configure a schedule if you need one.<\/p>\n\n<h4>Restore Safely<\/h4>\n\n<p>Clicking Restore DB opens a confirmation modal that:<\/p>\n\n<ol>\n<li>Shows the exact backup file name and creation date you are restoring from<\/li>\n<li>Displays a warning box explaining what will happen step by step<\/li>\n<li>Requires you to tick a checkbox: <em>\"I have taken a server snapshot and understand this will overwrite the live database\"<\/em><\/li>\n<li>Only enables the Restore button after that checkbox is ticked<\/li>\n<\/ol>\n\n<p>During restore, WordPress's native <code>.maintenance<\/code> file is created so visitors see the standard maintenance page. It is always removed when restore finishes, whether the restore succeeded or failed. The plugin header shows a live badge indicating whether the site is online or in maintenance mode.<\/p>\n\n<h4>Disaster Recovery<\/h4>\n\n<ul>\n<li>Failover Mode: a standby server never creates, schedules, or allows a manually- or WP-CLI-triggered backup while flagged as a failover target, and says so on every admin screen<\/li>\n<li>EC2 AMI Snapshots: create a full machine image of your AWS-hosted server directly from the plugin, with optional reboot for filesystem consistency, plus AMI history and status polling<\/li>\n<\/ul>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Backup directory uses a randomised, non-guessable name, not a fixed predictable path<\/li>\n<li>Protection covers Apache (both <code>.htaccess<\/code> syntaxes), nginx, IIS (<code>web.config<\/code>), and a silent <code>index.php<\/code>, plus <code>0700<\/code> permissions, not just an <code>.htaccess<\/code> that nginx and IIS ignore<\/li>\n<li>A daily self-check fetches its own backup URL to confirm the directory genuinely isn't publicly readable, and warns you with the exact server rule to add if it is<\/li>\n<li>All passwords passed to CLI tools via environment variable, not shell arguments<\/li>\n<\/ul>\n\n<h4>Developer &amp; Automation<\/h4>\n\n<ul>\n<li>Trigger a backup from WP-CLI or a system cron job<\/li>\n<li>Configurable scheduling: any interval in days, and the exact hour of day to run<\/li>\n<li>Full backup history: view all stored backups with filename, type label, size, creation date, and age; download any backup directly from the WordPress admin<\/li>\n<li>One-click migration: restore the database from any stored backup or by uploading a <code>.zip<\/code> or <code>.sql<\/code> file, on the same host or a new one<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin optionally connects to third-party services when those features are configured by the site administrator. No data is sent to any external service unless the administrator has explicitly enabled the relevant integration.<\/p>\n\n<h4>Telegram Bot API (optional notifications)<\/h4>\n\n<p>When Telegram is configured, the plugin sends backup, restore, and plugin\nrollback notifications, plus error alerts, to the administrator-configured\nTelegram chat via the Telegram Bot API. The message contains the site name,\nevent status, and (for error alerts) a summary of the PHP error, file name,\nand line number. No personal visitor data, post content, or backup data is\ntransmitted. No data is sent unless a Telegram bot token and chat ID have\nbeen entered in the plugin's Notifications settings.\nAPI endpoint contacted: https:\/\/api.telegram.org\/bot{token}\/sendMessage\nTerms of Service: https:\/\/telegram.org\/tos\nPrivacy Policy: https:\/\/telegram.org\/privacy\nTelegram Bot API documentation: https:\/\/core.telegram.org\/bots\/api<\/p>\n\n<h4>Amazon S3 (optional cloud backup)<\/h4>\n\n<p>When S3 settings are configured, the plugin uploads backup zip files directly\nto the administrator's own S3 bucket via the AWS S3 REST API (no external\ntools required). Only the backup zip file is transmitted. Credentials (bucket\nname, access key ID, secret access key, region) are stored in the WordPress\noptions table and are never sent anywhere except to the AWS S3 endpoint.\nAPI endpoint contacted: https:\/\/s3.{region}.amazonaws.com\/\nTerms of Service: https:\/\/aws.amazon.com\/service-terms\/\nPrivacy Policy: https:\/\/aws.amazon.com\/privacy\/<\/p>\n\n<h4>Google Drive (optional cloud backup)<\/h4>\n\n<p>When Google Drive settings are configured, the plugin transfers backup zip files\nto the administrator's own Google Drive account using the Google Drive v3 REST\nAPI and OAuth 2.0. No data is sent unless the administrator has completed the\nOAuth authorisation flow (entered a Client ID and Client Secret from Google\nCloud Console and clicked \"Connect to Google Drive\"). Only the backup zip file\nis uploaded. OAuth tokens (access token and refresh token) are stored in the\nWordPress options table.\nAPI endpoint contacted: https:\/\/www.googleapis.com\/ and https:\/\/oauth2.googleapis.com\/\nTerms of Service: https:\/\/policies.google.com\/terms\nPrivacy Policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Dropbox (optional cloud backup)<\/h4>\n\n<p>When Dropbox settings are configured, the plugin transfers backup zip files to\nthe administrator's own Dropbox account using the Dropbox v2 REST API and\nOAuth 2.0. No data is sent unless the administrator has completed the OAuth\nauthorisation flow (entered an App Key and App Secret from the Dropbox App\nConsole and clicked \"Connect to Dropbox\"). Only the backup zip file is\nuploaded. OAuth tokens are stored in the WordPress options table.\nAPI endpoint contacted: https:\/\/api.dropboxapi.com\/ and https:\/\/content.dropboxapi.com\/\nTerms of Service: https:\/\/www.dropbox.com\/terms\nPrivacy Policy: https:\/\/www.dropbox.com\/privacy<\/p>\n\n<h4>Microsoft OneDrive (optional cloud backup)<\/h4>\n\n<p>When OneDrive settings are configured, the plugin transfers backup zip files to\nthe administrator's own Microsoft OneDrive account using the Microsoft Graph\nREST API and OAuth 2.0. No data is sent unless the administrator has completed\nthe OAuth authorisation flow (entered an Azure App Client ID and Client Secret\nand clicked \"Connect to OneDrive\"). Only the backup zip file is uploaded.\nOAuth tokens are stored in the WordPress options table.\nAPI endpoint contacted: https:\/\/graph.microsoft.com\/ and https:\/\/login.microsoftonline.com\/\nTerms of Service: https:\/\/www.microsoft.com\/en-us\/servicesagreement\/\nPrivacy Policy: https:\/\/privacy.microsoft.com\/en-us\/privacystatement<\/p>\n\n<h4>CloudScale Managed Cloud Backup (optional, paid service)<\/h4>\n\n<p>When the administrator subscribes to the optional CloudScale Managed Cloud Backup\nservice, the plugin contacts the CloudScale broker to request a short-lived,\nprefix-scoped Amazon S3 access token, then uploads backup zip files directly to\nCloudScale's managed S3 storage (hosted in the EU, eu-west-1). Only the site's\ndomain name, the subscription licence key, and the backup zip file are involved;\nthe backup bytes are uploaded straight to S3 and do not pass through the broker.\nNo data is sent unless the administrator has subscribed and entered a licence key.\nAPI endpoint contacted: https:\/\/api.cloudscale.consulting\/ (broker) and\nhttps:\/\/cloudscale-backup-restore-global.s3.eu-west-1.amazonaws.com\/ (storage)\nTerms of Service: https:\/\/cloudscale.consulting\/terms\nPrivacy Policy: https:\/\/cloudscale.consulting\/privacy<\/p>\n\n<h4>PayPal (optional, payment for Managed Cloud Backup)<\/h4>\n\n<p>Subscription payments for the optional CloudScale Managed Cloud Backup service are\nprocessed by PayPal. Payment details are entered on PayPal's own hosted checkout\npage and are never collected, stored, or transmitted by this plugin. When the\nadministrator starts a subscription, the subscriber's email address and a PayPal\norder amount ($5.00 USD) are sent directly from the WordPress server to the PayPal\nREST API (api-m.paypal.com) to create a checkout session; no payment-card data is\nhandled by the plugin or the WordPress site. No data is sent unless the administrator\nchooses to subscribe to the paid service.\nAPI endpoint contacted: https:\/\/api-m.paypal.com\/ (live) or\nhttps:\/\/api-m.sandbox.paypal.com\/ (sandbox testing)\nBrowser-loaded script: https:\/\/www.paypal.com\/sdk\/js - PayPal's JavaScript SDK, loaded\ninto the plugin's admin screen only after an administrator opens the subscription\ncheckout. PayPal requires the SDK be served from its own origin so a compromised build\ncan be revoked, so it cannot be bundled with the plugin.\nTerms of Service: https:\/\/www.paypal.com\/us\/legalhub\/useragreement-full\nPrivacy Policy: https:\/\/www.paypal.com\/us\/legalhub\/privacy-full<\/p>\n\n<h4>AWS EC2 \/ AMI snapshots (optional, AMI snapshot feature only)<\/h4>\n\n<p>When the AMI snapshot feature is used, the plugin reads instance metadata\n(instance ID and region) from the local EC2 Instance Metadata Service at\nhttp:\/\/169.254.169.254. This address is only reachable from within an EC2\ninstance and no data leaves the server at this step. AMI creation, status poll,\nderegister, and snapshot delete requests are then issued directly to the AWS\nEC2 REST API (no external tools required). The same AWS credentials\n(access key ID and secret key) used for S3 are used; if none are configured\nthe plugin attempts to use the EC2 instance role via IMDS.\nAPI endpoint contacted: https:\/\/ec2.{region}.amazonaws.com\/\nTerms of Service: https:\/\/aws.amazon.com\/service-terms\/\nPrivacy Policy: https:\/\/aws.amazon.com\/privacy\/<\/p>\n\n<h4>Automatic Crash Recovery: health check probe (optional)<\/h4>\n\n<p>When Automatic Crash Recovery is enabled, the plugin periodically sends an HTTP\nrequest to the administrator-configured health check URL to verify the site is\nresponding. The URL defaults to the site's own home URL. No personal data is\ntransmitted. The request is a plain GET with no authentication payload. The\nsame probe is made when the administrator clicks \"Test Health Check\" in the\nplugin settings. If a system-cron watchdog script is installed on the server,\nthat script also probes this URL independently via curl. The health check URL\nis set by the administrator and is never shared with any third party.\nNo Terms of Service or Privacy Policy apply (the request goes to a URL you own).<\/p>\n\n<h3>Files written outside the plugin folder<\/h3>\n\n<p>The Automatic Crash Recovery feature writes a single file outside the plugin\nfolder when it is enabled: <code>wp-content\/fatal-error-handler.php<\/code>. This is a\nWordPress-recognised drop-in file (documented in the WordPress Developer\nHandbook under <code>get_dropins()<\/code>). WordPress core checks for this file on every\nrequest; if present, it replaces the default fatal-error screen with a custom\nhandler. The plugin uses this mechanism to show a branded recovery page to\nvisitors while a crash is being fixed, instead of a blank white screen.<\/p>\n\n<p>The file is written using the WordPress Filesystem API (WP_Filesystem). It is\nonly written when the feature is enabled, only overwritten if it was written by\nthis plugin (identified by an internal marker), and is deleted when the feature\nis disabled or the plugin is uninstalled. No personal data is stored in this file.<\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>CloudScale Backup &amp; Restore does not collect, transmit, or store any personal data. All backups are stored locally in the <code>cloudscale-backups\/<\/code> folder inside your WordPress uploads directory. No telemetry or analytics are sent by this plugin. Optional cloud backup features (S3, Google Drive, Dropbox, OneDrive, AMI snapshots) transmit data only when explicitly configured by the site administrator. See the External services section above.<\/p>\n\n<!--section=installation-->\n<p><strong>Option 1: WordPress admin (recommended)<\/strong><\/p>\n\n<ol>\n<li>Download <code>cloudscale-backup.zip<\/code><\/li>\n<li>In your WordPress admin, go to <strong>Plugins &gt; Add New Plugin &gt; Upload Plugin<\/strong><\/li>\n<li>Select the zip file and click <strong>Install Now<\/strong><\/li>\n<li>Click <strong>Activate Plugin<\/strong><\/li>\n<li>Go to <strong>Tools &gt; CloudScale Backup &amp; Restore<\/strong><\/li>\n<\/ol>\n\n<p><strong>Option 2: Manual via FTP\/SFTP<\/strong><\/p>\n\n<ol>\n<li>Unzip <code>cloudscale-backup.zip<\/code><\/li>\n<li>Upload the <code>cloudscale-backup<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate via <strong>Plugins &gt; Installed Plugins<\/strong><\/li>\n<li>Go to <strong>Tools &gt; CloudScale Backup &amp; Restore<\/strong><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20backups%20stored%3F\"><h3>Where are backups stored?<\/h3><\/dt>\n<dd><p>In a dedicated <code>cloudscale-backups\/<\/code> folder inside your WordPress uploads directory. This folder is created automatically on activation and protected with an <code>.htaccess<\/code> deny-all rule. Download backups using the Download button in the admin panel, which uses a nonce-secured handler.<\/p><\/dd>\n<dt id=\"will%20it%20time%20out%20on%20large%20sites%3F\"><h3>Will it time out on large sites?<\/h3><\/dt>\n<dd><p>No. The plugin sets <code>set_time_limit(0)<\/code> and <code>ignore_user_abort(true)<\/code> for all backup and restore operations. The PHP streaming implementation reads data in small chunks so memory usage stays flat regardless of database size. Check the System Info card for details about your server's configuration.<\/p><\/dd>\n<dt id=\"what%20php%20version%20is%20required%3F\"><h3>What PHP version is required?<\/h3><\/dt>\n<dd><p>PHP 8.1 or higher. The plugin uses typed parameters, <code>match<\/code> expressions, <code>str_contains()<\/code>, and first-class callable syntax introduced in PHP 8.0\/8.1.<\/p><\/dd>\n<dt id=\"is%20ziparchive%20required%3F\"><h3>Is ZipArchive required?<\/h3><\/dt>\n<dd><p>Yes. The <code>ZipArchive<\/code> extension is needed to create and read backup zip files. It is bundled with PHP on the vast majority of shared hosting environments. If it is missing, contact your host and ask them to enable the <code>zip<\/code> PHP extension.<\/p><\/dd>\n<dt id=\"how%20does%20the%20scheduling%20work%3F\"><h3>How does the scheduling work?<\/h3><\/dt>\n<dd><p>The plugin registers a custom WordPress cron interval based on the number of days you configure. For reliable scheduling, your server should have a real system cron job pointing at <code>wp-cron.php<\/code> rather than relying on WordPress's visitor-triggered pseudo-cron. Most managed WordPress hosts configure this automatically. Your server's current time and timezone are shown on the settings page so you can pick the right hour.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20just%20the%20database%20and%20keep%20my%20current%20media%3F\"><h3>Can I restore just the database and keep my current media?<\/h3><\/dt>\n<dd><p>Yes. The restore function extracts <code>database.sql<\/code> from the backup zip and imports it. Media, plugin, and theme files inside the zip are not automatically restored. You can unzip the backup manually and extract only the folders you need. This prevents accidentally overwriting files you have added since the backup.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20on%20a%20different%20server%20or%20after%20a%20domain%20change%3F\"><h3>Can I restore on a different server or after a domain change?<\/h3><\/dt>\n<dd><p>Yes. The restore imports the SQL as-is. If the database contains hardcoded URLs from the old domain, run a search-replace using WP-CLI after restoring:<\/p>\n\n<pre><code>wp search-replace 'olddomain.com' 'newdomain.com' --path=\/path\/to\/wordpress\n<\/code><\/pre><\/dd>\n<dt id=\"the%20restore%20failed.%20is%20the%20site%20broken%3F\"><h3>The restore failed. Is the site broken?<\/h3><\/dt>\n<dd><p>The plugin removes maintenance mode even when a restore fails, so your site will be accessible. Check the plugin page to confirm the maintenance badge is gone. Errors are logged to your server's PHP error log. If the database is in a partial state, restore from a server snapshot or use phpMyAdmin or Adminer to assess the database directly.<\/p><\/dd>\n<dt id=\"can%20i%20trigger%20a%20backup%20from%20wp-cli%20or%20a%20system%20cron%20job%3F\"><h3>Can I trigger a backup from WP-CLI or a system cron job?<\/h3><\/dt>\n<dd><p>Yes. Use WP-CLI to trigger a backup from the command line:<\/p>\n\n<pre><code>wp eval 'csbr_create_backup(true, true, true, true); csbr_enforce_retention();' --path=\/path\/to\/wordpress\n<\/code><\/pre>\n\n<p>Adjust the four boolean arguments (<code>$include_db<\/code>, <code>$include_media<\/code>, <code>$include_plugins<\/code>, <code>$include_themes<\/code>) as needed.<\/p><\/dd>\n<dt id=\"what%20is%20inside%20the%20backup%20zip%3F\"><h3>What is inside the backup zip?<\/h3><\/dt>\n<dd><p>Each zip may contain:<\/p>\n\n<ul>\n<li><code>database.sql<\/code>: complete SQL dump of all WordPress tables<\/li>\n<li><code>uploads\/<\/code>: full media uploads directory tree<\/li>\n<li><code>plugins\/<\/code>: full plugins directory tree<\/li>\n<li><code>themes\/<\/code>: full themes directory tree<\/li>\n<li><code>backup-meta.json<\/code>: metadata including plugin version, creation timestamp, WordPress version, site URL, table prefix, and which components were backed up<\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20use%20this%20to%20migrate%20my%20site%20to%20a%20new%20host%3F\"><h3>Can I use this to migrate my site to a new host?<\/h3><\/dt>\n<dd><p>Yes. Run a full backup on the old site, install WordPress on the new host, install and activate this plugin, then use Restore from Upload to import the database. Copy the <code>uploads\/<\/code>, <code>plugins\/<\/code>, and <code>themes\/<\/code> folders manually from the zip if needed, or use the backup of those folders.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.2.700<\/h4>\n\n<ul>\n<li>Fixed: The S3 client used direct <code>curl_setopt()<\/code> calls (via the <code>http_api_curl<\/code> filter) to stream file uploads without buffering: <code>CURLOPT_UPLOAD<\/code>\/<code>CURLOPT_INFILE<\/code> for files under the multipart threshold, and a progress-only callback for files above it. WordPress.org's plugin review policy treats any direct cURL usage as a hard rejection regardless of <code>phpcs:ignore<\/code> annotation. Small files (under the 100MB multipart threshold) are now read into memory and sent as a plain <code>wp_remote_request()<\/code> body, which is bounded and safe at that size; large files already went through bounded 50MB chunks via <code>wp_remote_request()<\/code> in the multipart path, so the only change there is dropping a cosmetic sub-part progress callback that required cURL. No change to the \"any size, no memory limit\" guarantee: memory use for a single upload is still capped at the multipart part size or the 100MB threshold, whichever path is taken, regardless of total backup size.<\/li>\n<\/ul>\n\n<h4>3.2.699<\/h4>\n\n<ul>\n<li>Changed: Rewrote the Description and tagline. The opening now quotes named competitor size limits (All-in-One WP Migration's 512MB import cap, Duplicator's ~500MB free-version ceiling, UpdraftPlus's single-destination free tier) to make the \"no size limit\" claim concrete, and restructured the flat feature list into headed sections so Managed Cloud Backup pricing, the five simultaneous cloud destinations, EC2 AMI snapshots, Failover Mode, and the security hardening (randomised directory, multi-webserver protection, daily public-access self-check) are no longer buried in the Changelog\/FAQ and actually appear on the page.<\/li>\n<\/ul>\n\n<h4>3.2.698<\/h4>\n\n<ul>\n<li>ADD: Cloud backups uploaded via the CloudScale broker now write to Amazon S3 Glacier Instant Retrieval instead of Standard storage. The 750 GB managed-storage ceiling is priced against Glacier IR ($4.50\/month); the same footprint on Standard runs about $17\/month. The Retention card now has a \"Keep cloud backups for\" control (1-3 months, default 2), with the storage space it allows shown derived rather than typed.<\/li>\n<li>FIX: WP_Error messages describing timeouts and durations reported milliseconds (e.g. \"300000 milliseconds\" for a 300-second ceiling) instead of seconds. All 32 rendered messages now go through a shared seconds-formatter.<\/li>\n<li>FIX: WordPress.org submission-review pass, 60 findings down to 16 (the remaining 16 are set_time_limit() calls kept deliberately, since removing timeout extension from a backup plugin risks a large operation failing mid-run with no resume path): 10 unescaped attribute echoes fixed, 3 HTML-entity icons converted to literal UTF-8 with proper escaping, the undisclosed PayPal SDK load now documented in External Services, five S3\/EC2 endpoint strings annotated as non-offloading, the emoji resource-hint filter matched a host as a substring (incorrectly stripping unrelated hosts like ps.w.org) and now matches exactly, and five set_time_limit()\/ini writes removed where the PHP manual confirms they had no effect on I\/O-bound operations.<\/li>\n<li>FIX: The backup zip download sent a Content-Length describing the pre-compression size when zlib.output_compression was active, truncating some downloads; the header is now omitted when compression is on.<\/li>\n<li>FIX: Tested up to bumped from 7.0 to 7.1.<\/li>\n<li>FIX: Telegram notifications now log transport failures and non-200 responses instead of failing silently; PayPal order creation now reports an invalid-JSON broker response distinctly from an HTTP-status failure.<\/li>\n<li>CLEANUP: Removed stale Twilio SMS and ntfy push-notification disclosures (both replaced by Telegram) and a dead Paystack payment disclosure (retired in favour of PayPal) from External Services; merged the readme's two separate \"External Services\" sections into one.<\/li>\n<\/ul>\n\n<h4>3.2.692<\/h4>\n\n<ul>\n<li>ADD: Failover mode. Set CSBR_FAILOVER_MODE, or write \/etc\/cloudscale\/failover-mode, on the host and this install will never create a local backup, schedule one, or allow one to be triggered by hand or by WP-CLI \u2014 and it says so on every admin screen: \"Not Backing Up: In Failover Mode\". Intended for a DR standby that may be taken live temporarily. It is a constant rather than a setting on purpose: the site-role flag flips to primary during a failover, and a standby is rebuilt by restoring the primary's database, so anything held in the database comes back switched on.<\/li>\n<li>FIX: Verifying a backup with an empty filename tried to open the backup DIRECTORY as a zip archive, because the empty name concatenates to the directory path and file_exists() is true for a directory. It now reports that no backup file was produced, which is the actual reason.<\/li>\n<\/ul>\n\n<h4>3.2.688<\/h4>\n\n<ul>\n<li>SECURITY: Local backups were protected only by an .htaccess deny-all, and .htaccess is inert on nginx, Caddy, LiteSpeed without rewrite support, and IIS. On those servers the archives were downloadable by anyone who guessed a filename \u2014 and the filenames are sequential (backup_F185, F186, F187), so guessing one gives you all of them. A backup contains your wp-config.php database credentials and auth salts plus a full database dump including password hashes. Found on a live site serving a 2 GB archive as HTTP 200 to an anonymous request.<\/li>\n<li>SECURITY: The backup directory is now uploads\/cloudscale-backup-\/ instead of a fixed, guessable name. Existing backups are migrated into it on upgrade; a file is only removed from the old location once the copy is confirmed the same size, and anything that cannot be moved is left in place rather than lost.<\/li>\n<li>SECURITY: Protection is no longer Apache-only. The plugin writes an .htaccess covering both mod_authz_core (Require all denied) and 2.2 (Order\/Deny) syntax, a web.config for IIS, a silent index.php, and sets the directory to 0700 \u2014 which is the only one of these that needs no cooperation from the web server, and blocks the common nginx + PHP-FPM arrangement where the two run as different users. The staging directory used during a restore is hardened the same way, since an extracted backup is the same secrets as loose files.<\/li>\n<li>ADD: A \"Public access to backups\" check that writes a short-lived canary file and fetches its own URL to find out whether the directory is genuinely readable. A real backup is never requested. The result appears in Retention &amp; Storage and, if the directory is exposed, as a non-dismissible admin warning with the exact nginx rule to add. It re-runs daily, because a server can be reconfigured under a plugin that never rechecks \u2014 which is how a fixed .htaccess went on protecting nothing for years.<\/li>\n<li>ADD: CSBR_BACKUP_DIR constant to pin the backup directory, for hosts where it is a mount point and the randomised path would move backups off it.<\/li>\n<\/ul>\n\n<h4>3.2.654<\/h4>\n\n<ul>\n<li>FIX: The dashboard widget reported \"Last backup: Never\" in red, and raised NEEDS ATTENTION, on any site with no LOCAL backup copies \u2014 even while its own record showed a backup that morning and all three cloud providers showed a successful sync. The recorded time was read only inside the branch that required a local file to exist. A host with no local copies is the normal state right after a restore, which is exactly when this widget gets looked at, and it is also normal if you keep backups off-site only. It now reports the real time, marks it \"(off-site)\", and says \"stored locally\" so a zero beside a recent time is not a contradiction.<\/li>\n<li>FIX: Every admin page could fatal with 'Undefined constant \"FS_CHMOD_FILE\"' on a clean install. The crash-recovery dropin writer passed that constant at admin_init, where WordPress does not guarantee it is defined: it is set by wp-admin\/includes\/file.php, which only happens to be loaded early on sites where another plugin pulled it in. Found on a freshly restored host, which is exactly where this plugin is used, because the first thing you do after a restore is open wp-admin.<\/li>\n<li>FIX: Licence card strings no longer pass a variable text domain to translation functions (Plugin Check NonSingularStringLiteralDomain critical, ~24 call sites); strings are now plain escaped output<\/li>\n<\/ul>\n\n<h4>3.2.637<\/h4>\n\n<ul>\n<li>ADD: New optional \"Site root extras\" backup component: .user.ini, php.ini, robots.txt, ads.txt, app-ads.txt, humans.txt, favicon.ico, .well-known\/, and search-engine verification files (Google\/Bing\/Yandex\/Pinterest) from the site root. Restored to the target root when cloning.<\/li>\n<li>ADD: New optional \"Server config snapshot\" backup component: read-only reference copies of readable nginx\/Apache config, full PHP runtime settings, and MySQL server variables saved under server-info\/ in the zip. Never restored automatically.<\/li>\n<li>ADD: Post-restore environment comparison, when a backup contains a server config snapshot, restoring it reports differences that commonly break a rebuilt site (PHP version, missing PHP extensions, lower memory\/upload limits, MySQL version) in the success message, notification, and log.<\/li>\n<li>ADD: Integrity check now validates the two new components when included.<\/li>\n<li>FIX: Clone extraction now rejects zip entry names containing \"..\" (path traversal hardening for crafted zips).<\/li>\n<\/ul>\n\n<h4>3.2.539<\/h4>\n\n<ul>\n<li>FIX: Fatal-error-handler drop-in now written via the WordPress Filesystem API instead of raw copy() (resolves Plugin Check PluginDirectoryWrite)<\/li>\n<li>FIX: Crash Recovery config and notification lock moved from the wp-content root into uploads\/cloudscale-backup\/ per WordPress.org guidelines; old files removed on upgrade<\/li>\n<li>FIX: Removed wp_prime_option_caches() (WordPress 6.4+) so the plugin stays compatible with its declared minimum of WordPress 6.0<\/li>\n<li>CHANGE: Drop-in notifications now use the non-blocking wp_remote_post() HTTP API instead of cURL<\/li>\n<li>CHANGE: Dev-only crash-test harness and clone module excluded from the release build; removed duplicate Plugin URI header<\/li>\n<\/ul>\n\n<h4>3.2.360<\/h4>\n\n<ul>\n<li>FIX: Remove four dead <code>wp_ajax_csbr_do_sync_job_*<\/code> handlers that called undefined function <code>csbr_do_async_sync()<\/code>, legacy loopback architecture replaced by <code>register_shutdown_function()<\/code> in v3.2.257<\/li>\n<li>FIX: Automatic Crash Recovery Explain modal and How It Works list now correctly document all notification channels (email, Twilio SMS, ntfy push) instead of only Twilio<\/li>\n<li>ADD: DocBlocks added to <code>csbr_set_job()<\/code>, <code>csbr_get_job()<\/code>, <code>csbr_delete_job()<\/code>, <code>csbr_find_rclone()<\/code>, <code>csbr_find_aws()<\/code>, <code>csbr_list_tables_in_dump()<\/code>, <code>csbr_list_backups()<\/code><\/li>\n<li>CLEANUP: Remove unused <code>csbr_verify_nonce()<\/code> helper (all handlers use <code>check_ajax_referer()<\/code> directly)<\/li>\n<\/ul>\n\n<h4>3.2.257<\/h4>\n\n<ul>\n<li>FIX: PCP compliance: <code>cs_admin_page()<\/code> now independently checks <code>current_user_can('manage_options')<\/code><\/li>\n<li>FIX: PCP compliance: <code>wp_unslash()<\/code> added to <code>$_POST['cs_action']<\/code> and <code>$_POST['schedule_enabled']<\/code>; <code>phpcs:ignore<\/code> annotations added<\/li>\n<li>FIX: PCP compliance: <code>data-free-bytes<\/code> attribute annotated with <code>phpcs:ignore EscapeOutput.OutputNotEscaped<\/code><\/li>\n<li>FIX: <code>uninstall.php<\/code>: Dropbox options now cleaned up on plugin delete<\/li>\n<li>FIX: Dropbox history pane infinite reload loop resolved<\/li>\n<li>FIX: AMI Save\/Create buttons now show feedback message correctly<\/li>\n<li>UX: Copy buttons on all Explain modal code blocks; Dropbox setup wizard guide; italic placeholders<\/li>\n<\/ul>\n\n<h4>3.2.1<\/h4>\n\n<ul>\n<li>Renamed internal constants with CS_BACKUP_ prefix to avoid collisions with other plugins<\/li>\n<li>Replaced @unlink(), @copy(), @rmdir() with wp_delete_file(), copy(), rmdir() per WordPress coding standards<\/li>\n<\/ul>\n\n<h4>3.2.0<\/h4>\n\n<ul>\n<li>NEW: Split backup scheduling into two independent cron events: file backup and AMI snapshot each have their own day picker and time selector<\/li>\n<li>NEW: Configurable backup filename prefix (default: bkup), set in the Retention card<\/li>\n<li>NEW: S3 sync auto-retry: on failure a single cron event fires 5 minutes later; UI shows pending state and a manual Retry button<\/li>\n<li>FIX: Scheduled backup run hour never saved due to missing name attribute on the hour select<\/li>\n<li>FIX: Full+ backup type badge now renders distinctly from Full (separate CSS rule)<\/li>\n<li>AMI explain modal updated to document the two-schedule architecture; reboot defaults clarified (off = crash-consistent, no downtime)<\/li>\n<\/ul>\n\n<h4>2.74.2<\/h4>\n\n<ul>\n<li>FIX: AMI creation failed with \"Character sets beyond ASCII are not supported\" due to em dash in description<\/li>\n<li>AMI description now stripped to printable ASCII only via regex<\/li>\n<li>AMI name now sanitised to AWS allowed characters (alphanumeric, hyphens, underscores, dots, slashes, parens) and capped at 128 chars<\/li>\n<li>Replaced sanitize_file_name with stricter AWS specific character filter<\/li>\n<\/ul>\n\n<h4>2.74.1<\/h4>\n\n<ul>\n<li>FIX: AMI panel could vanish if IMDS endpoint was unreachable or curl failed during page render<\/li>\n<li>All IMDS calls now wrapped in try\/catch with error suppression so failures cannot break the admin page<\/li>\n<li>Added curl_init availability check before attempting IMDS calls<\/li>\n<li>IMDS results cached in WordPress transients (1 hour TTL) to avoid repeated metadata calls on every page load<\/li>\n<li>AMI panel init block wrapped in top level try\/catch, falls back to empty state on any error<\/li>\n<\/ul>\n\n<h4>2.74.0<\/h4>\n\n<ul>\n<li>NEW: EC2 AMI Snapshot panel: create full machine images of the hosting instance directly from the plugin<\/li>\n<li>AMI name uses configurable prefix with automatic yyyyMMdd_HHmm timestamp suffix<\/li>\n<li>Optional instance reboot for filesystem consistent snapshots<\/li>\n<li>AMI creation history log with status tracking (last 5 shown, 20 stored)<\/li>\n<li>Check Status button to poll AMI state from AWS<\/li>\n<li>Explain modal with IAM policy requirements and restore instructions<\/li>\n<li>Auto detection of EC2 instance ID and region via IMDS (v1 and v2)<\/li>\n<li>Save\/create\/status operations via self contained AJAX handlers<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release of CloudScale Backup &amp; Restore<\/li>\n<li>Manual and scheduled backup of database, media uploads, plugins folder, and themes folder<\/li>\n<li>Configurable schedule interval in days with specific run hour<\/li>\n<li>Configurable retention with automatic cleanup of oldest backups<\/li>\n<li>Backup history table with type labels, sizes, dates, and ages<\/li>\n<li>Download any backup from the admin panel<\/li>\n<li>Restore from stored backup or uploaded .zip \/ .sql file<\/li>\n<li>WordPress maintenance mode enabled during restore and always removed after<\/li>\n<li>Restore confirmation modal with snapshot warning and checkbox gate<\/li>\n<li>Smart detection of mysqldump and mysql CLI for native backup and restore<\/li>\n<li>PHP streamed fallback for environments without CLI tool access<\/li>\n<li>Backup directory protected with .htaccess deny-all<\/li>\n<li>System info panel showing detected methods, memory limits, and backup path<\/li>\n<\/ul>","raw_excerpt":"No timeouts, no memory limits, any site size. Back up to S3, Google Drive, Dropbox, OneDrive or Managed Cloud at once, and restore in one click.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293223"}],"author":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andrewjbaker"}],"wp:attachment":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293223"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293223"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293223"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293223"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293223"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}