Skip to content
Draft
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
2 changes: 1 addition & 1 deletion .pinned
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ json_serialization;https://github.com/status-im/nim-json-serialization@#2b1c5eb1
metrics;https://github.com/status-im/nim-metrics@#6142e433fc8ea9b73379770a788017ac528d46ff
ngtcp2;https://github.com/status-im/nim-ngtcp2@#791eb859145f9f268eb23eb9cbe777bdd7699c4d
nimcrypto;https://github.com/cheatfate/nimcrypto@#19c41d6be4c00b4a2c8000583bd30cf8ceb5f4b1
quic;https://github.com/vacp2p/nim-quic@#6d8678a159bfb902f9725f0081d542134cd93916
lsquic;https://github.com/vacp2p/nim-lsquic@#c5ffcec38dfff73e230e1437211e6566dcc44f7d
results;https://github.com/arnetheduck/nim-results@#df8113dda4c2d74d460a8fa98252b0b771bf1f27
secp256k1;https://github.com/status-im/nim-secp256k1@#f808ed5e7a7bfc42204ec7830f14b7a42b63c284
serialization;https://github.com/status-im/nim-serialization@#548d0adc9797a10b2db7f788b804330306293088
Expand Down
28 changes: 28 additions & 0 deletions COMPOSE-README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
### Install dependencies locally (for faster docker builds)

```
nimble install -l
```

### Build docker image (run this after any change in code / dependencies)

```
docker build -t nim-libp2p/quic .
```

### Start simulation

```
TRANSPORT=QUIC NUM_LIBP2P_NODES=10 docker compose up
```
Environment variables you can use:
- `TRANSPORT` can be `QUIC` or `TCP` (default `QUIC`)
- `NUM_LIBP2P_NODES` number of libp2p nodes to start, default `10`
- `CONNECTTO` indicates the number of nodes each node will connect to, default `10`
- Optionally add the `-d` flag to run in the background (you can then see the logs with `docker logs container_name_here`)

### Stop simulation (if using -d flag)

```
docker compose down -v
```
47 changes: 47 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Create the build image
FROM nimlang/nim:2.2.6-ubuntu-regular AS build

WORKDIR /node
COPY . .

RUN git config --global http.sslVerify false

# --passL:"./libtcmalloc.so" \
# --gc:orc -d:useMalloc \

RUN nim c \
-d:chronicles_sinks=json \
--threads:on \
--mm:refc \
-d:metrics \
-d:libp2p_network_protocols_metrics \
-d:pubsubpeer_queue_metrics \
-d:release \
quic.nim

FROM nimlang/nim:2.2.6-ubuntu-regular

RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
libssl3 \
iproute2 \
ethtool \
curl \
procps \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

WORKDIR /node

COPY --from=build /node/quic /node/quic

COPY ./libtcmalloc.so .

COPY ./entrypoint.sh .

RUN chmod +x quic

EXPOSE 5000 8008

ENTRYPOINT ["./entrypoint.sh"]
2 changes: 2 additions & 0 deletions build-docker.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
docker build -t nim-libp2p/quic .
109 changes: 109 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
networks:
monitor:

services:
# observability ui
grafana:
container_name: grafana
image: grafana/grafana:11.1.0
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
env_file:
- ./grafana/provisioning/grafana-plugins.env
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
- ./grafana/dashboards:/var/lib/grafana/dashboards/:z
ports:
- "3000:3000" # browse on http://localhost:3000
networks: [monitor]
depends_on:
- prometheus

prometheus:
container_name: prometheus
image: prom/prometheus:v2.55.1
command: ["--config.file=/etc/prometheus/prometheus.yml"]
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
networks: [monitor]

cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitor

redis:
container_name: redis
image: redis:7-alpine
ports:
- "6379:6379" # optional; intra-network works without publishing
networks: [monitor]
tmpfs:
- /data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s

quic:
image: nim-libp2p/quic:latest
networks: [monitor]
deploy:
replicas: 25
command: []
cap_add:
- NET_ADMIN # REQUIRED for tc
environment:
NETEM: "delay 100ms 10ms distribution normal"
NUM_LIBP2P_NODES: ${NUM_LIBP2P_NODES:-10}
TRANSPORT: ${TRANSPORT:-QUIC}
CONNECTTO: ${CONNECTTO:-10}
ports:
- target: 5000 # app
published: 0
protocol: udp
- target: 8008 # prometheus
published: 0
protocol: tcp
volumes:
- ./vg-logs:/node/vg-logs
depends_on:
redis:
condition: service_healthy

loki:
image: grafana/loki:3.0.0
container_name: loki
command: ["-config.file=/etc/loki/config.yml"]
ports:
- "3100:3100"
networks: [monitor]
user: "0:0" # root
tmpfs:
- /loki
volumes:
- ./loki-config.yml:/etc/loki/config.yml:ro

promtail:
image: grafana/promtail:3.0.0
container_name: promtail
command: ["-config.file=/etc/promtail/config.yml"]
networks: [monitor]
depends_on:
- loki
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml:ro
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
10 changes: 10 additions & 0 deletions entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env bash

LOG_DIR=${VALGRIND_LOG_DIR:-/node/vg-logs}
mkdir -p "$LOG_DIR"

ls -la

LD_LIBRARY_PATH=".:${LD_LIBRARY_PATH}" HEAPPROFILE="$LOG_DIR/vg-${HOSTNAME:-node}.log" ./quic

cp ./quic $LOG_DIR/quic-${HOSTNAME:-node}
39 changes: 39 additions & 0 deletions env.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import strutils, os
import chronos, metrics/chronos_httpserver, chronicles
from nativesockets import getHostname

let
prometheusPort* = Port(8008) #prometheus metrics
myPort* = Port(5000) #libp2p port
chunks* = parseInt(getEnv("FRAGMENTS", "1")) #No. of fragments for each message

proc getPeerDetails*(): Result[(string, int, string), string] =
let
hostname = getHostname()
connectTo = parseInt(getEnv("CONNECTTO", "10"))
address =
if getEnv("TRANSPORT", "QUIC") == "QUIC":
"/ip4/0.0.0.0/udp/" & $myPort & "/quic-v1"
else:
"/ip4/0.0.0.0/tcp/" & $myPort
info "Host info ", address = address
return ok((hostname, connectTo, address))

#Prometheus metrics
proc startMetricsServer*(
serverIp: IpAddress, serverPort: Port
): Result[MetricsHttpServerRef, string] =
info "Starting metrics HTTP server", serverIp = $serverIp, serverPort = $serverPort

let metricsServerRes = MetricsHttpServerRef.new($serverIp, serverPort)
if metricsServerRes.isErr():
return err("metrics HTTP server start failed: " & $metricsServerRes.error)

let server = metricsServerRes.value
try:
waitFor server.start()
except CatchableError:
return err("metrics HTTP server start failed: " & getCurrentExceptionMsg())

info "Metrics HTTP server started", serverIp = $serverIp, serverPort = $serverPort
ok(metricsServerRes.value)
Loading