@zerops/web-components 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"id":167,"documentId":"pcs1k08s9v9jpu4fnwywcwpz","name":"Zerops showcase","icon":"zerops","createdAt":"2026-02-25T01:13:55.674Z","updatedAt":"2026-02-25T01:24:33.354Z","publishedAt":"2026-02-25T01:24:36.687Z","slug":"zerops-showcase","internalType":"example","source":"zerops-showcase","recipeCategories":[{"id":68,"documentId":"nig0447nu7nn2kkzzbb7do9q","name":"\"Hello World\" Examples","createdAt":"2025-05-07T06:50:52.537Z","updatedAt":"2025-11-26T08:39:02.369Z","publishedAt":"2025-11-26T08:39:02.386Z","slug":"hello-world-examples"}],"recipeLanguageFrameworks":[{"id":139,"documentId":"x99fy71s1pezfh202bt4f1c7","name":"Bun","createdAt":"2025-05-07T06:52:59.935Z","updatedAt":"2026-02-09T15:14:35.473Z","publishedAt":"2026-02-09T15:14:35.534Z","icon":"bun","slug":"bun","type":"language","iconImage":{"id":138,"documentId":"f7vmqcqbj0kic6gd3diqu2ow","name":"bun.svg","alternativeText":null,"caption":null,"width":80,"height":70,"formats":{},"hash":"bun_dd2692a959","ext":".svg","mime":"image/svg+xml","size":3.48,"url":"https://storage-prg1.zerops.io/4g1dn-storage/bun_dd2692a959.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2025-11-20T20:47:58.250Z","updatedAt":"2026-02-25T01:15:05.546Z","publishedAt":"2025-11-20T20:47:58.251Z","focalPoint":null},"iconImageDark":null},{"id":143,"documentId":"sivrlriziy3jz6l9e3uw9rwr","name":"Python","createdAt":"2025-05-07T06:53:18.800Z","updatedAt":"2026-02-09T15:21:52.981Z","publishedAt":"2026-02-09T15:21:53.014Z","icon":"python","slug":"python","type":"language","iconImage":{"id":107,"documentId":"l05jpq4t87aulln2dnbgha6l","name":"python.svg","alternativeText":null,"caption":null,"width":128,"height":128,"formats":null,"hash":"python_02fcd6f167","ext":".svg","mime":"image/svg+xml","size":2.2,"url":"https://storage-prg1.zerops.io/4g1dn-storage/python_02fcd6f167.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2025-11-20T19:59:52.107Z","updatedAt":"2025-11-20T19:59:52.107Z","publishedAt":"2025-11-20T19:59:52.107Z","focalPoint":null},"iconImageDark":null}],"iconImage":[{"id":189,"documentId":"xyus4pdab1aqfi8gc6q1wtot","name":"image (18).svg","alternativeText":null,"caption":null,"width":42,"height":50,"formats":null,"hash":"image_18_4140fe2320","ext":".svg","mime":"image/svg+xml","size":0.59,"url":"https://storage-prg1.zerops.io/4g1dn-storage/image_18_4140fe2320.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2026-02-25T01:15:28.887Z","updatedAt":"2026-02-25T01:15:28.887Z","publishedAt":"2026-02-25T01:15:28.888Z","focalPoint":null}],"sourceData":{"name":"zerops-showcase","content":"","extracts":{"intro":"Production-ready image processing pipeline showcasing distributed architecture on [Zerops](https://zerops.io) — a [Bun](https://bun.sh) + [React](https://react.dev) frontend with real-time WebSocket updates and live architecture visualization, a [Python](https://python.org) worker for async image processing via NATS, backed by PostgreSQL, Valkey, and S3-compatible object storage."},"environments":[{"name":"0 — AI Agent","content":"# Showcase Recipe — AI Agent Environment\n\nThis is an AI agent environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=ai-agent) recipe on [Zerops](https://zerops.io).\n\n\n**AI agent** environment provides a development space for AI agents to build and version the app.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage.","extracts":{"intro":"**AI agent** environment provides a development space for AI agents to build and version the app.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage."},"import":"# AI agent environment provides a development space for AI agents\n# to build and version the app. Comes with dev and staging services\n# for both the Bun frontend app and the Python image processing worker,\n# plus low-resource PostgreSQL, Valkey, NATS, and S3 object storage.\n\nproject:\n name: showcase-recipe-agent\n\nservices:\n # Development app — Zerops pulls source from the 'buildFromGit' repo\n # and uses the 'dev' zeropsSetup to deploy full source for live editing.\n # Agents SSH in and start the dev server directly.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: appdev\n type: bun@1.2\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n\n # Staging app — validates the production build pipeline. Zerops pulls\n # source and zerops.yaml from 'buildFromGit', using the 'prod' setup\n # to build optimized artifacts and deploy minimal footprint.\n - hostname: appstage\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Development worker — source deployed for live editing via SSH.\n # No HTTP port needed; the worker subscribes to NATS for processing jobs.\n - hostname: workerdev\n type: python@3.12\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n - hostname: workerstage\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-staging\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can process images independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-agent","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"appdev","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"appstage","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"workerdev","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"workerstage","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"1 — Remote (CDE)","content":"# Showcase Recipe — Remote Environment\n\nThis is a remote (CDE) environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=remote-cde) recipe on [Zerops](https://zerops.io).\n\n\n**Remote (CDE)** environment allows developers to build the app **within Zerops** via SSH, supporting the full development lifecycle without local tool installation.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage.","extracts":{"intro":"**Remote (CDE)** environment allows developers to build the app **within Zerops** via SSH, supporting the full development lifecycle without local tool installation.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage."},"import":"# Remote (CDE) environment allows developers to build the app within Zerops\n# via SSH, supporting the full development lifecycle without local tool\n# installation. Comes with dev and staging services for both the Bun frontend\n# app and the Python image processing worker, plus data infrastructure.\n\nproject:\n name: showcase-recipe-remote\n\nservices:\n # Development app — Zerops pulls source from the 'buildFromGit' repo,\n # using the 'dev' zeropsSetup which deploys full source for live editing.\n # Developers SSH in and start the dev server with hot reload.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: appdev\n type: bun@1.2\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n # Increase minRam for comfortable IDE/SSH development:\n # minRam: 4\n minRam: 0.5\n\n # Staging app — validates the production build pipeline. Uses 'prod' setup\n # to build optimized artifacts and deploy minimal footprint.\n - hostname: appstage\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Development worker — source deployed for live editing via SSH.\n # No HTTP port needed; the worker subscribes to NATS for processing jobs.\n - hostname: workerdev\n type: python@3.12\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n # Increase minRam for comfortable IDE/SSH development:\n # minRam: 4\n minRam: 0.5\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n - hostname: workerstage\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-hobby\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can process images independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-remote","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"appdev","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"appstage","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"workerdev","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"workerstage","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"2 — Local","content":"# Showcase Recipe — Local Environment\n\nThis is a local environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=local) recipe on [Zerops](https://zerops.io).\n\n\n**Local** environment supports local app development using zCLI VPN for database access, while ensuring valid deployment processes using a staged app in Zerops.\nIt includes a staging app and worker running in Zerops, with PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage accessible via VPN.","extracts":{"intro":"**Local** environment supports local app development using zCLI VPN for database access, while ensuring valid deployment processes using a staged app in Zerops.\nIt includes a staging app and worker running in Zerops, with PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage accessible via VPN."},"import":"# Local environment supports local app development using zCLI VPN\n# for database and service access, while ensuring valid deployment\n# processes using a staged app and worker in Zerops.\n\nproject:\n name: showcase-recipe-local\n\nservices:\n # Staging app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build and deploy. Validates the production\n # pipeline while the developer runs the app locally via `zcli vpn up`.\n # Subdomain access provides a public HTTPS URL\n # for testing the deployed version.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n # The worker runs in Zerops even during local development since it needs\n # persistent NATS subscription for processing events.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n # Accessible locally via `zcli vpn up` at db:5432.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-hobby\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-local","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"3 — Stage","content":"# Showcase Recipe — Stage Environment\n\nThis is a stage environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=stage) recipe on [Zerops](https://zerops.io).\n\n\n**Stage** environment uses the same configuration as production, but runs on a single container with lower scaling settings.","extracts":{"intro":"**Stage** environment uses the same configuration as production, but runs on a single container with lower scaling settings."},"import":"# Stage environment uses the same configuration as production,\n# but runs on a single container with lower scaling settings.\n\nproject:\n name: showcase-recipe-stage\n\nservices:\n # Staging app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Staging worker — production build, processes images from the NATS queue.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-staging\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-stage","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"4 — Small Production","content":"# Showcase Recipe — Small Production Environment\n\nThis is a small production environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production) recipe on [Zerops](https://zerops.io).\n\n\n**Small production** environment offers a production-ready setup optimized for moderate throughput.","extracts":{"intro":"**Small production** environment offers a production-ready setup optimized for moderate throughput."},"import":"# Small production environment offers a production-ready setup\n# optimized for moderate throughput.\n\nproject:\n name: showcase-recipe-small-prod\n\nservices:\n # Production app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL; replace with a custom domain\n # for production traffic.\n # minContainers: 2 ensures zero-downtime deploys and load distribution.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n minContainers: 2\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Production worker — processes images from the NATS queue.\n # Multiple containers distribute processing load across workers.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n minContainers: 2\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # PostgreSQL single-node — automatic encrypted backups are on by default.\n # For higher traffic, consider HA mode for replicated durability.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-production\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can scale independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 5\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-small-prod","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":2}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":2}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":5,"isUtility":false}]},{"name":"5 — Highly-available Production","content":"# Showcase Recipe — Highly-available Production Environment\n\nThis is a highly-available production environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=highly-available-production) recipe on [Zerops](https://zerops.io).\n\n\n**Highly-available production** environment provides a production setup with enhanced scaling, dedicated resources, and HA components for improved durability and performance.","extracts":{"intro":"**Highly-available production** environment provides a production setup with enhanced scaling, dedicated resources, and HA components for improved durability and performance."},"import":"# Highly-available production environment provides a production setup with\n# enhanced scaling, dedicated resources, and HA components for improved\n# durability and performance.\n\nproject:\n name: showcase-recipe-ha-prod\n # Serious core provides dedicated infrastructure for the project's\n # balancer, logging, and metrics — required for production workloads.\n corePackage: SERIOUS\n\nservices:\n # Production app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL; replace with a custom domain\n # for production traffic.\n # minContainers: 2 ensures zero-downtime deploys and load distribution.\n # Dedicated CPU cores prevent noisy-neighbor performance degradation.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n minContainers: 2\n maxContainers: 6\n verticalAutoscaling:\n cpuMode: DEDICATED\n minRam: 1\n minFreeRamGB: 0.5\n\n # Production worker — processes images from the NATS queue.\n # Multiple containers distribute processing load across workers.\n # Dedicated CPU cores ensure consistent image processing throughput.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n minContainers: 2\n maxContainers: 6\n verticalAutoscaling:\n cpuMode: DEDICATED\n minRam: 1\n minFreeRamGB: 0.5\n\n # PostgreSQL HA — replicates data across multiple nodes, no single point\n # of failure. Automatic encrypted backups are on by default.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:ha@17\n profile: oltp-production\n priority: 10\n\n # Valkey HA — replicated cache for event tracking and job counters,\n # ensuring cache availability even if a node fails.\n - hostname: redis\n type: valkey:ha@7.2\n priority: 10\n\n # NATS HA — replicated message queue for reliable event delivery\n # between the app and worker services.\n - hostname: queue\n type: nats:ha@2.12\n priority: 10\n\n # S3-compatible object storage — larger capacity for production workloads.\n - hostname: storage\n type: object-storage\n objectStorageSize: 10\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-ha-prod","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2","typeVersionName":"core:ha@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":3,"minContainerCount":3}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.5,"memoryPercent":0},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":6,"minContainerCount":2}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.5,"memoryPercent":0},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":6,"minContainerCount":2}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_ha","typeVersionName":"postgresql:ha@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":2,"memoryGBytes":4,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":30,"memoryGBytes":0.5,"memoryPercent":25},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":5433,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_ha","typeVersionName":"valkey:ha@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"},{"protocol":"tcp","port":7000,"description":"","scheme":"redis"},{"protocol":"tcp","port":7001,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_ha","typeVersionName":"nats:ha@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":10,"isUtility":false}]}],"errors":null},"externalDataCached":true,"externalDataFetchedAt":"2026-06-12T19:09:36.005Z"}
1
+ {"id":167,"documentId":"pcs1k08s9v9jpu4fnwywcwpz","name":"Zerops showcase","icon":"zerops","createdAt":"2026-02-25T01:13:55.674Z","updatedAt":"2026-02-25T01:24:33.354Z","publishedAt":"2026-02-25T01:24:36.687Z","slug":"zerops-showcase","internalType":"example","source":"zerops-showcase","recipeCategories":[{"id":68,"documentId":"nig0447nu7nn2kkzzbb7do9q","name":"\"Hello World\" Examples","createdAt":"2025-05-07T06:50:52.537Z","updatedAt":"2025-11-26T08:39:02.369Z","publishedAt":"2025-11-26T08:39:02.386Z","slug":"hello-world-examples"}],"recipeLanguageFrameworks":[{"id":139,"documentId":"x99fy71s1pezfh202bt4f1c7","name":"Bun","createdAt":"2025-05-07T06:52:59.935Z","updatedAt":"2026-02-09T15:14:35.473Z","publishedAt":"2026-02-09T15:14:35.534Z","icon":"bun","slug":"bun","type":"language","iconImage":{"id":138,"documentId":"f7vmqcqbj0kic6gd3diqu2ow","name":"bun.svg","alternativeText":null,"caption":null,"width":80,"height":70,"formats":{},"hash":"bun_dd2692a959","ext":".svg","mime":"image/svg+xml","size":3.48,"url":"https://storage-prg1.zerops.io/4g1dn-storage/bun_dd2692a959.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2025-11-20T20:47:58.250Z","updatedAt":"2026-02-25T01:15:05.546Z","publishedAt":"2025-11-20T20:47:58.251Z","focalPoint":null},"iconImageDark":null},{"id":143,"documentId":"sivrlriziy3jz6l9e3uw9rwr","name":"Python","createdAt":"2025-05-07T06:53:18.800Z","updatedAt":"2026-02-09T15:21:52.981Z","publishedAt":"2026-02-09T15:21:53.014Z","icon":"python","slug":"python","type":"language","iconImage":{"id":107,"documentId":"l05jpq4t87aulln2dnbgha6l","name":"python.svg","alternativeText":null,"caption":null,"width":128,"height":128,"formats":null,"hash":"python_02fcd6f167","ext":".svg","mime":"image/svg+xml","size":2.2,"url":"https://storage-prg1.zerops.io/4g1dn-storage/python_02fcd6f167.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2025-11-20T19:59:52.107Z","updatedAt":"2025-11-20T19:59:52.107Z","publishedAt":"2025-11-20T19:59:52.107Z","focalPoint":null},"iconImageDark":null}],"iconImage":[{"id":189,"documentId":"xyus4pdab1aqfi8gc6q1wtot","name":"image (18).svg","alternativeText":null,"caption":null,"width":42,"height":50,"formats":null,"hash":"image_18_4140fe2320","ext":".svg","mime":"image/svg+xml","size":0.59,"url":"https://storage-prg1.zerops.io/4g1dn-storage/image_18_4140fe2320.svg","previewUrl":null,"provider":"aws-s3","provider_metadata":null,"createdAt":"2026-02-25T01:15:28.887Z","updatedAt":"2026-02-25T01:15:28.887Z","publishedAt":"2026-02-25T01:15:28.888Z","focalPoint":null}],"sourceData":{"name":"zerops-showcase","content":"","extracts":{"intro":"Production-ready image processing pipeline showcasing distributed architecture on [Zerops](https://zerops.io) — a [Bun](https://bun.sh) + [React](https://react.dev) frontend with real-time WebSocket updates and live architecture visualization, a [Python](https://python.org) worker for async image processing via NATS, backed by PostgreSQL, Valkey, and S3-compatible object storage."},"environments":[{"name":"0 — AI Agent","content":"# Showcase Recipe — AI Agent Environment\n\nThis is an AI agent environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=ai-agent) recipe on [Zerops](https://zerops.io).\n\n\n**AI agent** environment provides a development space for AI agents to build and version the app.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage.","extracts":{"intro":"**AI agent** environment provides a development space for AI agents to build and version the app.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage."},"import":"# AI agent environment provides a development space for AI agents\n# to build and version the app. Comes with dev and staging services\n# for both the Bun frontend app and the Python image processing worker,\n# plus low-resource PostgreSQL, Valkey, NATS, and S3 object storage.\n\nproject:\n name: showcase-recipe-agent\n\nservices:\n # Development app — Zerops pulls source from the 'buildFromGit' repo\n # and uses the 'dev' zeropsSetup to deploy full source for live editing.\n # Agents SSH in and start the dev server directly.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: appdev\n type: bun@1.2\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n\n # Staging app — validates the production build pipeline. Zerops pulls\n # source and zerops.yaml from 'buildFromGit', using the 'prod' setup\n # to build optimized artifacts and deploy minimal footprint.\n - hostname: appstage\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Development worker — source deployed for live editing via SSH.\n # No HTTP port needed; the worker subscribes to NATS for processing jobs.\n - hostname: workerdev\n type: python@3.12\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n - hostname: workerstage\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-staging\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can process images independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-agent","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"appdev","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"appstage","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"workerdev","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"workerstage","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"1 — Remote (CDE)","content":"# Showcase Recipe — Remote Environment\n\nThis is a remote (CDE) environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=remote-cde) recipe on [Zerops](https://zerops.io).\n\n\n**Remote (CDE)** environment allows developers to build the app **within Zerops** via SSH, supporting the full development lifecycle without local tool installation.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage.","extracts":{"intro":"**Remote (CDE)** environment allows developers to build the app **within Zerops** via SSH, supporting the full development lifecycle without local tool installation.\nIt includes dev and staging services for both the app and worker, along with low-resource PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage."},"import":"# Remote (CDE) environment allows developers to build the app within Zerops\n# via SSH, supporting the full development lifecycle without local tool\n# installation. Comes with dev and staging services for both the Bun frontend\n# app and the Python image processing worker, plus data infrastructure.\n\nproject:\n name: showcase-recipe-remote\n\nservices:\n # Development app — Zerops pulls source from the 'buildFromGit' repo,\n # using the 'dev' zeropsSetup which deploys full source for live editing.\n # Developers SSH in and start the dev server with hot reload.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: appdev\n type: bun@1.2\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n # Increase minRam for comfortable IDE/SSH development:\n # minRam: 4\n minRam: 0.5\n\n # Staging app — validates the production build pipeline. Uses 'prod' setup\n # to build optimized artifacts and deploy minimal footprint.\n - hostname: appstage\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Development worker — source deployed for live editing via SSH.\n # No HTTP port needed; the worker subscribes to NATS for processing jobs.\n - hostname: workerdev\n type: python@3.12\n zeropsSetup: dev\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n # Increase minRam for comfortable IDE/SSH development:\n # minRam: 4\n minRam: 0.5\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n - hostname: workerstage\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-hobby\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can process images independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-remote","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"appdev","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"appstage","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"workerdev","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"workerstage","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"2 — Local","content":"# Showcase Recipe — Local Environment\n\nThis is a local environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=local) recipe on [Zerops](https://zerops.io).\n\n\n**Local** environment supports local app development using zCLI VPN for database access, while ensuring valid deployment processes using a staged app in Zerops.\nIt includes a staging app and worker running in Zerops, with PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage accessible via VPN.","extracts":{"intro":"**Local** environment supports local app development using zCLI VPN for database access, while ensuring valid deployment processes using a staged app in Zerops.\nIt includes a staging app and worker running in Zerops, with PostgreSQL, Valkey cache, NATS message queue, and S3-compatible object storage accessible via VPN."},"import":"# Local environment supports local app development using zCLI VPN\n# for database and service access, while ensuring valid deployment\n# processes using a staged app and worker in Zerops.\n\nproject:\n name: showcase-recipe-local\n\nservices:\n # Staging app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build and deploy. Validates the production\n # pipeline while the developer runs the app locally via `zcli vpn up`.\n # Subdomain access provides a public HTTPS URL\n # for testing the deployed version.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Worker — production build, listens on NATS\n # for image processing jobs.\n # The worker runs in Zerops even during local development since it needs\n # persistent NATS subscription for processing events.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n # Accessible locally via `zcli vpn up` at db:5432.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-hobby\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-local","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"3 — Stage","content":"# Showcase Recipe — Stage Environment\n\nThis is a stage environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=stage) recipe on [Zerops](https://zerops.io).\n\n\n**Stage** environment uses the same configuration as production, but runs on a single container with lower scaling settings.","extracts":{"intro":"**Stage** environment uses the same configuration as production, but runs on a single container with lower scaling settings."},"import":"# Stage environment uses the same configuration as production,\n# but runs on a single container with lower scaling settings.\n\nproject:\n name: showcase-recipe-stage\n\nservices:\n # Staging app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL for testing.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Staging worker — production build, processes images from the NATS queue.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n verticalAutoscaling:\n minRam: 0.5\n\n # PostgreSQL for persistent image metadata and processing state.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-staging\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 2\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-stage","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":2,"isUtility":false}]},{"name":"4 — Small Production","content":"# Showcase Recipe — Small Production Environment\n\nThis is a small production environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production) recipe on [Zerops](https://zerops.io).\n\n\n**Small production** environment offers a production-ready setup optimized for moderate throughput.","extracts":{"intro":"**Small production** environment offers a production-ready setup optimized for moderate throughput."},"import":"# Small production environment offers a production-ready setup\n# optimized for moderate throughput.\n\nproject:\n name: showcase-recipe-small-prod\n\nservices:\n # Production app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL; replace with a custom domain\n # for production traffic.\n # minContainers: 2 ensures zero-downtime deploys and load distribution.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n minContainers: 2\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # Production worker — processes images from the NATS queue.\n # Multiple containers distribute processing load across workers.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n minContainers: 2\n verticalAutoscaling:\n minRam: 0.5\n minFreeRamGB: 0.25\n\n # PostgreSQL single-node — automatic encrypted backups are on by default.\n # For higher traffic, consider HA mode for replicated durability.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:single@17\n profile: oltp-production\n priority: 10\n\n # Valkey (Redis-compatible) for event caching and active job tracking.\n - hostname: redis\n type: valkey:single@7.2\n priority: 10\n\n # NATS message queue — decouples the app from the worker. Upload events\n # flow through NATS so workers can scale independently.\n - hostname: queue\n type: nats:single@2.12\n priority: 10\n\n # S3-compatible object storage for images,\n # thumbnails, and resized variants.\n - hostname: storage\n type: object-storage\n objectStorageSize: 5\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-small-prod","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2_single","typeVersionName":"core:single@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":1,"minContainerCount":1}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":2}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.25,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":10,"minContainerCount":2}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_single","typeVersionName":"postgresql:single@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":20,"memoryGBytes":0.25,"memoryPercent":20},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_single","typeVersionName":"valkey:single@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_single","typeVersionName":"nats:single@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":5,"isUtility":false}]},{"name":"5 — Highly-available Production","content":"# Showcase Recipe — Highly-available Production Environment\n\nThis is a highly-available production environment for [Showcase Recipe (info + deploy)](https://app.zerops.io/recipes/showcase-recipe?environment=highly-available-production) recipe on [Zerops](https://zerops.io).\n\n\n**Highly-available production** environment provides a production setup with enhanced scaling, dedicated resources, and HA components for improved durability and performance.","extracts":{"intro":"**Highly-available production** environment provides a production setup with enhanced scaling, dedicated resources, and HA components for improved durability and performance."},"import":"# Highly-available production environment provides a production setup with\n# enhanced scaling, dedicated resources, and HA components for improved\n# durability and performance.\n\nproject:\n name: showcase-recipe-ha-prod\n # Serious core provides dedicated infrastructure for the project's\n # balancer, logging, and metrics — required for production workloads.\n corePackage: SERIOUS\n\nservices:\n # Production app — Zerops pulls source and zerops.yaml from the 'buildFromGit'\n # repo, using the 'prod' setup to build optimized artifacts and deploy.\n # Subdomain access provides a public HTTPS URL; replace with a custom domain\n # for production traffic.\n # minContainers: 2 ensures zero-downtime deploys and load distribution.\n # Dedicated CPU cores prevent noisy-neighbor performance degradation.\n - hostname: app\n type: bun@1.2\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-app\n enableSubdomainAccess: true\n envSecrets:\n CORE_MODE: serious\n minContainers: 2\n maxContainers: 6\n verticalAutoscaling:\n cpuMode: DEDICATED\n minRam: 1\n minFreeRamGB: 0.5\n\n # Production worker — processes images from the NATS queue.\n # Multiple containers distribute processing load across workers.\n # Dedicated CPU cores ensure consistent image processing throughput.\n - hostname: worker\n type: python@3.12\n zeropsSetup: prod\n buildFromGit: https://github.com/zerops-recipe-apps/showcase-recipe-worker\n minContainers: 2\n maxContainers: 6\n verticalAutoscaling:\n cpuMode: DEDICATED\n minRam: 1\n minFreeRamGB: 0.5\n\n # PostgreSQL HA — replicates data across multiple nodes, no single point\n # of failure. Automatic encrypted backups are on by default.\n # Priority 10 starts data services before app containers,\n # preventing connection errors on first deploy.\n - hostname: db\n type: postgresql:ha@17\n profile: oltp-production\n priority: 10\n\n # Valkey HA — replicated cache for event tracking and job counters,\n # ensuring cache availability even if a node fails.\n - hostname: redis\n type: valkey:ha@7.2\n priority: 10\n\n # NATS HA — replicated message queue for reliable event delivery\n # between the app and worker services.\n - hostname: queue\n type: nats:ha@2.12\n priority: 10\n\n # S3-compatible object storage — larger capacity for production workloads.\n - hostname: storage\n type: object-storage\n objectStorageSize: 10\n objectStoragePolicy: public-read\n priority: 10\n","projectName":"showcase-recipe-ha-prod","services":[{"name":"core","typeId":"core","typeName":"Core Service","typeVersionId":"core_v2","typeVersionName":"core:ha@2","exactVersionNumber":"v2","category":"CORE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":3,"minContainerCount":3}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"app","typeId":"bun","typeName":"Bun","typeVersionId":"ubuntu_bun_v1_2","typeVersionName":"ubuntu/bun@1.2.2","exactVersionNumber":"v1.2.2","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-app","content":"# Showcase Recipe App\n\n\nFull-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — build React frontend + bundle\n # Bun backend into optimized artifacts.\n # Bun's bundler inlines all deps, no node_modules\n # needed at runtime.\n - setup: prod\n build:\n base: bun@1.2\n\n # BUN_INSTALL redirects Bun's global package cache\n # into the project tree so Zerops can cache it\n # between builds (~/.bun is outside build scope).\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # --frozen-lockfile validates bun.lock for\n # reproducible production builds\n - bun install --frozen-lockfile\n # Build React frontend (Vite + Tailwind) — output lands in frontend/dist\n - cd frontend && bun install --frozen-lockfile && bun run build && cd ..\n # Bundle backend — Bun inlines all deps\n # (hono, postgres, ioredis, nats, aws-sdk)\n - bun build src/index.ts --outfile dist/index.js --target bun\n\n deployFiles:\n # Bundled backend + compiled frontend + DB schema for init\n - ./dist\n - ./frontend/dist\n - ./src/db/schema.sql\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache # Must match BUN_INSTALL path above\n\n # Readiness check: verifies the container is\n # healthy before the balancer routes traffic.\n # /api/health checks PG, Valkey, NATS, and S3.\n deploy:\n readinessCheck:\n httpGet:\n port: 3000\n path: /api/health\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: production\n # Database — auto-generated from 'db' service\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS message queue — referenced by 'queue' service hostname\n NATS_HOST: ${queue_hostname}\n NATS_PORT: ${queue_port}\n NATS_USER: ${queue_user}\n NATS_PASS: ${queue_password}\n # S3-compatible object storage\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: bun run dist/index.js\n\n # Development setup — deploy full source for live editing via SSH.\n # Developer SSHs in after deploy and starts\n # the dev server with hot reload.\n - setup: dev\n build:\n base: bun@1.2\n\n envVariables:\n BUN_INSTALL: ./.bun\n\n buildCommands:\n # No --frozen-lockfile — lockfile may not\n # exist in fresh forks\n - bun install\n - cd frontend && bun install && cd ..\n\n deployFiles:\n # Deploy everything — developer runs TypeScript source directly via SSH\n - ./\n\n cache:\n - node_modules\n - frontend/node_modules\n - .bun/install/cache\n\n run:\n base: bun@1.2\n\n ports:\n - port: 3000\n httpSupport: true\n\n envVariables:\n NODE_ENV: development\n\n # Container stays idle — developer starts server manually via SSH\n start: zsc noop --silent\n```","intro":"Full-stack image processing pipeline built with [Bun](https://bun.sh) and [React](https://react.dev), featuring real-time WebSocket updates, a live architecture visualization dashboard, and integrations with PostgreSQL, Valkey, NATS, and S3-compatible object storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.5,"memoryPercent":0},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":6,"minContainerCount":2}},"ports":[{"protocol":"tcp","port":3000,"description":"","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"worker","typeId":"python","typeName":"Python","typeVersionId":"ubuntu_python_v3_12","typeVersionName":"ubuntu/python@3.12","exactVersionNumber":"v3.12.0","category":"USER","gitRepo":"https://github.com/zerops-recipe-apps/showcase-recipe-worker","content":"# Showcase Recipe Worker\n\n\nAsynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform.\n\n\n⬇️ **Full recipe page and deploy with one-click**\n\n[![Deploy on Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/deploy-button/light/deploy-button.svg)](https://app.zerops.io/recipes/showcase-recipe?environment=small-production)\n\n## Integration Guide\n\n\n\n### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","zeropsYaml":"zerops:\n # Production setup\n - setup: prod\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # Valkey can be password-protected.\n REDIS_PASSWORD: ${redis_password}\n NATS_URL: ${queue_connectionString}\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n","extracts":{"integration-guide":"### 1. Adding `zerops.yaml`\nThe main application configuration file you place at the root of your repository, it tells Zerops how to build, deploy and run your application.\n\n```yaml\nzerops:\n # Production setup — deploy source and install dependencies at runtime.\n # Python is interpreted, so no compilation step is needed in buildCommands.\n - setup: prod\n build:\n # Deploy entire source tree — Python runs directly from source\n deploy: ./\n # Ensures requirements.txt is available during run.prepareCommands\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n\n # Install Python packages into the runtime container image.\n # prepareCommands run once per container creation and are cached,\n # unlike initCommands which run on every restart.\n prepareCommands:\n - pip install -r requirements.txt\n\n envVariables:\n # Database — references auto-generated variables from the 'db' service hostname\n DB_HOST: ${db_hostname}\n DB_PORT: ${db_port}\n DB_USER: ${db_user}\n DB_PASS: ${db_password}\n DB_NAME: ${db_dbName}\n # Valkey cache — referenced by 'redis' service hostname\n REDIS_HOST: ${redis_hostname}\n REDIS_PORT: ${redis_port}\n # NATS connection string — single URI with embedded credentials\n NATS_URL: ${queue_connectionString}\n # S3-compatible object storage — referenced by 'storage' service hostname\n S3_ENDPOINT: ${storage_apiUrl}\n S3_ACCESS_KEY: ${storage_accessKeyId}\n S3_SECRET_KEY: ${storage_secretAccessKey}\n S3_BUCKET: ${storage_bucketName}\n\n start: python src/main.py\n\n # Development setup — deploy full source for live editing via SSH.\n # The developer SSHs in and starts the worker manually.\n - setup: dev\n build:\n deploy: ./\n addToRunPrepare: requirements.txt\n\n run:\n base: python@3.12\n prepareCommands:\n - pip install -r requirements.txt\n # Container stays idle — developer starts worker manually via SSH\n start: zsc noop --silent\n```","intro":"Asynchronous image processing worker built with [Python](https://python.org) and [Pillow](https://python-pillow.org), listening for upload events via NATS message queue, generating thumbnails and resized WebP images, and persisting results to PostgreSQL, Valkey, and S3-compatible storage on [Zerops](https://zerops.io).\nUsed within [Showcase Recipe](https://app.zerops.io/recipes/showcase-recipe) for [Zerops](https://zerops.io) platform."},"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":1,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.5,"memoryPercent":0},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":6,"minContainerCount":2}},"ports":[],"objectStorageSize":null,"isUtility":false},{"name":"db","typeId":"postgresql","typeName":"PostgreSQL","typeVersionId":"postgresql_v17_ha","typeVersionName":"postgresql:ha@17","exactVersionNumber":"v17.7","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":2,"memoryGBytes":4,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":30,"memoryGBytes":0.5,"memoryPercent":25},"cpuMode":"DEDICATED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":5432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":6432,"description":"","scheme":"postgresql"},{"protocol":"tcp","port":5433,"description":"","scheme":"postgresql"}],"objectStorageSize":null,"isUtility":false},{"name":"redis","typeId":"valkey","typeName":"Valkey","typeVersionId":"valkey_v7_2_ha","typeVersionName":"valkey:ha@7.2","exactVersionNumber":"v7.2.12","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.5,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.0625,"memoryPercent":30},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":6379,"description":"","scheme":"redis"},{"protocol":"tcp","port":6380,"description":"","scheme":"redis"},{"protocol":"tcp","port":7000,"description":"","scheme":"redis"},{"protocol":"tcp","port":7001,"description":"","scheme":"redis"}],"objectStorageSize":null,"isUtility":false},{"name":"queue","typeId":"nats","typeName":"NATS","typeVersionId":"nats_v2_12_ha","typeVersionName":"nats:ha@2.12","exactVersionNumber":"v2.12.1","category":"STANDARD","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":{"maxResource":{"cpuCoreCount":8,"memoryGBytes":48,"diskGBytes":250},"minResource":{"cpuCoreCount":1,"memoryGBytes":0.25,"diskGBytes":1},"minFreeResource":{"cpuCoreCount":0.10000000149011612,"cpuCorePercent":0,"memoryGBytes":0.125,"memoryPercent":0},"cpuMode":"SHARED","startCpuCoreCount":2,"swapEnabled":true},"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[{"protocol":"tcp","port":4222,"description":"nats","scheme":"nats"},{"protocol":"tcp","port":8222,"description":"management","scheme":"http"}],"objectStorageSize":null,"isUtility":false},{"name":"storage","typeId":"object_storage","typeName":"Object storage","typeVersionId":"object_storage_v1","typeVersionName":"object-storage","exactVersionNumber":"","category":"OBJECT_STORAGE","gitRepo":null,"content":null,"zeropsYaml":null,"extracts":null,"autoscaling":{"verticalAutoscaling":null,"horizontalAutoscaling":{"maxContainerCount":null,"minContainerCount":null}},"ports":[],"objectStorageSize":10,"isUtility":false}]}],"errors":null},"externalDataCached":true,"externalDataFetchedAt":"2026-06-12T19:23:32.291Z"}