Panellicense

Configure JetBackup 5 destinations on cPanel — S3, B2, and SFTP

Set up S3-compatible, Backblaze B2, and SFTP destinations in JetBackup 5 on a cPanel server — credentials, encryption, throttling, and the four defaults that cause failed jobs.

9 min readUpdated 2026-05-16jetbackup · cpanel · backups · s3
schema: HowToschema: FAQPageschema: BreadcrumbList

JetBackup 5 ships with a long list of supported destination types, but the three that cover ~95% of real hosting deployments are S3-compatible (AWS S3, Wasabi, MinIO, DigitalOcean Spaces, Cloudflare R2), Backblaze B2, and SFTP to a separate box. This guide walks through configuring each one cleanly on a cPanel server, plus the four default settings that silently break large jobs.

Budget 30 minutes for the first destination — most of which is creating the bucket and IAM policy at the provider side — and 5 minutes per additional destination after that. You need a working JetBackup 5 license on a cPanel + WHM server with the plugin already installed under WHM → Plugins → JetBackup 5.

Before you start

  • JetBackup 5.3 or newer. The destination plugin set changed substantially between 5.2 and 5.3 — older guides referencing Amazon S3 as a separate type are obsolete; everything S3-shaped now lives under S3 Compatible.
  • 50-100 GB of free space on the cPanel server's backup partition. Jobs stage locally before uploading, so even with an offsite-only retention policy you still need the working space.
  • Outbound HTTPS (port 443) open to the destination endpoint. SFTP destinations need outbound TCP 22 (or whatever the target SSHd listens on).
  • A separate IAM user, application key, or SSH key per destination — never reuse your root cloud credentials. JetBackup stores destination credentials in /usr/local/jetapi/data/ and they're recoverable from a server image.

Destination type, briefly

Pick by cost-per-GB and recovery profile, not by familiarity:

TypeEgress costRestore latencyUse when
S3 (AWS)$0.09/GB outSecondsYou're already on AWS and Glacier rules cover archival
WasabiNoneSecondsPredictable monthly cost, no egress fee, 90-day minimum object retention
Backblaze B2$0.01/GB outSecondsCheapest at small-to-mid scale, free egress to Cloudflare
Cloudflare R2NoneSecondsAlready on Cloudflare, no egress to your origin
SFTPBandwidth onlyDisk-boundYou own a second box (offsite, different DC)

For most independent hosts, Backblaze B2 + a weekly SFTP to a colo box is the cost-optimal pair. AWS S3 is rarely the right answer unless billing constraints lock you in.

Step 1 — Create the destination at the provider

The pattern is the same for every S3-compatible target:

  1. Create a bucket. Name it <hostname>-jetbackup — JetBackup writes everything under a single bucket and uses a folder hierarchy internally.
  2. Disable public access. JetBackup writes encrypted blobs, but a misconfigured bucket policy is still the most common backup-data leak.
  3. Create an IAM user (AWS), application key (B2), or access key (Wasabi/R2) scoped to the bucket only. The minimum permissions are GetObject, PutObject, DeleteObject, ListBucket, and ListAllMyBuckets.
  4. Save the access key ID, secret key, and endpoint URL — you'll paste them into JetBackup in the next step.

For Backblaze B2 specifically, the endpoint format is https://s3.<region>.backblazeb2.com when using the S3-compatible API. Don't use the native B2 API endpoint — JetBackup 5 deprecated the native B2 connector in 5.4.

Step 2 — Add the destination in JetBackup

In WHM → JetBackup 5 → Destinations → Create New Destination:

Type:        S3 Compatible
Name:        b2-primary
Path:        /                      ← leave as root, JetBackup creates its own subfolders
Bucket:      myhost-jetbackup
Endpoint:    https://s3.us-west-002.backblazeb2.com
Region:      us-west-002
Access Key:  <your-application-key-id>
Secret Key:  <your-application-key>

Hit Validate Destination before Create. JetBackup uploads a 1 KB test object, lists the bucket, and deletes the test object. If validation fails, the error tells you which step broke — 403 is almost always a permission missing from your IAM policy, 404 is a typo in the bucket name or wrong region in the endpoint.

For SFTP, the same form takes a host, port, username, and either a password or an SSH private key. Use the key — JetBackup encrypts it at rest, password auth ages badly:

Type:        SSH
Host:        backup.example.net
Port:        22
Username:    jetbackup
Auth Type:   Private Key
Path:        /home/jetbackup/incoming

Drop the SFTP target's host key into JetBackup's known_hosts on first connect via the validation step — JetBackup pins the host key and refuses to upload if it changes later, so plan for that on key rotation.

Step 3 — Tune the four defaults that break large jobs

