When you self-host Owncast on a managed VPS, you broadcast your live video and run its chat from a machine of your own, which our teams keep up to date and monitor day and night. Owncast is free software under the MIT license. This guide follows its official documentation: the CPU and bandwidth to plan for, installing with Docker Compose, the stream key, HTTPS, video qualities, object storage, chat, backups and updates.
By Simon Vasconcelos Lee
Published on 14 November 202615-minute read
owncast/owncast image, which ships with ffmpeg, web port 8080 behind an HTTPS reverse proxy, and RTMP port 1935 for your broadcasting software.abc123.data folder off the server for a full recovery, and update with docker compose pull.Owncast is an open source, self-hosted, single-user live video streaming and chat server: one instance carries the channel of one person or organization. Its README presents it as a way to run your own live streams, in the style of the large mainstream platforms, while keeping ownership of your content, interface, moderation and audience.
/hls/stream.m3u8.Owncast is published under the MIT license. It grants, free of charge, the right to use, copy, modify, merge, publish, distribute, sublicense and sell copies of the software. You can therefore run it for your business, your community or your clients, with no license to buy.
The only condition is to keep the copyright notice and the license text in all copies or substantial portions of the software. The text provides the software “as is”, without warranty.
The documentation says it up front: requirements depend on your configuration. It does set out a clear rule to estimate them. The CPU transcodes the video into the qualities you offer; bandwidth delivers it to each viewer.
The documentation gives two formulas. The volume of a stream, in gigabytes: bitrate in kbps × duration in seconds × viewers ÷ 8,000,000. The peak outbound speed to sustain, in Mbps: bitrate in kbps × viewers ÷ 1,000. With several qualities, work out each one and add them up. Its estimates for a two-hour stream:
| Stream bitrate | 10 viewers | 25 viewers | 50 viewers |
|---|---|---|---|
| 2,000 kbps | 18 GB, 20 Mbps | 45 GB, 50 Mbps | 90 GB, 100 Mbps |
| 4,000 kbps | 36 GB, 40 Mbps | 90 GB, 100 Mbps | 180 GB, 200 Mbps |
| 6,000 kbps | 54 GB, 60 Mbps | 135 GB, 150 Mbps | 270 GB, 300 Mbps |
On a Simafri VPS, traffic has no monthly meter: your streams are sized on their peak bitrate. As your audience grows, object storage, covered below, serves the video in place of the server.
The documentation gives measured reference points, noting that they vary with codec, bitrate, resolution and encoder preset:
| Configuration | CPU load |
|---|---|
| A single passthrough quality, no re-encoding | Minimal |
| A single transcoded quality | Light |
| Two qualities, high and low | Moderate |
| Three qualities, or heavy compression | Heavy |
The documentation gives no memory figure, and disk matters little: video segments are written and then removed as the stream goes on. Only the data folder grows over time. On a VPS, the CPU does the encoding: each transcoded quality is sized in vCPUs. On a managed VPS, tell us about your streams, their bitrate, their qualities and your audience, and we will recommend the right size.
Before it reaches the server, the stream leaves your own connection. The documentation asks for an upload speed of at least 1.5 times the stream bitrate: 7.5 Mbps for a 5,000 kbps stream. It recommends a wired connection over Wi-Fi.
The documentation offers the owncast/owncast image on Docker Hub, which includes ffmpeg, the encoding tool Owncast needs. On a server with Docker installed, create a folder and put this compose.yaml in it, taken from the documentation:
services:
owncast:
image: owncast/owncast:latest
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
- "1935:1935"
volumes:
- ./data:/app/data
docker compose up -d
127.0.0.1: this is the one change from the documentation’s example, which publishes both ports. Its reverse proxy page asks you to keep Owncast off the internet, since it listens on every interface by default, and Docker publishes a port on all of the server’s addresses when given none. The web interface is then reached through the reverse proxy alone.data folder keeps the database and its backups on the server, outside the container: this is what you back up and move.latest tag follows the most recent release; 0.3.0 pins a version.The documentation’s other route is a script that downloads the latest Owncast release for your platform, and ffmpeg if it is not already there. It installs everything in an owncast folder under the current one. The documentation advises against running it as root and recommends reading any remote script before running it:
curl -s https://owncast.online/install.sh | bash
To have Owncast start with the server and restart on its own after a crash, the documentation provides a systemd service, to adapt to the folder and account you chose:
[Unit]
Description=Owncast
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/owncast
ExecStart=/opt/owncast/owncast
User=owncast
Group=owncast
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now owncast
The admin lives at /admin. Owncast starts with credentials everyone knows, which the documentation asks you to change at your first login:
| Setting | Default value | What it does |
|---|---|---|
| Admin username | admin | Logging in to /admin |
| Admin password | abc123 | Logging in to /admin |
| Stream key | abc123 | Publishing the stream from your broadcasting software |
To make this change before the interface is open to the public, go through an SSH tunnel: the server’s port 8080 shows up on your computer, at http://localhost:8080/admin. Add -p and the SSH port shown in your customer area.
ssh -L 8080:127.0.0.1:8080 user@live.example.com
!@#$%^&*, and no dash anywhere.--adminpassword flag, which saves it to the database.The admin password and the stream key both start as abc123, but they are two separate settings: change both.
Owncast does not handle HTTPS itself. The documentation puts a reverse proxy in front of it, which listens on ports 80 and 443, gets the certificate, encrypts the traffic and forwards it in plain form to Owncast on port 8080. Without HTTPS, browsers flag the page as not secure, and a page served over HTTPS cannot embed your video or your chat.
/ws, which carries the chat. A proxy that blocks it cuts off the chat.X-Forwarded-For header to block the IP address of a user banned from chat. The documentation asks for the proxy to set this header itself.The documentation suggests Caddy if you have no other preference: it gets a Let’s Encrypt certificate on its own and forwards WebSocket with no extra setting. Here is its Caddyfile example, where the tls line gives the email address of the Let’s Encrypt account:
live.example.com {
encode gzip
reverse_proxy 127.0.0.1:8080
tls contact@example.com
}
With Nginx, the documentation stresses WebSocket: forgetting it is what disables chat. Add this map block to the http section of /etc/nginx/nginx.conf:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
This site block follows the documentation’s, on port 80 so that Certbot can set up HTTPS:
server {
listen 80;
listen [::]:80;
server_name live.example.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
proxy_pass http://127.0.0.1:8080;
}
}
sudo nginx -t
sudo certbot --nginx
Owncast accepts any software that broadcasts over RTMP to a remote server. The key is only accepted on the /live path. In OBS:
rtmp://live.example.com:1935/live.Software with no field for the key accepts the full address, rtmp://live.example.com:1935/live/your-key.
On a Simafri VPS, the server’s IPv6 address can open any port you choose: your broadcasting software reaches port 1935 through that address, under a name that carries the AAAA record. On an IPv4 Docker network, as here, Docker maps the port on the server’s IPv6 address to the container. Open that port if ufw is active, then test from your computer:
sudo ufw allow 1935/tcp
nc -6 -vz live.example.com 1935
For any other need, tell us what you have in mind and we will look at the addressing with you.
2.| Resolution | Frames per second | Suggested bitrate |
|---|---|---|
| 1920 × 1080 | 60 | 5,000 kbps |
| 1920 × 1080 | 30 | 4,500 kbps |
| 1280 × 720 | 60 | 4,000 kbps |
| 1280 × 720 | 30 | 3,000 kbps |
The qualities offered to viewers are set under “Configuration”, “Video”. Several qualities let the player pick the one its connection can sustain: the documentation recommends a second quality, from 1,000 to 2,000 kbps, next to a high quality of 4,000 to 6,000 kbps, once your first configuration has been tested.
Passthrough passes the incoming video along without re-encoding it: it saves nearly all of that quality’s CPU, and ignores its bitrate, resolution and frame rate settings. The documentation reserves it for advanced users: viewers receive exactly what your software sends, which some players cannot play, and latency goes up. Test playback on the devices that matter to you before relying on it.
Latency is set with the latency buffer, on the same page. Each level trades a little delay for stability, and a change applies from the next stream:
| Level | Segment length | Segments in playlist | Approximate latency |
|---|---|---|---|
| 0, lowest | 1 second | 25 | about 5 seconds |
| 1 | 2 seconds | 15 | about 8 to 9 seconds |
| 2, default | 3 seconds | 10 | about 10 seconds |
| 3 | 4 seconds | 8 | about 15 seconds |
| 4, highest | 5 seconds | 5 | about 18 seconds |
Version 0.3.0 also adds, on the viewer side, the player’s “Minimize latency” option, which slightly speeds up playback to get closer to live, and an autoplay setting, off by default.
Owncast can send its video segments to S3-compatible storage, from which viewers download them. The server still serves the master playlist, the APIs and the chat; the video, which makes up almost all of the bandwidth, comes from the storage. Your server then sends only one copy of each quality: in the documentation’s example, 6.5 Mbps for two qualities at 5,000 and 1,500 kbps, whether you have zero viewers or a thousand. CPU load stays the same.
CORS or Access-Control-Allow-Origin error in the browser console almost always comes from there.This storage serves the live stream, not an archive: Owncast deletes, as it goes, segments older than the playlist plus a buffer of about 20 segments. The bucket only holds the last few minutes of the stream.
For viewers spread around the world, the documentation also describes a content delivery network (CDN) placed in front of Owncast, with a separate origin hostname and the “Websocket host override” setting, which keeps the chat connected to the origin server.
Chat is set up under “Configuration”, “Chat”. By default there are no moderators: the documentation suggests at least making yourself one, from the “Users” page of the admin.
The documentation points out that IP blocking can be evaded, with a VPN for example: it keeps abuse down, and moderation remains each channel’s own work. Hence the value of named moderators for your most watched streams.
Owncast backs up its own database once an hour, to data/backup/owncastdb.bak. The --backupdir flag changes that folder. Here is what the data folder holds:
| Item | What it holds | In the hourly backup |
|---|---|---|
owncast.db | Configuration, users, chat history and access tokens | Yes |
backup/ | The hourly database backup | It is the backup |
Custom emoji, public/ | Files you have added | No |
| Plugins | Installed plugins and their data, since 0.3.0 | No |
| GeoIP data | Where viewers are connecting from | No |
For a full recovery, or to move the instance, the documentation asks you to back up the whole data folder: copying it to a new install carries everything over. With Docker, with the service stopped:
docker compose down
tar -czf owncast-$(date +%F).tar.gz data
docker compose up -d
Schedule this copy to match your streams, and send it off the server. Placed on its disk, these archives are also part of its nightly backups.
A restore brings the database back to the time of the backup: anything changed since is lost. First copy the current database somewhere safe, then:
--restoreDatabase and the path of the backup file: it restores the database, then exits.docker compose stop
docker compose run --rm owncast --restoreDatabase data/backup/owncastdb.bak
docker compose up -d
With Docker, the documentation gives two commands, run from the compose.yaml folder. The data folder stays in place:
docker compose pull
docker compose up -d
With the installer, the 0.3.0 release notes describe the update: stop the service, set aside any web interface files you have customized, run the installer again as the account that runs Owncast, then restart. The script itself stores an archive of the data folder in owncast-install-backups before replacing the release.
sudo systemctl stop owncast
su -c "curl https://owncast.online/install.sh | bash" owncast
sudo systemctl start owncast
Version 0.3.0, released on 3 September 2026, brings plugins, Featured Streams, autoplay and the choice of the interface RTMP listens on. Its notes ask you to read the changes before updating, as they affect your instance: follow these notes with each release, and copy the data folder right before.
Self-hosting means running the server on top of the application. On a managed VPS, our teams take charge of the server and proactively monitor your instance; Owncast remains your software, with its settings and its data.
| Topic | Our teams | You |
|---|---|---|
| The server | System and security updates, server interventions included | The timing that suits your business |
| Monitoring | Server monitored 24/7, with intervention without waiting for your call | Reading your instance’s logs |
| Owncast | Proactive monitoring: errors, slowdowns, CPU load and disk space spotted, fix recommended | Its installation, updates and settings, which you apply, yourself or through your AI assistant |
| Streams and chat | The server that carries them, monitored and backed up | Stream keys, video qualities, moderators and chat rules |
| Backups | Every night, encrypted and kept off the machine; restores included | Owncast’s own copies, and the restore request, when you need one |
| Migration | Your current server migrated, free of charge | The timing of the switch |
If you would rather have our teams work inside the application itself, that service is billed by the hour or at a fixed rate, with an estimate shared before the work starts.
With a Simafri Managed VPS, our teams keep your Owncast instance’s server up to date, monitor it day and night and step in without waiting for your call; they also proactively monitor your instance and recommend useful fixes, which you apply, yourself or through your AI assistant. Backups are encrypted every night and kept off the machine, restores are included, and migrating your current server is complimentary.
Yes. Owncast is under the MIT license: you can use, modify and redistribute it at work with no license to buy, as long as you keep its copyright notice. What remains is the cost of the server that runs it.
It depends on the qualities you offer. As a rough rule of thumb, the documentation counts one core per transcoded quality at 30 frames per second, and almost nothing for a passthrough quality. Viewer count does not change CPU load.
Peak speed equals the stream bitrate times the number of viewers: 25 viewers at 5,000 kbps need 125 Mbps outbound. S3-compatible object storage can serve the video in place of the server, which then sends only one copy of each quality.
Create a compose.yaml with the owncast/owncast image, port 8080 published on 127.0.0.1, port 1935 for RTMP and a data folder mounted on /app/data, then run docker compose up -d. Next, put an HTTPS reverse proxy in front of port 8080.
The admin, at /admin, opens with the username admin and the password abc123, and the stream key is also abc123. These are two separate settings: change both at your first login, under Configuration, Server Setup.
In OBS, pick a custom service, enter rtmp://your-server:1935/live and your stream key. Send H.264 video and AAC audio, with a keyframe every 2 seconds.
Owncast backs up its database every hour to data/backup/owncastdb.bak. That backup only covers the database: for a full recovery, copy the whole data folder off the server. Restores are done with the --restoreDatabase flag.
A managed VPS covers the server: system, security, monitoring and backups. Our teams also proactively monitor your instance and recommend useful fixes, which you apply. Work inside the application is billed by the hour or at a fixed rate.
Simafri
Let's talk about your website
Tell us about your project in a few words: we will get back to you quickly.
Thank you! Your request has been sent. We'll get back to you shortly.
Prefer email? Write to us at support@simafri.com.