2021-03-30 14:25:24 -07:00
|
|
|
---
|
2026-05-18 19:21:04 -07:00
|
|
|
name: obmp
|
2022-10-20 07:12:08 -07:00
|
|
|
volumes:
|
|
|
|
|
data-volume:
|
|
|
|
|
driver_opts:
|
|
|
|
|
type: none
|
|
|
|
|
device: ${OBMP_DATA_ROOT}/postgres/data
|
|
|
|
|
o: bind
|
|
|
|
|
ts-volume:
|
|
|
|
|
driver_opts:
|
|
|
|
|
type: none
|
|
|
|
|
device: ${OBMP_DATA_ROOT}/postgres/ts
|
|
|
|
|
o: bind
|
|
|
|
|
|
2021-03-30 14:25:24 -07:00
|
|
|
services:
|
|
|
|
|
|
|
|
|
|
zookeeper:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-zookeeper
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/2181'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 60s
|
2022-06-08 11:53:55 -07:00
|
|
|
image: confluentinc/cp-zookeeper:7.1.1
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 1g
|
2021-03-30 19:00:25 -07:00
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/zk-data:/var/lib/zookeeper/data
|
|
|
|
|
- ${OBMP_DATA_ROOT}/zk-log:/var/lib/zookeeper/log
|
2021-03-30 14:25:24 -07:00
|
|
|
environment:
|
|
|
|
|
ZOOKEEPER_CLIENT_PORT: 2181
|
|
|
|
|
ZOOKEEPER_TICK_TIME: 2000
|
|
|
|
|
|
|
|
|
|
kafka:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-kafka
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9092'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 90s
|
2022-06-08 11:53:55 -07:00
|
|
|
image: confluentinc/cp-kafka:7.1.1
|
2026-05-18 20:04:37 -07:00
|
|
|
# Raise KAFKA_MEM_LIMIT for production (full-table initial dumps are bursty).
|
|
|
|
|
mem_limit: ${KAFKA_MEM_LIMIT:-4g}
|
2021-03-30 14:25:24 -07:00
|
|
|
|
|
|
|
|
# Change the mount point to where you want to store Kafka data.
|
|
|
|
|
# Normally 80GB or more
|
|
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/kafka-data:/var/lib/kafka/data
|
|
|
|
|
depends_on:
|
|
|
|
|
- zookeeper
|
|
|
|
|
ports:
|
2022-02-22 14:30:05 -08:00
|
|
|
- "9092:9092"
|
2021-03-30 14:25:24 -07:00
|
|
|
environment:
|
|
|
|
|
KAFKA_BROKER_ID: 1
|
2021-03-30 19:00:25 -07:00
|
|
|
KAFKA_ZOOKEEPER_CONNECT: obmp-zookeeper:2181
|
2021-03-30 14:25:24 -07:00
|
|
|
|
|
|
|
|
# Change/add listeners based on your FQDN that the host and other containers can access. You can use
|
|
|
|
|
# an IP address as well. By default, only within the compose/containers can Kafka be accesssed
|
|
|
|
|
# using port 29092. Outside access can be enabled, but you should use an FQDN listener.
|
2026-05-18 19:21:04 -07:00
|
|
|
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://obmp-kafka:29092,PLAINTEXT_HOST://${HOST_IP:-10.40.40.202}:9092
|
2021-03-30 14:25:24 -07:00
|
|
|
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
|
|
|
|
|
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
|
|
|
|
|
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
|
|
|
|
KAFKA_NUM_PARTITIONS: 8
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
KAFKA_LOG_RETENTION_MINUTES: 720
|
2021-03-30 14:25:24 -07:00
|
|
|
KAFKA_LOG_ROLL_MS: 3600000
|
|
|
|
|
KAFKA_LOG_SEGMENT_BYTES: 1073741824
|
|
|
|
|
KAFKA_MESSAGE_MAX_BYTES: 100000000
|
|
|
|
|
KAFKA_LOG_CLEANER_THREADS: 2
|
|
|
|
|
|
2022-03-31 12:13:46 -07:00
|
|
|
# TODO: Move comment to documentation
|
|
|
|
|
# You can use SWAG and Let's Encrypt to front the Grafana HTTP port 3000 instance. Below is an example
|
|
|
|
|
# Create the SWAG direcgtory using "sudo mkdir -m 777 ${OBMP_DATA_ROOT}/swag"
|
|
|
|
|
# swag:
|
|
|
|
|
# image: linuxserver/letsencrypt:version-1.11.0
|
|
|
|
|
# container_name: obmp-swag
|
|
|
|
|
# cap_add:
|
|
|
|
|
# - NET_ADMIN
|
|
|
|
|
# environment:
|
|
|
|
|
# - PUID=1000
|
|
|
|
|
# - PGID=1000
|
|
|
|
|
# - TZ=UTC
|
|
|
|
|
# - URL=<domain of grafana host, this should be the domain only, not the hostname>
|
|
|
|
|
# - SUBDOMAINS=<hostname, without the domain>,
|
|
|
|
|
# - VALIDATION=http
|
|
|
|
|
# - EMAIL=<your email>
|
|
|
|
|
# - ONLY_SUBDOMAINS=true
|
|
|
|
|
# - STAGING=false
|
|
|
|
|
# volumes:
|
|
|
|
|
# - /var/openbmp/swag:/config
|
|
|
|
|
# ports:
|
|
|
|
|
# - 443:443
|
|
|
|
|
# - 80:80 #optional
|
|
|
|
|
# restart: unless-stopped
|
|
|
|
|
|
2021-03-30 14:25:24 -07:00
|
|
|
grafana:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-grafana
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -q --spider http://localhost:3000/api/health || exit 1"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 40s
|
2022-10-20 07:12:08 -07:00
|
|
|
image: grafana/grafana:9.1.7
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 1g
|
2021-03-30 14:25:24 -07:00
|
|
|
ports:
|
2022-02-22 14:30:05 -08:00
|
|
|
- "3000:3000"
|
2021-03-30 14:25:24 -07:00
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/grafana:/var/lib/grafana
|
2021-03-30 19:00:25 -07:00
|
|
|
- ${OBMP_DATA_ROOT}/grafana/provisioning:/etc/grafana/provisioning/
|
2021-03-30 14:25:24 -07:00
|
|
|
environment:
|
|
|
|
|
- GF_SECURITY_ADMIN_PASSWORD=openbmp
|
2026-05-15 14:23:09 -07:00
|
|
|
- GF_AUTH_ANONYMOUS_ENABLED=false
|
2026-05-18 19:21:04 -07:00
|
|
|
- GF_SERVER_ROOT_URL=https://${OBMP_DOMAIN:-bmp.apodacalab.com}/grafana/
|
2026-05-15 14:23:09 -07:00
|
|
|
- GF_SERVER_SERVE_FROM_SUB_PATH=true
|
|
|
|
|
- GF_AUTH_PROXY_ENABLED=true
|
|
|
|
|
- GF_AUTH_PROXY_HEADER_NAME=Remote-User
|
|
|
|
|
- GF_AUTH_PROXY_HEADER_PROPERTY=username
|
|
|
|
|
- GF_AUTH_PROXY_AUTO_SIGN_UP=true
|
2022-03-31 12:13:46 -07:00
|
|
|
- GF_USERS_HOME_PAGE=d/obmp-home/obmp-home
|
2022-02-22 14:30:05 -08:00
|
|
|
- GF_INSTALL_PLUGINS=agenty-flowcharting-panel,grafana-piechart-panel,grafana-worldmap-panel,grafana-simple-json-datasource,vonage-status-panel
|
2021-03-30 14:25:24 -07:00
|
|
|
|
2022-03-31 12:13:46 -07:00
|
|
|
# TODO: Move comment block to documentation
|
|
|
|
|
# The below is an example of how to enable OAuth
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_NAME=MyCompany SSO
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_ICON=signin
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_ENABLED=true
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_CLIENT_ID=<the client ID>
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=<client secret>
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_ALLOW_SIGN_UP=true
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_AUTH_URL=<auth url, such as https://domain/as/authorization.oauth2>
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_TOKEN_URL=<token url, such as https://domain/as/token.oauth2
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_API_URL=<userinfo url, such as https://domain/idp/userinfo.openid
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_SCOPES=email openid profile
|
|
|
|
|
#- GF_AUTH_GENERIC_OAUTH_SEND_CLIENT_CREDENTIALS_VIA_POST=true
|
|
|
|
|
#- GF_SERVER_ENFORCE_DOMAIN=true
|
|
|
|
|
#- GF_SERVER_PROTOCOL=http
|
|
|
|
|
#- GF_SERVER_HTTP_PORT=3000
|
|
|
|
|
#- GF_SERVER_DOMAIN=<fqdn of grafana server>
|
|
|
|
|
#- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/
|
|
|
|
|
|
2021-03-30 14:25:24 -07:00
|
|
|
psql:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-psql
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "pg_isready -U openbmp -d openbmp"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 60s
|
2022-10-20 07:12:08 -07:00
|
|
|
image: openbmp/postgres:2.2.1
|
2026-05-18 20:04:37 -07:00
|
|
|
# Raise PSQL_MEM_LIMIT for production (see docs/production-sizing.md).
|
|
|
|
|
mem_limit: ${PSQL_MEM_LIMIT:-6g}
|
2022-06-10 12:53:24 -07:00
|
|
|
privileged: true
|
2022-03-28 12:43:37 -07:00
|
|
|
shm_size: 1536m
|
|
|
|
|
sysctls:
|
|
|
|
|
- net.ipv4.tcp_keepalive_intvl=30
|
|
|
|
|
- net.ipv4.tcp_keepalive_probes=5
|
|
|
|
|
- net.ipv4.tcp_keepalive_time=180
|
2021-03-30 14:25:24 -07:00
|
|
|
ports:
|
2022-02-22 14:30:05 -08:00
|
|
|
- "5432:5432"
|
2021-03-30 14:25:24 -07:00
|
|
|
volumes:
|
2022-10-20 07:12:08 -07:00
|
|
|
- data-volume:/var/lib/postgresql/data
|
|
|
|
|
- ts-volume:/var/lib/postgresql/ts
|
2022-03-28 12:43:37 -07:00
|
|
|
# alter_job max_runtime in _timescaledb_config.bgw_job ( https://docs.timescale.com/latest/api#alter_job )
|
2022-03-09 10:48:58 -08:00
|
|
|
command: >
|
|
|
|
|
-c max_wal_size=10GB
|
2021-03-30 14:25:24 -07:00
|
|
|
environment:
|
|
|
|
|
- POSTGRES_PASSWORD=openbmp
|
|
|
|
|
- POSTGRES_USER=openbmp
|
|
|
|
|
- POSTGRES_DB=openbmp
|
|
|
|
|
|
|
|
|
|
collector:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-collector
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/5000'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 40s
|
2022-10-20 07:12:08 -07:00
|
|
|
image: openbmp/collector:2.2.3
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 2g
|
2021-03-30 14:25:24 -07:00
|
|
|
sysctls:
|
|
|
|
|
- net.ipv4.tcp_keepalive_intvl=30
|
|
|
|
|
- net.ipv4.tcp_keepalive_probes=5
|
|
|
|
|
- net.ipv4.tcp_keepalive_time=180
|
|
|
|
|
ports:
|
2022-02-22 14:30:05 -08:00
|
|
|
- "5000:5000"
|
2021-03-30 14:25:24 -07:00
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/config:/config
|
|
|
|
|
environment:
|
2021-03-30 19:00:25 -07:00
|
|
|
- KAFKA_FQDN=obmp-kafka:29092
|
2021-03-30 14:25:24 -07:00
|
|
|
|
|
|
|
|
psql-app:
|
|
|
|
|
restart: unless-stopped
|
2021-03-30 19:00:25 -07:00
|
|
|
container_name: obmp-psql-app
|
2026-05-18 22:03:52 -07:00
|
|
|
# No healthcheck — the consumer exposes no health port; Docker's
|
|
|
|
|
# restart-on-exit covers process death.
|
2022-10-20 07:12:08 -07:00
|
|
|
image: openbmp/psql-app:2.2.2
|
2026-05-18 20:04:37 -07:00
|
|
|
# mem_limit must exceed the MEM (JVM heap) env below. Raise both for
|
|
|
|
|
# production — see docs/production-sizing.md.
|
|
|
|
|
mem_limit: ${PSQL_APP_MEM_LIMIT:-4g}
|
2021-03-30 14:25:24 -07:00
|
|
|
sysctls:
|
|
|
|
|
- net.ipv4.tcp_keepalive_intvl=30
|
|
|
|
|
- net.ipv4.tcp_keepalive_probes=5
|
|
|
|
|
- net.ipv4.tcp_keepalive_time=180
|
|
|
|
|
ports:
|
2022-02-22 14:30:05 -08:00
|
|
|
- "9005:9005"
|
2021-04-30 14:14:27 +00:00
|
|
|
|
2021-03-30 14:25:24 -07:00
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/config:/config
|
|
|
|
|
environment:
|
2022-03-28 15:51:15 -07:00
|
|
|
- MEM=3 # Set memory to at least 2GB but ideally 4GB
|
2021-03-30 19:00:25 -07:00
|
|
|
- KAFKA_FQDN=obmp-kafka:29092
|
2021-04-30 14:14:27 +00:00
|
|
|
- RPKI_URL=https://rpki.cloudflare.com/rpki.json # define the URL to retrieve json endoed RPKI data
|
|
|
|
|
- RPKI_PASS=None
|
|
|
|
|
- RPKI_USER=None
|
2021-03-30 22:31:06 -07:00
|
|
|
- ENABLE_RPKI=1 # 1 enables, 0 disables RPKI sync
|
|
|
|
|
- ENABLE_IRR=1 # 1 enables, 0 disables IRR sync
|
2022-06-08 14:53:55 -07:00
|
|
|
- ENABLE_DBIP=1 # 1 enables, 0 disables DBIP import
|
2021-04-30 14:14:27 +00:00
|
|
|
- POSTGRES_REPORT_WINDOW='8 minute' # default POSTGRESS window to select when building
|
|
|
|
|
# summary tables. For deployments that absorb large
|
|
|
|
|
# bursts increase the value, ex 60 minute
|
2021-03-30 14:25:24 -07:00
|
|
|
- POSTGRES_PASSWORD=openbmp
|
|
|
|
|
- POSTGRES_USER=openbmp
|
|
|
|
|
- POSTGRES_DB=openbmp
|
2021-03-30 19:00:25 -07:00
|
|
|
- POSTGRES_HOST=obmp-psql
|
|
|
|
|
- POSTGRES_PORT=5432
|
2021-07-30 22:55:53 +00:00
|
|
|
- POSTGRES_DROP_peer_event_log='1 year'
|
|
|
|
|
- POSTGRES_DROP_stat_reports='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_ip_rib_log='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_alerts='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_ls_nodes_log='4 months'
|
|
|
|
|
- POSTGRES_DROP_ls_links_log='4 months'
|
|
|
|
|
- POSTGRES_DROP_ls_prefixes_log='4 months'
|
|
|
|
|
- POSTGRES_DROP_stats_chg_byprefix='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_stats_chg_byasn='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_stats_chg_bypeer='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_stats_ip_origins='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_stats_peer_rib='4 weeks'
|
|
|
|
|
- POSTGRES_DROP_stats_peer_update_counts='4 weeks'
|
2022-02-22 14:30:05 -08:00
|
|
|
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
exabgp:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-exabgp
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/5050'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 40s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 22:03:52 -07:00
|
|
|
# The full-table feature generates up to 900K route objects in memory;
|
|
|
|
|
# 512m OOM-killed it. Raise EXABGP_MEM_LIMIT in .env for larger tables.
|
|
|
|
|
mem_limit: ${EXABGP_MEM_LIMIT:-6g}
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
build:
|
|
|
|
|
context: ./exabgp
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
# Host networking so ExaBGP can reach CML routers directly on port 179
|
|
|
|
|
network_mode: host
|
|
|
|
|
environment:
|
2026-05-18 19:21:04 -07:00
|
|
|
# IP on the host that CML routers reach (BGP peering source)
|
|
|
|
|
- EXABGP_LOCAL_IP=${HOST_IP:-10.40.40.202}
|
|
|
|
|
# ExaBGP presents as AS 65100 (eBGP peer to the lab route reflectors)
|
|
|
|
|
- EXABGP_LOCAL_AS=${EXABGP_LOCAL_AS:-65100}
|
|
|
|
|
# Peer list — ";"-separated entries of "ip:peer_as:description".
|
|
|
|
|
# Default covers both labs: AS 65020 (ESXi) and AS 65021 (Proxmox).
|
|
|
|
|
- EXABGP_PEERS=${EXABGP_PEERS:-10.100.0.100:65020:CML-R9K-CORE-01;10.100.0.200:65020:CML-R9K-CORE-02;10.100.1.100:65021:PROX-R9K-CORE-01;10.100.1.200:65021:PROX-R9K-CORE-02}
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
# Flask API port (also on host network)
|
2026-05-18 19:21:04 -07:00
|
|
|
- EXABGP_API_PORT=${EXABGP_API_PORT:-5050}
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
volumes:
|
|
|
|
|
# Mount scenarios dir so you can edit/add scenarios without rebuilding
|
|
|
|
|
- ./exabgp/scenarios:/exabgp/scenarios
|
|
|
|
|
# No ports: block needed — network_mode: host exposes directly
|
|
|
|
|
|
Add Phase 2: Vue 3 control panel, 6 learning dashboards, new BGP scenarios
- exabgp-ui/: Vue 3 + Vite SPA served by NGINX on :5001; proxies /api/ to
ExaBGP Flask on :5050; includes StatusBar, ScenarioPanel, RouteTable,
AnnounceForm, PeerStatus, ChurnControl components
- docker-compose.yml: add obmp-exabgp-ui service (host network, port 5001)
- exabgp/scenarios/__init__.py: add convergence_test, route_leak,
hijack_simulation scenarios for structured BGP learning exercises
- exabgp/inject.py: add 'peers' and 'monitor' subcommands; live-refresh
terminal status view with ANSI cursor repositioning
- obmp-grafana/dashboards/Learning/: 6 new OBMP-Learning dashboards
(update rate, peer health, AS path, RPKI, churn, attributes)
- obmp-grafana/provisioning/dashboards/openbmp-dashboards.yml: add
OpenBMP-Learning folder provider pointing to dashboards/Learning/
- DOCS.md: document Web UI, 3 new scenarios, 6 learning dashboards;
fix section numbering (10-14) and architecture diagram (23 dashboards)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 15:37:16 -07:00
|
|
|
exabgp-ui:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-exabgp-ui
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -q --spider http://localhost:5001/ || exit 1"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 30s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 256m
|
Add Phase 2: Vue 3 control panel, 6 learning dashboards, new BGP scenarios
- exabgp-ui/: Vue 3 + Vite SPA served by NGINX on :5001; proxies /api/ to
ExaBGP Flask on :5050; includes StatusBar, ScenarioPanel, RouteTable,
AnnounceForm, PeerStatus, ChurnControl components
- docker-compose.yml: add obmp-exabgp-ui service (host network, port 5001)
- exabgp/scenarios/__init__.py: add convergence_test, route_leak,
hijack_simulation scenarios for structured BGP learning exercises
- exabgp/inject.py: add 'peers' and 'monitor' subcommands; live-refresh
terminal status view with ANSI cursor repositioning
- obmp-grafana/dashboards/Learning/: 6 new OBMP-Learning dashboards
(update rate, peer health, AS path, RPKI, churn, attributes)
- obmp-grafana/provisioning/dashboards/openbmp-dashboards.yml: add
OpenBMP-Learning folder provider pointing to dashboards/Learning/
- DOCS.md: document Web UI, 3 new scenarios, 6 learning dashboards;
fix section numbering (10-14) and architecture diagram (23 dashboards)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 15:37:16 -07:00
|
|
|
build:
|
|
|
|
|
context: ./exabgp-ui
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
# Host networking so NGINX can proxy /api to ExaBGP Flask on localhost:5050
|
|
|
|
|
network_mode: host
|
|
|
|
|
# Serves on port 5001 (host network, defined in nginx.conf)
|
|
|
|
|
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
# --- Phase 4: gNMI Streaming Telemetry ---
|
|
|
|
|
|
|
|
|
|
influxdb:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-influxdb
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "curl -fsS http://localhost:8086/health || exit 1"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 40s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
image: influxdb:2.7
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 2g
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
ports:
|
|
|
|
|
- "8086:8086"
|
|
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/influxdb:/var/lib/influxdb2
|
|
|
|
|
environment:
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_MODE=setup
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_USERNAME=openbmp
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_PASSWORD=openbmp123
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_ORG=openbmp
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_BUCKET=telemetry
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=openbmp-telemetry-token
|
|
|
|
|
- DOCKER_INFLUXDB_INIT_RETENTION=30d
|
|
|
|
|
|
|
|
|
|
telegraf:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-telegraf
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 512m
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
build:
|
|
|
|
|
context: ./telegraf
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
network_mode: host
|
2026-05-18 22:03:52 -07:00
|
|
|
# Run telegraf as root and override the image entrypoint (which otherwise
|
|
|
|
|
# drops back to the telegraf user) so [[inputs.docker]] can read the
|
|
|
|
|
# Docker daemon socket for container resource metrics.
|
|
|
|
|
user: root
|
|
|
|
|
entrypoint: ["telegraf"]
|
|
|
|
|
volumes:
|
|
|
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
2026-05-19 08:28:36 -07:00
|
|
|
# Host root, read-only — lets [[inputs.disk]] report the real host
|
|
|
|
|
# filesystems (Postgres/Kafka/InfluxDB data) instead of the container's.
|
|
|
|
|
- /:/hostfs:ro
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
depends_on:
|
|
|
|
|
- influxdb
|
|
|
|
|
environment:
|
|
|
|
|
- INFLUXDB_TOKEN=openbmp-telemetry-token
|
2026-05-19 08:28:36 -07:00
|
|
|
# Point gopsutil-based inputs (disk) at the host filesystem mount above.
|
|
|
|
|
- HOST_MOUNT_PREFIX=/hostfs
|
|
|
|
|
- HOST_PROC=/hostfs/proc
|
|
|
|
|
- HOST_SYS=/hostfs/sys
|
|
|
|
|
- HOST_ETC=/hostfs/etc
|
|
|
|
|
# PostgreSQL credentials for [[inputs.postgresql_extensible]] (DB size).
|
|
|
|
|
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-openbmp}
|
2026-05-18 21:10:57 -07:00
|
|
|
# gNMI fleet — quoted, comma-separated host:port list. Default = the two
|
|
|
|
|
# ESXi CORE routers; extend via GNMI_ADDRESSES in .env for more routers.
|
|
|
|
|
- 'GNMI_ADDRESSES=${GNMI_ADDRESSES:-"10.100.0.100:57400", "10.100.0.200:57400"}'
|
|
|
|
|
- GNMI_USERNAME=${GNMI_USERNAME:-webui}
|
|
|
|
|
- GNMI_PASSWORD=${GNMI_PASSWORD:-cisco}
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
|
|
|
|
|
# --- Phase 4: Traffic Generator ---
|
|
|
|
|
|
|
|
|
|
traffic-gen:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-traffic-gen
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/5051'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 30s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 1g
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
build:
|
|
|
|
|
context: ./traffic-gen
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
network_mode: host
|
|
|
|
|
cap_add:
|
|
|
|
|
- NET_RAW
|
|
|
|
|
- NET_ADMIN
|
|
|
|
|
environment:
|
2026-05-15 14:23:09 -07:00
|
|
|
- TRAFFIC_GEN_PORT=5051
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
- TRAFFIC_GEN_MODE=sender
|
2026-05-15 14:23:09 -07:00
|
|
|
- RESPONDER_URL=http://172.30.0.10:5053
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
|
|
|
|
|
traffic-gen-ui:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-traffic-gen-ui
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -q --spider http://localhost:5002/ || exit 1"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 30s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 256m
|
Add Phase 4: gNMI streaming telemetry and traffic generator
- gNMI integration: NETCONF script to enable gRPC on all 9 routers,
Telegraf container with gnmi input plugin, InfluxDB for time-series
storage, 3 Grafana telemetry dashboards (utilization, errors, combined)
- Traffic generator: Scapy-based dual-mode container (sender/responder)
with Flask API, RFC 2544 test suite (throughput, latency, frame-loss,
back-to-back), Vue 3 web UI with flow builder, test runner, real-time
stats monitor, and results export
- docker-compose.yml updated with influxdb, telegraf, traffic-gen,
traffic-gen-ui services
- Full documentation in DOCS.md sections 15-16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:29:44 -07:00
|
|
|
build:
|
|
|
|
|
context: ./traffic-gen-ui
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
network_mode: host
|
|
|
|
|
# Serves on port 5002 (host network, defined in nginx.conf)
|
|
|
|
|
|
2026-05-15 14:23:09 -07:00
|
|
|
traffic-gen-responder:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-traffic-gen-responder
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/5053'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 30s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["test"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 1g
|
2026-05-15 14:23:09 -07:00
|
|
|
build:
|
|
|
|
|
context: ./traffic-gen
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
cap_add:
|
|
|
|
|
- NET_RAW
|
|
|
|
|
- NET_ADMIN
|
|
|
|
|
environment:
|
|
|
|
|
- TRAFFIC_GEN_PORT=5053
|
|
|
|
|
- TRAFFIC_GEN_MODE=responder
|
|
|
|
|
- TRAFFIC_GEN_RESPONDER_MODE=echo
|
|
|
|
|
- TRAFFIC_GEN_INTERFACE=eth0
|
|
|
|
|
networks:
|
|
|
|
|
traffic-test-net:
|
|
|
|
|
ipv4_address: 172.30.0.10
|
|
|
|
|
ports:
|
|
|
|
|
- "5053:5053"
|
|
|
|
|
|
2026-05-19 07:39:12 -07:00
|
|
|
# GoBGP -- pulls the full real Internet routing table (roadmap E1) from the
|
|
|
|
|
# AS57355 lab route server and BMP-exports it to the OpenBMP collector, where
|
|
|
|
|
# it lands in PostgreSQL ip_rib as a monitored peer. Config + MRT fallback
|
|
|
|
|
# script live in ./gobgp (see gobgp/README.md). Receive-only, local AS 65001.
|
|
|
|
|
gobgp:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-gobgp
|
|
|
|
|
image: jauderho/gobgp:v4.5.0
|
2026-05-19 08:08:55 -07:00
|
|
|
# Host networking: the daemon uses the host's real IPv4 + IPv6 stack, so
|
|
|
|
|
# both the v4 and v6 eBGP sessions to AS57355 source from the host's
|
|
|
|
|
# public addresses (no Docker IPv6/NAT plumbing). BMP still reaches the
|
|
|
|
|
# collector on 10.40.40.202:5000 (its published port).
|
|
|
|
|
network_mode: host
|
2026-05-19 07:39:12 -07:00
|
|
|
depends_on:
|
|
|
|
|
- collector
|
|
|
|
|
# gobgpd reads /config/gobgpd.conf; the same mount carries mrt-refresh.sh
|
|
|
|
|
# and the cached MRT dumps it downloads.
|
|
|
|
|
volumes:
|
|
|
|
|
- ./gobgp:/config
|
|
|
|
|
command: ["gobgpd", "-f", "/config/gobgpd.conf", "-t", "toml"]
|
|
|
|
|
|
2026-05-19 09:15:44 -07:00
|
|
|
# GoBGP -- modular EVPN test-route injector (roadmap E5). Profile-gated, so
|
|
|
|
|
# it is NOT part of the normal stack. Originates synthetic BGP EVPN routes
|
|
|
|
|
# and BMP-exports them so the EVPN pipeline can be exercised. Start only for
|
|
|
|
|
# testing: docker compose --profile evpn-test up -d gobgp-evpn
|
|
|
|
|
# then: bash gobgp-evpn/inject-evpn.sh
|
|
|
|
|
gobgp-evpn:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-gobgp-evpn
|
|
|
|
|
profiles: ["evpn-test"]
|
|
|
|
|
image: jauderho/gobgp:v4.5.0
|
|
|
|
|
depends_on:
|
|
|
|
|
- collector
|
|
|
|
|
volumes:
|
|
|
|
|
- ./gobgp-evpn:/config
|
|
|
|
|
command: ["gobgpd", "-f", "/config/gobgpd.conf", "-t", "toml"]
|
|
|
|
|
|
2022-02-22 14:30:05 -08:00
|
|
|
whois:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-whois
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/43'"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 30s
|
2022-06-08 11:53:55 -07:00
|
|
|
image: openbmp/whois:2.2.0
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 1g
|
2022-02-22 14:30:05 -08:00
|
|
|
sysctls:
|
|
|
|
|
- net.ipv4.tcp_keepalive_intvl=30
|
|
|
|
|
- net.ipv4.tcp_keepalive_probes=5
|
|
|
|
|
- net.ipv4.tcp_keepalive_time=180
|
|
|
|
|
ports:
|
|
|
|
|
- "4300:43"
|
|
|
|
|
# volumes:
|
|
|
|
|
# - ${OBMP_DATA_ROOT}/config:/config
|
|
|
|
|
environment:
|
|
|
|
|
- POSTGRES_PASSWORD=openbmp
|
|
|
|
|
- POSTGRES_USER=openbmp
|
|
|
|
|
- POSTGRES_DB=openbmp
|
|
|
|
|
- POSTGRES_HOST=obmp-psql
|
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
|
|
|
- POSTGRES_PORT=5432
|
2026-05-15 14:23:09 -07:00
|
|
|
|
|
|
|
|
authelia:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-authelia
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["auth"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 256m
|
2026-05-15 14:23:09 -07:00
|
|
|
image: authelia/authelia:4.38
|
|
|
|
|
ports:
|
|
|
|
|
- "9091:9091"
|
|
|
|
|
volumes:
|
|
|
|
|
- ${OBMP_DATA_ROOT}/authelia:/config
|
|
|
|
|
environment:
|
|
|
|
|
- TZ=UTC
|
|
|
|
|
|
|
|
|
|
portal:
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
container_name: obmp-portal
|
2026-05-18 22:03:52 -07:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -q --spider http://localhost:80/ || exit 1"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 20s
|
2026-05-18 19:21:04 -07:00
|
|
|
profiles: ["auth"]
|
2026-05-18 20:04:37 -07:00
|
|
|
mem_limit: 128m
|
2026-05-15 14:23:09 -07:00
|
|
|
image: nginx:alpine
|
|
|
|
|
ports:
|
|
|
|
|
- "8080:80"
|
|
|
|
|
volumes:
|
|
|
|
|
- ./portal:/usr/share/nginx/html:ro
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
traffic-test-net:
|
|
|
|
|
driver: bridge
|
|
|
|
|
ipam:
|
|
|
|
|
config:
|
|
|
|
|
- subnet: 172.30.0.0/24
|