Out of the box, JetBackup 5's destination defaults work for a single small server and fail once you have real customer data on the box:

  1. Concurrent transfers. Default is 4. On a 1 Gbps uplink uploading to Backblaze B2, bump to 12-16. JetBackup uses parallel multipart uploads per file, so this number is per-account-being-backed-up, not per-server. Too high and you'll saturate the upstream link and starve other services on the box.

  2. Chunk size. Default is 100 MB. For accounts with single files >1 GB (typical for anyone hosting databases or media sites), increase to 250 MB. Larger chunks reduce the round-trip overhead but increase the retry cost on a failed transfer.

  3. Encryption. Default is off. Turn it on — JetBackup's client-side AES-256 encryption is the difference between a leaked bucket being an embarrassment and being a notification-triggering breach. Generate the key inside the JetBackup UI and back it up to a password manager before the first run. If you lose the encryption key the backups are unrecoverable — JetBackup support cannot decrypt them.

  4. Retention versus destination. The retention policy lives on the schedule, not the destination. A destination with no schedule pointing at it accumulates orphan data forever. Set up at least one schedule per destination immediately or run weekly cleanup with jetapi backup --remove-orphans.

Step 4 — Attach the destination to a schedule

A destination on its own doesn't do anything. In JetBackup 5 → Schedules → Create New Schedule:

Name:              daily-offsite-b2
Type:              Account
Schedule:          Daily @ 02:00
Destinations:      [b2-primary]
Retention:         7 daily + 4 weekly + 6 monthly
Compression:       gzip-fast
Disable on quota:  Yes

The retention numbers above (7/4/6) are conservative for shared hosting. Reseller and VPS hosts usually push to 14/8/12. Each tier multiplies the storage cost roughly linearly — a 30 GB account with 7+4+6 retention sits at ~510 GB on the destination steady-state.

Step 5 — Verify the first job end-to-end

Trigger a manual run on a single small account first:

jetapi backup --create --account testuser --schedule daily-offsite-b2

Watch the live log under JetBackup 5 → Jobs → Running Jobs. A healthy first run goes: Queued → Snapshotting → Compressing → Encrypting → Uploading → Verifying → Completed. The Verifying step downloads the manifest from the destination and confirms the chunk count and checksums match — this is the step that catches misconfigured destinations that accept writes but corrupt them.

If the job completes but the destination shows no folder, you've hit the most common gotcha: the IAM policy allowed PutObject but not ListBucket, so JetBackup wrote the chunks but failed verification and rolled back. Add ListBucket and rerun.

Restoring from an offsite destination

This is where the 30-minute setup pays off — or doesn't. Practice a restore the same day you configure the destination:

jetapi restore --account testuser --backup latest --destination b2-primary

A working restore pulls the manifest, validates checksums, decrypts, and writes the account back. Time the restore. A 10 GB account from B2 typically takes 8-15 minutes on a 100 Mbps download link, mostly bottlenecked by the local disk write rather than the network. If your real-world restore SLA is "within an hour" and your largest account is 200 GB, do the math — you may need an additional faster destination (local NAS, on-net SFTP) for the recovery-critical subset of accounts.

How JetBackup interacts with other tools on the box

A few integrations that cause questions:

  • Imunify360 excludes JetBackup automatically from malware scanning — no manual exclude list needed.
  • CloudLinux LVE limits apply to the backup process by default. If jobs are getting killed for hitting IO limits, exempt the jetbackup5 user from LVE under CloudLinux LVE tuning.
  • WHM backups still run independently if you haven't disabled them. Two backup systems doubling up on disk IO at 2 AM is a common cause of overnight load alerts — pick one and disable the other.

For licensing — JetBackup 5 is per-server, not per-account, and the same license covers unlimited destinations. See the pricing breakdown or contact us for volume questions if you're licensing more than 10 servers.

What's the cheapest S3-compatible destination for JetBackup?+
Backblaze B2 at ~$0.006/GB/month storage with $0.01/GB egress, or Cloudflare R2 at $0.015/GB/month storage with zero egress. R2 wins if you restore frequently; B2 wins on pure storage cost. Both work via JetBackup's S3 Compatible destination type.
Can JetBackup 5 back up to Google Drive or Dropbox?+
Yes — both are first-class destination types in JetBackup 5. They're fine for tiny VPS deployments but throttle aggressively above ~50 GB of churn per day. For anything resembling a real shared host, use S3-compatible or SFTP instead.
How do I rotate the encryption key without losing old backups?+
You don't. JetBackup's per-destination encryption key is set at destination creation and used for every backup written to that destination. To rotate, create a new destination with a new key, point new schedules at it, and let the old destination's retention age out over 6-12 months before deleting it.
Does JetBackup support immutable or object-lock destinations?+
Partially. JetBackup writes objects but doesn't set retention locks itself — you configure object lock at the bucket level (AWS S3 Object Lock, B2 File Lock, Wasabi Compliance Mode). Set the lock period longer than your JetBackup retention or the cleanup job will fail trying to delete locked objects.
Why does the destination validate but jobs fail with 403?+
The validate step only tests PutObject, ListBucket, and DeleteObject on a tiny test file. Real jobs also need multipart upload permissions — specifically AbortMultipartUpload — which a minimal IAM policy often omits. Add it and retry.
Can I run JetBackup 5 alongside R1Soft?+
Yes, but pick one as the primary. Running both with overlapping schedules causes filesystem lock contention and inflates IOPS. Most hosts keep R1Soft for bare-metal CDP and JetBackup for account-level restores — non-overlapping schedules, non-overlapping use cases.

Next steps

Switch in an afternoon

Switch from your current reseller — free.

We migrate active cPanel, Plesk, LiteSpeed and CloudLinux licenses from any reseller. We prorate the first month so you never pay twice, and your customers see zero downtime during the swap.