# CPU render-farm worker pool

Source: https://docs.quake.ai/resources/iac-templates/render-farm-worker
Markdown: https://docs.quake.ai/resources/iac-templates/render-farm-worker.md

---

# CPU render-farm worker pool

This pattern composes Compute and Object Storage.



Quake AI has no GPU rendering. This template provisions a CPU-only render pool for hobbyist, motion-design preview, overnight batch, and audio-render workloads. See [Self-Hosted AI on Cloud Infrastructure](/docs/compute/concepts/self-hosted-ai) for the platform CPU-only posture. Do not expect feature-film GPU farm throughput.



## What this template deploys

- Private network and router for dispatcher and worker egress
- Two Object Storage buckets (job manifests/assets and rendered output)
- One dispatcher VM running a lightweight HTTP queue API on port 8080
- A parameterized pool of CPU worker VMs (`worker_count`) that pull jobs, render with FFmpeg or Blender Cycles CPU, and upload results
- Security group rules scoped to the private subnet for dispatcher↔worker traffic
- Optional node_exporter when `enable_monitoring` is true (scrape from a [monitoring stack](/resources/iac-templates/monitoring-stack) deployment)
- **0 floating IPs** by default; workers have no public addresses

Upload input assets and POST a job manifest to the dispatcher private API, or enable `enable_dispatcher_fip` for remote submission over one public IP.

## Prerequisites

- OpenTofu or Terraform >= 1.6.0
- OpenStack application credentials (`source openrc.sh`)
- EC2-compatible Object Storage credentials. See [S3 storage ACL template](/resources/iac-templates/s3-storage-acl).
- One floating IP available when enabling remote dispatcher access

## Parameters

| Parameter | Description | Default |
| --- | --- | --- |
| `key_name` | SSH keypair name (must already exist in your project) | required |
| `jobs_bucket_name` | Bucket for manifests and input assets | required |
| `output_bucket_name` | Bucket for rendered frames and clips | required |
| `s3_access_key` / `s3_secret_key` | EC2-compat Object Storage credentials | required |
| `worker_count` | Number of CPU render workers | `2` |
| `worker_flavor` | CPU flavor per worker | `c2a.large` |
| `dispatcher_flavor` | CPU flavor for the dispatcher | `c2a.large` |
| `worker_mode` | `queue-puller`, `opencue-rqd`, or `tractor-blade` stub profile | `queue-puller` |
| `enable_dispatcher_fip` | Attach one FIP for remote job POST | `false` |
| `enable_monitoring` | Install node_exporter on all nodes | `false` |
| `poll_interval_seconds` | Worker queue poll interval | `30` |
| `image_name` | Boot image name | `Ubuntu-24.04` |
| `external_network` | Shared external network for router gateway and floating IP | `PublicStatic` |
| `private_cidr` | Private subnet CIDR for dispatcher and workers | `192.168.80.0/24` |
| `instance_prefix` | Prefix for dispatcher and worker instance names | `render-farm` |
| `admin_cidr` | Source CIDR allowed for SSH on dispatcher and workers | `0.0.0.0/0` |
| `submit_cidr` | Source CIDR allowed to POST jobs to the dispatcher API | `0.0.0.0/0` |
| `s3_endpoint` | Quake AI S3-compatible endpoint URL | `https://object.us-east-1.rumble.cloud` |
| `s3_region` | S3 region identifier for the AWS provider | `us-east-1` |

## Cost and sizing

Size `worker_flavor` and `worker_count` for concurrent CPU renders you expect. Blender Cycles and FFmpeg scale with vCPU count; there is no GPU acceleration on Quake AI. Object Storage charges follow your plan allowance for stored job assets and output frames.

## When to use this pattern

Queue overnight Blender Cycles CPU previews, batch FFmpeg transcode jobs, or audio-render jobs without standing up a proprietary render SaaS. For single-file audio normalization, see the [audio post-production worker](/resources/iac-templates/audio-worker) template.

## Estimated cost

<PricingCompanion
  components={[
    { kind: "template", slug: "render-farm-worker", required: true },
  ]}
/>

## Template source

<TemplateSource slug="render-farm-worker" />

<TemplateResourceMap template="render-farm-worker" format="opentofu" />

## Outputs

| Output | Description |
| --- | --- |
| `dispatcher_private_ip` | Private IP workers use for the queue API |
| `dispatcher_floating_ip` | Public IP when `enable_dispatcher_fip` is true |
| `job_submit_url` | HTTP endpoint for job POST |
| `jobs_bucket` / `output_bucket` | Object Storage bucket names |
| `floating_ip_count` | `0` by default; `1` when dispatcher FIP is enabled |
| `worker_instance_ids` | Nova IDs for the worker pool |

## See also

- [Deploy the render-farm worker template](/resources/deployments/deploy-render-farm-worker-template)
- [Self-hosted AI concept](/docs/compute/concepts/self-hosted-ai)
- [Monitoring stack template](/resources/iac-templates/monitoring-stack)
