Troubleshooting
Installation Health Check (Doctor)
If you encounter issues during or after installation, run the diagnostic script from your install directory:
# From your install directory (default ~/fluxomni)
./doctor.sh
The script verifies:
- Docker and Docker Compose installation
- Environment configuration (
.env) - Port availability (checks for conflicts with other services)
- Container running status
- Disk space and data directory integrity
Container Does Not Start
Navigate to your Fluxomni Studio install directory and check the logs:
# Default: ~/fluxomni
cd ~/fluxomni
docker compose logs -f frontend control-plane media-node
For standalone remote media-node installs:
# Default: ~/fluxomni-media-node
cd ~/fluxomni-media-node
docker compose logs -f media-node
Common causes:
- Docker daemon is not running.
- The selected image tag does not exist.
FLUXOMNI_CONTROL_PLANE_INTERNAL_AUTH_TOKENis missing from.envafter a manual install.- The configured frontend HTTP port, 1935, 8000/tcp, 8003/tcp, 8000/udp, 8081/tcp (loopback), 10080/udp, 50051/tcp, or 50052/tcp is already in use.
- For standalone media-node installs, the control-plane RPC endpoint in
.envis unreachable from the media server. - For standalone media-node installs, the advertised
FLUXOMNI_MEDIA_NODE_ENDPOINTdoes not point back to the media server.
Media Node Does Not Appear in Fleet
If the control surface loads but a standalone node never shows up under /fleet, check the media-node logs:
cd ~/fluxomni-media-node
docker compose logs -f media-node
Look for a successful Registered media node with control plane message.
If it never appears, verify:
FLUXOMNI_CONTROL_PLANE_RPC_ENDPOINTis reachable from the media-node host.FLUXOMNI_CONTROL_PLANE_INTERNAL_AUTH_TOKENmatches the control-plane value exactly.FLUXOMNI_MEDIA_NODE_PUBLIC_HOSTandFLUXOMNI_MEDIA_NODE_ENDPOINTpoint back to the actual media-node host and published gRPC port.- Any firewall between hosts allows TCP
50052to the control-plane and the published media-node gRPC port back to the node when remote operators or services need it.
SRS Reports Too Few Open Files
1128 exceed max open files=1024 means the container’s file limit is below SRS’s startup requirement.
Rerun the latest installer with your existing directory and explicit capacity maintenance mode. It supplies limits of 65,536, including for v26.3.2 assets. Container recreation interrupts active streams but retains mounted data.
For manual installs, add this under media-node and check for conflicting overrides:
ulimits:
nofile:
soft: 65536
hard: 65536
Apply the change through Capacity Ledger Upgrades, then verify:
docker compose exec media-node sh -c 'ulimit -Sn; ulimit -Hn'
Both values should be 65536. Applying the change requires container recreation, not a restart.
Generated URLs Use the Wrong Hostname or IP
If the UI shows RTMP, HLS, SRT, or WebRTC URLs with a private IP, Docker hostname, or old domain, update these values in .env and restart the stack:
FLUXOMNI_PUBLIC_HOSTfor control-plane linksFLUXOMNI_MEDIA_NODE_PUBLIC_HOSTfor media ingest and playback links
On current releases, /routes is the main operator surface and /fleet shows attached media nodes. Those pages use the configured public hosts when they render copyable endpoints.
Check Running State
From your install directory:
docker compose ps
Clean Restart
Use Capacity Ledger Upgrades for a planned restart. Disable and drain routes while the old reporters are alive; restarting containers does not clear old reservations.
Playlist File Errors
Files in a route playlist show a signal integrity badge:
- REF — the file matches the reference stream parameters. No issues.
- DIFF — the file has different codec, resolution, or frame rate than the reference. This may cause brief glitches or quality changes during playback transitions.
- ERROR — the file could not be probed. It may be corrupt, still downloading, or in an unsupported format.
To fix DIFF warnings, re-encode files to match the reference parameters shown in the playlist status bar (codec, resolution, frame rate, audio channels).
Disk Space
If the control-plane or media-node containers exit unexpectedly, check available disk space:
df -h ~/fluxomni/data
Playlist file downloads and DVR recordings can fill the disk. Free space by:
- Clearing unused playlist files from route playlists.
- Removing old DVR segments from
data/dvr/. - Moving the data directory to a larger volume and updating
FLUXOMNI_CONTROL_PLANE_DATA_DIRandFLUXOMNI_MEDIA_NODE_DATA_DIRin.env.
Port Already in Use
If Docker fails with an error like:
failed to bind port 0.0.0.0:80/tcp: Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
Another service on the host is already listening on that port. This is common on NAS devices (Synology, QNAP, Unraid) where the built-in web UI occupies port 80. Port 8000 (HLS TCP / RTC UDP) is another frequent conflict — Synology DSM uses it as an alternative HTTP port, and media apps like Plex or Jellyfin may also bind to it.
Fix: override the conflicting host ports in .env without editing docker-compose.yml:
# Change the Control Surface port from 80 to 8080
echo 'FLUXOMNI_FRONTEND_HTTP_PORT=8080' >> .env
# Change HLS TCP port from 8000 to 8800 (if 8000 is also taken)
echo 'FLUXOMNI_MEDIA_NODE_HLS_PORT=8800' >> .env
# Change WebRTC media UDP and WHIP signaling TCP independently
echo 'FLUXOMNI_SRS_RTC_PORT=8800' >> .env
echo 'FLUXOMNI_MEDIA_NODE_WHIP_PORT=8803' >> .env
Apply the changes using Capacity Ledger Upgrades. For an already running installation, drain routes before recreating containers.
Access the Control Surface at http://<HOST-IP>:8080. If you also set FLUXOMNI_PUBLIC_URL, make sure it includes the new port (e.g. http://nas.local:8080).
Multi-Subnet and NAT Environments
In environments with multiple networks (e.g. cloud VPCs, complex office LANs, or behind NAT), the Web UI might be unreachable if the public-facing address is misconfigured.
The Self-Host Doctor (./doctor.sh) will automatically detect your local IP addresses and warn you if FLUXOMNI_PUBLIC_HOST is set to a restricted loopback address.
Symptoms:
- Browser shows “Connection Timed Out” or “Connection Refused”.
- The doctor script warns that
FLUXOMNI_PUBLIC_HOSTdoes not match any local IP.
Resolution:
- Run the Doctor:
./doctor.shto see the recommended IPs for your host. - Set the correct Public Host: ensure
FLUXOMNI_PUBLIC_HOSTin.envis set to the IP or hostname that your browser uses to reach the server. - Bind to all interfaces: if you want the Control Plane to be reachable from any network connected to the server, ensure
FLUXOMNI_CONTROL_PLANE_HTTP_BINDis set to0.0.0.0:<port>(default in most setups). - Check NAT Reflection: if you are accessing the server via a public IP from inside the same LAN, ensure your router supports NAT reflection (Hairpin NAT).
If you are using a reverse proxy (Nginx, Traefik, Caddy), set FLUXOMNI_PUBLIC_URL to the full proxy URL:
FLUXOMNI_PUBLIC_URL=https://fluxomni.example.com
All port mappings in docker-compose.yml support the same pattern — override via the corresponding FLUXOMNI_* variable in .env:
| Variable | Default | Service |
|---|---|---|
FLUXOMNI_FRONTEND_HTTP_PORT | 80 | Control Surface (HTTP) |
FLUXOMNI_CONTROL_PLANE_RPC_PORT | 127.0.0.1:50052 | Control-plane gRPC |
FLUXOMNI_MEDIA_NODE_RTMP_PORT | 1935 | RTMP ingest |
FLUXOMNI_MEDIA_NODE_HLS_PORT | 8000 | HLS TCP |
FLUXOMNI_MEDIA_NODE_WHIP_PORT | 8003 | WHIP signaling TCP |
FLUXOMNI_SRS_RTC_PORT | 8000 | WebRTC media UDP |
FLUXOMNI_MEDIA_NODE_SRT_PORT | 10080 | SRT ingest |
Firewall and Port Issues
Fluxomni Studio uses both TCP and UDP ports. A common mistake is only opening TCP:
| Port | Protocol | Service |
|---|---|---|
| 80 | TCP | Control Surface (HTTP) |
| 1935 | TCP | RTMP ingest |
| 8000 | TCP | HLS playback |
| 8003 | TCP | WHIP signaling |
| 8000 | UDP | WebRTC media |
| 8081 | TCP (localhost) | SRS callback (internal) |
| 10080 | UDP | SRT ingest |
| 50051 | TCP | Media-node gRPC |
| 50052 | TCP | Control-plane gRPC (localhost by default) |
SRT (port 10080) is UDP only. If SRT publishers cannot connect, verify that UDP traffic is allowed through your firewall or cloud security group.
WHIP needs both signaling TCP and media UDP: by default TCP 8003 and UDP 8000. HLS uses TCP 8000 separately. If you override ports, open the matching firewall/cloud rules; changing the HLS port does not change the RTC UDP listener.
Stream Quality Issues
If the output stream has artifacts, stuttering, or audio sync problems:
- Check the Signal Integrity panel on the routes list for mismatch or fetch warnings.
- Open the route workspace and verify the input codec info matches what your encoder is sending.
- Ensure your encoder bitrate does not exceed the server’s upload bandwidth.
- For playlist playback, verify all files use the same codec, resolution, and frame rate as the primary source.
Cannot Sign In
If you are locked out of the Control Surface:
- Verify the username and password. Passwords are case-sensitive.
- If you forgot the admin password, current installs store user accounts in
data/state.db, notdata/state.json. Stop the stack first, back updata/, and usesqlite3 data/state.dbas a last-resort recovery path if you need to inspect or repair theuserstable before restarting. - If no user accounts exist, Fluxomni Studio falls back to the open admin shell. After emergency recovery, use Settings to create a new admin account before re-enabling named-user sign-in.
Rollback to a Previous Version
Retain the database and diagnose the candidate using Capacity Ledger Upgrades. A predecessor image may not understand migrated state or durable capacity ownership; changing the image tag and recreating containers is not a verified rollback.
Restoring an older database and matching images requires a separately reviewed recovery procedure, backups and proof that all predecessor execution is stopped. Never erase the ledger or reuse the initialization acknowledgement to release exposed ownership. Available image tags are listed on GitHub Releases.