← All guidesStreaming

Build your own OBS multistream server for Twitch and YouTube

Build an OBS multistream server with Restreamer. Send one upload to Twitch and YouTube, estimate bandwidth costs, and add TikTok with stream-key access.

Jump to steps

Is an OBS multistream server right for you?

An OBS multistream server lets you send one video upload from home and forward it to several platforms. If your connection handles one stream comfortably but struggles with two, that is a useful job for a small server. This guide uses the open-source datarhei Restreamer on a DigitalOcean Droplet.

A Droplet is a rented Linux computer. Restreamer provides the dashboard and forwarding; OBS still captures and encodes your scene. YouTube and Twitch handle viewers, so ten viewers and ten thousand viewers do not create ten thousand connections to your Droplet.

I would choose this setup for a creator who wants control and can keep an SSH window open during a show. Use a managed relay if you want someone else to maintain the server. A local multistream plugin is another reasonable choice when you already have enough upload capacity.

This walkthrough is for one creator and one shared landscape stream. It does not combine chats, create independent vertical layouts, or keep broadcasting after OBS stops. The costs below are estimates, not benchmark results or a guarantee that a particular Droplet can handle your show.

Check your accounts before renting anything

Open YouTube Studio and enable live streaming first. Initial activation can take up to 24 hours. Create a private test broadcast and check that the encoder settings show a server URL and stream key. A private broadcast is safer for a rehearsal; an unlisted link can still be shared.

In Twitch, find your primary stream key under Creator Dashboard, Settings, Stream. Read the current simulcasting guidelines linked below. Adding a destination to Restreamer does not manage your account settings or establish that your broadcast follows each platform's rules.

For TikTok, check whether your account exposes a server URL and stream key for an external encoder. Access to the phone app or LIVE Studio alone is not proof that this route is available. If you cannot find both values, continue with Twitch and YouTube. There is no reason to buy a server just to discover that limitation.

  • Install OBS on your computer and confirm a local recording has picture and microphone audio.
  • Use content you can broadcast, such as a camera view and a spoken test. Keep private windows out of the scene.
  • Have an SSH key ready. On Windows use PowerShell with OpenSSH; on macOS or Linux use Terminal.

Price your OBS multistream server before you create it

Restreamer has no software subscription fee. DigitalOcean currently lists a Basic Droplet with 1 GiB memory and 1,000 GiB monthly transfer at $6, or 2 GiB and 2,000 GiB at $12. I would budget the $12 option for a first trial to leave more memory and transfer headroom. That is a starting allocation, not a measured minimum.

For the estimate, add the video and audio bitrates, multiply by the number of destinations, then by streaming hours. At a total 6 Mbps, each destination uses about 2.51 GiB per hour. Three destinations over 100 hours use about 754 GiB before protocol overhead. Watching the relay preview also adds outbound traffic.

DigitalOcean includes inbound transfer. Outbound allowances accrue while the Droplet exists and are pooled at team level; do not assume a server created for one evening receives a whole month's allowance. Excess outbound transfer currently costs $0.01 per GiB. Other team workloads can use the same pool.

Allow headroom and review your billing page after the rehearsal. Powering off a Droplet does not end its compute charges. Destroy it when you no longer need it, after saving the configuration you want to keep. Separately retained snapshots, volumes, and backups may still cost money.

Scroll horizontally to see all columns.

Illustrative monthly outbound transfer at 6 Mbps total per destination, before overhead
Destinations50 hours100 hours
2251 GiB503 GiB
3377 GiB754 GiB

Step 1. Create a server with only SSH access

Create a fresh Ubuntu 24.04 LTS Basic Droplet in a region near your streaming location. Select SSH-key authentication, give it a recognizable name such as obs-relay, and record its public IPv4 address. Use a fresh server so these installation commands do not interfere with another app.

Create a DigitalOcean Cloud Firewall and attach it to this Droplet. Allow inbound TCP port 22 only from your current public IPv4 address with /32 at the end. Keep the default outbound rules for updates and publication traffic. Do not add inbound rules for 8080, 1935, HTTP, or HTTPS.

This guide carries the dashboard and OBS connection through SSH. No domain name or certificate is needed. If your home address changes, update the firewall source using the DigitalOcean dashboard. Do not leave SSH open to everyone as a workaround.

