# 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» на слабом хосте. # Для защищенного Web UI задайте переменные окружения перед запуском: # WEBUI_DOMAIN, WEBUI_IP_WHITELIST, LETSENCRYPT_EMAIL, CF_DNS_API_TOKEN # Cloudflare запись для WEBUI_DOMAIN: DNS only (серый облачок). 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: ${EVOBGP_REGISTRY:-git.shts.su/denozord}/evobgp-bird2:${EVOBGP_IMAGE_TAG:-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: ${EVOBGP_REGISTRY:-git.shts.su/denozord}/evobgp-agent:${EVOBGP_IMAGE_TAG:-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: ${EVOBGP_REGISTRY:-git.shts.su/denozord}/evobgp-all:${EVOBGP_IMAGE_TAG:-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: ${EVOBGP_REGISTRY:-git.shts.su/denozord}/evobgp-web-all:${EVOBGP_IMAGE_TAG:-latest} restart: unless-stopped depends_on: evobgp-all: condition: service_started labels: - traefik.enable=true - traefik.http.routers.evobgp-web.rule=Host(`${WEBUI_DOMAIN}`) - traefik.http.routers.evobgp-web.entrypoints=websecure - traefik.http.routers.evobgp-web.tls=true - traefik.http.routers.evobgp-web.tls.certresolver=letsencrypt - traefik.http.routers.evobgp-web.middlewares=webui-ipwhitelist@docker - traefik.http.middlewares.webui-ipwhitelist.ipallowlist.sourcerange=${WEBUI_IP_WHITELIST} - traefik.http.services.evobgp-web.loadbalancer.server.port=80 logging: driver: json-file options: max-size: "10m" max-file: "3" evobgp-edge: image: traefik:latest restart: unless-stopped depends_on: evobgp-web: condition: service_started ports: - "80:80" - "443:443" environment: DOCKER_API_VERSION: "1.44" CF_DNS_API_TOKEN: ${CF_DNS_API_TOKEN} command: - --api.dashboard=false - --providers.docker=true - --providers.docker.exposedbydefault=false - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --entrypoints.web.http.redirections.entrypoint.to=websecure - --entrypoints.web.http.redirections.entrypoint.scheme=https - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json - --certificatesresolvers.letsencrypt.acme.dnschallenge=true - --certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare - --certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=15 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - traefik_letsencrypt:/letsencrypt 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: traefik_letsencrypt: