{"id":368952,"date":"2026-09-21T19:19:18","date_gmt":"2026-09-21T19:19:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sitecarry\/"},"modified":"2026-09-28T19:35:05","modified_gmt":"2026-09-28T19:35:05","slug":"sitecarry","status":"publish","type":"plugin","link":"https:\/\/syr.wordpress.org\/plugins\/sitecarry\/","author":23562247,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.34.0","stable_tag":"1.34.0","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Sitecarry","header_author":"Usman","header_description":"Backup, clone and migrate any WordPress site \u2014 files and database in one restorable package.","assets_banners_color":"59646b","last_updated":"2026-09-28 19:35:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/dotance.com\/plugins\/sitecarry\/","header_author_uri":"https:\/\/dotance.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":206,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.31.0":{"tag":"1.31.0","author":"dotance","date":"2026-09-21 19:18:55","revision":3706208},"1.31.1":{"tag":"1.31.1","author":"dotance","date":"2026-09-21 19:44:03","revision":3706237},"1.31.2":{"tag":"1.31.2","author":"dotance","date":"2026-09-23 17:54:27","revision":3709901},"1.32.0":{"tag":"1.32.0","author":"dotance","date":"2026-09-23 18:33:19","revision":3709963},"1.33.0":{"tag":"1.33.0","author":"dotance","date":"2026-09-26 10:17:32","revision":3714089},"1.34.0":{"tag":"1.34.0","author":"dotance","date":"2026-09-28 19:35:05","revision":3717822}},"upgrade_notice":{"1.34.0":"<p>Adds one-button restore: put this site back to any package from the Backups screen,\nwith a safety backup taken first. wp-config.php, your packages and Sitecarry itself\nare never touched.<\/p>","1.15.0":"<p>Housekeeping and a proper uninstall. Deleting the plugin now clears its settings and\nschedules; your backup packages are left where they are.<\/p>","1.14.0":"<p>Fixes ten bugs, most of them cases where an interrupted backup could resume into a\ncorrupt archive. Worth taking.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3706208,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3706208,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3706208,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3706208,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.31.0","1.31.1","1.31.2","1.32.0","1.33.0","1.34.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3706223,"resolution":"1","location":"assets","locale":"","width":1280,"height":1200},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3706223,"resolution":"2","location":"assets","locale":"","width":1280,"height":1382},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3706223,"resolution":"3","location":"assets","locale":"","width":1280,"height":1753},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3706223,"resolution":"4","location":"assets","locale":"","width":1280,"height":653}},"screenshots":{"1":"Every package, whether it has been proven to restore, and what has actually happened over the past month \u2014 with one line at the top for the only question that matters: is this site protected right now.","2":"When backups run, how many are kept, and the weekly rehearsal that proves the newest one still restores.","3":"Sending finished packages to Google Drive, Amazon S3, anything that speaks the same protocol, or FTP \u2014 each with the set-up it honestly takes, and the error you get when you miss a step.","4":"Being told when a backup fails, by email or into Slack or Discord."}},"plugin_section":[],"plugin_tags":[151,10698,10718,152,23756],"plugin_category":[59],"plugin_contributors":[280364],"plugin_business_model":[],"class_list":["post-368952","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-cloud-backup","plugin_tags-database-backup","plugin_tags-restore","plugin_tags-site-migration","plugin_category-utilities-and-tools","plugin_contributors-dotance","plugin_committers-dotance"],"banners":{"banner":"https:\/\/ps.w.org\/sitecarry\/assets\/banner-772x250.png?rev=3706208","banner_2x":"https:\/\/ps.w.org\/sitecarry\/assets\/banner-1544x500.png?rev=3706208","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sitecarry\/assets\/icon-128x128.png?rev=3706208","icon_2x":"https:\/\/ps.w.org\/sitecarry\/assets\/icon-256x256.png?rev=3706208","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sitecarry\/assets\/screenshot-1.png?rev=3706223","caption":"Every package, whether it has been proven to restore, and what has actually happened over the past month \u2014 with one line at the top for the only question that matters: is this site protected right now."},{"src":"https:\/\/ps.w.org\/sitecarry\/assets\/screenshot-2.png?rev=3706223","caption":"When backups run, how many are kept, and the weekly rehearsal that proves the newest one still restores."},{"src":"https:\/\/ps.w.org\/sitecarry\/assets\/screenshot-3.png?rev=3706223","caption":"Sending finished packages to Google Drive, Amazon S3, anything that speaks the same protocol, or FTP \u2014 each with the set-up it honestly takes, and the error you get when you miss a step."},{"src":"https:\/\/ps.w.org\/sitecarry\/assets\/screenshot-4.png?rev=3706223","caption":"Being told when a backup fails, by email or into Slack or Discord."}],"raw_content":"<!--section=description-->\n<p>Sitecarry builds a single package containing your site's files and a full database\nexport, then lets you download it from the WordPress admin.<\/p>\n\n<p>The build runs in short, resumable slices, so it works on shared hosting where a\nsingle PHP request is capped at 30 seconds. If a request times out, the next one\npicks up exactly where the last one stopped.<\/p>\n\n<p>Each package comes with a standalone installer that restores it onto any server \u2014\nthe same file works for moving a site to new hosting, cloning live to staging, or\nrolling a site back.<\/p>\n\n<p><strong>What it does<\/strong><\/p>\n\n<ul>\n<li>Full site package: files plus a complete SQL export<\/li>\n<li>Your <code>wp-config.php<\/code> is never archived, so the database password and the login\nkeys and salts stay on the server; the restore writes that file itself<\/li>\n<li>Scheduled backups \u2014 hourly, twice daily, daily or weekly, with retention<\/li>\n<li>Optional incremental file backups, with automatic full backups in between<\/li>\n<li>Upload to Amazon S3, any S3-compatible storage, FTP or Google Drive \u2014 Drive\nconnects in one click, or with a Google app of your own if you would rather keep\nthe plugin's author out of it entirely<\/li>\n<li>Restore straight from storage when the archives are no longer on the server<\/li>\n<li>Email or Slack\/Discord notification when a backup fails<\/li>\n<li>Verify that a package is intact, from the admin or WP-CLI<\/li>\n<li><strong>Rehearse a backup<\/strong>, by hand or every week \u2014 import it into scratch tables, check\nthe row count, prove the result would work as a site, and\nconfirm serialized data survives a domain change. Then throw the tables away.\nNothing on the site is touched<\/li>\n<li>WP-CLI commands for backing up, listing, verifying and checking status<\/li>\n<li>Backups run in the background \u2014 start one and close the tab<\/li>\n<li>Resumable build and resumable restore \u2014 both survive short PHP execution limits<\/li>\n<li>Live progress throughout<\/li>\n<li><strong>Restore this site with one button<\/strong> \u2014 the package's database is rebuilt in\ntables of its own, swapped in atomically, and the files put back afterwards<\/li>\n<li>Standalone <code>installer.php<\/code> for moving a site to a different server, where there is\nno WordPress to press a button in<\/li>\n<li>Serialization-safe URL rewriting, so page builder content survives the move<\/li>\n<li>Skips caches, <code>node_modules<\/code>, <code>.git<\/code>, and other backup plugins' folders, which is\nusually the difference between a 400MB package and a 40GB one<\/li>\n<li>Records a manifest describing the origin site (URLs, table prefix, versions)<\/li>\n<\/ul>\n\n<p><strong>Why URL rewriting is the hard part<\/strong><\/p>\n\n<p>WordPress stores a lot of settings as PHP serialized data, where every string\ncarries its own byte length. Replacing an old domain with a longer one using a\nplain search and replace breaks those lengths, and WordPress can then no longer\nread the value \u2014 which is how a migration quietly wipes widget settings and page\nbuilder layouts. Sitecarry rewrites the serialized form directly and repairs the\nlengths, and it also handles the JSON-escaped form (<code>https:\\\/\\\/<\/code>) that page\nbuilders such as Elementor store their content in.<\/p>\n\n<p><strong>Security<\/strong><\/p>\n\n<p>Packages contain a complete copy of your database. Sitecarry stores them in a\nprotected folder with an unguessable filename, blocks direct web access via\n    .htaccess and <code>web.config<\/code>, and serves downloads only through an authenticated\nadmin request \u2014 never a public URL.<\/p>\n\n<p>Every package has its own restore passphrase, shown in the admin and kept out of\nthe archive. The installer refuses to do anything without it, so an installer\nleft behind on a server cannot be used by anyone else to overwrite the site. It\nalso deletes itself and the archive when the restore finishes.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Out of the box Sitecarry talks to nothing but your own server. It contacts an\noutside service only when you switch one on, and only with what that service needs\nto do its job. It never sends usage data, analytics or licence checks anywhere.<\/p>\n\n<p><strong>Amazon S3, or any S3-compatible storage<\/strong> \u2014 used only when you set Storage to S3.\nSitecarry sends your backup archives, and the requests needed to list and delete\nthem, to the endpoint you enter (by default <code>https:\/\/s3.&lt;region&gt;.amazonaws.com<\/code>, or\nyour own for Backblaze B2, Wasabi, DigitalOcean Spaces, MinIO and so on). What is\nsent: the archive itself \u2014 which contains your site's files and a full database\nexport \u2014 plus the access key you configured, used to sign each request. Nothing is\nsent until you save S3 credentials and run a backup.\nFor any other S3-compatible provider, the terms are that provider's own.<\/p>\n\n<ul>\n<li>Service: Amazon S3, provided by Amazon Web Services (<code>amazonaws.com<\/code>)<\/li>\n<li>Terms of service: <a href=\"https:\/\/aws.amazon.com\/service-terms\/\">https:\/\/aws.amazon.com\/service-terms\/<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/aws.amazon.com\/privacy\/\">https:\/\/aws.amazon.com\/privacy\/<\/a><\/li>\n<\/ul>\n\n<p><strong>FTP \/ FTPS server<\/strong> \u2014 used only when you set Storage to FTP. Sitecarry connects to\nthe host, port and path you enter and uploads the same archives, authenticating with\nthe username and password you configured. The server is one you choose, so its terms\nare your host's. Plain FTP sends that password and the whole archive unencrypted;\nthe settings screen recommends FTP over TLS for this reason.<\/p>\n\n<p><strong>Google Drive<\/strong> \u2014 used only when you set Storage to Google Drive and complete the\nconnection. Sitecarry sends you to <code>https:\/\/accounts.google.com<\/code> to authorise,\nexchanges the code at <code>https:\/\/oauth2.googleapis.com\/token<\/code>, and uploads, lists and\ndeletes archives through <code>https:\/\/www.googleapis.com\/drive\/v3<\/code> and\n    https:\/\/www.googleapis.com\/upload\/drive\/v3. What is sent: the archives, and an\nOAuth token belonging to the Google account you authorise. The connection uses an\nOAuth client you create yourself, so the traffic is between your site and Google \u2014\nit is not routed through us. Only the <code>drive.file<\/code> scope is requested, which limits\nSitecarry to files it created itself.<\/p>\n\n<ul>\n<li>Service: Google Drive API, provided by Google (<code>googleapis.com<\/code>, <code>accounts.google.com<\/code>)<\/li>\n<li>Terms of service: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a> and <a href=\"https:\/\/developers.google.com\/terms\">https:\/\/developers.google.com\/terms<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<p><strong>dotance.com \u2014 only if you choose \"Connect with Google\"<\/strong> \u2014 Google Drive needs an\nOAuth app, and this is the one Sitecarry lends you so connecting takes a click\ninstead of ten minutes in the Google console. When you press that button your\nbrowser goes to <code>https:\/\/dotance.com\/wp-json\/dotance\/v1\/google\/start<\/code>, on to\nGoogle's own consent screen, and back; your site then collects the resulting\npermission from <code>...\/google\/claim<\/code>, and asks <code>...\/google\/token<\/code> for a fresh\naccess token about once an hour while a backup runs. What is sent: your site's\naddress, and the permission Google issued for the Drive you approved. What is\nnever sent: your backups \u2014 they upload from your server straight to Google \u2014 and\nno credentials of any other kind. Choose \"Use my own Google app\" instead and\nnothing touches dotance.com at all.<\/p>\n\n<ul>\n<li>Service: Dotance (<code>dotance.com<\/code>), the plugin's author<\/li>\n<li>Terms of service: <a href=\"https:\/\/dotance.com\/terms\/\">https:\/\/dotance.com\/terms\/<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/dotance.com\/privacy-policy\/\">https:\/\/dotance.com\/privacy-policy\/<\/a><\/li>\n<\/ul>\n\n<p><strong>Slack, Discord, or any incoming webhook<\/strong> \u2014 used only when you enter a webhook URL\non the Notifications screen. Sitecarry posts a short message to that URL when a\nbackup finishes or fails: the site name, the outcome, the step it stopped on and the\nerror text. No archive and no credentials are sent. The destination is the URL you\nsupply, commonly <code>https:\/\/hooks.slack.com\/...<\/code>.<\/p>\n\n<ul>\n<li>Service: Slack incoming webhooks (<code>hooks.slack.com<\/code>)<\/li>\n<li>Terms of service: <a href=\"https:\/\/slack.com\/terms-of-service\">https:\/\/slack.com\/terms-of-service<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/slack.com\/trust\/privacy\/privacy-policy\">https:\/\/slack.com\/trust\/privacy\/privacy-policy<\/a><\/li>\n<li>Service: Discord webhooks (<code>discord.com<\/code>)<\/li>\n<li>Terms of service: <a href=\"https:\/\/discord.com\/terms\">https:\/\/discord.com\/terms<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/discord.com\/privacy\">https:\/\/discord.com\/privacy<\/a><\/li>\n<\/ul>\n\n<p><strong>Your own site<\/strong> \u2014 Sitecarry sends an HTTP request to your site's own\n    admin-ajax.php to start and continue a background backup. That is a loopback\nrequest to your server, not a third party.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Sitecarry<\/strong> in the admin menu and click <strong>Create Backup<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20packages%20stored%3F\"><h3>Where are packages stored?<\/h3><\/dt>\n<dd><p>In <code>wp-content\/uploads\/sitecarry\/<\/code>, protected from direct web access.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens if I delete the plugin?<\/h3><\/dt>\n<dd><p>Sitecarry removes its settings and its scheduled events from the database, and stops\nscheduling anything. Your packages in <code>wp-content\/uploads\/sitecarry\/<\/code> are left\nexactly where they are, on purpose \u2014 deleting a plugin should never be the thing\nthat destroys your last copy of the site. Delete that folder yourself once you are\nsure you no longer need what is in it.<\/p><\/dd>\n<dt id=\"it%20says%20to%20keep%20the%20tab%20open.%20why%3F\"><h3>It says to keep the tab open. Why?<\/h3><\/dt>\n<dd><p>Background backups need the site to be able to send an HTTP request to itself. Some\nhosts block that. When Sitecarry detects it cannot, it falls back to running the\nbackup from your browser instead, which works everywhere but needs the tab left\nopen. Ask your host to allow loopback requests if you want unattended backups.<\/p><\/dd>\n<dt id=\"how%20do%20i%20roll%20this%20site%20back%20to%20a%20package%3F\"><h3>How do I roll this site back to a package?<\/h3><\/dt>\n<dd><p>Press <strong>Restore this site<\/strong> next to the package and confirm. Sitecarry offers to take\na backup of the site as it is first, then rebuilds the package's database in tables of\nits own, swaps them in, and puts the files back. Nothing is uploaded by hand and no\npassphrase is needed \u2014 you are already signed in as an administrator.<\/p>\n\n<p>What it does not touch: <code>wp-config.php<\/code>, your stored packages, and Sitecarry itself.\nThe tables it replaced are kept for two days, so a change of mind is quick.<\/p>\n\n<p>Moving a site to a <strong>different server<\/strong> is the other case, and it still uses the\ndownloadable installer \u2014 there is no WordPress there yet to press a button in.<\/p><\/dd>\n<dt id=\"a%20backup%20seems%20stuck.%20what%20do%20i%20do%3F\"><h3>A backup seems stuck. What do I do?<\/h3><\/dt>\n<dd><p>While a backup is running there is a <strong>Stop backup<\/strong> button under the progress bar,\nand it will tell you if that backup has stopped making progress. Stopping clears\naway the half-built package. From the command line, <code>wp sitecarry stop<\/code> does the\nsame \u2014 useful if the admin screen is not loading.<\/p>\n\n<p>Nothing is lost by stopping: a partial package cannot be restored from anyway.<\/p><\/dd>\n<dt id=\"can%20i%20run%20backups%20from%20the%20command%20line%3F\"><h3>Can I run backups from the command line?<\/h3><\/dt>\n<dd><p>Yes. <code>wp sitecarry backup<\/code> builds one and waits for it, with no execution limit and\nnothing to keep open. <code>wp sitecarry verify --all<\/code> checks every package and exits\nnon-zero if any fails, so it works in a monitoring script. <code>wp sitecarry status<\/code>\nprints how the site is protected.<\/p><\/dd>\n<dt id=\"does%20verifying%20prove%20the%20backup%20will%20restore%3F\"><h3>Does verifying prove the backup will restore?<\/h3><\/dt>\n<dd><p>No, and nothing short of restoring it does. Verifying proves the archive is the one\nthat was written, still opens, and holds the files a restore starts from. That\ncatches truncated uploads, disks that filled mid-write and silent corruption. It\ncannot tell you the database inside will import cleanly on a different server.<\/p>\n\n<p>That last gap is exactly what rehearsing closes \u2014 see the next two questions.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20verifying%20and%20rehearsing%3F\"><h3>What is the difference between verifying and rehearsing?<\/h3><\/dt>\n<dd><p>Verifying reads the archive: it confirms the file is the one that was written, that\nit still opens, and that the two files a restore cannot start without are inside. It\ntakes seconds and it cannot tell you the database will import.<\/p>\n\n<p>Rehearsing imports it. The whole database export is run into tables of the plugin's\nown, the row count is compared against what was recorded at backup time, and the\ntables are then dropped. Nothing on your site is written to at any point.<\/p>\n\n<p>That is the difference between \"this file is intact\" and \"this backup works\".<\/p><\/dd>\n<dt id=\"can%20it%20rehearse%20on%20its%20own%3F\"><h3>Can it rehearse on its own?<\/h3><\/dt>\n<dd><p>Yes. Turn on <strong>Rehearse weekly<\/strong> in Settings and Sitecarry proves the newest full\nbackup once a week, on Sunday, three hours after your backup hour. You hear from it\nonly when it fails \u2014 the same failures-only rule backups use, for the same reason: a\nweekly all-clear stops being read within a month and takes the important one with it.<\/p>\n\n<p>The hour is not a setting on purpose. It follows the backup hour so the two cannot be\npointed at each other, and a rehearsal stands aside if it finds a backup running.<\/p>\n\n<p>What gets rehearsed is the newest package that stands on its own. With incremental\nbackups on, the newest package is usually a difference, so it walks back to the most\nrecent full one rather than skipping that week.<\/p><\/dd>\n<dt id=\"is%20rehearsing%20safe%20to%20run%20on%20a%20live%20site%3F\"><h3>Is rehearsing safe to run on a live site?<\/h3><\/dt>\n<dd><p>Yes, and it is built to be. Every table it creates carries a prefix of its own, every\nstatement is checked to be acting on one of those tables before it runs, and the\ntables are dropped whether the rehearsal passes, fails or is interrupted. Anything a\ncrash leaves behind is swept away within a day.<\/p>\n\n<p>It does use processor time and, briefly, database space roughly the size of your\ndatabase. It will not start while a backup is running.<\/p><\/dd>\n<dt id=\"what%20does%20rehearsing%20actually%20check%3F\"><h3>What does rehearsing actually check?<\/h3><\/dt>\n<dd><p>Six things, in order, and it stops at the first that fails:<\/p>\n\n<ol>\n<li>The archive is the one that was written, and still opens.<\/li>\n<li>Every file in it decompresses to the size it claims.<\/li>\n<li>The whole database export imports, into tables of the plugin's own.<\/li>\n<li>The number of rows matches what was recorded when the backup was taken \u2014 which\ncatches a dump that imported without error and is simply short.<\/li>\n<li>Serialized data survives a domain change.<\/li>\n<li>What imported is a WordPress that would work: it knows its own address, it has\nroles, and at least one user holds a role that still exists.<\/li>\n<\/ol>\n\n<p>The fifth is the one worth explaining. Widget settings, theme options and every\npage-builder layout are stored as serialized data, where each string records its own\nbyte length. Move to a longer address without repairing those lengths and WordPress\ncan no longer read the value: the site loads, looks right, and the layouts are gone.\nSo a rehearsal rewrites the imported rows to a deliberately longer address and checks\nWordPress can still read every one of them back.<\/p>\n\n<p>The sixth catches the other silent one. WordPress stores roles in an option named\nafter the table prefix, and each user's capabilities under a meta key named after it\ntoo. Restore under a different prefix and rename only the tables, and you get a site\nthat loads perfectly and locks everybody out. A rehearsal moves the prefix in the\ndata as a real restore would, then checks a user is still left holding a role that\nexists.<\/p>\n\n<p>To be plain about what step six is: it reads what WordPress reads on its way up. It\ndoes not execute WordPress against the scratch tables. Booting a second WordPress\nwould mean either a second PHP process \u2014 <code>proc_open<\/code> and <code>exec<\/code> are disabled on most\nshared hosting \u2014 or writing a web-reachable bootstrap into your document root on a\nschedule, which is a worse thing to own than the gap it closes.<\/p>\n\n<p>Nothing is written to your site at any point. The rows are tested in memory, and the\nscratch tables are dropped when it finishes.<\/p><\/dd>\n<dt id=\"does%20a%20passing%20rehearsal%20guarantee%20the%20restore%20will%20work%3F\"><h3>Does a passing rehearsal guarantee the restore will work?<\/h3><\/dt>\n<dd><p>It guarantees more than anything else short of doing it, and less than everything.\nIt proves the package restores <strong>onto this server<\/strong> \u2014 this PHP, this MySQL. The\nserver you would actually use in a disaster is a different one, and nothing but a\nreal restore proves that.<\/p>\n\n<p>What it does catch is the whole class of failures that make a backup useless without\nannouncing itself: a truncated dump, a corrupt entry in the middle of the archive, a\ndatabase export that is short of rows.\nThat last gap is what <strong>rehearsing<\/strong> closes \u2014 see below.<\/p><\/dd>\n<dt id=\"the%20server%20is%20gone.%20how%20do%20i%20restore%3F\"><h3>The server is gone. How do I restore?<\/h3><\/dt>\n<dd><p>Upload <code>installer.php<\/code> into the target folder on the new server, open it, and enter\nthe package passphrase. If it cannot find the archives it will offer to download\nthem from your storage \u2014 enter a read-only key for that bucket when it asks. Keep a\ncopy of <code>installer.php<\/code> somewhere other than the site it protects; it is small, and\nwithout it you would have only the archives.<\/p><\/dd>\n<dt id=\"what%20do%20i%20need%20to%20restore%20an%20incremental%20backup%3F\"><h3>What do I need to restore an incremental backup?<\/h3><\/dt>\n<dd><p>Every archive from the last full backup up to the one you are restoring. The\nSitecarry screen tells you how many that is, and the installer refuses to start\nwhile any of them is missing rather than restoring half a site. If that sounds\nfragile, leave incremental off \u2014 every package is then complete on its own.<\/p><\/dd>\n<dt id=\"how%20do%20i%20move%20a%20site%20to%20a%20different%20server%3F\"><h3>How do I move a site to a different server?<\/h3><\/dt>\n<dd><p>Download both the Archive and the Installer from the Sitecarry screen, upload them\ninto the target folder on the other server, create an empty database there, then\nopen <code>installer.php<\/code> in a browser and enter the package's restore passphrase.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20sqlite%3F\"><h3>Does it work on SQLite?<\/h3><\/dt>\n<dd><p>No, and it tells you rather than pretending. The database export is MySQL, and the\nrestore installer connects through mysqli, so a package taken on SQLite could not be\nrestored. On such a site \u2014 WordPress Playground, or the SQLite database integration\nplugin \u2014 the Backups screen says so and the button is disabled.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20press%20%22connect%20with%20google%22%3F\"><h3>What happens when I press \"Connect with Google\"?<\/h3><\/dt>\n<dd><p>Google asks whether you allow Sitecarry to keep files in your Drive, and the\npermission it issues is handed to your site through dotance.com, which is where\nthe Google app being borrowed lives. After that your backups upload from your\nserver straight to Google; dotance.com only turns that permission into a fresh\naccess token roughly once an hour, because only it holds the app's secret.<\/p>\n\n<p>If you would rather have nobody in the middle, open \"Use my own Google app\" on\nthe Storage screen and create an OAuth client of your own \u2014 about ten minutes,\nonce, and then the plugin talks only to Google.<\/p>\n\n<p>Sitecarry asks for the narrowest Drive scope that exists: it can see the files it\ncreated itself and nothing else in your Drive.<\/p><\/dd>\n<dt id=\"is%20wp-config.php%20inside%20the%20package%3F\"><h3>Is wp-config.php inside the package?<\/h3><\/dt>\n<dd><p>No, and deliberately. It holds your database password and the eight authentication\nkeys and salts that sign every login cookie on the site \u2014 secrets that should never\nleave the server, least of all inside an archive that gets uploaded to cloud storage.<\/p>\n\n<p>A restore does not need it. Onto an existing WordPress install the installer keeps\nthat site's own <code>wp-config.php<\/code> and rewrites the database settings in it; into an\nempty folder it writes a fresh one from what you type in, with newly generated keys.\nOn a multisite, add the multisite constants back by hand after restoring into an\nempty folder.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20while%20the%20site%20is%20live%3F\"><h3>Can I restore while the site is live?<\/h3><\/dt>\n<dd><p>Yes, and visitors see a short \"being restored\" page while it runs \u2014 no file is\nwritten into your site root to do that, and scheduled tasks are held back so nothing\nwrites into tables that are about to be replaced. Keep the tab open; if it closes,\nreopening the Backups screen picks the restore up where it stopped.<\/p>\n\n<p>If a restore stops halfway through putting files back, the database is already the\npackage's and the files are part old, part new. The screen says so and offers both\nways out: carry on, or restore the safety backup it took at the start.<\/p><\/dd>\n<dt id=\"why%20does%20moving%20to%20another%20server%20not%20run%20inside%20wordpress%3F\"><h3>Why does moving to another server not run inside WordPress?<\/h3><\/dt>\n<dd><p>Because it replaces the very files WordPress is running from. Anything doing that\nfrom inside WordPress would be pulling the floor out from under itself partway\nthrough. The installer is a standalone program that never loads WordPress.<\/p><\/dd>\n<dt id=\"can%20it%20restore%20into%20a%20database%20that%20already%20has%20a%20wordpress%20install%3F\"><h3>Can it restore into a database that already has a WordPress install?<\/h3><\/dt>\n<dd><p>Only if it uses the same table prefix, and it will replace those tables. Changing\nthe table prefix during a restore is not supported yet \u2014 use an empty database.<\/p><\/dd>\n<dt id=\"how%20large%20a%20site%20can%20it%20handle%3F\"><h3>How large a site can it handle?<\/h3><\/dt>\n<dd><p>Comfortably into the tens of gigabytes. Sitecarry writes its own archive format\nrather than using PHP's zip extension, appending each file to the end and never\nrewriting what is already there \u2014 so the work grows with the size of the site\ninstead of with the square of it. ZIP64 is used automatically, so neither the\narchive nor any file in it is capped at 4GB.<\/p>\n\n<p>You still need free disk space for the package, and enough for the database export\nwhile it is being written.<\/p><\/dd>\n<dt id=\"can%20i%20make%20backups%20faster%3F\"><h3>Can I make backups faster?<\/h3><\/dt>\n<dd><p>Three things matter, in order.<\/p>\n\n<p>Compression is the big one, and Sitecarry already avoids most of the cost: images,\nvideo, audio, fonts and archives are stored as they are, whatever level you pick,\nbecause compressing them again is pure waste. If the server is slow and disk is\ncheap, set compression to None.<\/p>\n\n<p>Second, exclude what you do not need. A folder of raw video in uploads will\ndominate everything else.<\/p>\n\n<p>Third, let it run in the background rather than from a browser tab, or use\n    wp sitecarry backup, which has no execution limit at all.<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20what%20is%20inside%20before%20installing%3F\"><h3>Where can I see what is inside before installing?<\/h3><\/dt>\n<dd><p>Screenshots, what is inside, the release history and answers to setup questions are on the <a href=\"https:\/\/dotance.com\/plugins\/sitecarry\/\">Sitecarry page at dotance.com<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.34.0<\/h4>\n\n<ul>\n<li><strong>Restore this site, from the screen.<\/strong> Press Restore next to a package and it\ngoes back: the database is rebuilt in tables of its own and swapped in with one\natomic rename, then the files are put back through WordPress's own filesystem\nAPI. It offers to back the site up first, it never touches wp-config.php, your\npackages or Sitecarry itself, and it keeps the tables it replaced for two days.<\/li>\n<li>Moving a site to a different server still uses the downloadable installer, and a\npackage taken on another site is refused here rather than half-restored.<\/li>\n<li>The importer that a rehearsal and a restore share now lives in one file, so the\nmost dangerous code in the plugin has one source.<\/li>\n<\/ul>\n\n<h4>1.33.0<\/h4>\n\n<ul>\n<li>Google Drive connects in one click. Creating a Google app of your own is still\nthere, and still the option that keeps everyone else out of it \u2014 but if you were\nnever going to do that, press Connect with Google and approve it at Google. Your\nbackups upload from your server straight to Drive either way; what passes through\ndotance.com is the approval, and a token refresh about once an hour.<\/li>\n<\/ul>\n\n<h4>1.32.0<\/h4>\n\n<ul>\n<li>The activity history can now be cleared, from a link in that card. Useful when a\nsite changes hands, or when the failures in it were all yours from testing. The\npackages themselves are untouched \u2014 only the record of what has happened.<\/li>\n<\/ul>\n\n<h4>1.31.2<\/h4>\n\n<ul>\n<li>Fixed: on sites large enough that a backup runs in more than one pass, the\nfinished archive could be written with an index length that was short by the\nlast few entries, and no zip reader would open it \u2014 \"zip error 21\". The length\nnow comes from the running total the packer keeps rather than from the\nfilesystem, whose answer can lag behind on some hosts. Verify and rehearse\ncaught this every time; existing packages that fail to verify should be\nreplaced with a fresh backup.<\/li>\n<\/ul>\n\n<h4>1.31.1<\/h4>\n\n<ul>\n<li>Fixed on Windows servers: each backup included every earlier package, and its\npassphrase file, so packages doubled in size with every run. Windows reports the\nuploads folder with backslashes, so the check that skips Sitecarry's own folder\nnever matched. Both paths are now normalised the way WordPress does it. Linux and\nmacOS servers were not affected.<\/li>\n<\/ul>\n\n<h4>1.31.0<\/h4>\n\n<ul>\n<li>Sitecarry now says so plainly on a site whose database it cannot export into a\nrestorable package. The export is MySQL and the installer restores through\nmysqli, so on SQLite \u2014 WordPress Playground, or the SQLite integration plugin \u2014\na backup would build and could never be restored. Backups are refused there\ninstead, with the reason on the screen.<\/li>\n<\/ul>\n\n<h4>1.30.0<\/h4>\n\n<ul>\n<li>The restore installer is never written to this server. It is assembled in memory\nand streamed straight to the browser, so the generated file exists only as the\ndownload itself.<\/li>\n<\/ul>\n\n<h4>1.29.0<\/h4>\n\n<ul>\n<li><strong>wp-config.php is no longer part of a package.<\/strong> It holds the database password\nand the eight keys and salts that sign every login cookie, and a package can be\nuploaded to storage outside your control. A restore writes that file instead:\nonto an existing install it updates the one already there, and into an empty\nfolder it generates a new one with fresh keys.<\/li>\n<li><strong>Restoring starts with a download.<\/strong> The Restore button used to write a restore\ninstaller into the WordPress folder; a plugin should not put a program there, so\nit does not any more. Each package row now offers <strong>Get installer<\/strong>, and the\nscreen explains the three steps: download the installer and the archive, upload\nboth to the site being restored, open installer.php. The restore itself is\nunchanged, including moving to a new domain, server or table prefix.<\/li>\n<li><code>wp sitecarry stage<\/code> is replaced by <code>wp sitecarry installer &lt;id&gt;<\/code>, which prints\nthe installer so you can redirect it to a file.<\/li>\n<li>Loopback requests now pass their SSL verification through core's own\n  https_local_ssl_verify filter rather than switching it off outright.<\/li>\n<li>The readme name matches the plugin header.<\/li>\n<\/ul>\n\n<h4>1.28.0<\/h4>\n\n<ul>\n<li>Requires WordPress 6.2 or later. Every database query that names a table now passes\nthe name through <code>$wpdb-&gt;prepare()<\/code> as an identifier placeholder.<\/li>\n<li>Inside WordPress, all remote requests go through the WordPress HTTP API. The\nstandalone restore installer, which runs without WordPress, keeps its own transport.<\/li>\n<li>The plugin no longer raises PHP's execution time limit. Each step is sized to fit\ninside the host's limit and resumes in the next request.<\/li>\n<li>Settings are sanitized field by field as they are read from the form.<\/li>\n<li>The restore installer downloads from a file on disk instead of being echoed.<\/li>\n<li>Plugin constants now use the <code>SITECARRY_<\/code> prefix.<\/li>\n<li>The package manifest no longer records the content folder path, which nothing read.<\/li>\n<\/ul>\n\n<p>Older entries: <a href=\"https:\/\/dotance.com\/plugins\/sitecarry\/\">dotance.com\/plugins\/sitecarry\/<\/a><\/p>","raw_excerpt":"Back up, restore and migrate your site \u2014 files and database in one package \u2014 and prove each backup restores before you need it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368952"}],"author":[{"embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dotance"}],"wp:attachment":[{"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368952"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368952"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368952"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368952"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368952"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/syr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}