# S3-Compatible Storage

URL: /docs/storage-providers/s3

Source: https://github.com/easypanel-io/monorepo/blob/main/apps/website/content/docs/storage-providers/s3.mdx

Configure AWS S3 or an S3-compatible backup destination.



Easypanel supports AWS S3 and services that expose an S3-compatible API. The
provider presets supply examples for common services, while **Generic S3**
supports another compatible endpoint.

## Supported presets [#supported-presets]

* AWS S3
* Cloudflare R2
* DigitalOcean Spaces
* Backblaze B2
* Wasabi
* Generic S3

The preset changes field suggestions; every provider is accessed through its
S3-compatible API.

## Before you begin [#before-you-begin]

Create a bucket and a dedicated credential at the storage provider. Scope the
credential to that bucket and allow:

* listing the bucket;
* reading objects for restores;
* writing objects for backups;
* deleting objects for database retention and volume synchronization.

If you do not use retention or volume backups, delete permission may not be
required for a successful upload, but recovery and cleanup should still be
planned.

## Configure the provider [#configure-the-provider]

1. Open **Settings → Server → Storage Providers**.
2. Select **Add Provider**, then choose the S3 provider preset.
3. Complete the fields:
   * **Name** identifies this connection inside Easypanel.
   * **Access Key ID** and **Secret Access Key** authenticate the request.
   * **Bucket** is the existing destination bucket.
   * **Region** must match the bucket or provider API.
   * **Endpoint** is the S3 API endpoint. AWS normally uses the preset's empty
     endpoint; compatible services require their endpoint.
   * **Storage Class** is optional and controls the class assigned to new
     objects.
4. Save the provider.
5. Create a backup and perform a manual run.
6. Confirm that the backup object exists below the configured destination path.

Saving runs a listing request through `rclone`. **Could not connect** means that
the server could not authenticate, reach the endpoint, locate the bucket, or
list it.

<Callout type="warn">
  A successful save does not test object uploads, downloads, or deletion. Use a
  manual backup and a non-production restore to verify the complete permission
  set.
</Callout>

## Provider-specific values [#provider-specific-values]

Use values from the provider's S3 API or object-storage settings:

| Provider            | Typical region or endpoint form                                |
| ------------------- | -------------------------------------------------------------- |
| AWS S3              | Region such as `us-east-1`; endpoint can normally remain empty |
| Cloudflare R2       | Region `auto`; endpoint contains the account ID                |
| DigitalOcean Spaces | Region and endpoint use a datacenter such as `nyc3`            |
| Backblaze B2        | Region and endpoint use the bucket's B2 S3 endpoint            |
| Wasabi              | Use the region and endpoint assigned to the bucket             |
| Generic S3          | Use the exact region and S3 API endpoint from the provider     |

Do not enter a provider's browser console URL as the endpoint.

## Storage classes [#storage-classes]

Leaving **Storage Class** empty uses the provider default. Easypanel offers
suggestions for AWS S3, Cloudflare R2, and Generic S3, but the provider decides
which classes are valid.

<Callout type="warn">
  Objects uploaded to AWS `GLACIER` or `DEEP_ARCHIVE` cannot be read
  immediately. Restore the object through AWS first and wait until it is
  available before starting an Easypanel database restore.
</Callout>

Storage-class minimum duration, retrieval, and deletion charges are controlled
by the provider. Review those rules before applying an archival class to
frequent backups.

## Paths, retention, and versioning [#paths-retention-and-versioning]

The backup's destination path is stored below the configured bucket:

```text
s3://your-bucket/production/orders-postgres/
```

Use a unique path for each database or volume. Database retention deletes the
oldest files found in its path. Volume backup uses synchronization and can
delete destination objects that no longer exist in the source volume.

Provider-side object versioning can protect against accidental overwrite or
deletion, but it also consumes additional storage. Configure lifecycle rules at
the provider and test how to recover a previous object version.

## Troubleshooting [#troubleshooting]

### Could not connect [#could-not-connect]

* Confirm that the Easypanel server can resolve and reach the endpoint.
* Check access key, secret, bucket, region, and endpoint for extra spaces.
* Confirm the credential can list the bucket.
* Make sure the endpoint is the S3 API endpoint, not the web console.
* Check whether the provider requires a different region value.

### Backups upload but retention fails [#backups-upload-but-retention-fails]

Grant delete permission within the destination path. Also verify that no
provider retention lock or object-lock policy prevents deletion.

### Restore cannot read an object [#restore-cannot-read-an-object]

Check read permission and the exact object path. For an archival storage class,
restore the object at the provider before retrying Easypanel.

See [Storage Providers](/docs/storage-providers) for shared permission,
validation, and deletion behavior.