On your own computer, replace YOUR_DROPLET_IP with that IPv4 address and run the command below. The first connection asks you to verify the server fingerprint; compare it with the server through the provider console. Continue only when the remote prompt identifies your new server.

Local terminal1 step
  1. Connect to the new server
    Edit firstReplace every highlighted value before running this command.
    ssh root@YOUR_DROPLET_IP

    Replace before running: YOUR_DROPLET_IP

Step 2. Install Docker and create the configuration file

You are now typing on the Droplet as root. Docker runs the packaged Restreamer application; Compose reads a short file that defines its ports and storage. Run the installation commands one at a time. If any command fails, fix that error before continuing.

The package names below are for a fresh Ubuntu 24.04 server using Ubuntu's repositories. If apt cannot find docker-compose-v2, check the OS version and that the universe repository is enabled. Do not mix these instructions with an existing Docker installation from another source.

After the Compose version appears, create the working directory, then open compose.yaml. Nano is a text editor. Paste the YAML from the next section into that editor, press Ctrl+O and Enter to save, then Ctrl+X to return to the server prompt.

Connected Droplet4 steps
  1. Refresh package lists
    apt update
  2. Install Docker and Compose
    apt install -y docker.io docker-compose-v2 nano
  3. Start Docker
    systemctl enable --now docker
  4. Check the Compose version
    docker compose version
Connected Droplet2 steps
  1. Create the directory
    mkdir -p /opt/obs-relay
  2. Open the directory
    cd /opt/obs-relay
Connected Droplet1 step
  1. Open compose.yaml in Nano
    nano compose.yaml

Keep the dashboard and stream listener private

Paste this complete configuration into compose.yaml. Version 2.12.0 identifies the Restreamer release used by these instructions. The two 127.0.0.1 bindings accept connections through the server itself, including your SSH tunnel. They do not publish a dashboard or stream listener on every network interface.

The named volumes preserve settings when you recreate the container. They contain sensitive configuration once you add platform keys. Docker also keeps at most three 10 MB container log files under this configuration; that limit does not cap every application file or recording. Leave recording off during the first setup.

You can copy the file here or download it below. This setup is small enough to show in full, so there is no separate companion repository or installer to trust.

compose.yaml: paste into the editor, not the shellServer file editor
services:
  restreamer:
    image: datarhei/restreamer:2.12.0
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
      - "127.0.0.1:1935:1935"
    volumes:
      - restreamer-config:/core/config
      - restreamer-data:/core/data
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
volumes:
  restreamer-config:
  restreamer-data:

Check before continuing: Save this as /opt/obs-relay/compose.yaml.

Step 3. Start Restreamer and check its ports

Back at the server prompt in /opt/obs-relay, validate the file, start the container, then check its state. The first start downloads the image and can take a few minutes. A successful configuration check prints nothing. Wait for it to finish successfully before running the next command.

The port checks should return 127.0.0.1:8080 and 127.0.0.1:1935. Stop if either mapping starts with 0.0.0.0 or [::]. Correct the YAML and run docker compose up -d again. These checks confirm configuration and container state; the broadcast test comes later.

Connected Droplet3 steps
  1. Validate the file
    docker compose config --quiet
  2. Start Restreamer
    docker compose up -d
  3. Check container state
    docker compose ps
Connected Droplet2 steps
  1. Check the dashboard binding
    docker compose port restreamer 8080
  2. Check the RTMP binding
    docker compose port restreamer 1935

Step 4. Open the encrypted connection from your computer

Leave the server terminal available. Open a second terminal on your own computer and run this single command after replacing YOUR_DROPLET_IP. A working tunnel normally leaves the window blank. Keep it open throughout setup and every broadcast.

Open http://127.0.0.1:18080/ui in the browser on that same computer. HTTP is confined to local connections; SSH encrypts traffic crossing the internet. Follow Restreamer's first-run account setup and choose a unique password. If the page fails, first check that the tunnel is still running.

Local port 18080 leads to the dashboard; local port 11935 leads to the streaming listener. If SSH reports that a local port is already in use, choose another unused local port and change its matching browser or OBS address. Do not change the server-side port by accident.

Keep the computer awake and use a wired connection when possible. An SSH tunnel is convenient for a fixed streaming desk, but reconnection is manual here. Mobile streaming across changing networks needs a different transport and recovery plan.

