Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,24 @@
- [x] Support [newTrackon][newtrackon] checks.
- [x] Persistent `SQLite3` or `MySQL` Databases.

## Tracker Demo

Experience the **Torrust Tracker** in action with our comprehensive demo environment! The [Torrust Demo][torrust-demo] repository provides a complete setup showcasing the tracker's capabilities in a real-world scenario.

The demo takes full advantage of the tracker's powerful metrics system and seamless integration with [Prometheus][prometheus]. This allows you to monitor tracker performance, peer statistics, and system health in real-time. You can build sophisticated Grafana dashboards to visualize all aspects of your tracker's operation.

![Sample Grafana Dashboard](./docs/media/demo/torrust-tracker-grafana-dashboard.png)

**Demo Features:**

- Complete Docker Compose setup.
- Pre-configured Prometheus metrics collection.
- Sample Grafana dashboards for monitoring.
- Real-time tracker statistics and performance metrics.
- Easy deployment for testing and evaluation.

Visit the [Torrust Demo repository][torrust-demo] to get started with your own tracker instance and explore the monitoring capabilities.

## Roadmap

Core:
Expand Down Expand Up @@ -49,7 +67,7 @@ Utils:

Others:

- [ ] Support for Windows.
- [ ] Intensive testing for Windows.
- [ ] Docker images for other architectures.

<https://github.com/orgs/torrust/projects/10/views/6>
Expand Down Expand Up @@ -274,3 +292,5 @@ This project was a joint effort by [Nautilus Cyberneering GmbH][nautilus] and [D
[Naim A.]: https://github.com/naim94a/udpt
[greatest-ape]: https://github.com/greatest-ape/aquatic
[Power2All]: https://github.com/power2all
[torrust-demo]: https://github.com/torrust/torrust-demo
[prometheus]: https://prometheus.io/
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,8 @@ mod tests {
let socket_addr = resolve_socket_addr(&Url::parse("udp://localhost:8080").unwrap());

assert!(
socket_addr == SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080)
|| socket_addr == SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 8080)
socket_addr == SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8080)
|| socket_addr == SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 8080)
);
}

