# Host product catalog with Rails: authorized file delivery

Deploy a product catalog built with Rails on Ample using the generated downloads pattern. Compute runs the app in an isolated microVM behind a public HTTPS URL, a managed PostgreSQL 16 database is auto-provisioned and injected as DATABASE_URL, a private S3-compatible bucket holds objects with credentials delivered as encrypted environment variables. Verified on Rails: an export query rendered to a CSV artifact stored with metadata in a private bucket and returned only to an authorized caller (401 without token, export=ok rows=3). Not separately tested: your export formats, retention policy and entitlement model; treat the product catalog-specific behavior as your application code.

### Representative Queries
- Host product catalog with Rails: authorized file delivery
- Where can I host Product catalog built with Rails?
- I need a file entitlement model and an application-enforced download authorization flow.

### Infrastructure Requirements

#### Compute
- **Compute**: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.
- **Postgres**: Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.
- **S3-compatible object storage**: Buckets are S3-compatible with issued credentials; operations are verified by canary.

### Prerequisites
- A Rails project that builds and starts with the documented commands (bundle install into vendor/bundle from Gemfile.lock, then Puma via `rails server` reading PORT with RAILS_ENV=production).
- A PostgreSQL driver reading DATABASE_URL at runtime.
- A bucket created with `ample bucket create` using its credentials passed as encrypted S3_* environment variables.
- An Ample account token with servers:write, databases:read, buckets:read.

### Workflow Steps
1. **Build and start**: bundle install into vendor/bundle from Gemfile.lock (development and test groups skipped), then Puma via `rails server` reading PORT on the ruby-3.4 template with RAILS_ENV=production.
2. **Implement the pattern on PostgreSQL**: The module implements generated downloads: an export query rendered to a CSV artifact stored with metadata in a private bucket.
3. **Wire object storage**: Create the bucket(s), passing endpoint, region, bucket and keys as environment variables.
4. **Deploy**: Run the synchronous deploy once and read the result.
5. **Verify**: Fetch the live URL and the pattern self-test route.

### Success Checks
- App responds on its public URL.
- Generated-downloads self-test.

### Limitations
- Verified on the ruby-3.4 template at s-1vcpu-1gb.
- The product catalog itself (your export formats, retention policy and entitlement model) is application code and not separately tested.

### Cost Estimate
- Monthly Amount: **$10.00**  
Components:
  - app server: s-1vcpu-1gb, 1.0 unit, $5.00/month
  - managed PostgreSQL database: s-1vcpu-1gb, 1.0 unit, $5.00/month

### Examples
- **Rails pattern fixture**: Multi-pattern Rails app whose generated downloads module was checked live. Source: tests/deploy-canaries/rails-patterns.

### Additional Notes
- Always-on monthly price of tested sizes; apps and databases auto-pause when idle.