Local terminal1 step
  1. Open and keep the tunnel running
    Edit firstReplace every highlighted value before running this command.
    ssh -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -L 127.0.0.1:18080:127.0.0.1:8080 -L 127.0.0.1:11935:127.0.0.1:1935 root@YOUR_DROPLET_IP

    Replace before running: YOUR_DROPLET_IP

Step 5. Connect OBS to the Restreamer input

In Restreamer's system settings, enable the RTMP server on port 1935 and set a long, unique RTMP token. Start the source wizard and choose its internal RTMP input. Copy the publishing address it provides. Do not invent the stream identifier or copy a playback address.

In OBS, open Settings, Stream and choose Custom. Use the publishing address from the wizard, replacing only its host and port with 127.0.0.1:11935. Keep the generated application path, stream name, and token unchanged. If the wizard gives separate Server and Stream Key fields, preserve that split.

When given one complete URL, put the portion before the final slash in Server and the final stream-name portion, including its token query, in Stream Key. The Restreamer token is for this input; your Twitch and YouTube keys belong in publication services later.

Start with a 1280 by 720 scene at 30 fps, H.264 video at 4,000 Kbps constant bitrate, a two-second keyframe interval, and AAC stereo audio at 128 Kbps. These are starting settings for the rehearsal. Check the current destination recommendations before changing quality.

Start Streaming in OBS so the wizard can detect the input. Select the incoming audio track and use copy or passthrough for video and audio where offered. Finish the wizard and check the relay preview. Copy forwards encoded media without a new video encode. Resizing and filters change the workload.

Step 6. Test YouTube, then add Twitch

In Restreamer, use the plus button in Publication services to add YouTube. Enter the server URL and stream key from your private YouTube test broadcast. Prefer the platform's documented RTMPS endpoint, which encrypts the outgoing connection. Leave certificate verification enabled.

Start that publication service and look for incoming video in YouTube Studio. If automatic start is disabled, use YouTube's Go Live control when ready. Open the actual private broadcast player while signed in to an allowed account. Speak and clap once, then check picture, audible speech, and synchronization.

Once YouTube works, add a separate Twitch publication service with its current ingest URL and stream key. A normal Twitch broadcast can be public and notify followers. Plan this rehearsal accordingly and use only a harmless test scene. Check the actual Twitch player as well as the Restreamer status.

Keep the first publication source at its default if it works. Restreamer documents HLS as a publication source, which can add buffering. Its RTMP source option requires enabling the channel's RTMP output under Processing & Control. Treat that as a later latency adjustment and recheck both players after changing it.

Add TikTok only after the first two destinations work

Add TikTok or a custom RTMP publication destination using the current server URL and key supplied by your account. BytePlus's instructions say to retrieve these for each TikTok broadcast. Recheck them if the connection worked yesterday and fails today.

A copied landscape stream remains landscape. The relay does not turn it into a thoughtful vertical composition. For a separate portrait view, prepare a second OBS output or deliberately add server-side processing. A second upload changes the home-bandwidth calculation; server encoding changes the CPU requirement.

If your account does not offer external encoder credentials, stop this optional branch. Keep the working Twitch and YouTube setup. Do not install a key extractor or assume access through another application grants reusable RTMP credentials.

Rehearse a full session and a deliberate interruption

Run a 30-minute rehearsal with all intended destinations active. Watch OBS's Stats panel for network dropped frames and encoding overload. On the Droplet, run the resource command below and note CPU, memory, and network totals. A single snapshot is a clue, so repeat it during normal scene changes.

Keep a record of the plan, bitrate, destinations, duration, and player results. If CPU stays saturated, check for accidental transcoding before buying a larger server. If the home connection drops frames, reduce bitrate and check the local network; the Droplet cannot repair video that never reaches it.

During the planned test, close the tunnel with Ctrl+C. Both destinations should lose their input. Reopen the same SSH command and check whether OBS reconnects and each platform resumes. Some platform events must be started again after a disconnect. Write down that recovery procedure.

Finally, restart Restreamer on the server during the rehearsal and check recovery again. This interrupts the stream. A container restart policy does not guarantee that a platform keeps the same live event open. End the rehearsal by stopping publications, stopping OBS, and confirming each platform has ended its broadcast.

On the Droplet: inspect current resource useConnected Droplet
docker stats --no-stream

Check before continuing: A resource snapshot appears. Repeat during the rehearsal.