Expand All @@ -127,8 +127,8 @@ mod tests {
let socket_addr = resolve_socket_addr(&Url::parse("udp://localhost:8080").unwrap());

assert!(
socket_addr == SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080)
|| socket_addr == SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 8080)
socket_addr == SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8080)
|| socket_addr == SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 8080)
);
}
}
2 changes: 1 addition & 1 deletion console/tracker-client/src/console/clients/udp/checker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ impl Client {
bytes_uploaded: NumberOfBytes(0i64.into()),
bytes_left: NumberOfBytes(0i64.into()),
event: AnnounceEvent::Started.into(),
ip_address: Ipv4Addr::new(0, 0, 0, 0).into(),
ip_address: Ipv4Addr::UNSPECIFIED.into(),
key: PeerKey::new(0i32),
peers_wanted: NumberOfPeers(1i32.into()),
port: Port::new(port),
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions packages/axum-http-tracker-server/src/v1/handlers/announce.rs
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ mod tests {
async fn it_should_fail_when_the_authentication_key_is_missing() {
let http_core_tracker_services = initialize_private_tracker();

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let maybe_key = None;
Expand Down Expand Up @@ -265,7 +265,7 @@ mod tests {

let unregistered_key = authentication::Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap();

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let maybe_key = Some(unregistered_key);
Expand Down Expand Up @@ -308,7 +308,7 @@ mod tests {

let announce_request = sample_announce_request();

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let response = handle_announce(
Expand Down Expand Up @@ -356,7 +356,7 @@ mod tests {
connection_info_socket_address: None,
};

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let response = handle_announce(
Expand Down Expand Up @@ -401,7 +401,7 @@ mod tests {
connection_info_socket_address: None,
};

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let response = handle_announce(
Expand Down
10 changes: 5 additions & 5 deletions packages/axum-http-tracker-server/src/v1/handlers/scrape.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ mod tests {

#[tokio::test]
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing() {
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker();
Expand Down Expand Up @@ -224,7 +224,7 @@ mod tests {

#[tokio::test]
async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_invalid() {
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker();
Expand Down Expand Up @@ -272,7 +272,7 @@ mod tests {

let scrape_request = sample_scrape_request();

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let scrape_service = ScrapeService::new(
Expand Down Expand Up @@ -314,7 +314,7 @@ mod tests {
connection_info_socket_address: None,
};

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let scrape_service = ScrapeService::new(
Expand Down Expand Up @@ -361,7 +361,7 @@ mod tests {
connection_info_socket_address: None,
};

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let scrape_service = ScrapeService::new(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -748,7 +748,7 @@ mod for_all_config_modes {
Client::new(*env.bind_address())
.announce(
&QueryBuilder::default()
.with_peer_addr(&IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)))
.with_peer_addr(&IpAddr::V6(Ipv6Addr::LOCALHOST))
.query(),
)
.await;
Expand Down
2 changes: 1 addition & 1 deletion packages/configuration/src/v2_0_0/health_check_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ impl Default for HealthCheckApi {

impl HealthCheckApi {
fn default_bind_address() -> SocketAddr {
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 1313)
SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1313)
}
}
2 changes: 1 addition & 1 deletion packages/configuration/src/v2_0_0/http_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl Default for HttpTracker {

impl HttpTracker {
fn default_bind_address() -> SocketAddr {
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 7070)
SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 7070)
}

fn default_tsl_config() -> Option<TslConfig> {
Expand Down
5 changes: 1 addition & 4 deletions packages/configuration/src/v2_0_0/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,10 +492,7 @@ mod tests {
fn configuration_should_contain_the_external_ip() {
let configuration = Configuration::default();

assert_eq!(
configuration.core.net.external_ip,
Some(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))
);
assert_eq!(configuration.core.net.external_ip, Some(IpAddr::V4(Ipv4Addr::UNSPECIFIED)));
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion packages/configuration/src/v2_0_0/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ impl Default for Network {
impl Network {
#[allow(clippy::unnecessary_wraps)]
fn default_external_ip() -> Option<IpAddr> {
Some(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))
Some(IpAddr::V4(Ipv4Addr::UNSPECIFIED))
}

fn default_on_reverse_proxy() -> bool {
Expand Down
2 changes: 1 addition & 1 deletion packages/configuration/src/v2_0_0/tracker_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl Default for HttpApi {

impl HttpApi {
fn default_bind_address() -> SocketAddr {
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 1212)
SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1212)
}

#[allow(clippy::unnecessary_wraps)]
Expand Down
2 changes: 1 addition & 1 deletion packages/configuration/src/v2_0_0/udp_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ impl Default for UdpTracker {

impl UdpTracker {
fn default_bind_address() -> SocketAddr {
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 6969)
SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 6969)
}

fn default_cookie_lifetime() -> Duration {
Expand Down
2 changes: 1 addition & 1 deletion packages/http-tracker-core/benches/helpers/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pub async fn return_announce_data_once(samples: u64) -> Duration {
core_http_tracker_services.http_stats_event_sender.clone(),
);

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let start = Instant::now();
Expand Down
6 changes: 3 additions & 3 deletions packages/http-tracker-core/src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,13 @@ pub mod test {

use crate::event::{ConnectionContext, Event};

let remote_client_ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
let remote_client_ip = IpAddr::V4(Ipv4Addr::LOCALHOST);
let info_hash = sample_info_hash();

let event1 = Event::TcpAnnounce {
connection: ConnectionContext::new(
RemoteClientAddr::new(ResolvedIp::FromSocketAddr(remote_client_ip), Some(8080)),
ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(),
ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070)).unwrap(),
),
info_hash,
announcement: Peer::default(),
Expand All @@ -192,7 +192,7 @@ pub mod test {
ResolvedIp::FromSocketAddr(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2))),
Some(8080),
),
ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(),
ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070)).unwrap(),
),
info_hash,
announcement: Peer::default(),
Expand Down
16 changes: 8 additions & 8 deletions packages/http-tracker-core/src/services/announce.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ mod tests {

let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer);

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let announce_service = AnnounceService::new(
Expand Down Expand Up @@ -380,7 +380,7 @@ mod tests {

#[tokio::test]
async fn it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4() {
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();
let peer = sample_peer_using_ipv4();
let remote_client_ip = IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1));
Expand Down Expand Up @@ -442,7 +442,7 @@ mod tests {
}

fn peer_with_the_ipv4_loopback_ip() -> peer::Peer {
let loopback_ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
let loopback_ip = IpAddr::V4(Ipv4Addr::LOCALHOST);
let mut peer = sample_peer();
peer.peer_addr = SocketAddr::new(loopback_ip, 8080);
peer
Expand All @@ -453,10 +453,10 @@ mod tests {
{
// Tracker changes the peer IP to the tracker external IP when the peer is using the loopback IP.

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();
let peer = peer_with_the_ipv4_loopback_ip();
let remote_client_ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
let remote_client_ip = IpAddr::V4(Ipv4Addr::LOCALHOST);

let server_service_binding_clone = server_service_binding.clone();
let peer_copy = peer;
Expand All @@ -466,7 +466,7 @@ mod tests {
.expect_send()
.with(predicate::function(move |event| {
let mut announced_peer = peer_copy;
announced_peer.peer_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
announced_peer.peer_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8080);

let mut peer_announcement = peer;
peer_announcement.peer_addr = SocketAddr::new(
Expand Down Expand Up @@ -514,7 +514,7 @@ mod tests {
#[tokio::test]
async fn it_should_send_the_tcp_6_announce_event_when_the_peer_uses_ipv6_even_if_the_tracker_changes_the_peer_ip_to_ipv4()
{
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();
let peer = sample_peer_using_ipv6();
let remote_client_ip = IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969));
Expand Down Expand Up @@ -550,7 +550,7 @@ mod tests {
core_http_tracker_services.http_stats_event_sender.clone(),
);

let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 7070);
let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap();

let _announce_data = announce_service
Expand Down
Loading
Loading