### Host campaign site with Rails: public-site delivery

#### Summary
Deploy a campaign site built with Rails on Ample using the public web service pattern. Compute runs the app in an isolated microVM behind a public HTTPS URL, and a published bucket serves public assets from the CDN host. Verified on Rails: a versioned, immutable-cached asset uploaded to a published bucket and served from the CDN URL alongside the app's own public HTTPS URL. Not separately tested: your site content and build; treat the campaign site-specific behavior as your application code.

#### Representative Queries
- Host campaign site with Rails: public-site delivery
- Where can I host Campaign site built with Rails?
- I need an explicit origin-to-CDN delivery path and a tested public content build.

#### Framework
Rails

#### Workload
Campaign site

#### Release Status
published

#### Support Status
verified

#### Execution Status
ready

#### Prerequisites
- A Rails project that builds and starts with the documented commands (`bundle install` into `vendor/bundle` from `Gemfile.lock`, skipping development and test groups, then `Puma` via `rails server` reading `PORT` on the `ruby-3.4` template with `RAILS_ENV=production`).
- A bucket from `ample bucket create` with its credentials passed as encrypted `S3_*` environment variables.
- An Ample account token with `servers:write`, `buckets:read` permissions.

#### 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`. The server must bind `0.0.0.0` on `PORT`.
2. **Wire object storage**  
   Create the bucket(s), then pass endpoint, region, bucket, and keys as `--env` values. Use path-style addressing. Keep private data in an unpublished bucket. Publish only the bucket that serves public assets and reference its CDN URL.
3. **Deploy**  
   Run the synchronous deploy once and read the result (exit `0` live, `1` failed, `2` blocked). Re-running with no change is a no-op.  
   Command:  
   `ample deploy . --name --public --env S3_ENDPOINT=... --env S3_REGION=... --env S3_BUCKET=... --env S3_ACCESS_KEY_ID=... --env S3_SECRET_ACCESS_KEY=... --env CDN_PUBLIC_URL=...`
4. **Verify**  
   Fetch the live URL and the pattern self-test route(s) (`/p/versioned-static-assets`) from the example; then run your own checks. On failure read `ample logs --kind build` then `--kind runtime`.  
   Command:  
   `ample logs --kind build`

#### Success Checks
- App responds on its public URL  
   Kind: `http_get`  
   Path: `/`  
   Expect: `ample canary rails patterns`
- Versioned-static-assets self-test  
   Kind: `http_get`  
   Path: `/p/versioned-static-assets`  
   Expect: `a CDN URL whose content is served publicly`

#### Limitations
- Verified on the `ruby-3.4` template at `s-1vcpu-1gb` with the example fixture; other sizes, templates, and Rails major versions are not verified.
- The campaign site itself (your site content and build) is application code and was not separately tested; the pattern checks are what was verified.
- Region, compliance attestations and request-duration limits are unknown and not claimed.
- Apps auto-pause when idle and wake on the next request; always-on is an operator setting, not a plan feature.
- PutObject and GetObject with path-style addressing are verified; multipart upload, listing, presigned URLs, and lifecycle rules are not.
- The CDN serves published-bucket objects only; cache rules, purge, and TTL control are not verified (the fixture sets Cache-Control on upload and versions keys).

#### Cost Estimate
- Currency: USD  
- Monthly Amount: 5.0  
- Authoritative: true  
- Basis: size prices from `pricing.toml` (loaded by the API) at build revision `1ac5595375130d45290090e82ed0f554ccd45405-dirty`  
- Components:  
  - Name: `app server`  
    - Size: `s-1vcpu-1gb`  
    - Quantity: 1.0  
    - Monthly Amount: 5.0  
- Note: Always-on monthly price of the tested sizes; apps and databases auto-pause when idle. Buckets are allocation-priced per quota and not included.

#### Evidence Summary
- **Kind:** `canary_run`  
  **Summary:** Rails pattern fixture deployed on Ample; checks passed for versioned-static-assets and configuration-secrets.  
  **Observed At:** `2026-09-20T21:55:28Z`  
  **Implementation Revision:** `4f7cb9813c1f-dirty (CLI 4f7cb98)`  
  **Expires At:** `2027-03-19T21:55:28Z`  
  **Scope:**  
  Checks: `/p/versioned-static-assets`  
  Pattern: `pattern:public-web-service`  
  Template: `ruby-3.4`

#### Last Verified At
2026-09-20T21:55:28Z
