# Migrate Cloudflare R2 bucket: Public media library

Move object storage from Cloudflare R2 bucket to Ample, one component at a time. Destination verified on Ample: an object written to a published bucket with an immutable Cache-Control header, a mapping row, and the CDN URL serving it publicly. Source procedure: Inventory the bucket with `rclone size` or the R2 dashboard. Not migrated automatically: R2 public buckets with custom domains, Workers bindings and lifecycle rules are not migrated; publish an Ample bucket for public assets instead. Cutover: Switch the app's S3_* environment to the Ample bucket with a redeploy, verify reads and writes, keep R2 read-only until confirmed. Rollback: keep the source untouched until you confirm; nothing at the source is changed or deleted by this guide.

## Representative Queries
- Migrate Cloudflare R2 bucket: Public media library
- Where can I host Public media library?
- I need a component-scoped export/import or reconfiguration procedure for Public media library, with compatibility checks, verification and rollback.

## Workload
Public media library

## Migration Source
Cloudflare R2 bucket

## Execution Status
unbound

## Prerequisites
- Authorized access to the Cloudflare R2 bucket source and its export tooling
- An inventory of every component in scope and out of scope
- A validated backup or copy before any cutover
- An Ample account token with servers:write, buckets:write

## Workflow Steps
1. **Inventory the source**  
   List what Cloudflare R2 bucket provides beyond the component you are moving. Out of scope here: R2 public buckets with custom domains, Workers bindings and lifecycle rules are not migrated; publish an Ample bucket for public assets instead.
2. **Source step 1**  
   Inventory the bucket with `rclone size` or the R2 dashboard.
3. **Source step 2**  
   Copy objects with `rclone sync` from the R2 S3-compatible endpoint to the Ample bucket endpoint using the issued credentials (path-style).
4. **Source step 3**  
   Verify a sample of objects by size and checksum after the copy.
5. **Create the destination bucket and copy**  
   Create the bucket, copy with rclone or the S3 CLI in path-style mode using the issued credentials, then pass the credentials to the app as encrypted S3_* variables.
   
   ```sh
   ample bucket create --name "<bucket_name>"
   ```
6. **Validate before cutover**  
   Run the app's own checks and, for data, compare counts and checksums; the example checks are the pattern self-tests (/p/public-media-library).
7. **Cut over**  
   Switch the app's S3_* environment to the Ample bucket with a redeploy, verify reads and writes, keep R2 read-only until confirmed.
8. **Rollback**  
   Point DNS or configuration back to the source. The source was never modified; deletion is a separate, user-executed step after validation.

## Examples
- **Express pattern fixture (destination)**  
  Verified destination basis: public media library.
  - Source Reference: tests/deploy-canaries/express-patterns

## Success Checks
- Destination app responds on its public URL
- Public-media-library check from the destination example
- Data or object counts and checksums match the source

## Limitations
- Documentation only: nothing is executed automatically and no execution binding is offered.
- The source-side procedure is documented from Cloudflare R2 bucket's standard tooling and was not executed in this catalog's evidence; the destination side was verified with the pattern fixture. 
- No full source-product parity is claimed: R2 public buckets with custom domains, Workers bindings and lifecycle rules are not migrated; publish an Ample bucket for public assets instead.
- Verified on the node-22 template at s-1vcpu-1gb; region, compliance and request-duration limits are unknown.

## Cost Estimate
- **Currency**: USD  
- **Monthly Amount**: 5.0  
- **Basis**: Size prices from pricing.toml (loaded by the API) at build revision 1ac5595375130d45290090e82ed0f554ccd45405-dirty
- **Components**:  
  - App server: size s-1vcpu-1gb, quantity 1.0, monthly amount 5.0

## Evidence Summary
- **Kind**: canary_run  
  **Summary**: Destination side verified: the Express pattern fixture deployed on Ample (npm install, npm run build --if-present, npm run start on the node-22 template) and its checks passed.

## Last Verified At
2026-09-21T02:34:39Z

## Formats
- [HTML](/content/migrate/cloudflare-r2-bucket/public-media-library/index.html)  
- [Markdown](/content/migrate/cloudflare-r2-bucket/public-media-library.md)
- [JSON](https://api.ample.computer/v1/catalog/recipes/page%3Amigrate%3Acloudflare-r2-bucket%3Apublic-media-library)

## Next Actions
- **Browse the catalog index**  
  - Operation: GET, Path: /v1/catalog
- **Search published recipes by intent, stack and constraints**  
  - Operation: POST, Path: /v1/catalog/search  
- **Prepare a side-effect-free deployment plan for an authorized project**  
  - Operation: POST, Path: /v1/catalog/plan
- **Read the existing agent authentication setup**  
  - Operation: GET, Path: /mcp/setup  
- **Browse Cloudflare R2 bucket**  
  - Operation: GET, Path: /v1/catalog/nodes/migration%3Acloudflare-r2-bucket  
- **Browse Public media library**  
  - Operation: GET, Path: /v1/catalog/nodes/pattern%3Apublic-media-library  
- **Browse Migrate objects**  
  - Operation: GET, Path: /v1/catalog/nodes/intent%3Amigrate-objects