Before continuing: This interrupts active publications. Run only during the planned rehearsal.

On the Droplet: interrupt the test stream and check recoveryConnected Droplet
docker compose restart restreamer

Check before continuing: The test stream is interrupted. Check recovery in OBS and both platform players.

Fix the first failing connection

Work outward from OBS. A healthy dashboard cannot prove that a platform received audio, and a green publication status cannot prove that viewers see the right scene. Recheck one connection at a time. Restreamer process details can help, but remove stream URLs, keys, and tokens before sharing logs.

Scroll horizontally to see all columns.

Find the failing part before changing the server
SymptomFirst check
Dashboard will not openSSH tunnel, local port 18080, and container state.
OBS cannot connectTunnel, port 11935, RTMP enabled, and the full generated input key.
Picture with no soundOBS audio meter, selected input track, and AAC audio enabled.
Only one destination failsThat destination's URL, key, event status, and encoder requirements.
Long delayPlayer buffering and the publication source. Test RTMP sourcing only after the default works.
All destinations stutterOBS dropped frames, home upload headroom, tunnel stability, and server CPU.

Choose the approach you want to maintain

Restreamer is my pick here because its dashboard makes separate destinations easier to manage. You still own updates, secrets, and the interruption plan. MediaMTX is appealing when you prefer a configuration file and fewer dashboard controls. A managed relay suits someone who wants to spend that maintenance time on the show.

Scroll horizontally to see all columns.

Alternatives for the same broadcasting job
ApproachUseful advantageTradeoff
Restreamer on a DropletOne home upload and a destination dashboard.Server charges, transfer limits, and maintenance.
MediaMTX on a serverSmall configuration-driven relay.More manual setup and no equivalent creator dashboard.
Local OBS multistream pluginNo separate server to rent.A separate upload for each destination.
Managed multistream serviceProvider operates the relay.Provider-specific limits, pricing, and account integrations.

Frequently asked questions

Can I multistream from OBS for free? Restreamer is open source, but the rented server and excess transfer cost money. Local plugins avoid server rental and use a separate upload for each destination. Compare that upload requirement with your connection before choosing a relay.

Will a $6 Droplet handle Twitch and YouTube? It is a trial candidate for forwarding compatible encoded media, not a guaranteed specification. Test your bitrate and destinations through a full rehearsal. Resizing, filters, recording, and extra encodes need a separate capacity assessment.

Does TikTok LIVE access give me a stream key? Do not assume it does. This setup needs the external encoder server URL and stream key exposed by your account. If you cannot obtain both through the platform, use the Twitch and YouTube path and leave TikTok unconfigured.

Does the server use more bandwidth when viewers join? The platforms deliver video to their viewers. The relay sends one copy to each destination, so its primary transfer depends on bitrate, destination count, and hours. Directly watching its own preview or hosting playback for viewers adds separate transfer.

Can I close the SSH window after setup? No. In this setup SSH carries the OBS upload and dashboard connection. Keep that window open and the computer awake throughout the broadcast. Reopen the tunnel after an interruption, then check OBS and every platform for recovery.

Keep the setup only if the rehearsal earns it

If both players remain usable through a normal session and you can recover from an interruption, save the configuration and your recovery notes. Recheck actual transfer after your first week. Use those readings to decide whether the Droplet size is appropriate.

Before upgrading Restreamer, stop publications, back up its named volumes to protected storage, read the release notes, and test the new version during a rehearsal. Keep platform keys out of Git. Do not run docker compose down -v unless you intend to delete the saved settings.

To pause the relay, run the stop command below. The Droplet still costs money. If this approach is too much work, end every platform event, keep any configuration you need, and destroy the dedicated Droplet through DigitalOcean. Review any separately retained resources on the billing page.

For a creator who wants a private relay and can maintain it, start with the budget you calculated above. The useful result is a broadcast that survives your rehearsal, with a monthly bill you understand.

On the Droplet: stop the relay while keeping its settingsConnected Droplet
docker compose stop restreamer

Check before continuing: The relay stops; saved settings remain. Droplet charges continue.

Check your result

Expected result
Both platform players show the right scene and synchronized speech during a 30-minute rehearsal.
Stop if
Stop if the dashboard or RTMP listener is public, audio is missing, frames drop, or a destination fails to recover.
Next step
Record the recovery steps and real transfer. Add TikTok only with current external encoder credentials.