From a58554a13ddfd674eb3c73ce66e8a2ad489f28fe Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Mon, 20 Mar 2023 18:00:42 +0000 Subject: [PATCH 1/2] docs: [#253] crate docs for lib.rs Entrypoint for the crate documentation, the `lib.rs` file. --- cSpell.json | 1 + docs/media/torrust-tracker-components.png | Bin 0 -> 84935 bytes src/lib.rs | 423 ++++++++++++++++++++++ 3 files changed, 424 insertions(+) create mode 100644 docs/media/torrust-tracker-components.png diff --git a/cSpell.json b/cSpell.json index 4a9b11ce..d8dee5c6 100644 --- a/cSpell.json +++ b/cSpell.json @@ -7,6 +7,7 @@ "Azureus", "bencode", "bencoded", + "beps", "binascii", "Bitflu", "bools", diff --git a/docs/media/torrust-tracker-components.png b/docs/media/torrust-tracker-components.png new file mode 100644 index 0000000000000000000000000000000000000000..19fe3c0b897a2413a4a6fbf807a0dbdac19b6268 GIT binary patch literal 84935 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 SBJPMMwE4nr**S|%`~M5@Hz=$C literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index bd775f8c..3e722592 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,426 @@ +//! **Torrust Tracker** is a modern and feature-rich (private) [`BitTorrent`](https://www.bittorrent.org/) tracker. +//! +//! [`BitTorrent`](https://en.wikipedia.org/wiki/BitTorrent) is a protocol for distributing files using a peer-to-peer network. +//! +//! Peers in the networks need to know where they can find other peers with the files they are looking for. +//! +//! Tracker are services that allow peers to quickly find other peers. Client peers announce their existence to a tracker, +//! and the tracker responds to the peer with a list of other peers in the swarm. +//! +//! You can learn more about `BitTorrent` and `BitTorrent` Trackers on these sites: +//! +//! - +//! - +//! - +//! +//! Torrust Tracker is a `BitTorrent` tracker with a focus on: +//! +//! - Performance +//! - Robustness +//! - Extensibility +//! - Security +//! - Usability +//! - And with a community-driven development +//! +//! # Table of contents +//! +//! - [Features](#features) +//! - [Services](#services) +//! - [Installation](#installation) +//! - [Configuration](#configuration) +//! - [Usage](#usage) +//! - [Components](#components) +//! - [Implemented BEPs](#implemented-beps) +//! +//! # Features +//! +//! - Multiple UDP server and HTTP(S) server blocks for socket binding possible +//! - Full IPv4 and IPv6 support for both UDP and HTTP(S) +//! - Private and Whitelisted mode +//! - Built-in API +//! - Peer authentication using time-bound keys +//! - Database persistence for authentication keys, whitelist and completed peers counter +//! - DB Support for `SQLite` and `MySQl` +//! +//! # Services +//! +//! From the end-user perspective the Torrust Tracker exposes three different services. +//! +//! - A REST [`API`](crate::servers::apis) +//! - One or more [`UDP`](crate::servers::udp) trackers +//! - One or more [`HTTP`](crate::servers::http) trackers +//! +//! # Installation +//! +//! ## Minimum requirements +//! +//! - Rust Stable `1.68` +//! - You might have problems compiling with a machine with low resources. Or with low resources limits on docker containers. It has been tested with docker containers with 6 CPUs, 7.5 GM of memory and 2GB of swap. +//! +//! ## Prerequisites +//! +//! With the default configuration you will need to create the `storage` directory: +//! +//! ```text +//! storage/ +//! ├── database +//! │   └── data.db +//! └── ssl_certificates +//! ├── localhost.crt +//! └── localhost.key +//! ``` +//! +//! The default configuration expects a directory `./storage/database` to be writable by the tracker process. +//! +//! By default the tracker uses `SQLite` and the database file name `data.db`. +//! +//! You only need the `ssl_certificates` directory in case you are setting up SSL for the HTTP tracker or the tracker API. +//! Visit [`HTTP`](crate::servers::http) or [`API`](crate::servers::apis) if you want to know how you can use HTTPS. +//! +//! ## Install from sources +//! +//! ```text +//! git clone https://github.com/torrust/torrust-tracker.git \ +//! && cd torrust-tracker \ +//! && cargo build --release \ +//! && mkdir -p ./storage/database \ +//! && mkdir -p ./storage/ssl_certificates +//! ``` +//! +//! ## Run with docker +//! +//! You can run the tracker with a pre-built docker image: +//! +//! ```text +//! mkdir -p ./storage/database \ +//! && mkdir -p ./storage/ssl_certificates \ +//! && export TORRUST_TRACKER_USER_UID=1000 \ +//! && docker run -it \ +//! --user="$TORRUST_TRACKER_USER_UID" \ +//! --publish 6969:6969/udp \ +//! --publish 7070:7070/tcp \ +//! --publish 1212:1212/tcp \ +//! --volume "$(pwd)/storage":"/app/storage" \ +//! torrust/tracker:3.0.0-alpha.1 +//! ``` +//! +//! For more information about using docker visit the [tracker docker documentation](https://github.com/torrust/torrust-tracker/tree/develop/docker). +//! +//! # Configuration +//! +//! In order to run the tracker you need to provide the configuration. If you run the tracker without providing the configuration, +//! the tracker will generate the default configuration the first time you run it. It will generate a `config.toml` file with +//! in the root directory. +//! +//! The default configuration is: +//! +//! ```toml +//! log_level = "info" +//! mode = "public" +//! db_driver = "Sqlite3" +//! db_path = "./storage/database/data.db" +//! announce_interval = 120 +//! min_announce_interval = 120 +//! max_peer_timeout = 900 +//! on_reverse_proxy = false +//! external_ip = "0.0.0.0" +//! tracker_usage_statistics = true +//! persistent_torrent_completed_stat = false +//! inactive_peer_cleanup_interval = 600 +//! remove_peerless_torrents = true +//! +//! [[udp_trackers]] +//! enabled = false +//! bind_address = "0.0.0.0:6969" +//! +//! [[http_trackers]] +//! enabled = false +//! bind_address = "0.0.0.0:7070" +//! ssl_enabled = false +//! ssl_cert_path = "" +//! ssl_key_path = "" +//! +//! [http_api] +//! enabled = true +//! bind_address = "127.0.0.1:1212" +//! ssl_enabled = false +//! ssl_cert_path = "" +//! ssl_key_path = "" +//! +//! [http_api.access_tokens] +//! admin = "MyAccessToken" +//! ``` +//! +//! The default configuration includes one disabled UDP server, one disabled HTTP server and the enabled API. +//! +//! For more information about each service and options you can visit the documentation for the [torrust-tracker-configuration crate](https://docs.rs/torrust-tracker-configuration/3.0.0-alpha.1/torrust_tracker_configuration/). +//! +//! Alternatively to the `config.toml` file you can use one environment variable `TORRUST_TRACKER_CONFIG` to pass the configuration to the tracker: +//! +//! ```text +//! TORRUST_TRACKER_CONFIG=$(cat config.toml) +//! cargo run +//! ``` +//! +//! In the previous example you are just setting the env var with the contents of the `config.toml` file. +//! +//! The env var contains the same data as the `config.toml`. It's particularly useful in you are [running the tracker with docker](https://github.com/torrust/torrust-tracker/tree/develop/docker). +//! +//! > NOTE: The `TORRUST_TRACKER_CONFIG` env var has priority over the `config.toml` file. +//! +//! # Usage +//! +//! Running the tracker with the default configuration and enabling the UDP and HTTP trackers will expose the services on these URLs: +//! +//! - REST API: +//! - UDP tracker: +//! - HTTP tracker: +//! +//! ## API usage +//! +//! In order to use the tracker API you need to enable it in the configuration: +//! +//! ```toml +//! [http_api] +//! enabled = true +//! bind_address = "127.0.0.1:1212" +//! ssl_enabled = false +//! ssl_cert_path = "" +//! ssl_key_path = "" +//! ``` +//! +//! By default it's enabled on port `1212`. You also need to add access tokens in the configuration: +//! +//! ```toml +//! [http_api.access_tokens] +//! admin = "MyAccessToken" +//! LABEL = "YOUR_TOKEN" +//! ``` +//! +//! All tokens give full access the the API. Once you have defined you token you can make request adding the token as a `GET` parameter. For example: +//! +//! +//! +//! That endpoint will give you the tracker metrics: +//! +//! ```json +//! { +//! "torrents": 0, +//! "seeders": 0, +//! "completed": 0, +//! "leechers": 0, +//! "tcp4_connections_handled": 0, +//! "tcp4_announces_handled": 0, +//! "tcp4_scrapes_handled": 0, +//! "tcp6_connections_handled": 0, +//! "tcp6_announces_handled": 0, +//! "tcp6_scrapes_handled": 0, +//! "udp4_connections_handled": 0, +//! "udp4_announces_handled": 0, +//! "udp4_scrapes_handled": 0, +//! "udp6_connections_handled": 0, +//! "udp6_announces_handled": 0, +//! "udp6_scrapes_handled": 0 +//! } +//! ``` +//! +//! Refer to the [`API`](crate::servers::apis) documentation for more information about the [`API`](crate::servers::apis) endpoints. +//! +//! ## HTTP tracker usage +//! +//! The HTTP tracker implements two type of requests: +//! +//! - Announce: +//! - Scrape: +//! +//! In you are using the tracker in `private` or `private_listed` mode you will need to append the authentication key: +//! +//! - Announce: +//! - Scrape: +//! +//! In order to use the HTTP tracker you need to enable at least one server in the configuration: +//! +//! ```toml +//! [[http_trackers]] +//! enabled = true +//! bind_address = "0.0.0.0:7070" +//! ``` +//! +//! Refer to the [`HTTP`](crate::servers::http) documentation for more information about the [`HTTP`](crate::servers::http) tracker. +//! +//! ### Announce +//! +//! The `announce` request allows a peer to announce itself and obtain a list of peer for an specific torrent. +//! +//! A sample `announce` request: +//! +//! +//! +//! If you want to know more about the `announce` request: +//! +//! - [BEP 03. The `BitTorrent` Protocol Specification](https://www.bittorrent.org/beps/bep_0003.html) +//! - [BEP 23. Tracker Returns Compact Peer Lists](https://www.bittorrent.org/beps/bep_0023.html) +//! - [Vuze announce docs](https://wiki.vuze.com/w/Announce) +//! +//! ### Scrape +//! +//! The `scrape` request allows a peer to get swarm metadata for multiple torrents at the same time. +//! +//! A sample `scrape` request for only one torrent: +//! +//! +//! +//! The response contains the swarm metadata for that torrent: +//! +//! - `complete`: the number of active peers that have completed downloading, also known as seeders. Peers from which other peers can get a full copy of the torrent. +//! - `downloaded`: the number of peers that have ever completed downloading. +//! - `incomplete`: the number of active peers that have not completed downloading, also known as leechers. +//! +//! The `scrape` response is a bencoded byte array like the following: +//! +//! ```text +//! d5:filesd20:xxxxxxxxxxxxxxxxxxxxd8:completei11e10:downloadedi13772e10:incompletei19e20:yyyyyyyyyyyyyyyyyyyyd8:completei21e10:downloadedi206e10:incompletei20eee +//! ``` +//! +//! If you save the response as a file and you open it with a program that can handle binary data you would see: +//! +//! ```text +//! 00000000: 6435 3a66 696c 6573 6432 303a 8100 0000 d5:filesd20:.... +//! 00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +//! 00000020: 6438 3a63 6f6d 706c 6574 6569 3165 3130 d8:completei1e10 +//! 00000030: 3a64 6f77 6e6c 6f61 6465 6469 3065 3130 :downloadedi0e10 +//! 00000040: 3a69 6e63 6f6d 706c 6574 6569 3065 6565 :incompletei0eee +//! 00000050: 65 e +//! ``` +//! +//! `BitTorrent` uses a data formatting specification called [Bencode](https://en.wikipedia.org/wiki/Bencode). +//! +//! If you want to know more about the `scrape` request: +//! +//! - [BEP 48. Tracker Protocol Extension: Scrape](https://www.bittorrent.org/beps/bep_0048.html) +//! - [Vuze scrape docs](https://wiki.vuze.com/w/Scrape) +//! +//! ### Authentication keys +//! +//! If the tracker is running in `private` or `private_listed` mode you will need to provide a valid authentication key. +//! +//! Right now the only way to add new keys is via the REST [`API`](crate::servers::apis). The endpoint `POST /api/vi/key/:duration_in_seconds` +//! will return an expiring key that will be valid for `duration_in_seconds` seconds. +//! +//! Using `curl` you can create a 2-minute valid auth key: +//! +//! ```text +//! $ curl -X POST http://127.0.0.1:1212/api/v1/key/120?token=MyAccessToken +//! ``` +//! +//! Response: +//! +//! ```json +//! { +//! "key": "nvCFlJCq7fz7Qx6KoKTDiMZvns8l5Kw7", +//! "valid_until": 1679334334, +//! "expiry_time": "2023-03-20 17:45:34.712077008 UTC" +//! } +//! ``` +//! +//! You can also use the Torrust Tracker together with the [Torrust Index](https://github.com/torrust/torrust-index). If that's the case, +//! the Index will create the keys by using the API. +//! +//! ## UDP tracker usage +//! +//! The UDP tracker also implements two type of requests: +//! +//! - Announce: +//! - Scrape: +//! +//! In order to use the UDP tracker you need to enable at least one server in the configuration: +//! +//! ```toml +//! [[udp_trackers]] +//! enabled = true +//! bind_address = "0.0.0.0:6969" +//! ``` +//! +//! Refer to the [`UDP`](crate::servers::udp) documentation for more information about the [`UDP`](crate::servers::udp) tracker. +//! +//! If you want to know more about the UDP tracker protocol: +//! +//! - [BEP 15. UDP Tracker Protocol for `BitTorrent`](https://www.bittorrent.org/beps/bep_0015.html) +//! +//! # Components +//! +//! Torrust Tracker has four main components: +//! +//! - The core [`tracker`](crate::tracker) +//! - The tracker REST [`API`](crate::servers::apis) +//! - The [`UDP`](crate::servers::udp) tracker +//! - The [`HTTP`](crate::servers::http) tracker +//! +//! ![Torrust Tracker Components](https://github.com/torrust/torrust-tracker/blob/main/docs/media/torrust-tracker-components.png) +//! +//! ## Core tracker +//! +//! The core tracker is the main containing the tracker generic tracker logic. +//! +//! The core tracker handles: +//! +//! - Authentication with keys +//! - Authorization using a torrent whitelist +//! - Statistics +//! - Persistence +//! +//! See [`tracker`](crate::tracker) for more details on the [`tracker`](crate::tracker) module. +//! +//! ## Tracker API +//! +//! The tracker exposes a REST API. The API has four resource groups: +//! +//! - Authentication keys: to handle the keys for the HTTP tracker +//! - Statistics: to get the tracker metrics like requests counters +//! - Torrents: to get peers for a torrent +//! - Whitelist: to handle the torrent whitelist when the tracker runs on `listed` or `private_listed` mode +//! +//! See [`API`](crate::servers::apis) for more details on the REST API. +//! +//! ## UDP tracker +//! +//! UDP trackers are trackers with focus on performance. By Using UDP instead of HTTP the tracker removed the overhead +//! of opening and closing TCP connections. It also reduces the response size. +//! +//! You can find more information about UDP tracker on: +//! +//! - [Wikipedia: UDP tracker](https://en.wikipedia.org/wiki/UDP_tracker) +//! - [BEP 15: UDP Tracker Protocol for `BitTorrent`](https://www.bittorrent.org/beps/bep_0015.html) +//! +//! See [`UDP`](crate::servers::udp) for more details on the UDP tracker. +//! +//! ## HTTP tracker +//! +//! HTTP tracker was the original tracker specification defined on the [BEP 3]((https://www.bittorrent.org/beps/bep_0003.html)). +//! +//! See [`HTTP`](crate::servers::http) for more details on the HTTP tracker. +//! +//! You can find more information about UDP tracker on: +//! +//! - [Wikipedia: `BitTorrent` tracker](https://en.wikipedia.org/wiki/BitTorrent_tracker) +//! - [BEP 3: The `BitTorrent` Protocol Specification](https://www.bittorrent.org/beps/bep_0003.html) +//! +//! # Implemented BEPs +//! +//! BEP stands for `BitTorrent` Enhancement Proposal. BEPs are documents providing information to the `BitTorrent` +//! community or describing a new feature for the `BitTorrent` protocols. +//! +//! You can find all BEPs on +//! +//! Torrust Tracker implements these BEPs: +//! +//! - [BEP 3](https://www.bittorrent.org/beps/bep_0003.html): The `BitTorrent` Protocol +//! - [BEP 7](https://www.bittorrent.org/beps/bep_0007.html): IPv6 Support +//! - [BEP 15](https://www.bittorrent.org/beps/bep_0015.html): UDP Tracker Protocol for `BitTorrent` +//! - [BEP 23](https://www.bittorrent.org/beps/bep_0023.html): Tracker Returns Compact Peer Lists +//! - [BEP 27](https://www.bittorrent.org/beps/bep_0027.html): Private Torrents +//! - [BEP 41](https://www.bittorrent.org/beps/bep_0041.html): UDP Tracker Protocol Extensions +//! - [BEP 48](https://www.bittorrent.org/beps/bep_0048.html): Tracker Protocol Extension: Scrape pub mod app; pub mod bootstrap; pub mod servers; From 78f295bebf9ffbe1c4617f080fc69d0f7665ca6e Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Tue, 21 Mar 2023 11:53:54 +0000 Subject: [PATCH 2/2] docs: [#253] crate docs for app.rs --- src/app.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app.rs b/src/app.rs index 5f75449c..3fc790a2 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,3 +1,22 @@ +//! Torrust Tracker application. +//! +//! The tracker application has a global configuration for multiple jobs. +//! It's basically a container for other services. +//! It also check constraint and dependencies between services. For example: +//! It's not safe to run a UDP tracker on top of a core public tracker, as UDP trackers +//! do not allow private access to the tracker data. +//! +//! The application is responsible for: +//! +//! - Loading data from the database when it's needed. +//! - Starting some jobs depending on the configuration. +//! +//! The started jobs may be: +//! +//! - Torrent cleaner: it removes inactive peers and (optionally) peerless torrents. +//! - UDP trackers: the user can enable multiple UDP tracker on several ports. +//! - HTTP trackers: the user can enable multiple HTTP tracker on several ports. +//! - Tracker REST API: the tracker API can be enabled/disabled. use std::sync::Arc; use log::warn;