{"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-10-19T12:25:25","modified_gmt":"2026-10-19T12:25:25","slug":"cloudscale-backup-restore","status":"publish","type":"plugin","link":"https:\/\/hr.wordpress.org\/plugins\/cloudscale-backup-restore\/","author":23459506,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.2.858","stable_tag":"3.2.858","tested":"7.1.3","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-10-19 12:25:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/cloudscale.consulting","header_author_uri":"https:\/\/cloudscale.consulting","rating":5,"author_block_rating":0,"active_installs":0,"downloads":1263,"num_ratings":1,"support_threads":1,"support_threads_resolved":1,"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},"3.2.832":{"tag":"3.2.832","author":"andrewjbaker","date":"2026-10-13 11:26:47","revision":3743737},"3.2.833":{"tag":"3.2.833","author":"andrewjbaker","date":"2026-10-14 05:19:14","revision":3745370},"3.2.836":{"tag":"3.2.836","author":"andrewjbaker","date":"2026-10-14 08:23:04","revision":3745688},"3.2.844":{"tag":"3.2.844","author":"andrewjbaker","date":"2026-10-14 16:38:40","revision":3746794},"3.2.846":{"tag":"3.2.846","author":"andrewjbaker","date":"2026-10-14 17:18:38","revision":3746839},"3.2.848":{"tag":"3.2.848","author":"andrewjbaker","date":"2026-10-15 11:59:10","revision":3748370},"3.2.852":{"tag":"3.2.852","author":"andrewjbaker","date":"2026-10-19 08:35:27","revision":3754299},"3.2.854":{"tag":"3.2.854","author":"andrewjbaker","date":"2026-10-19 08:50:55","revision":3754329},"3.2.856":{"tag":"3.2.856","author":"andrewjbaker","date":"2026-10-19 11:51:52","revision":3754651},"3.2.857":{"tag":"3.2.857","author":"andrewjbaker","date":"2026-10-19 11:58:52","revision":3754670},"3.2.858":{"tag":"3.2.858","author":"andrewjbaker","date":"2026-10-19 12:25:25","revision":3754711}},"upgrade_notice":{"3.2.858":"<p>Uninstall now cleans up the plugin&#039;s state files; your backups are kept. Also includes the &quot;Full restore&quot; label and cloud upload retries.<\/p>","3.2.857":"<p>The restore option &quot;Full database&quot; is now called &quot;Full restore&quot;: it has always restored the backup&#039;s files as well as its database. Includes chunk retries for OneDrive, Dropbox and Google Drive uploads.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"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","3.2.832","3.2.833","3.2.836","3.2.844","3.2.846","3.2.848","3.2.852","3.2.854","3.2.856","3.2.857","3.2.858"],"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":"Backup schedule and settings: days of the week, run time, retention, folder sizes and system information, including the backup and restore methods detected on your server.","2":"Manual backup with per-component checkboxes and a live progress bar, and the backup history with type badges, age, and Download, Restore and Delete actions."}},"plugin_section":[262246],"plugin_tags":[151,10698,217780,4155,152],"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-cloud-backup","plugin_tags-disaster-recovery","plugin_tags-migration","plugin_tags-restore","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":"Backup schedule and settings: days of the week, run time, retention, folder sizes and system information, including the backup and restore methods detected on your server."},{"src":"https:\/\/ps.w.org\/cloudscale-backup-restore\/assets\/screenshot-2.jpg?rev=3555507","caption":"Manual backup with per-component checkboxes and a live progress bar, and the backup history with type badges, age, and Download, Restore and Delete actions."}],"raw_content":"<!--section=description-->\n<p><strong>A backup is only worth the restore behind it.<\/strong> CloudScale Backup &amp; Restore is built for the day something goes wrong: a multi-gigabyte site, a dead server, a plugin update that takes the site down. It backs up to five destinations at once, restores your whole site in one click, and can keep a second server ready to take over. No size limit, no destination limit, no paid restore button.<\/p>\n\n<h4>Why CloudScale<\/h4>\n\n<ul>\n<li><strong>Free full restore.<\/strong> Files and database, from a local backup, an upload or any connected cloud. No premium tier is needed to get your site back.<\/li>\n<li><strong>Built for large sites.<\/strong> The database is streamed in 500-row pages, never loaded into memory. Uploads go in chunks: S3 multipart over 100 MB, and OneDrive, Dropbox and Google Drive chunks are retried up to 5 times on a dropped connection, throttle or server error, resuming where the provider says it stopped.<\/li>\n<li><strong>Five destinations at once.<\/strong> Amazon S3, Google Drive, Dropbox and Microsoft OneDrive on your own accounts, plus CloudScale Managed Cloud. Every destination you enable gets every backup.<\/li>\n<li><strong>Regional affinity.<\/strong> Managed Cloud stores backups in one of ten regions: US East, US West, South America, Ireland, Frankfurt, Cape Town, Mumbai, Singapore, Tokyo or Sydney. Automatic mode measures which is nearest your site; or pick one for data residency.<\/li>\n<li><strong>Automated recovery to a new site.<\/strong> A standby server restores itself from the newest cloud backup on a schedule, refuses a stale one, and reports recovery time and a file-by-file reconciliation.<\/li>\n<li><strong>Self-healing backups.<\/strong> A backup killed mid-run (deploy, PHP restart, out of memory) is detected through a file lock and finished or restarted, and you are told. Every archive can be integrity-checked before it is uploaded or older backups are deleted.<\/li>\n<li><strong>Rollback for bad plugin updates.<\/strong> Automatic Crash Recovery copies a plugin before WordPress updates it and can roll it back if the site starts failing.<\/li>\n<li><strong>Alerts that reach you.<\/strong> Email and Telegram alerts for failed backups, restores and recoveries, including fatal errors that a normal <code>try\/catch<\/code> never sees.<\/li>\n<\/ul>\n\n<h4>Backup: Everything, Any Size<\/h4>\n\n<p>Pick any combination; it is packaged into one <code>.zip<\/code> whose name says what it holds, with a <code>backup-meta.json<\/code> inside:<\/p>\n\n<ul>\n<li>Database (all tables), media uploads, plugins, themes<\/li>\n<li>Must-use plugins, languages, drop-ins, <code>.htaccess<\/code>, <code>wp-config.php<\/code> and WordPress core files<\/li>\n<li>Site root extras (<code>robots.txt<\/code>, favicon, <code>.well-known\/<\/code>, verification files) and a read-only snapshot of your web server, PHP and MySQL settings<\/li>\n<li>Optional AES-256 encryption with your own password<\/li>\n<li>Schedule by day of the week and time, with retention (keep the last N) on every destination<\/li>\n<li>Space check and \"delete oldest\" for cloud destinations that are filling up<\/li>\n<\/ul>\n\n<h4>Restore: One Click, Server-Side<\/h4>\n\n<ul>\n<li><strong>Full restore<\/strong> puts back the backup's files, then its database. It runs on the server, so you can close the page<\/li>\n<li><strong>Specific tables only<\/strong> or a <strong>single post or page<\/strong> with its metadata, no maintenance mode needed<\/li>\n<li>Restore from this server, from an uploaded <code>.zip<\/code> or <code>.sql<\/code>, or pull straight from S3, Google Drive, Dropbox, OneDrive or Managed Cloud to the server. S3 and Managed Cloud downloads resume where they stopped<\/li>\n<li>Encrypted backups are checked against your password before anything is touched<\/li>\n<li>Visitors see a maintenance page; it is removed whether the restore succeeds or fails<\/li>\n<li><code>wp-config.php<\/code> is never overwritten, so the site keeps its own database credentials<\/li>\n<li>Afterwards: file-by-file reconciliation, drop-in health check, and a comparison of PHP, extensions, limits and MySQL between the old server and the new one<\/li>\n<\/ul>\n\n<h4>Disaster Recovery and Failover<\/h4>\n\n<ul>\n<li><strong>Standby &amp; DR tab:<\/strong> turn a second install into a hot standby or a refreshed test copy with one typed confirmation, then follow a six-step checklist<\/li>\n<li><strong>Automated Restore:<\/strong> the standby lists your cloud storage, copies the newest backup straight to the server and restores it on a schedule. A backup older than your limit (36 hours by default) is refused and alerted<\/li>\n<li><strong>Safe by design:<\/strong> an armed standby never takes or uploads its own backups, so it cannot overwrite production's. While it is serving traffic, refreshes pause so nothing visitors wrote is lost<\/li>\n<li><strong>DNS failover:<\/strong> a Cloudflare script in the plugin's GitHub repository repoints DNS at the standby after three failed probes, and back after ten good ones<\/li>\n<li><strong>EC2 AMI snapshots:<\/strong> create and restore full machine images of an AWS-hosted server from the plugin<\/li>\n<\/ul>\n\n<h4>Staging Clones<\/h4>\n\n<p>Clone any backup into a separate WordPress install on the same server, with its own directory and database. URLs are rewritten everywhere, including serialized data and JSON. The plugin refuses this site's own directory or database, and can refresh the clone after each scheduled backup.<\/p>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Backup folder with a random, non-guessable name, protected for Apache, nginx and IIS, with <code>0700<\/code> permissions<\/li>\n<li>A daily self-check confirms backups are not publicly downloadable, and shows the server rule to add if they are<\/li>\n<li>Cloud credentials and the encryption password are kept in a protected file outside the database, so they never travel inside your backups<\/li>\n<\/ul>\n\n<h4>WP-CLI<\/h4>\n\n<pre><code>wp csbr restore, `wp csbr cloud-list`, `wp csbr cloud-pull`, `wp csbr sync-from-cloud`, `wp csbr auto-restore`, `wp csbr role` and `wp csbr doctor` let a system timer keep a standby in sync without WP-Cron.\n<\/code><\/pre>\n\n<h4>Managed Cloud<\/h4>\n\n<p>Don't have a cloud account? CloudScale Managed Cloud is $5\/month for 750 GB on Amazon S3 Glacier Instant Retrieval, in the region you choose or the nearest one. Your own S3, Google Drive, Dropbox and OneDrive destinations are always free.<\/p>\n\n<p><strong>Automatic backups are off by default.<\/strong> Run your first backup by hand to confirm your server, then switch on a schedule. Full documentation: <a href=\"https:\/\/help.cloudscale.consulting\/plugin-help\/backup-restore\/\">help.cloudscale.consulting<\/a>.<\/p>\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><strong>Service:<\/strong> Telegram Messenger, https:\/\/telegram.org\/\nWhen a Telegram bot token and chat ID are entered, the plugin sends backup,\nrestore, rollback and error alerts to that chat. A message holds the site name,\nevent status and, for errors, the PHP error, file and line. No visitor data,\npost content or backup data is sent.\nAPI endpoint contacted: the sendMessage method on api.telegram.org, addressed with\nthe administrator's own bot token.\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><strong>Service:<\/strong> Amazon Web Services, https:\/\/aws.amazon.com\/\nWhen S3 settings are configured, the plugin uploads backup zips to the\nadministrator's own S3 bucket via the S3 REST API. Only the backup zip is sent.\nThe credentials are stored on the site and sent only to the AWS S3 endpoint.\nAPI endpoint contacted: the Amazon S3 host for the bucket's own AWS region, for\nexample s3.eu-west-1.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><strong>Service:<\/strong> Google, https:\/\/workspace.google.com\/products\/drive\/\nWhen 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 endpoints contacted: www.googleapis.com (Drive v3) and oauth2.googleapis.com\n(OAuth 2.0 tokens).\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><strong>Service:<\/strong> Dropbox, https:\/\/www.dropbox.com\/\nWhen 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 endpoints contacted: api.dropboxapi.com and content.dropboxapi.com (Dropbox v2\nREST API).\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><strong>Service:<\/strong> Microsoft, https:\/\/learn.microsoft.com\/en-us\/onedrive\/\nWhen 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:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/p>\n\n<h4>CloudScale Managed Cloud Backup (optional, paid service)<\/h4>\n\n<p><strong>Service:<\/strong> CloudScale Consulting, https:\/\/cloudscale.consulting\/\nWhen subscribed, the plugin asks the CloudScale broker for a short-lived,\nprefix-scoped Amazon S3 token, then uploads backup zips straight to CloudScale's\nS3 storage; backup bytes never pass through the broker. It times ten HEAD requests per storage\nregion and sends the averages, to pick the nearest region. Nothing is sent until\na licence key is entered. Storage is encrypted at rest. For extra security, Encrypt\nbackups adds AES-256 encryption with the site owner's own password before upload. Leave us a message sends the typed email and\nmessage, hostname and licence key on Send. Clicking the PayPal button sends the\nproduct name, hostname and the optional email typed above it to \/checkout-start,\nso a failed checkout can be followed up.\nAPI endpoints contacted (broker): https:\/\/api.cloudscale.consulting\/backup\/token,\nhttps:\/\/api.cloudscale.consulting\/backup\/list, https:\/\/api.cloudscale.consulting\/status,\nhttps:\/\/api.cloudscale.consulting\/checkout, https:\/\/api.cloudscale.consulting\/checkout-start,\nhttps:\/\/api.cloudscale.consulting\/recover, https:\/\/api.cloudscale.consulting\/recover\/verify,\nhttps:\/\/api.cloudscale.consulting\/refund-request and https:\/\/api.cloudscale.consulting\/contact.\nStorage and timing requests go to CloudScale's Amazon S3 storage in its ten\nregions: af-south-1, eu-west-1, us-east-1, ap-southeast-2, ap-southeast-1,\nap-south-1, sa-east-1, us-west-2, eu-central-1 and ap-northeast-1.\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><strong>Service:<\/strong> PayPal, https:\/\/www.paypal.com\/us\/home\nSubscription payments for the optional CloudScale Managed Cloud Backup service are\nprocessed by PayPal on its own hosted checkout; card details never reach this plugin\nor the site. When the administrator starts a subscription, the subscriber's email and\nthe order amount ($5.00 USD) are sent from the WordPress server to the PayPal REST API\n(api-m.paypal.com) to create a checkout session. Nothing is sent unless the\nadministrator chooses to subscribe.\nAPI endpoint contacted: api-m.paypal.com (live) or api-m.sandbox.paypal.com\n(sandbox testing), the PayPal REST API: https:\/\/developer.paypal.com\/api\/rest\nBrowser-loaded script: PayPal's JavaScript SDK from www.paypal.com\/sdk\/js, 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\/paypal\/useragreement-full\nPrivacy Policy: https:\/\/www.paypal.com\/us\/legalhub\/paypal\/privacy-full<\/p>\n\n<h4>AWS EC2 \/ AMI snapshots (optional, AMI snapshot feature only)<\/h4>\n\n<p><strong>Service:<\/strong> Amazon Web Services, https:\/\/aws.amazon.com\/\nWhen the AMI snapshot feature is used, the plugin reads instance metadata\n(instance ID and region) from the local EC2 Instance Metadata Service at the\nlink-local address 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: the Amazon EC2 host for the instance's own AWS region, for\nexample ec2.eu-west-1.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<h4>Gmail SMTP port check (only when sending a test email)<\/h4>\n\n<p><strong>Service:<\/strong> Google, https:\/\/workspace.google.com\/gmail\/\nWhen the administrator clicks Send Test in the Notifications card, the plugin opens\na TCP connection to smtp.gmail.com on ports 587, 465 and 25 and closes it at once,\nto tell whether this server can reach an outside mail server at all. No email,\nlogin or data of any kind is sent; only the connection is attempted. Nothing\nhappens until the button is clicked.\nTerms of Service: https:\/\/policies.google.com\/terms\nPrivacy Policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Help documentation link<\/h4>\n\n<p>The plugin's header links to its help pages on help.cloudscale.consulting. It is\nan ordinary link the administrator may choose to open; the plugin itself never\nrequests that host and sends it no data.<\/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, CloudScale Managed) transmit data only when explicitly configured by the site administrator. CloudScale Managed backups are encrypted at rest; Encrypt backups adds the site owner's own password. See the External services section above.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In WordPress admin go to <strong>Plugins &gt; Add New Plugin<\/strong>, search for <strong>CloudScale Backup &amp; Restore<\/strong>, then click <strong>Install Now<\/strong> and <strong>Activate<\/strong><\/li>\n<li>Open <strong>Tools &gt; CloudScale Backup &amp; Restore<\/strong><\/li>\n<li>Click <strong>Back up my site now<\/strong> to take your first backup<\/li>\n<li>Optional: connect S3, Google Drive, Dropbox, OneDrive or Managed Cloud, then turn on a schedule<\/li>\n<\/ol>\n\n<p>To install by hand, upload the <code>cloudscale-backup<\/code> folder to <code>\/wp-content\/plugins\/<\/code> and activate it under <strong>Plugins &gt; Installed Plugins<\/strong>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20restore%20really%20free%3F\"><h3>Is restore really free?<\/h3><\/dt>\n<dd><p>Yes. Full restore, selective table restore, single post restore, cloud restore, staging clones and automated standby restore are all in the free plugin. Only Managed Cloud storage is paid; your own cloud accounts cost nothing extra.<\/p><\/dd>\n<dt id=\"will%20it%20work%20on%20a%20large%20site%3F\"><h3>Will it work on a large site?<\/h3><\/dt>\n<dd><p>Yes. The database is dumped in 500-row pages, so memory stays flat whatever its size. Backups and restores run without PHP's time limit, large uploads are sent in retried chunks, and an S3 or Managed Cloud download that stops part way resumes. A backup killed mid-run is picked up and finished or restarted. The System Info panel shows your server's limits and the methods in use.<\/p><\/dd>\n<dt id=\"where%20are%20backups%20stored%3F\"><h3>Where are backups stored?<\/h3><\/dt>\n<dd><p>On your server in <code>wp-content\/uploads\/cloudscale-backup-&lt;random&gt;\/<\/code>. The random part makes the folder name unguessable, and it carries deny rules for Apache, nginx and IIS plus an <code>index.php<\/code> and <code>0700<\/code> permissions. Download any backup from the admin with the Download button. Copies go to every cloud destination you enable.<\/p><\/dd>\n<dt id=\"where%20are%20managed%20cloud%20backups%20stored%3F\"><h3>Where are Managed Cloud backups stored?<\/h3><\/dt>\n<dd><p>In one of ten Amazon S3 regions. Automatic picks the region nearest your site by measuring it; you can also choose one, for example to keep data in Europe. Changing region sends new backups there; backups in the old region expire within 90 days.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20only%20the%20database%2C%20or%20only%20some%20tables%3F\"><h3>Can I restore only the database, or only some tables?<\/h3><\/dt>\n<dd><p>Yes. In the Restore window choose <strong>Full restore<\/strong> (files, then database), <strong>Specific tables only<\/strong> (just the tables you tick) or <strong>Single post or page<\/strong>. Upload a <code>.sql<\/code> file to restore a database only. On the command line, <code>wp csbr restore<\/code> takes <code>--db-only<\/code>, <code>--files-only<\/code> and <code>--components=&lt;list&gt;<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20migrate%20to%20a%20new%20host%20or%20domain%3F\"><h3>Can I migrate to a new host or domain?<\/h3><\/dt>\n<dd><p>Yes. Install WordPress and this plugin on the new host, then restore the backup from an upload or straight from your cloud storage. Files and database are both restored. If the domain changed, run <code>wp search-replace 'old.example' 'new.example' --all-tables<\/code> afterwards. To copy a site onto the same server under a new URL, use Clone Targets, which rewrites URLs for you.<\/p><\/dd>\n<dt id=\"how%20does%20scheduling%20work%3F\"><h3>How does scheduling work?<\/h3><\/dt>\n<dd><p>Choose the days of the week and the time of day; cloud copies run a set delay after the local backup. For reliable timing, point a real system cron job at <code>wp-cron.php<\/code> instead of relying on visitor traffic. Your server's time and timezone are shown next to the schedule.<\/p><\/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. On the Automated Restore tab connect the cloud storage the live site backs up to, choose the site to copy from, and switch on the schedule. The checklist shows anything still missing. A hot standby also needs something outside WordPress to move your DNS; the plugin's GitHub repository has a Cloudflare script for that.<\/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 an empty directory the web server can write to, with a <code>wp-config.php<\/code> naming an empty database (or one your database user can create). Take a backup that includes WordPress core files. On the Clone Targets tab add the directory, its URL and that <code>wp-config.php<\/code>, press Verify, then Clone Now. Everything in the target is replaced and every URL is rewritten. The <code>wp-config.php<\/code> must hold literal database values, and cloning needs the PHP <code>mysqli<\/code> extension. A clone is a complete copy, including mail settings and scheduled tasks, so block outgoing email on it before you browse it. Hook <code>csbr_clone_post_restore<\/code> to run your own steps afterwards.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20restore%20fails%3F\"><h3>What happens if a restore fails?<\/h3><\/dt>\n<dd><p>Maintenance mode is removed even when a restore fails, including on a PHP fatal or out-of-memory error, and you are alerted with the reason. The restore result lists anything that could not be written. There is no automatic rollback of a partly restored database, so take a server snapshot first (the Restore window asks you to confirm you have) and restore again or from that snapshot.<\/p><\/dd>\n<dt id=\"can%20i%20run%20backups%20and%20restores%20from%20wp-cli%20or%20cron%3F\"><h3>Can I run backups and restores from WP-CLI or cron?<\/h3><\/dt>\n<dd><p>Yes. <code>wp csbr restore &lt;file&gt;<\/code> restores a local backup, <code>wp csbr cloud-pull --newest<\/code> downloads the newest S3 backup, <code>wp csbr sync-from-cloud<\/code> pulls and restores in one step, and <code>wp csbr auto-restore<\/code> runs a standby's configured restore. Run <code>wp help csbr<\/code> for every option.<\/p><\/dd>\n<dt id=\"do%20i%20need%20ziparchive%20or%20a%20recent%20php%3F\"><h3>Do I need ZipArchive or a recent PHP?<\/h3><\/dt>\n<dd><p>PHP 8.1 or newer and the PHP <code>zip<\/code> extension, which nearly every host includes. AES-256 encryption needs a <code>zip<\/code> extension built with encryption support; the plugin tells you if yours is not.<\/p><\/dd>\n<dt id=\"what%20is%20inside%20the%20backup%20zip%3F\"><h3>What is inside the backup zip?<\/h3><\/dt>\n<dd><p>The parts you chose: <code>database.sql<\/code>, the uploads, plugins, themes and other folders, plus <code>backup-meta.json<\/code>, which records the plugin and WordPress versions, site URL, table prefix and components, so you can check a backup without restoring it.<\/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. Uninstalling removes them, except where noted:<\/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. <strong>Kept on uninstall<\/strong> so a reinstall or a manual restore can still use your\nbackups; delete the folder yourself if you no longer want them. The token is kept in\n  wp-content\/csbr-state\/dir-token (with the same deny rules), which also stays so a\nreinstall finds the folder.<\/li>\n<li><code>wp-content\/csbr-state\/<\/code> - the plugin's hardened state directory: the automatic restore\nschedule, the backup run lock and the crash-recovery configuration. Removed on\nuninstall, apart from <code>dir-token<\/code> and its deny rules (above).<\/li>\n<li><code>wp-content\/csbr-failover-mode.json<\/code>, <code>csbr-site-id.json<\/code> and <code>csbr-restore-ledger.json<\/code> -\nsmall markers for the standby, failover and restore features, kept outside the database\nbecause a restore replaces the database. Removed on uninstall.<\/li>\n<li><code>wp-content\/csbr-site-role.json<\/code> and <code>wp-content\/cloudscale-alert-env-label.json<\/code> - the\nsite's role (primary or standby) and its alert label. <strong>Kept on uninstall<\/strong>, because the\nother CloudScale plugins read them too; delete them by hand if no CloudScale plugin\nremains.<\/li>\n<li><code>wp-content\/maintenance.php<\/code> and <code>wp-content\/csbr-restore-progress.json<\/code> - the visitor\npage and progress file shown while a restore runs, removed when it ends. Uninstall\nremoves <code>maintenance.php<\/code> only if it is this plugin's copy.<\/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.858<\/h4>\n\n<ul>\n<li>FIX: Uninstall now removes the plugin's state files in wp-content. Backup archives, the token naming their folder, and the site-role and alert-label markers shared with other CloudScale plugins are kept on purpose.<\/li>\n<li>TWEAK: Rewrote the plugin description and FAQ.<\/li>\n<\/ul>\n\n<h4>3.2.857<\/h4>\n\n<ul>\n<li>TWEAK: The restore modal's \"Full database, drop and recreate all tables\" option is now \"Full restore\". It always restored the backup's files as well as its database, and the label and warning now say so.<\/li>\n<\/ul>\n\n<h4>3.2.856<\/h4>\n\n<ul>\n<li>FIX: OneDrive and Dropbox uploads retry a chunk that fails on a dropped connection, a throttle (429) or a server error (5xx), up to 5 attempts, instead of losing the whole upload. They resume where the provider says it is and honour Retry-After. Google Drive follows the same rules and now retries a 429 too.<\/li>\n<li>FIX: Dropbox refreshes an access token that expires during a long upload.<\/li>\n<li>FIX: <code>wp csbr restore<\/code> and <code>wp csbr sync-from-cloud<\/code> now run the same restore as the Restore button. The password check, file check, drop-in health check and alerts now apply to WP-CLI, and files-only backups work there.<\/li>\n<li>TWEAK: Removed 12 server actions that nothing in the plugin called.<\/li>\n<\/ul>\n\n<h4>3.2.855<\/h4>\n\n<ul>\n<li>FIX: Test Connection for Google Drive, Dropbox and OneDrive failed to detect revoked credentials; it now shows the provider's error.<\/li>\n<li>FIX: A failed cloud listing no longer erases which backups are golden, so they can't be pruned by mistake.<\/li>\n<li>FIX: Delete oldest on Google Drive could delete the newest backup.<\/li>\n<li>FIX: Saving the AMI card no longer resets \"Max Cloud Backups to Keep\" to 10.<\/li>\n<li>FIX: Backups are verified before old ones are pruned; a corrupt or half-written backup is reported as failed and not uploaded.<\/li>\n<li>FIX: Database read errors during a backup now fail it instead of producing a short dump.<\/li>\n<li>FIX: Dropbox can be connected on a fresh install; cloud downloads refresh expired tokens and no longer stop at 300 seconds.<\/li>\n<li>FIX: CloudScale Managed uploads once, and managed storage is pruned when S3 is unticked.<\/li>\n<li>FIX: S3, Google Drive and OneDrive listings follow every page.<\/li>\n<li>FIX: Restore fails if file extraction stops part way; files-only backups restore without touching the database.<\/li>\n<li>FIX: Clone URL rewrite failures are reported; nested serialized values are rewritten correctly.<\/li>\n<li>FIX: Crash recovery finds its settings again (alerts and recovery page), and rollback never deletes the plugin before the old version is ready.<\/li>\n<li>FIX: Auto-restore fixed time is saved; an empty backup-day list stays empty; Telegram test sends once.<\/li>\n<li>NEW: System Info health checks (PHP, folder, ZIP\/AES, WP-Cron, overdue schedule, last result per destination) and <code>wp csbr doctor<\/code>.<\/li>\n<li>NEW: S3 Test checks list and delete permissions and removes its test file; Managed Test checks storage credentials.<\/li>\n<li>NEW: Activity log records skipped uploads, OAuth and token errors, dump\/archive timings, skipped days and undelivered alerts.<\/li>\n<\/ul>\n\n<h4>3.2.854<\/h4>\n\n<ul>\n<li>FIX: Google Drive's \"Authorised redirect URI\" box now shows the URI Connect sends (admin.php), so registering it no longer fails with redirect_uri_mismatch.<\/li>\n<li>FIX: OneDrive gets the pre-sync space check and Delete oldest, like Dropbox and Google Drive.<\/li>\n<li>FIX: A skipped cloud upload says to tick the provider under \"Include in cloud backup\" and Save, instead of \"not configured\".<\/li>\n<li>FIX: S3 Diagnose shows bucket, prefix, credentials source, last sync and the Include setting.<\/li>\n<li>Changed: S3 and AMI text no longer say the AWS CLI is required; the plugin talks to AWS directly.<\/li>\n<\/ul>\n\n<h4>3.2.852<\/h4>\n\n<ul>\n<li>FIX: OneDrive uploads no longer report \"OneDrive not configured\" after a successful Test Connection. The OneDrive tick under \"Include in cloud backup\" is now saved; tick it and save once after updating.<\/li>\n<li>Changed: Dropbox and OneDrive Explain and Diagnose describe the built-in API connection, not rclone, which is not needed.<\/li>\n<\/ul>\n\n<h4>3.2.848<\/h4>\n\n<ul>\n<li>Changed: alert-sync hooks use literal, prefixed names for WordPress.org Plugin Check.<\/li>\n<\/ul>\n\n<h4>3.2.847<\/h4>\n\n<ul>\n<li>Changed: alert settings (Telegram, environment label, mute) are stored under this plugin's own prefix, migrated automatically, and kept in sync with the other CloudScale plugins.<\/li>\n<\/ul>\n\n<h4>3.2.846<\/h4>\n\n<ul>\n<li>IMPROVED: The Managed card reads \"Use a password for extra security\" with a Set a password button, or confirms backups are encrypted with your password.<\/li>\n<li>FIX: Saving the backup encryption password checks the request's nonce itself, not only in its callers.<\/li>\n<\/ul>\n\n<h4>3.2.845<\/h4>\n\n<ul>\n<li>IMPROVED: CloudScale Managed storage adds Oregon (US West), Frankfurt and Tokyo, ten regions in all. N. Virginia now reads as US East.<\/li>\n<\/ul>\n\n<h4>3.2.844<\/h4>\n\n<ul>\n<li>NEW: The Managed card suggests a backup password for extra security. Setting or changing the encryption password now asks for it twice and a confirmation that a copy is kept.<\/li>\n<li>FIX: A restore of an encrypted backup without the matching password stops before changing anything.<\/li>\n<li>FIX: A database-only backup can be restored again; it was refused for having no files.<\/li>\n<\/ul>\n\n<h4>3.2.843<\/h4>\n\n<ul>\n<li>FIX: Uploading a large backup to S3 or CloudScale Managed no longer grows the PHP process by the size of the backup. A 3 GB backup could be stopped by the server's memory limit partway through its cloud uploads.<\/li>\n<li>FIX: The Automatic Restore card no longer logs \"Undefined variable $show_hour\" and now pre-fills the suggested restore time.<\/li>\n<\/ul>\n\n<h4>3.2.842<\/h4>\n\n<ul>\n<li>FIX: A standby restoring its primary's Managed backups reads the region the primary backs up to, not its own region choice or nearest region.<\/li>\n<\/ul>\n\n<h4>3.2.841<\/h4>\n\n<ul>\n<li>IMPROVED: WordPress.org review pass: output escaped where it is printed, every request value sanitised where it is read, admin scripts attached to the plugin's script handle, and the External services section completed. Notification emails now show the site name in the header.<\/li>\n<li>FIX: A restore request with an empty file name is refused instead of resolving to the backup folder.<\/li>\n<\/ul>\n\n<h4>3.2.840<\/h4>\n\n<ul>\n<li>NEW: Choose the CloudScale Managed backup region on the Cloud Backups tab: Automatic (nearest this site) or any of seven regions. Changing region sends new backups there; backups in the old region stop showing and expire there within 90 days, and switching back shows them.<\/li>\n<li>IMPROVED: CloudScale Managed storage adds Singapore, Mumbai and S\u00e3o Paulo, so the regions are US, South America, Europe, Africa, India, Asia and Australia.<\/li>\n<\/ul>\n\n<h4>3.2.838<\/h4>\n\n<ul>\n<li>IMPROVED: CloudScale Managed storage adds a bucket in Sydney (ap-southeast-2), so the nearest region is now one of US, Europe, Africa or Australia.<\/li>\n<li>IMPROVED: Backup alerts say where a Managed backup is stored, for example \"CloudScale Managed: OK, stored in Africa (Cape Town)\". The Managed card and the Explain panel show the region too, instead of saying all storage is in the EU.<\/li>\n<\/ul>\n\n<h4>3.2.836<\/h4>\n\n<ul>\n<li>IMPROVED: CloudScale Managed storage now has a bucket in Cape Town (af-south-1) and N. Virginia (us-east-1) as well as Ireland (eu-west-1). On its first managed backup a site times ten requests to each region, and the account is kept in the nearest one from then on. A site in South Africa uploads to Cape Town instead of Ireland, roughly fifteen times faster per connection.<\/li>\n<\/ul>\n\n<h4>3.2.835<\/h4>\n\n<ul>\n<li>IMPROVED: Large backups now upload to S3 and CloudScale Managed up to four parts at a time instead of one, when the server has the memory for it. Uploads to a distant region were limited by the round trip, not the connection: one 3.2 GB backup took 51 minutes to reach Managed storage. A part that fails in a batch is sent again on its own with the usual retries.<\/li>\n<\/ul>\n\n<h4>3.2.833<\/h4>\n\n<ul>\n<li>FIXED: A site restored from a backup taken by 3.2.832 could start a full backup of itself a few minutes after the restore. The backup's own \"in progress\" record travels inside its database, and the restored site took it for a backup of its own that had died. A run record is now used only by the site that wrote it, and never on a standby.<\/li>\n<li>FIXED: A standby no longer runs a scheduled backup even when one is handed to it.<\/li>\n<li>FIXED: Backup folders left behind by older versions of the plugin are no longer included in the uploads part of a backup. One site's backup grew from 3 GB to 8 GB because of two old archives in such a folder.<\/li>\n<\/ul>\n\n<h4>3.2.832<\/h4>\n\n<ul>\n<li>FIXED: A scheduled backup that is killed part-way through its cloud upload (PHP restarted by a deploy or an update, a server reboot, an out-of-memory kill) is now noticed within five minutes and picked up again by itself. The archive is uploaded to the destinations that do not have it yet, and you are told both that it was interrupted and how it ended. Before, the run simply vanished: no alert, no retry, and no new backup in the cloud until the next night.<\/li>\n<li>FIXED: The scheduled backup is now watched for the whole run, uploads included. A PHP error during the upload used to send nothing, because the safety net was switched off once the archive had been written.<\/li>\n<li>FIXED: The cloud catch-up pass no longer stands down for six hours after a backup that died, and it now covers CloudScale Managed and OneDrive as well as S3, Google Drive and Dropbox.<\/li>\n<li>FIXED: A scheduled backup killed while still building its archive is started again, once.<\/li>\n<li>IMPROVED: A second scheduled backup cannot start while the previous one is still uploading.<\/li>\n<\/ul>\n\n<h4>3.2.830<\/h4>\n\n<ul>\n<li>FIXED: A large backup is no longer lost to one slow part of an Amazon S3 or CloudScale Managed upload. When S3 answers a part with a temporary error (a request timeout, or a 500, 502, 503 or 504), that part alone is now sent again, up to five times with waits of 2, 8, 30 and 60 seconds, instead of the whole upload failing. Before, a single timed-out part on a slow connection discarded a multi-gigabyte upload.<\/li>\n<li>IMPROVED: The time allowed to send one part of a large S3 upload now follows the size of the part (up to 800 seconds for a full 50 MB part, 300 before), so an upload that is slow but still moving is allowed to finish.<\/li>\n<\/ul>\n\n<h4>3.2.819<\/h4>\n\n<ul>\n<li>CHANGED: The Restore button in the backup list now shows a box with an up arrow instead of a plain circular arrow, which read as \"undo\" or \"refresh\" rather than \"restore from a backup\".<\/li>\n<li>IMPROVED: When you choose your own site in \"Bring a backup onto this server\", the list now says these are this site's own backups and that restoring one replaces everything on this site with it. Copying it onto the server is still allowed, as it is how you recover a rebuilt server.<\/li>\n<\/ul>\n\n<h4>3.2.818<\/h4>\n\n<ul>\n<li>FIXED: A site can no longer be set up to restore itself from its own backups. Automatic restore replaces the whole site with the newest backup of another site, so pointed at its own backups it would undo everything written since the last one, every night. The source list now shows this site greyed out and unselectable, the save refuses it, and a schedule that already has it will not run. A standby copying its primary is unaffected.<\/li>\n<\/ul>\n\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<p>Older versions: see CHANGELOG.md in the plugin folder.<\/p>","raw_excerpt":"Back up sites of any size to S3, Google Drive, Dropbox, OneDrive or Managed Cloud. Free full restore, staging clones and automated disaster recovery.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293223"}],"author":[{"embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andrewjbaker"}],"wp:attachment":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293223"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293223"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293223"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293223"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293223"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}