{"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-09-21T14:19:59","modified_gmt":"2026-09-21T14:19:59","slug":"cloudscale-backup-restore","status":"publish","type":"plugin","link":"https:\/\/bre.wordpress.org\/plugins\/cloudscale-backup-restore\/","author":23459506,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.2.817","stable_tag":"3.2.817","tested":"7.1.1","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-09-21 14:19:59","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":839,"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","revision":3635709},"3.2.548":{"tag":"3.2.548","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.592":{"tag":"3.2.592","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.594":{"tag":"3.2.594","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.600":{"tag":"3.2.600","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.604":{"tag":"3.2.604","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.605":{"tag":"3.2.605","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.617":{"tag":"3.2.617","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.627":{"tag":"3.2.627","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.637":{"tag":"3.2.637","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.639":{"tag":"3.2.639","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.653":{"tag":"3.2.653","author":"andrewjbaker","date":"2026-08-05 18:19:28","revision":3635709},"3.2.654":{"tag":"3.2.654","author":"andrewjbaker","date":"2026-08-05 18:30:14","revision":3635722},"3.2.698":{"tag":"3.2.698","author":"andrewjbaker","date":"2026-08-25 08:33:13","revision":3664899},"3.2.700":{"tag":"3.2.700","author":"andrewjbaker","date":"2026-08-26 14:36:39","revision":3667276},"3.2.704":{"tag":"3.2.704","author":"andrewjbaker","date":"2026-09-01 06:55:46","revision":3675473},"3.2.817":{"tag":"3.2.817","author":"andrewjbaker","date":"2026-09-21 14:19:59","revision":3705751}},"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","3.2.704","3.2.817"],"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>Standby &amp; DR tab: one screen to turn a second install into either a hot standby (takes over if the live site dies) or a refreshed copy (for testing, never serves the public). One typed confirmation sets the site role, failover mode, the alert label and disarms the live site's scheduled jobs on the copy, then a six-step checklist shows what is done and what is left<\/li>\n<li>Automated Restore: a standby refreshes itself from the primary's newest cloud backup on a schedule. It lists your cloud storage (S3, Google Drive, Dropbox, OneDrive or CloudScale Managed), copies the backup straight to the server without passing through your computer, restores it, and reports the recovery time and a file-by-file reconciliation afterwards<\/li>\n<li>Staleness limit: a run refuses a backup older than the limit you set (36 hours by default) and raises an alert, so a standby quietly restoring last week's backup cannot look healthy. If the backup is late it waits for up to three hours, looking every 15 minutes, before alerting<\/li>\n<li>Armed is not serving: failover mode marks a standby as armed to take over, so it never creates, schedules or allows a backup of its own, and says so on every admin screen. Whether it is actually carrying traffic is a separate host-level signal written by whatever moves your DNS; while it says serving, the refresh is suspended so nothing visitors wrote is overwritten<\/li>\n<li>Cloudflare failover script: <code>tools\/cloudflare-failover.sh<\/code> in the plugin's GitHub repository polls the primary, repoints one DNS record at the standby after three consecutive failures, and points it back after ten consecutive clean probes. Every failback prints a reconcile reminder, because work done on the standby while it served exists nowhere else and the standby's next refresh erases it. Not included in this zip, which carries no shell scripts<\/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>Clone to a Staging Site<\/h4>\n\n<p>Restore any backup into a <strong>separate WordPress install on the same server<\/strong>, with its own directory and database, instead of over the live site.<\/p>\n\n<ul>\n<li>Clone Targets tab: give a target a directory, its URL and its <code>wp-config.php<\/code>, then press Clone Now. URLs are rewritten everywhere, including serialized data and JSON<\/li>\n<li>Refuses this site's own database or directory before touching anything<\/li>\n<li>Optional schedule after each backup. Runs no shell scripts; hook the <code>csbr_clone_post_restore<\/code> action instead<\/li>\n<li>The dump is streamed, so large sites clone inside PHP's default memory limit<\/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>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=\"how%20do%20i%20set%20up%20a%20standby%20or%20disaster-recovery%20copy%20of%20my%20site%3F\"><h3>How do I set up a standby or disaster-recovery copy of my site?<\/h3><\/dt>\n<dd><p>Install WordPress and this plugin on the second server, then open the Standby &amp; DR tab there (never on the live site). Choose a hot standby or a refreshed copy, label its alerts, type MAKE THIS A COPY and press Apply. Then on the Automated Restore tab connect the cloud storage the live site backs up to, choose the folder or site to copy from, and switch on the schedule. The checklist on the Standby &amp; DR tab shows anything still missing. A hot standby also needs something outside WordPress to move your DNS and to tell the standby when it is serving; the help site and the plugin's GitHub repository describe a Cloudflare script that does the DNS half.<\/p><\/dd>\n<dt id=\"how%20do%20i%20clone%20my%20site%20to%20a%20staging%20copy%20on%20the%20same%20server%3F\"><h3>How do I clone my site to a staging copy on the same server?<\/h3><\/dt>\n<dd><p>Create the target first: an empty directory the web server can write to, containing a <code>wp-config.php<\/code> that names an empty database (or one your database user can create). Take a backup that includes WordPress core files. Then open the Clone Targets tab, add a target with that directory, the URL it will be served from and the path to that <code>wp-config.php<\/code>, press Verify, and press Clone Now. The target's files and database are replaced by the backup and every URL is rewritten. The plugin refuses if the target is this site's own directory or database, or a directory that contains this site. Point your web server or hosting panel at the new directory to view it. The <code>wp-config.php<\/code> must contain literal database values: one that reads them from environment variables cannot be used, and the plugin says so. Cloning needs the PHP <code>mysqli<\/code> extension, and the database user named in that <code>wp-config.php<\/code> must be able to create the database, or the database must already exist. Clone Now names the directory and database it will overwrite and asks first, because everything in the target is replaced and that cannot be undone. You can also refresh a target automatically after each scheduled backup, on the days you choose, and hook the <code>csbr_clone_post_restore<\/code> PHP action to run your own steps afterwards: the clone itself runs no shell scripts. A clone is a complete copy, including your mail settings and scheduled tasks, and nothing in it blocks outgoing email, so block email on it before you browse it.<\/p><\/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<dt id=\"what%20files%20does%20the%20plugin%20write%20outside%20its%20own%20folder%3F\"><h3>What files does the plugin write outside its own folder?<\/h3><\/dt>\n<dd><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<p>The plugin also writes the following, all of which are removed on uninstall:<\/p>\n\n<ul>\n<li><code>wp-content\/uploads\/cloudscale-backup-&lt;random&gt;\/<\/code> - the backup archives themselves,\nplus an <code>.htaccess<\/code>, a <code>web.config<\/code> and an <code>index.php<\/code> that block public access to\nthem. The directory name carries a per-site random token because a fixed, guessable\nname meant sequentially-named archives could be downloaded by anyone who guessed a\nfilename.<\/li>\n<li><code>wp-content\/csbr-secrets.php<\/code> - cloud storage credentials, the licence key and the\nbackup encryption password, held outside the database so they are not carried inside\nthe database dumps this plugin creates. It begins with a PHP exit guard so it cannot\nbe read over HTTP, is written <code>0600<\/code>, and is excluded from every backup. A lock file\nand a short-lived temporary file sit alongside it during a write.<\/li>\n<li><code>wp-content\/cloudscale-backup-par.json<\/code> - the Automatic Crash Recovery state file,\nrecording which plugins are being monitored.<\/li>\n<li><code>wp-content\/csbr-state\/csbr-auto-restore.json<\/code> - on a standby site only, the automatic\nrestore schedule and the source it pulls from. The directory carries the same deny-all\nrules as the backup directory, so the file is not readable over HTTP. Installs upgrading\nfrom an earlier version have their existing <code>wp-content\/csbr-auto-restore.json<\/code> moved\nhere automatically.<\/li>\n<li><code>&lt;WordPress root&gt;\/.maintenance<\/code> - WordPress's own maintenance-mode file, written only\nwhile a restore is running and removed when it finishes or fails. This is the\nmechanism WordPress itself uses during core updates.<\/li>\n<li>A temporary staging directory under the system temp path while a backup is built or\na restore is unpacked, deleted when the operation ends.<\/li>\n<li><code>wp-content\/csbr-state\/plugin-auto-recovery\/<\/code> - Automatic Crash Recovery only: a copy of\na plugin taken just before WordPress updates it, so a bad update can be rolled back. It is\nremoved when the monitoring window closes and otherwise after 72 hours, and on uninstall.\nIt sits outside the uploads folder because it holds PHP, and it carries deny rules.<\/li>\n<li>Clone Targets only, and only after an administrator adds a target and presses Clone Now\nor enables its schedule: a complete WordPress install (core, plugins, themes, uploads and\nthe <code>wp-config.php<\/code> the administrator named) is written into the directory the\nadministrator chose for that target, which is normally outside <code>wp-content<\/code>, and the\ntables in that target's own database are dropped and recreated. It never writes to this\nsite's own directory, and no script is generated or run. The target list is stored in\nthe <code>csbr_clone_targets<\/code> option.<\/li>\n<\/ul>\n\n<p>No personal data is stored in any of these files beyond what the site itself already\nholds.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.2.817<\/h4>\n\n<ul>\n<li>FIXED: A restore now clears the site's persistent object cache (Redis or Memcached). Before, the database was replaced but the cache kept serving the old settings, so a restored site could go on showing its previous theme, plugin list or site settings until the cache was cleared by hand, while the restore reported success. The cache is cleared as soon as the database has been restored, and also after an import that stops part-way.<\/li>\n<\/ul>\n\n<h4>3.2.816<\/h4>\n\n<ul>\n<li>FIXED: A restore no longer strands your backups in a folder the plugin has stopped looking in. The backup folder's name carries a private token that was kept only in the database, so restoring a database that lacked it (a standby copying a primary, or a database taken from another site) made the plugin invent a new folder and leave the old one behind, unused, with the backups inside. The token is now also kept in a protected file outside the uploads folder, and the folder name stays the same after a restore. Sites that already have a folder keep it.<\/li>\n<\/ul>\n\n<h4>3.2.815<\/h4>\n\n<ul>\n<li>FIXED: Automatic Crash Recovery now takes its rollback copy when several plugins are updated at once. Before, it only did so for a single update, so \"Update all\" in the dashboard and <code>wp plugin update --all<\/code> left every plugin in the batch without a copy to roll back to, and the log said \"No pre-update backup found\". Both now get a copy and the same post-update monitoring as a single update.<\/li>\n<\/ul>\n\n<h4>3.2.814<\/h4>\n\n<ul>\n<li>FIXED: Buying a one-off boost through PayPal could leave the order unpaid. The return link handed to PayPal had its parameters joined with <code>&amp;amp;<\/code> instead of <code>&amp;<\/code>, so when PayPal sent the buyer back the plugin could not find the order and quietly did nothing. The link is now built correctly and a return with a missing or expired security token is logged, with \"Recover licence\" as the way out.<\/li>\n<\/ul>\n\n<h4>3.2.813<\/h4>\n\n<ul>\n<li>FIXED: Automatic Crash Recovery no longer keeps copies of a plugin's PHP files inside the uploads folder. Before each plugin update it copies the plugin so it can roll the update back, and those copies sat under uploads, where a security scanner reads any PHP as a possible compromise. Cyber DevTools' file-integrity check reported 50 executable files on a standby after WordPress auto-updated one plugin. The copies now live under <code>wp-content\/csbr-state\/<\/code>, outside uploads, with deny rules. Rolling back works exactly as before, and copies taken by earlier versions are still used and are cleared by the same 72-hour sweep.<\/li>\n<\/ul>\n\n<h4>3.2.812<\/h4>\n\n<ul>\n<li>ADDED: Clone to a staging site. Restore any backup into a separate WordPress install on the same server, with its own directory and database and every URL rewritten, instead of over the live site. Set up targets on the new Clone Targets tab, run one with Clone Now (which names what it will overwrite and asks first) or refresh it after each scheduled backup on the days you pick.<\/li>\n<li>ADDED: The clone refuses to run against this site's own database or directory, or a directory that contains this site, and checks a target's wp-config.php is writable before it deletes anything.<\/li>\n<li>ADDED: <code>csbr_clone_post_restore<\/code> PHP action for steps to run after a clone. The clone runs no shell scripts.<\/li>\n<\/ul>\n\n<h4>3.2.809<\/h4>\n\n<ul>\n<li>FIXED: A restore now replaces files the web server cannot open for writing, such as files owned by another user after an SFTP upload, a control-panel edit or a host-side deploy. Those files were reported as \"could not be written\" and the stale copy was left in place, so the restore was partial while looking complete apart from a warning. The new file is written beside the old one and swapped in atomically, so a failure part way leaves the old file, never a gap. A file whose directory is not writable is still reported.<\/li>\n<li>FIXED: The restore warning that lists files which could not be written printed \"Array; Array; Array\" instead of naming them. It now names the component, the reason and an example path, as the WP-CLI output already did.<\/li>\n<\/ul>\n\n<h4>3.2.806<\/h4>\n\n<ul>\n<li>FIXED: Backups failed in their first second on sites where the database is dumped by PHP, with \"count(): Argument #1 must be of type Countable|array, null given\". A variable was released two lines before it was counted. Introduced in 3.2.799. If you installed 3.2.799 to 3.2.805, check that your scheduled backups have been running.<\/li>\n<li>CHANGED: The Last recovery panel leaves out a phase that took no time, such as the copy from cloud storage when the backup was already on the server.<\/li>\n<\/ul>\n\n<h4>3.2.805<\/h4>\n\n<ul>\n<li>CHANGED: On the Recover a site tab, the \"Cannot log in to wp-admin at all?\" card has moved to the bottom, after the restore steps it used to interrupt. When Automatic Crash Recovery is already on it is now a single line saying so, and the full card appears only when it is off.<\/li>\n<\/ul>\n\n<h4>3.2.804<\/h4>\n\n<ul>\n<li>ADDED: A \"Last recovery\" panel on the Recover a site tab. It shows how long the last restore really took, split into the copy from cloud storage, files, database and checking, how big it was, and how old the backup was when it was restored.<\/li>\n<li>ADDED: Reconciliation. When a restore finishes, every file in the backup is looked up on disk and any that are missing or the wrong size are counted and named. The panel also checks, live, for anything left lying around: a maintenance file, a restore frozen part way, a half-copied backup, or an operation that never reported its ending.<\/li>\n<li>ADDED: The restore-succeeded alert now carries the recovery time, sizes and the reconciliation result.<\/li>\n<li>FIXED: A restore that died without cleaning up left the maintenance file on disk for ever. It is now cleared on the next admin page load, recorded as a failed restore, and alerted once.<\/li>\n<\/ul>\n\n<h4>3.2.803<\/h4>\n\n<ul>\n<li>FIXED: A restore could die on any large file. Each file in the backup was read into memory whole, so a single 121 MB file under a 128 MB PHP memory limit killed the restore on its fourteenth file. Files are now streamed to disk, and a 48 MB file restores in 2 MB of memory.<\/li>\n<li>FIXED: When a restore, backup, cloud copy or cloud sync hit a fatal error in the background, nothing was reported at all: no alert, no failed job, and maintenance mode left on. The safety net for this could never run because of where the work was started from. It runs now.<\/li>\n<li>FIXED: A restore that was refused because another was already running could start anyway.<\/li>\n<li>FIXED: The automatic restore status stopped checking the first time the server lost the job, and told you to reload. It now keeps following through maintenance mode and the database being replaced, and says so plainly if the restore stalls.<\/li>\n<li>IMPROVED: Restoring files now reports progress as it goes, instead of sitting at 0% until every file is written.<\/li>\n<\/ul>\n\n<h4>3.2.802<\/h4>\n\n<ul>\n<li>CHANGED: \"Run the automatic restore now\" asks for its confirmation in the plugin's own dialog instead of a browser prompt, with the word to type shown in bold and an Explain button.<\/li>\n<li>ADDED: A progress bar under the automatic restore status while a manual run is copying and restoring.<\/li>\n<\/ul>\n\n<h4>3.2.801<\/h4>\n\n<ul>\n<li>FIXED: \"Run the automatic restore now\" never restored anything. It recorded its own job as running, then saw that record, decided a restore was already in progress and skipped itself within a couple of seconds.<\/li>\n<li>FIXED: The result of a manual automatic-restore run was wiped by a page reload 2.5 seconds later, so a run that refused looked like a button that did nothing. Failures now stay on screen, in a visible status box, and a skipped run is no longer shown with a tick.<\/li>\n<li>CHANGED: \"Run the automatic restore now\" asks you to type confirm before it starts, instead of REPLACE THIS SITE.<\/li>\n<\/ul>\n\n<h4>3.2.800<\/h4>\n\n<ul>\n<li>FIXED: An \"Automatic Restore\" box appeared at the bottom of every tab on sites with Google Drive, Dropbox or OneDrive backup history. Three unclosed attributes on the Manual Restore tab let its contents spill out of the tab.<\/li>\n<li>CHANGED: \"Run the automatic restore now\" has moved next to Save schedule and Check the source now on the Recover a site tab, beside the settings it runs. It still asks you to type REPLACE THIS SITE first. The separate box on Manual Restore is gone.<\/li>\n<\/ul>\n\n<h4>3.2.799<\/h4>\n\n<ul>\n<li>SECURITY: Your Google Drive, Dropbox and OneDrive credentials were stored in the database, which meant every backup contained them. A site restored from one of your backups came up able to read and delete the backups in your cloud account. They are now stored outside the database and moved across automatically when you update.<\/li>\n<li>SECURITY: The file holding your cloud credentials, licence key and backup encryption password could briefly be downloaded from your site while it was being written. It is now protected for its whole life, and any leftovers from an interrupted write are cleaned up.<\/li>\n<li>SECURITY: The health-check address in Automatic Crash Recovery was not escaped when written into the monitoring script that runs as root, so anyone who could reach the settings page could run commands on the server.<\/li>\n<li>SECURITY: The Dashboard widget and its script loaded for every logged-in user, including subscribers, exposing backup counts, disk space and cloud sync status. Both are now administrator-only.<\/li>\n<li>SECURITY: Cloning to another site could drop every table in THIS site's database if the clone target still pointed at this installation's wp-config.php.<\/li>\n<li>FIXED: Encrypted backups were always reported as corrupt. The verifier was not given the encryption password, so it could not read inside the archive and marked good backups as failed.<\/li>\n<li>FIXED: Dropbox retention never deleted anything unless you had clicked Refresh on the Dropbox card at least once, so old Dropbox backups built up without limit.<\/li>\n<li>FIXED: A backup taken while the site was busy could silently miss rows, because the database was read in pages with no guaranteed order.<\/li>\n<li>FIXED: Restores started from WP-CLI, from a standby's automatic restore, or from the clone tool let visitors back onto the site after ten minutes, part-way through the restore.<\/li>\n<li>FIXED: A scheduled backup could start during a restore and store a copy of a half-restored database.<\/li>\n<li>FIXED: Downloading a large backup from Google Drive, Dropbox, OneDrive or S3 could time out. Only the local download streamed properly; the other four now do too.<\/li>\n<li>FIXED: A standby site with incorrect cloud credentials slowed every page on the front end.<\/li>\n<li>FIXED: A standby reported backups as arriving late when they had arrived in good time.<\/li>\n<li>FIXED: Restoring a database dump created by mysqldump or phpMyAdmin merged into your existing database instead of replacing it, while reporting success. Comment lines in those dumps were being read as part of the statement below them, so the instruction to replace each table was skipped and its rows were added to the old table. Backups made by this plugin were never affected. Dumps from other tools now restore correctly.<\/li>\n<li>FIXED: A restore that the database rejected is now reported as a failure. Rejected statements were counted and logged, but the restore still recorded itself as successful, sent a success notification and took the site out of maintenance mode. It now stops and tells you the database needs restoring again from a known-good backup.<\/li>\n<li>FIXED: Cloning to another site could drop every table in THIS site's database if the clone target still pointed at this installation's wp-config.php. The clone now checks the target database as well as the target directory, and refuses unless you have explicitly allowed it.<\/li>\n<\/ul>\n\n<h4>3.2.787<\/h4>\n\n<ul>\n<li>ADDED: A standby site now remembers when the last 14 backups actually arrived in your cloud storage, and suggests a restore time that sits clear of all of them. It also warns when backups have started arriving after the time you chose, which otherwise only shows up as a refused restore the next morning. The suggestion is never applied on its own.<\/li>\n<li>FIXED: When the plugin could not read your account, it said \"this account holds no backups yet\" instead of saying what went wrong. An error and an empty account are now told apart, and failures name the reason.<\/li>\n<\/ul>\n\n<h4>3.2.784<\/h4>\n\n<ul>\n<li>FIXED: The activity log could hide recent entries, so a backup that had just succeeded looked like it had never run. Entries were stored under one name and looked for under another, and the periodic tidy-up that made them visible ran on a one-in-ten chance. The log now shows everything that has been written, immediately, and Clear now really clears.<\/li>\n<li>FIXED: Scheduled jobs other than the main backup could fail without telling anyone. A PHP fatal cannot be caught by ordinary error handling, so the nightly cloud upload, the exposure probe and the AMI checks could simply stop, leaving nothing in the log and no alert. All scheduled jobs now report failures the same way the backup does.<\/li>\n<li>FIXED: After a backup, the \"last backup\" time, the in-progress marker and the failure flag could disagree with each other. They are now all set in one place, and the time comes from the backup file itself.<\/li>\n<\/ul>\n\n<h4>3.2.782<\/h4>\n\n<ul>\n<li>FIXED: The \"Copy Last Backup to Cloud\" button appeared five times, once per cloud provider, with the same wording each time. Each one now names its destination, so you can tell which cloud you are about to upload to without scrolling back to the card heading.<\/li>\n<\/ul>\n\n<h4>3.2.781<\/h4>\n\n<ul>\n<li>FIXED: Scheduled backups could fail with \"Call to undefined function wp_tempnam()\" while manual backups from the admin screen kept working. The function lives in a WordPress admin file that scheduled jobs never load, so the nightly backup died and the one you clicked yourself did not. Every use now loads that file first.<\/li>\n<li>FIXED: A site marked as a refreshed copy no longer sends any email. A copy has the original site's users and orders, so a password reset or an order confirmation would otherwise go to a real customer from a test machine. Sites marked as a hot standby still send, because they are meant to take over. Blocked messages are logged so you can see what was stopped.<\/li>\n<li>FIXED: The flag that tells a standby whether it is currently serving live traffic is now ignored when it is out of date, rather than believed indefinitely.<\/li>\n<\/ul>\n\n<h4>3.2.779<\/h4>\n\n<ul>\n<li>ADDED: A \"Standby &amp; DR\" tab. Setting up a second site needed four settings in three different places and nothing said what they were for. This asks one question instead: is this the live site, a hot standby that should take over if the live site dies, or a refreshed copy for testing. It then sets everything that answer implies, and shows a checklist of what is done and what is left, including the DNS wiring a takeover needs that no plugin can do for you.<\/li>\n<li>FIXED: A crash that could take the whole admin area down when two CloudScale plugins were active together. A shared class guarded itself against being declared twice in a way that does not work when PHP's opcache is on, so the second plugin to load could fatal. All the shared classes now use the form that actually holds.<\/li>\n<li>FIXED: Automatic restore refused to run on any site in failover mode, even when that site was only armed to take over rather than actually serving. Those are different things, and the first is the normal state of a standby, so the nightly refresh could never be switched on. It now refuses only when the site is genuinely carrying the live site's traffic, or when nothing can tell it either way.<\/li>\n<li>FIXED: The Recover tab said you could choose which components to put back and offered no such control; that picker is on the Manual Restore tab, and it now says so.<\/li>\n<\/ul>\n\n<h4>3.2.773<\/h4>\n\n<ul>\n<li>ADDED: The plugin now has its own top-level menu with an icon, instead of hiding under Tools. This is the screen you open when something has gone wrong, and on a phone the Tools submenu was several taps away. Existing links and bookmarks to the old address still work.<\/li>\n<li>FIXED: The label that marks alerts as coming from a standby or test copy is no longer stored in the database. A standby has the live site's database restored over it, which erased the label and left the copy's alerts looking identical to the real site's. It is now stored in a file that a restore cannot touch, an existing label is moved there automatically, and you can set it in a new Alert Label card on the Environment tab.<\/li>\n<li>FIXED: On hosting where wp-content cannot be written, setting that label now refuses and tells you the line to add to wp-config.php, instead of saving it somewhere a restore would wipe.<\/li>\n<\/ul>\n\n<h4>3.2.769<\/h4>\n\n<ul>\n<li>ADDED: Automatic restore. A standby site can now refresh itself from your primary site's newest cloud backup on a schedule: it lists your cloud storage, refuses if the newest backup is too old, copies it to the server and restores from it. Set it up at the bottom of the Restore tab. It uses the same copy and the same restore the buttons on those screens use, so there is no second code path to drift.<\/li>\n<li>FIXED: The Restore tab's introduction said it rolls back your database. Restores have put your files back as well since 3.2.762, so the most prominent sentence on that screen was describing the old behaviour.<\/li>\n<li>ADDED: A staleness limit, which is the point of the feature rather than a detail. A standby that quietly restores last week's backup every night looks perfectly healthy and is useless for failover, so a run refuses when the newest backup is older than the limit you set, and the refusal raises an alert. The default is 36 hours: long enough that one missed nightly backup does not alarm you, short enough that two do.<\/li>\n<li>ADDED: The cloud folder to restore from can be named explicitly, so several standby sites (a staging copy and a disaster-recovery copy, say) can both track one primary. Each one only ever reads that folder, so they cannot interfere with each other or with the primary.<\/li>\n<li>ADDED: \"Check the source now\" answers \"would tonight's run work?\" without touching your site, naming the backup it would pick, how old it is, and whether there is room for it on the server.<\/li>\n<li>ADDED: The backup lists now show which backups have already been restored onto this machine, with the time, and the button becomes \"Restore again\". Previously a backup restored an hour ago looked identical to one merely downloaded, so the most destructive button in the plugin went on inviting you to repeat work already done. Failed attempts are shown too.<\/li>\n<li>ADDED: A wp csbr auto-restore command, so a server timer can drive the job without relying on WP-Cron.<\/li>\n<li>SECURITY: Automatic restore refuses to run, and refuses to be switched on, on a site marked as the primary, and refuses while failover mode is on, because that means the copy is serving live traffic and holds content that exists nowhere else. Switching it on asks you to type REPLACE THIS SITE. Its settings are stored in a file rather than the database, because every run replaces the database with the primary's copy, which would otherwise switch the schedule off after the first successful run without saying so.<\/li>\n<\/ul>\n\n<h4>3.2.717<\/h4>\n\n<ul>\n<li>FIXED: The cloud storage space check could let a backup start that did not fit. It sized the backup from whichever backup file was \"newest\", but picked that file by name rather than by date, and ignored what the backup actually contained, so a small database-only backup made overnight could make a full backup look a fraction of its real size. If no backup existed yet it skipped the check altogether, which meant the very first backup after installing, the one most likely to fill a free Google Drive, was never checked. It now uses the same size estimate the local disk check uses.<\/li>\n<\/ul>\n\n<h4>3.2.716<\/h4>\n\n<ul>\n<li>ADDED: Failover mode can now be switched on from the Environment tab. Failover mode makes a site refuse to create any backup at all, stronger than the standby role, which only stops cloud uploads and pruning. It is for a copy of your site that is temporarily serving live traffic, so it cannot start a second backup history alongside the real one. Previously it could only be set in wp-config.php or by your hosting provider, so on most shared hosting it could not be reached at all, even though the dashboard described it. If your host has pinned the setting, that still wins and the screen says so.<\/li>\n<li>ADDED: Turning failover mode on asks you to type STOP BACKUPS first. It stops every backup on the site, including scheduled ones, and nothing warns you afterwards, a site that has stopped backing up is silent. Turning it off again is a single click.<\/li>\n<li>FIXED: The dashboard notice now says what set failover mode, a constant, your hosting provider, or this site, instead of telling everybody it could not be changed.<\/li>\n<\/ul>\n\n<h4>3.2.715<\/h4>\n\n<ul>\n<li>ADDED: Copy a cloud backup straight to this server. The Restore tab could only download a backup to your own computer, so restoring a 2.5 GB backup meant downloading 2.5 GB and uploading it back again, to put a file on a server that can already reach the same storage. Every provider (S3, Google Drive, Dropbox, OneDrive and CloudScale Managed) now has a \"Copy to server\" button beside Download. The backup lands under Local Backups, ready to restore. Restoring stays a separate step, because fetching a file should never overwrite your site by itself.<\/li>\n<li>ADDED: Copying checks free space first, and downloads to a temporary name so a dropped transfer cannot leave a half-finished file looking like a backup you could restore from. Nothing is deleted to make room, it tells you how much space it needs instead.<\/li>\n<li>ADDED: Restores now check there is room before writing anything. A restore that fills the disk half way leaves your site both broken and unable to write anything else; this one stops first and leaves the site untouched. The size is read from the backup file itself and counts only the parts you are actually restoring.<\/li>\n<\/ul>\n\n<h4>3.2.713<\/h4>\n\n<ul>\n<li>ADDED: A backup can no longer fill the disk, and no longer has to be abandoned when space is tight. Before writing anything, the plugin estimates the size of the backup it is about to take and checks that free space is at least three times that estimate. If it is not, the oldest backups are aged out one at a time until there is enough room, and the backup goes ahead. Only when there is nothing left to age out is the backup failed, because running the volume to zero does not simply lose a backup, it stops MySQL and PHP being able to write at all.<\/li>\n<li>ADDED: When older backups have to be aged out early, the backup report says so, stating how many backups are being kept against the number you asked to retain, which files were removed, and how much space would be needed to stop it happening. A backup history quietly shorter than the one you configured is otherwise only discovered when you reach for a backup that is not there. The last remaining backup is never deleted to make room for a new one.<\/li>\n<\/ul>\n\n<p>Older versions: see CHANGELOG.md in the plugin folder.<\/p>","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:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293223"}],"author":[{"embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andrewjbaker"}],"wp:attachment":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293223"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293223"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293223"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293223"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293223"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}