blissful-infra deploy
blissful-infra deploy takes the app you built locally and ships it to a real cloud environment. Set deploy.target in your blissful-infra.yaml to choose the platform, then run the same command every time.
blissful-infra deploy [name] [options][name] is optional. If omitted, the CLI reads blissful-infra.yaml from the current directory.
Options
Section titled “Options”| Flag | Description |
|---|---|
--dry-run | Print what would be deployed without making any changes |
Configuration
Section titled “Configuration”Set deploy.target in blissful-infra.yaml before running deploy:
name: my-appbackend: spring-bootfrontend: react-vitedatabase: postgresdeploy: target: cloudflare # cloudflare | vercel | awsYou can set the target at scaffold time so the project is ready from the start:
blissful-infra start my-app --deploy-target cloudflareDeploy targets
Section titled “Deploy targets”Cloudflare
Section titled “Cloudflare”Prerequisites: wrangler CLI installed and authenticated.
npm install -g wranglerwrangler loginWhat deploys:
| Local | Cloudflare |
|---|---|
| React + Vite frontend | Cloudflare Pages |
| Express / Hono backend | Cloudflare Worker |
| Postgres database | Cloudflare D1 (SQLite) |
| Redis cache | Cloudflare KV |
The CLI calls wrangler for each step, you don’t need to know the wrangler commands yourself. A wrangler.toml is generated in frontend/ and backend/ at scaffold time if you used --deploy-target cloudflare. If you’re deploying an existing project, the CLI generates them on first deploy.
Config block (optional):
deploy: target: cloudflare cloudflare: accountId: your-cf-account-id workerName: my-app-api pagesProject: my-app-frontendIf accountId is omitted, wrangler uses your default account from wrangler login.
Vercel
Section titled “Vercel”Prerequisites: vercel CLI installed and authenticated.
npm install -g vercelvercel loginWhat deploys: frontend via vercel build + vercel deploy --prebuilt --prod, backend via vercel deploy --prod.
Vercel uses real Postgres (not SQLite), so no DDL translation is needed. Configure DATABASE_URL, Redis (Upstash), and queue (QStash) environment variables in your Vercel project dashboard.
Config block (optional):
deploy: target: vercel vercel: orgId: your-org-id projectId: your-project-idPrerequisites: AWS CLI and CDK installed and configured.
brew install awsclinpm install -g aws-cdkaws configureWhat deploys: CDK stacks via cdk deploy --all. The scaffold generates CDK stacks for ECS Fargate (backend), S3 + CloudFront (frontend), and RDS Postgres (database).
Config block (optional):
deploy: target: aws aws: region: us-east-1 cluster: my-app-clusterExamples
Section titled “Examples”# Deploy from the project directorycd my-appblissful-infra deploy
# Deploy by project name from parent directoryblissful-infra deploy my-app
# Preview without making any changesblissful-infra deploy --dry-runModule portability
Section titled “Module portability”The local modules map to platform-native equivalents so your application code doesn’t change when you switch targets:
| Module | Local | Cloudflare | Vercel | AWS |
|---|---|---|---|---|
| Frontend | nginx | CF Pages | Vercel | S3 + CloudFront |
| Backend | Docker | CF Worker | Vercel Functions | ECS Fargate |
| Database | Postgres | D1 (SQLite) | Vercel Postgres | RDS |
| Cache | Redis | CF KV | Upstash Redis | ElastiCache |
| Queue | Kafka | CF Queues | Upstash QStash | SQS |
To switch platforms, change deploy.target in blissful-infra.yaml and run blissful-infra deploy again.
Error handling
Section titled “Error handling”Missing target: If deploy.target is local-only or not set, the CLI prints the config block you need to add and exits.
Missing prerequisite: If wrangler, vercel, or aws is not installed, the CLI prints the exact install command and exits.
Deploy failure: The CLI surfaces the underlying error output and exits with the same code as the failing tool.