Compare commits
2
Commits
07f2ce562e
...
dc5e20e9b2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc5e20e9b2 | ||
|
|
20e674c1f2 |
No files matched your search
@@ -7,6 +7,7 @@
|
|||||||
# docker compose -f docker-compose.yaml -f docker-compose.microvps-full.yaml --profile microvps-full down
|
# docker compose -f docker-compose.yaml -f docker-compose.microvps-full.yaml --profile microvps-full down
|
||||||
#
|
#
|
||||||
# Лимиты под хост ~1 ГиБ: сумма лимитов контейнеров ~800 МиБ + запас ОС/Docker. При OOM увеличьте RAM VPS или уберите prometheus/nats из профиля (отдельная правка compose).
|
# Лимиты под хост ~1 ГиБ: сумма лимитов контейнеров ~800 МиБ + запас ОС/Docker. При OOM увеличьте RAM VPS или уберите prometheus/nats из профиля (отдельная правка compose).
|
||||||
|
# Postgres ниже ~240–256 МиБ часто не успевает пройти healthcheck / падает по памяти — не уменьшайте postgres без tuned postgresql.conf.
|
||||||
|
|
||||||
services:
|
services:
|
||||||
evobgp-all:
|
evobgp-all:
|
||||||
@@ -23,7 +24,7 @@ services:
|
|||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
cpus: "0.45"
|
cpus: "0.45"
|
||||||
memory: 180M
|
memory: 256M
|
||||||
|
|
||||||
bird2:
|
bird2:
|
||||||
deploy:
|
deploy:
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ services:
|
|||||||
profiles: ["reference", "microvps", "microvps-full"]
|
profiles: ["reference", "microvps", "microvps-full"]
|
||||||
image: postgres:16-alpine
|
image: postgres:16-alpine
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# Дефолтный /dev/shm в Docker (64 МиБ) мало для Postgres; иначе ошибки shared memory при старте.
|
||||||
|
shm_size: "256mb"
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: evobgp
|
POSTGRES_USER: evobgp
|
||||||
POSTGRES_PASSWORD: evobgp
|
POSTGRES_PASSWORD: evobgp
|
||||||
@@ -55,7 +57,8 @@ services:
|
|||||||
test: ["CMD-SHELL", "pg_isready -U evobgp -d evobgp"]
|
test: ["CMD-SHELL", "pg_isready -U evobgp -d evobgp"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 12
|
||||||
|
start_period: 45s
|
||||||
logging: *default-logging
|
logging: *default-logging
|
||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
|
|||||||
@@ -0,0 +1,170 @@
|
|||||||
|
# Standalone stack (без profiles): Portainer / `docker compose -f stack.microvps-full.yaml up -d`
|
||||||
|
# Эквивалент microvps-full из docker-compose.yaml + docker-compose.microvps-full.yaml,
|
||||||
|
# с встроенными configs для Prometheus (как у вас).
|
||||||
|
#
|
||||||
|
# Postgres: shm_size + start_period — иначе часто «dependency postgres failed» на слабом хосте.
|
||||||
|
name: evobgp-microvps-full
|
||||||
|
|
||||||
|
configs:
|
||||||
|
prometheus_yml:
|
||||||
|
content: |
|
||||||
|
global:
|
||||||
|
scrape_interval: 15s
|
||||||
|
evaluation_interval: 15s
|
||||||
|
rule_files:
|
||||||
|
- /etc/prometheus/alerts.yml
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: evobgp-all
|
||||||
|
metrics_path: /metrics
|
||||||
|
static_configs:
|
||||||
|
- targets: ["evobgp-all:8080"]
|
||||||
|
prometheus_alerts_yml:
|
||||||
|
content: |
|
||||||
|
groups: []
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:16-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
shm_size: "256mb"
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: evobgp
|
||||||
|
POSTGRES_PASSWORD: evobgp
|
||||||
|
POSTGRES_DB: evobgp
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U evobgp -d evobgp"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 12
|
||||||
|
start_period: 45s
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
nats:
|
||||||
|
image: nats:2.10-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
command: ["-js", "-m", "8222"]
|
||||||
|
ports:
|
||||||
|
- "4222:4222"
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
bird2:
|
||||||
|
image: git.shts.su/denozord/evobgp-bird2:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
sysctls:
|
||||||
|
net.ipv4.ip_forward: "1"
|
||||||
|
net.ipv6.conf.all.forwarding: "1"
|
||||||
|
volumes:
|
||||||
|
- bird_etc:/etc/bird
|
||||||
|
- bird_run:/run/bird
|
||||||
|
ports:
|
||||||
|
- "179:179/tcp"
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
evobgp-agent:
|
||||||
|
image: git.shts.su/denozord/evobgp-agent:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
bird2:
|
||||||
|
condition: service_started
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
volumes:
|
||||||
|
- bird_etc:/etc/bird
|
||||||
|
- bird_run:/run/bird
|
||||||
|
entrypoint: ["/usr/local/bin/evobgp-agent"]
|
||||||
|
command: ["watch", "-socket=/run/bird/bird.ctl", "-watch-interval=30s"]
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
evobgp-all:
|
||||||
|
image: git.shts.su/denozord/evobgp-all:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
nats:
|
||||||
|
condition: service_started
|
||||||
|
bird2:
|
||||||
|
condition: service_started
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
environment:
|
||||||
|
EVOBGP_DATABASE_URL: postgres://evobgp:evobgp@postgres:5432/evobgp?sslmode=disable
|
||||||
|
EVOBGP_BROKER_URL: nats://nats:4222
|
||||||
|
EVOBGP_HTTP_ADDR: ":8080"
|
||||||
|
EVOBGP_SEED_DEMO: "1"
|
||||||
|
EVOBGP_BIRDC_SOCKET: /run/bird/bird.ctl
|
||||||
|
EVOBGP_BIRDC_INTERVAL: 30s
|
||||||
|
EVOBGP_BIRD_ACTIVE_DIR: /etc/bird
|
||||||
|
EVOBGP_BIRD_STAGING_DIR: /tmp/evobgp-bird-staging
|
||||||
|
EVOBGP_DEV_INSECURE: "1"
|
||||||
|
volumes:
|
||||||
|
- bird_etc:/etc/bird
|
||||||
|
- bird_run:/run/bird:ro
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
evobgp-web:
|
||||||
|
image: git.shts.su/denozord/evobgp-web-all:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
evobgp-all:
|
||||||
|
condition: service_started
|
||||||
|
ports:
|
||||||
|
- "3000:80"
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
prometheus:
|
||||||
|
image: prom/prometheus:v2.54.1
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
evobgp-all:
|
||||||
|
condition: service_started
|
||||||
|
ports:
|
||||||
|
- "9090:9090"
|
||||||
|
configs:
|
||||||
|
- source: prometheus_yml
|
||||||
|
target: /etc/prometheus/prometheus.yml
|
||||||
|
- source: prometheus_alerts_yml
|
||||||
|
target: /etc/prometheus/alerts.yml
|
||||||
|
command:
|
||||||
|
- --config.file=/etc/prometheus/prometheus.yml
|
||||||
|
- --storage.tsdb.path=/prometheus
|
||||||
|
- --storage.tsdb.retention.time=7d
|
||||||
|
- --web.enable-lifecycle
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
|
bird_etc:
|
||||||
|
bird_run:
|
||||||
@@ -73,7 +73,8 @@ type BGPPeerFromTemplateOptions struct {
|
|||||||
OverrideLocalASN uint32
|
OverrideLocalASN uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenderProtocolBGPFromTemplate renders protocol bgp … from TEMPLATE { neighbor; multihop; source address; passive; }.
|
// RenderProtocolBGPFromTemplate renders protocol bgp … from TEMPLATE { neighbor; multihop; source address; strict bind; passive; }.
|
||||||
|
// strict bind дублируется и в шаблоне, и в каждом пире — явная фиксация на сессию.
|
||||||
func RenderProtocolBGPFromTemplate(opts BGPPeerFromTemplateOptions) (string, error) {
|
func RenderProtocolBGPFromTemplate(opts BGPPeerFromTemplateOptions) (string, error) {
|
||||||
if strings.TrimSpace(opts.ProtocolName) == "" {
|
if strings.TrimSpace(opts.ProtocolName) == "" {
|
||||||
return "", fmt.Errorf("birdfmt: protocol name is required")
|
return "", fmt.Errorf("birdfmt: protocol name is required")
|
||||||
@@ -109,6 +110,7 @@ func RenderProtocolBGPFromTemplate(opts BGPPeerFromTemplateOptions) (string, err
|
|||||||
b.WriteString(" source address ")
|
b.WriteString(" source address ")
|
||||||
b.WriteString(strings.TrimSpace(opts.SourceAddress))
|
b.WriteString(strings.TrimSpace(opts.SourceAddress))
|
||||||
b.WriteString(";\n")
|
b.WriteString(";\n")
|
||||||
|
b.WriteString(" strict bind on;\n")
|
||||||
b.WriteString(" passive;\n")
|
b.WriteString(" passive;\n")
|
||||||
b.WriteString("}\n")
|
b.WriteString("}\n")
|
||||||
return b.String(), nil
|
return b.String(), nil
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ func TestRenderProtocolBGPFromTemplate_MultihopPassive(t *testing.T) {
|
|||||||
if !strings.Contains(got, "source address 77.232.38.173;") {
|
if !strings.Contains(got, "source address 77.232.38.173;") {
|
||||||
t.Fatal(got)
|
t.Fatal(got)
|
||||||
}
|
}
|
||||||
|
if !strings.Contains(got, "strict bind on;") {
|
||||||
|
t.Fatal(got)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRenderProtocolBGPFromTemplate_OverrideLocal(t *testing.T) {
|
func TestRenderProtocolBGPFromTemplate_OverrideLocal(t *testing.T) {
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ protocol bgp evobgp_peer_ci from bgp_template {
|
|||||||
neighbor 192.0.2.2 as 65002;
|
neighbor 192.0.2.2 as 65002;
|
||||||
multihop;
|
multihop;
|
||||||
source address 192.0.2.1;
|
source address 192.0.2.1;
|
||||||
|
strict bind on;
|
||||||
passive;
|
passive;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user