# Your own bucket (/docs/storage/destinations)

Backups always land in backupd Storage. On Pro you can also add your own S3-compatible bucket, called a **destination**, to keep an extra copy you control. Each new backup and its manifest are copied there byte for byte, still encrypted.

<Callout type="info">
  Copying backups to your own bucket is part of **Pro**. On other plans, adding
  a destination shows *Copying backups to your own bucket is part of Pro.
  Upgrade in Settings → Billing to add a destination.*
</Callout>

## Supported providers [#supported-providers]

- Amazon S3
- Cloudflare R2
- Google Cloud Storage
- Backblaze B2
- MinIO

## Add a destination [#add-a-destination]

Owners and admins can add destinations. Open **Destinations** (or **Settings → Destinations**) and click **Add destination**.

| Field | What to enter |
| --- | --- |
| **Provider** | One of the providers above. |
| **Display name** | Optional. Defaults to the provider and bucket name. |
| **Bucket** | The bucket name. It must already exist. |
| **Region** | The bucket's region. Leave empty to use `auto`. |
| **Endpoint** | Shown for Cloudflare R2, Backblaze B2 and MinIO, where it is required. |
| **Access key ID** and **Secret access key** | Keys that can read, write and list objects under the prefix. They are encrypted at rest. |
| **Path prefix** | Where backups go in the bucket. Defaults to `backupd/`. Letters, numbers, dashes, dots and slashes. |

Click **Test connection** to check that backupd can reach the bucket, then **Add destination**. backupd also checks access when you add it, and shows _Couldn't reach the bucket: …_ if it can't.

### Per provider [#per-provider]

<Tabs items={["Amazon S3", "Cloudflare R2", "Google Cloud Storage", "Backblaze B2", "MinIO"]}>
<Tab value="Amazon S3">

- **Region:** the bucket's region, for example `us-east-1`.
- **Endpoint:** not needed.
- **Keys:** an IAM access key with `s3:PutObject`, `s3:GetObject` and `s3:ListBucket` on the bucket and prefix.

</Tab>
<Tab value="Cloudflare R2">

- **Region:** `auto`.
- **Endpoint:** `https://<account-id>.r2.cloudflarestorage.com`.
- **Keys:** an R2 API token with Object Read & Write on the bucket.

</Tab>
<Tab value="Google Cloud Storage">

- **Region:** `auto`.
- **Endpoint:** not needed.
- **Keys:** an HMAC key (access ID and secret) for a service account that can read, write and list objects in the bucket. HMAC keys are under **Cloud Storage → Settings → Interoperability**.

</Tab>
<Tab value="Backblaze B2">

- **Region:** the region in your bucket's S3 endpoint, for example `us-west-004`.
- **Endpoint:** your bucket's S3 endpoint, for example `https://s3.us-west-004.backblazeb2.com`.
- **Keys:** an application key restricted to the bucket, with read and write access. Use the key ID as the **Access key ID**.

</Tab>
<Tab value="MinIO">

- **Region:** your MinIO region, or leave empty.
- **Endpoint:** your server's URL, for example `https://minio.example.com:9000`. It must be reachable from the internet.
- **Keys:** an access key with a policy that allows reading, writing and listing under the prefix.

</Tab>
</Tabs>

## How copies work [#how-copies-work]

- After each successful backup, the encrypted file and its `.manifest.age` manifest are copied to every destination.
- Copies are retried automatically. If a copy still fails, the **Copy to destination failed** event goes to your notification channels.
- Files are laid out by workspace, database and month:

  ```txt
  backupd/<workspace ID>/<database ID>/<yyyy>/<mm>/<backup ID>.pgdump.zst.age
  backupd/<workspace ID>/<database ID>/<yyyy>/<mm>/<backup ID>.pgdump.zst.age.manifest.age
  ```

  The extension depends on the engine: `.pgdump`, `.sql`, `.archive` or `.zip`. You'll find the database ID in the database's **Settings** tab and the backup ID on the backup's page.

- Copies are encrypted to backupd's key and every key you have added. [Add your own key](/docs/security/encryption-keys) so you can open them without backupd.

## What backupd never does in your bucket [#what-backupd-never-does-in-your-bucket]

- **Retention doesn't apply.** backupd doesn't delete expired backups from your bucket. Use your provider's lifecycle rules to expire old files.
- Deleting a backup, removing a database or removing a destination leaves existing copies in your bucket untouched.

## Remove a destination [#remove-a-destination]

Remove a destination from the **Destinations** page. New backups stop being copied there. Existing copies in that bucket are left untouched.

## After a downgrade [#after-a-downgrade]

If your workspace moves off Pro, new backups are no longer copied to your buckets. Copies already there stay where they are.
