guard/docs/configuration.md

6.7 KiB
Raw Blame History

Configuration - Rampart

Примеры конфигурационных файлов для всех компонентов.

Как конфиги связывают компоненты

Edge config.toml               Manager (env)
  bind.address                    JWT_SECRET
  bind.port                       API_PASSWORD
  backend.address          ───→   REDIS_URL
  hmac.secret ←──────┐            CLICKHOUSE_URL
  store.redis_url ────┤
                     │
Velocity (env)       │     Paper (env)
  RAMPART_HMAC_SECRET┤       RAMPART_HMAC_SECRET
  RAMPART_ALLOWED_   │       RAMPART_REDIS_URL
  DOMAINS            │       RAMPART_SERVER_NAME
  RAMPART_REDIS_URL ─┘       RAMPART_SERVER_IP

HMAC secret должен быть ОДИНАКОВЫМ на Edge, Velocity и Paper. Redis URL - одинаковым на всех компонентах.


1. Edge Node (config.toml)

[bind]
address = "0.0.0.0"
port = 25565

[backend]
# Velocity нода или HAProxy
address = "10.0.0.2"
port = 25565

[hmac]
# Минимум 32 байта. Сгенерировать: openssl rand -hex 32
secret = "CHANGE_ME_32_BYTES_LONG_HERE_ABCDEF123456"

[workers]
# Количество воркеров = количество vCPU
count = 4

[xdp]
# Опционально, требует kernel 5.10+
enabled = false
interface = "eth0"

[pow]
# PoW Challenge (Layer 2). ВЫКЛЮЧЕН по умолчанию (P0-4):
# текстовый challenge отправляется до handshake и несовместим с ванильными
# MC-клиентами — они не умеют его решать, и при enabled=true никто не сможет
# зайти на сервер. Включать только после появления клиентского мода или PoW,
# совместимого с протоколом Minecraft.
enabled = false
difficulty = 4

[limits]
# Максимум времени на получение handshake (Slowloris защита)
handshake_timeout_secs = 5
# Максимум одновременных соединений с одного IP
max_connections_per_ip = 10
# Лимит коннектов в секунду с одного IP (Status ping)
rate_limit_status_pps = 2
# Лимит коннектов в секунду с одного IP (Login)
rate_limit_login_pps = 5
# Лимит burst
rate_limit_burst = 10

[store]
# v0.2+: Redis для синхронизации блэклиста
redis_url = "redis://:password@10.0.0.1:6379/0"
# TTL кэша блэклиста (локально)
blacklist_cache_ttl_secs = 300

[logging]
level = "info"        # trace, debug, info, warn, error
format = "json"       # json или text

[metrics]
enabled = true
port = 9090

[quic]
# v0.4+: QUIC канал к Manager (опционально)
enabled = false
connect = "10.0.0.1:7777"

2. Velocity Plugin

Плагин конфигурируется через переменные окружения (совпадают с edge node).

# Обязательно: HMAC секрет (должен совпадать с edge нодой)
RAMPART_HMAC_SECRET="CHANGE_ME_32_BYTES_LONG_HERE_ABCDEF123456"

# Опционально: список разрешённых доменов (через запятую)
RAMPART_ALLOWED_DOMAINS="play.example.com,mc.example.com,example.com"

Установка:

# Сборка
cd plugins && ./gradlew :velocity:build

# Копирование в Velocity
cp velocity/build/libs/rampart-velocity-*.jar /opt/velocity/plugins/

# Рестарт
systemctl restart velocity

Плагин делает:

  • DomainCheck: блокирует direct IP-коннекты, пропускает только домены из whitelist
  • HmacCheck: верифицирует HMAC-SHA256 подпись в hostname (\0shield\0<sig>)

3. Paper Plugin

Конфигурация - через переменные окружения:

# Обязательно: HMAC секрет (должен совпадать с edge нодой)
RAMPART_HMAC_SECRET="CHANGE_ME_32_BYTES_LONG_HERE_ABCDEF123456"

Установка:

cd plugins && ./gradlew :paper:build
cp paper/build/libs/rampart-paper-*.jar /opt/paper/plugins/

Плагин делает:

  • HmacCheck: резервная верификация HMAC-подписи на случай прямого коннекта (в обход Velocity)

4. Manager (manager.toml)

[bind]
address = "0.0.0.0"
port = 8080

[tls]
cert = "/etc/rampart/tls/manager.crt"
key = "/etc/rampart/tls/manager.key"
ca = "/etc/rampart/tls/ca.crt"

[auth]
jwt_secret = "CHANGE_ME_JWT_SECRET_HERE"
jwt_expiry_hours = 24

[redis]
url = "redis://:password@127.0.0.1:6379/0"
pool_size = 10

[nats]
# v0.4+: NATS для критических событий
urls = ["nats://127.0.0.1:4222"]

[clickhouse]
url = "http://127.0.0.1:8123"
db = "rampart"
batch_size = 1000
flush_interval_secs = 1

[quic]
# v0.4+: QUIC сервер для edge нод
bind = "0.0.0.0:7777"

[limits]
api_rate_per_minute = 60

5. HAProxy (haproxy.cfg)

global
    maxconn 100000
    log /dev/log local0

defaults
    mode tcp
    timeout connect 3s
    timeout client  30s
    timeout server  30s
    option tcplog

frontend minecraft_in
    bind *:25565
    mode tcp

    # Только от edge нод
    acl is_edge src 10.0.100.0/24
    tcp-request connection reject if !is_edge

    default_backend velocity_pool

backend velocity_pool
    mode tcp
    balance leastconn
    option tcp-check

    server vel1 10.0.0.2:25565 check inter 3s rise 2 fall 3
    server vel2 10.0.0.3:25565 check inter 3s rise 2 fall 3
    server vel3 10.0.0.4:25565 check inter 3s rise 2 fall 3

6. Prometheus (prometheus.yml)

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'rampart-edge'
    static_configs:
      - targets:
        - '10.0.100.1:9090'
        - '10.0.100.2:9090'

  - job_name: 'rampart-manager'
    static_configs:
      - targets: ['10.0.0.1:9090']

  - job_name: 'rampart-velocity'
    static_configs:
      - targets:
        - '10.0.0.2:9091'
        - '10.0.0.3:9091'

  - job_name: 'paper-servers'
    file_sd_configs:
      - files: ['/etc/prometheus/game_servers.json']
        refresh_interval: 30s

7. WireGuard (wg0.conf)

[Interface]
Address = 10.0.0.1/16
PrivateKey = <MANAGER_PRIVATE_KEY>
ListenPort = 51820
MTU = 1420

[Peer]
# Edge EU
PublicKey = <EDGE_EU_PUBLIC_KEY>
AllowedIPs = 10.0.100.1/32

[Peer]
# Edge US
PublicKey = <EDGE_US_PUBLIC_KEY>
AllowedIPs = 10.0.100.2/32

[Peer]
# Velocity 1
PublicKey = <VEL1_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32

Версия: 1.0 | Июль 2026