# PeerTube collector

peertube-collector is a project designed to collect and analyze WebRTC statistics from a Chromium browser and export them to a MongoDB service. This project includes a Docker setup for running the necessary services.

## Prerequisites

**Linux** based OS with the following:

### Software:
- Docker Engine Community version is required. To install Docker CE, follow the official [install instructions](https://docs.docker.com/engine/install/).

### Ports: 

#### External (OPTIONAL PROBABLY NOT NEEDED!!!):
These ports are actively used by selenium and the collector services.

- 50000:60000/udp (WebRTC)
  - WebRTC NAT traversal requires a range of ports to be open.
    The range needs to be fairly large since the port is chosen randomly by the STUN server.
- 27107/tcp (MongoDB)

Ports can be opened in the host machine's firewall with:
```sh
ufw allow 50000:60000/udp
ufw allow 27107/tcp
```
## Setup with Docker Compose

1. Clone the repository:
    ```sh
    git clone <repository-url>
    cd peertube-collector
    ```
2. Create and configure the environment file based on the `.env.example` file:
    ```sh
    cp .env.example .env
    ```
3. Ajust the firewall settings to allow the necessary ports if needed
4. Start the Docker containers:
    ```sh
    docker compose up --abort-on-container-failure
    ```

The collector will start gathering WebRTC stats from the Selenium container and sending them to the Telegraf service.

To stop the Docker containers run: `docker compose down -v`

### Setup with Monolithic image:

1. Clone the repository:
    ```sh
    git clone <repository-url>
    cd peertube-collector
    ```
2. Create and configure the environment file based on the `.env.example` file:
    ```sh
    cp .env.example .env
    ```
3. Ajust the firewall settings to allow the necessary ports if needed
4. Start the Docker container:
    ```sh
    docker run --rm -p 7900:7900 --env-file .env --name peertube-collector --pull always --shm-size="2g" gitea.kobim.cloud/kobim/peertube-collector-monolith:latest
    ```

    or

    ```sh
    docker run --rm -p 7900:7900 --env-file .env --name peertube-collector --pull always --shm-size="2g" kobimex/peertube-collector-monolith:latest
    ```


### Environment Variables

| Environment Variable            | Service              | Default Value                  | Description                                                                                                                                                |
| ------------------------------- | -------------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TELEGRAF_HOSTNAME`             | telegraf             | None, **must** be set          | Hostname used to identify the host/user between sessions                                                                                                   |
| `TELEGRAF_MONGODB_DSN`          | telegraf             | `mongodb://stats_user...`      | DSN for the MongoDB service                                                                                                                                |
| `TELEGRAF_MONGODB_DATABASE`     | telegraf             | `statistics`                   | Database name for the MongoDB service                                                                                                                      |
| `VIDEO_URL`                     | collector            | `https://tube.kobim.cloud/...` | URL for the video to be analyzed                                                                                                                           |
| `HUB_URL`                       | collector            | None                           | URL for the Selenium Hub. If not set, the local Chrome driver will be used                                                                                 |
| `SOCKET_URL`                    | collector            | `localhost`                    | Socket URL for Telegraf service                                                                                                                            |
| `SOCKET_PORT`                   | collector & telegraf | `8094`                         | Socket port for Telegraf service                                                                                                                           |
| `WEBRTC_INTERNALS_PATH`         | collector            | None                           | **Absolute** path for WebRTC internals exporter extension. When **not** set the extension path is construced relative to the current main script location. |
| `WEBRTC_INTERNALS_EXPORTER_URL` | WebRTC extension     | `http://localhost:9092`        | Server URL for the WebRTC internals exporter extension                                                                                                     |

Variables can be set in the `.env` file.
An example configuration is provided in the `.env.example` file.

### Monitoring
A noVNC server is available at [http://localhost:7900](http://localhost:7900/?autoconnect=1&resize=scale&password=secret) to monitor the Selenium container. The password is `secret`.

## Components

### Docker Compose

The `docker-compose.yml` file defines the following services:
- **selenium**: Runs a Selenium standalone Chromium container.
- **telegraf**: Collects and sends metrics to the specified output.
- **collector**: Runs the main Python application to collect WebRTC stats.

### Dockerfile

The `Dockerfile` sets up the Python environment and installs the necessary dependencies to run the `main.py` script.

### Monolithic Dockerfile

`Monolith.dockerfile` is a single Dockerfile that combines the Selenium, Telegraf, and Collector services into a single container. This is useful for deployment in a single container environment.

### Main Python Script

The `main.py` script sets up the Selenium WebDriver, collects WebRTC stats, and sends them to the Telegraf service.

### WebRTC Internals Exporter

The `webrtc-internals-exporter` directory contains a Chromium extension that collects WebRTC stats from the browser.
It uses Webpack to replace the server collector endpoint with an environment variable.

# Credits

- [WebRTC Internals Exporter](https://github.com/vpalmisano/webrtc-internals-exporter)
  - [WebRTC debugging with Prometheus/Grafana](https://medium.com/@vpalmisano/webrtc-debugging-with-prometheus-grafana-254b6ac71063)
- [MongoDB Docker Compose examples](https://github.com/TGITS/docker-compose-examples/tree/main/mongodb-docker-compose-examples)