Skip to content
Deployments

Deploy the live RTMP/SRT ingest and restream template with OpenTofu

Deployment · Updated Jun 2026

Coming from another cloud?

▸AWS·IVS

This Quake AI feature maps to AWS’s IVS.

▸Google Cloud·Live Stream

This Quake AI feature maps to Google Cloud’s Live Stream.

Deploy the live RTMP/SRT ingest and restream template with OpenTofu

Stand up a CPU ingest VM that accepts an RTMP push and fans out to downstream RTMP endpoints using the validated OpenTofu template live-ingest-restream. The template provisions NGINX-RTMP or SRS on CPU only; multi-rung ABR ladders are bounded on CPU, so prefer pass-through restream where possible.

Monthly cost estimate

Pricing calculator ↗

Sized as a custom package on dedicated vCPU.

Starting template$60.20/mo

Monthly total for the required template above. Use the configurator below to add optional pieces and see the total update.

What each resource is for

Ingest

c2a.large · 2 dedicated vCPU, 4 GiB RAM, 0.5 Gbps

$62.00/mo

Compute shown per role at custom-package rates ($29/dedicated vCPU, $7.25/shared vCPU, $1/GiB RAM). The headline above is the billed total: the cheaper of a named plan and the custom package, plus add-ons.

Included in baseline

c2a.large

2 dedicated vCPU, 4 GiB RAM, 0.5 Gbps

$62.00

Compute + RAM rate basis

2 vCPU + 4 GiB RAM at $29/dedicated vCPU, $7.25/shared vCPU, $1/GiB RAM (regular). Totals apply the flat −$5/mo package promotion.

—

Block storage (40 GiB)

40 GiB at $0.08/GiB/mo

$3.20

Public IP (included)

1 included with the custom package

$0.00

Package promotional discount

Flat −$5.00/mo on the custom package (same promotion as named plans).

$-5.00

Included at no charge

These line items are zero on Quake AI. Many other providers meter them separately.

Data transfer (inbound and outbound)

Unlimited data transfer on every plan; Quake AI does not meter per-GB egress.

AWS, GCP, and Azure meter outbound transfer per GB. DigitalOcean and Hetzner include an allowance on compute plans, then charge overage.

Learn more
$0.00

Private networking

Private networks, subnets, Neutron routers, and security groups are included with the plan.

VPC objects are usually free to create elsewhere, but NAT gateways bill hourly plus per-GB processed. Quake AI uses router SNAT with no separate NAT line item.

$0.00

Control-plane API requests

OpenStack API calls for provisioning and management are included.

Some managed services on other clouds meter API calls or charge for premium control-plane features.

$0.00

Dev/test vs production

Start on shared CPU for dev/test, then promote to dedicated for production with a flavor resize. The network, storage, and template stay the same.

Dev/test on shared CPU

Burstable s1a flavors; suited to prototyping and low or bursty load.

$14.70/mo

Production on dedicated CPU

The headline estimate above; predictable steady-load performance.

$60.20/mo

Saves $45.50/mo while you build on shared CPU.

Shared flavors carry less RAM (c2a.large (4 GiB RAM) -> s1a.small (2 GiB RAM)). A resize reboots the instance; data on attached volumes persists. Size the dedicated flavor for the RAM your production workload needs.

Pricing data last validated: . For current rates, check quake.ai/pricing.

OBS or hardware encoderQuake AIFloating IPRTMP 1935CPU ingest VMNGINX-RTMP or SRSObject StorageHLS replay (optional)YouTube / Twitch / custom RTMP RTMP pushrestreamHLS segments
Click to zoom
Live ingest topology: one floating IP accepts RTMP from your encoder; the ingest VM restreams to downstream platforms

Prerequisites#

You need:

  • A Quake AI account with application credentials
  • OpenTofu 1.6.0 or later (installation guide)
  • OpenStack credentials sourced into the shell (source openrc.sh). See the OpenStack CLI guide.
  • An SSH key pair already uploaded to the project. See Add an SSH key.
  • A copy of the live-ingest-restream template from the template reference page
  • One floating IP available in your project quota
  • An encoder (OBS Studio or a hardware RTMP source) that can push to a public RTMP URL
  • Enough project quota for one c2a.large instance, one 40 GB boot volume, one private network, one router, and one floating IP
  • EC2-compatible Object Storage credentials in terraform.tfvars (required for tofu plan even when HLS replay is disabled)

Step 1: Configure variables#

Mint EC2-compatible credentials with openstack ec2 credentials create and copy terraform.tfvars.example to terraform.tfvars:

HCL
key_name = "YOUR_KEY_NAME"

encoder_cidr = "203.0.113.10/32"
admin_cidr   = "203.0.113.10/32"

application_name = "live"

restream_targets = [
  "rtmp://a.rtmp.youtube.com/live2/YOUR_YOUTUBE_STREAM_KEY",
]

s3_access_key = "YOUR_EC2_ACCESS_KEY"
s3_secret_key = "YOUR_EC2_SECRET_KEY"

Replace CIDR values with your studio egress IP. Defaults for ingest_server, ingest_flavor, and HLS replay options are documented on the Live RTMP/SRT ingest and restream reference page.

Step 2: Apply the template#

From the template directory, run:

bash
tofu init
tofu plan
tofu apply

Type yes when prompted. Provisioning takes a few minutes while cloud-init installs the ingest software.

When the run finishes, note rtmp_publish_url and ingest_floating_ip from the outputs. Append your stream_key to the URL when you set one in terraform.tfvars.

Step 3: Verify the ingest endpoint#

In OBS Studio, open Settings > Stream, choose Custom service, and set:

  • Server: the rtmp_publish_url output (for example rtmp://207.x.x.x/live)
  • Stream key: your configured key, or leave blank when stream_key is empty

Start a short test stream. Confirm the ingest instance status is Active in the Console.

From your workstation, confirm the floating IP responds on port 1935:

bash
nc -zv "$(tofu output -raw ingest_floating_ip)" 1935

A successful probe reports the port open. If OBS cannot connect, verify encoder_cidr includes your encoder's public egress address.

When you configured restream_targets, check each downstream platform's live dashboard for an incoming signal after you start streaming.

Next steps#

Clean up#

If you enabled HLS replay, empty the bucket before destroy. Run tofu destroy from the project directory when finished.

Was this page helpful?