If your stream isn’t behaving as expected, the sections below cover the most common issues and how to resolve them. Work through the relevant item for your situation — most problems come down to firewall rules, incorrect URLs, or a missing configuration detail.
The most likely causes are a blocked port or a mismatched stream name.
  1. Confirm that port 1935 is open on your server’s firewall. On most Linux servers you can check with:
    sudo ufw status
    
  2. Open the Simple RTMP Restreamer dashboard and verify that the stream name you created there exactly matches the stream key you entered in OBS.
  3. Use the following RTMP URL format in OBS — replace your-server with your server’s IP or hostname and stream-name with the name you created in the dashboard:
    rtmp://your-server/live/stream-name
    
  4. In OBS, go to Settings → Stream and confirm the service is set to Custom with the URL above and no trailing slash.
The dashboard marks a stream as OFFLINE when no frames have been received in the last 3 seconds. A brief connectivity blip is enough to trigger this.
  • Confirm OBS is sending to the exact RTMP URL shown in your dashboard — a typo in the stream name sends data to a different (or non-existent) stream.
  • Check that port 1935 is reachable from the machine running OBS. Firewalls between your encoder and the server are a common cause of silently dropped connections.
  • Watch the bitrate field in the dashboard while OBS is streaming. If it stays at 0, the server is not receiving data from your encoder.
The dashboard runs on port 6070. If you can’t load it in your browser, check the following:
  1. Verify that port 6070 is open on your server’s firewall.
  2. If HTTP Basic Auth is enabled (set via BASIC_AUTH_USER and BASIC_AUTH_PASS), your browser will prompt for credentials. Enter the username and password you configured.
  3. Test basic connectivity from your local machine:
    curl http://your-server:6070/
    
    A successful response confirms the service is running and the port is reachable.
A 401 response means HTTP Basic Auth is active on your instance. This happens when both BASIC_AUTH_USER and BASIC_AUTH_PASS environment variables are set.Pass your credentials with every API request using the -u flag:
curl -u user:pass http://your-server:6070/api/streams/-/status
Replace user and pass with the values you set in your environment configuration.
Push targets forward your incoming RTMP stream to an external destination such as YouTube or Twitch. If a target isn’t receiving video, work through these checks:
  1. Open the dashboard and confirm the target’s RTMP URL is correct, including the stream key appended at the end (for example, rtmp://live.twitch.tv/live/your-stream-key).
  2. Verify that your server can reach the target platform’s ingest server. Run a quick connectivity test from your server:
    curl -v rtmp://ingest.example.com
    
  3. The push target connects when a new frame batch arrives after you go live — wait a few seconds after starting your stream before concluding the target isn’t working.
Streams are stored in the data file simple-rtmp-restreamer.data.json. If this file isn’t persisted across container restarts, your stream configuration will be lost.
  1. Open your docker-compose.yml and confirm there is a volume mount for the data file, for example:
    volumes:
      - ./simple-rtmp-restreamer.data.json:/app/simple-rtmp-restreamer.data.json
    
  2. If the file doesn’t exist on the host yet, create it before starting the container:
    touch simple-rtmp-restreamer.data.json
    
  3. Restart the container and verify the file is being written to on the host after you create a stream.
This is expected behavior. The restreamer automatically kills any stream that has received no frames for 30 consecutive seconds. This frees resources when an encoder disconnects without closing the RTMP connection cleanly.
  • If your stream is stopping unintentionally, check that your encoder is continuously sending frames. A paused or frozen source in OBS can cause the frame rate to drop to zero.
  • If you intentionally stopped streaming, the 30-second cleanup is normal — the stream entry is removed after the timeout elapses.