Self-hosting. Remnawave

ΠœΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для управлСния прокси-сСрвСрами, созданный Π½Π° основС Xray-core, с ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° простоту ΠΈ удобство использования.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ: https://github.com/remnawave/panel

ДокумСнтация: Remnawave Documentation

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ docker compose Ρ„Π°ΠΉΠ»Π°:

services:
    remnawave-db:
        image: postgres:17
        container_name: 'remnawave-db'
        hostname: remnawave-db
        restart: always
        env_file:
            - .env
        environment:
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DB=${POSTGRES_DB}
            - TZ=UTC
        ports:
            - 6767:5432
        volumes:
            - remnawave-db-data:/var/lib/postgresql/data
        networks:
            - remnawave-network
        healthcheck:
            test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
            interval: 3s
            timeout: 10s
            retries: 3

    remnawave:
        image: remnawave/backend:dev
        container_name: 'remnawave'
        hostname: remnawave
        restart: always
        ports:
            - 3030:3000
            - 3001:3001
        env_file:
            - .env
        networks:
            - remnawave-network
        depends_on:
            remnawave-db:
                condition: service_healthy
            remnawave-redis:
                condition: service_healthy

    remnawave-subscription-page:
        image: remnawave/subscription-page:latest
        container_name: remnawave-subscription-page
        hostname: remnawave-subscription-page
        restart: always
        environment:
            - REMNAWAVE_PLAIN_DOMAIN=remnawave:3000
            - REQUEST_REMNAWAVE_SCHEME=http
            - SUBSCRIPTION_PAGE_PORT=3010
            - CUSTOM_SUB_PREFIX=sub
            - META_TITLE="Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° подписки"
            - META_DESCRIPTION="Π’Π°ΡˆΠ° ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ страница подписки Π½Π° VPN"
        ports:
            - 3010:3010
        networks:
            - remnawave-network

    remnawave-redis:
        image: valkey/valkey:8.0.2-alpine
        container_name: remnawave-redis
        hostname: remnawave-redis
        restart: always
        networks:
            - remnawave-network
        volumes:
            - remnawave-redis-data:/data
        healthcheck:
            test: ['CMD', 'valkey-cli', 'ping']
            interval: 3s
            timeout: 10s
            retries: 3

networks:
    remnawave-network:
        name: remnawave-network
        driver: bridge
        external: false

volumes:
    remnawave-db-data:
        driver: local
        external: false
        name: remnawave-db-data
    remnawave-redis-data:
        driver: local
        external: false
        name: remnawave-redis-data

Настройка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… запуска

### APP ###
APP_PORT=3000
METRICS_PORT=3001


### API ###
# Possible values: max (start instances on all cores), number (start instances on number of cores), -1 (start instances on all cores - 1)
# !!! Do not set this value more that physical cores count in your machine !!!
API_INSTANCES=1

### DATABASE ###
# FORMAT: postgresql://{user}:{password}@{host}:{port}/{database}
DATABASE_URL="postgresql://postgres:postgres@remnawave-db:5432/postgres"

### REDIS ###
REDIS_HOST=remnawave-redis
REDIS_PORT=6379

### JWT ###
### CHANGE DEFAULT VALUES ###
JWT_AUTH_SECRET=<secret>
JWT_API_TOKENS_SECRET=<secret>

### TELEGRAM ###
IS_TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=<secret>
TELEGRAM_ADMIN_ID=<secret>
NODES_NOTIFY_CHAT_ID=<secret>
NODES_NOTIFY_THREAD_ID=<secret>
TELEGRAM_ADMIN_THREAD_ID=<secret>

### FRONT_END ###
FRONT_END_DOMAIN=panel.<domain>.ru

### SUBSCRIPTION PUBLIC DOMAIN ###
### RAW DOMAIN, WITHOUT HTTP/HTTPS, DO NOT PLACE / to end of domain ###
### Used in "profile-web-page-url" response header ###
SUB_PUBLIC_DOMAIN=sub.<domain>.ru/sub

### SWAGGER ###
SWAGGER_PATH=/docs
SCALAR_PATH=/scalar
IS_DOCS_ENABLED=true

### PROMETHEUS ###
### Metrics are available at /metrics
METRICS_USER=user
METRICS_PASS=password

### WEBHOOK ###
WEBHOOK_ENABLED=false
### Only https:// is allowed
WEBHOOK_URL=https://webhook.site/1234567890
### This secret is used to sign the webhook payload, must be exact 64 characters. Only a-z, 0-9, A-Z are allowed.
WEBHOOK_SECRET_HEADER=<secret>

### Database ###
### For Postgres Docker container ###
# NOT USED BY THE APP ITSELF
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… сСкрСтных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

openssl rand -hex 64

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с супСр Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ доступны с вСрсии 1.5.6 (dev) ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ:

NODES_NOTIFY_THREAD_ID
TELEGRAM_ADMIN_THREAD_ID
Postgres

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π½Π΅ выходят Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ сСти Π΄ΠΎΠΊΠ΅Ρ€.


Настройка проксирования ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ authenik

Для ΠΏΠ°Π½Π΅Π»ΠΈ примСняСтся Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ стандартный шаблон с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· authentik:

http:
  routers:
    remnawave:
      rule: "Host(`panel.<domain>.ru`)"
      entrypoints:
        - http   
      middlewares:
        - remnawave-https-redirect
        - authentik
      service: remnawave
          
    remnawave-secure:
      rule: "Host(`panel.<domain>.ru`)"
      entrypoints:
        - https
      middlewares:
        - authentik
      tls: true
      service: remnawave

  middlewares:
    remnawave-https-redirect:
      redirectScheme:
        scheme: https

  services:
    remnawave:
      loadBalancer:
        servers:
          - url: "http://192.168.0.132:3030"

Для страницы подписки Π·Π°Ρ‰ΠΈΡ‚Π° authentik Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для свободного доступа ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ:

http:
  routers:
    sub-remnawave:
      rule: "Host(`sub.<domain>.ru`)"
      entrypoints:
        - http   
      middlewares:
        - sub-remnawave-https-redirect
      service: sub-remnawave
          
    sub-remnawave-secure:
      rule: "Host(`sub.<domain>.ru`)"
      entrypoints:
        - https
      tls: true
      service: sub-remnawave

  middlewares:
    sub-remnawave-https-redirect:
      redirectScheme:
        scheme: https

  services:
    sub-remnawave:
      loadBalancer:
        servers:
          - url: "http://192.168.0.132:3010"

Настройки authentik

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ страницу подписки для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² authentik Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ΄ Π΄ΠΎΠΌΠ΅Π½Π°. Один для ΠΏΠ°Π½Π΅Π»ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ для страницы подписки.

Для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΠ°Π½Π΅Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· authentik ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ стандартныС настройки Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· прокси traefik (см ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Настройка Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· authentik traefik).

Для доступа ΠΊ api Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡƒΡ‚Π΅ΠΉ. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² настройки Authentik > Provider > Advanced protocol settings > Unauthenticated Paths ΠΈ внСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

^/api/.*

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ настройкС api Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‚Ρ‹ authentik ΠΊΠ°ΠΊ ΠΈ страница подписки, Π° страница ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°.

ΠžΠ±Ρ‰ΠΈΠ΅ настройки ΠΏΠ°Π½Π΅Π»ΠΈ:

  1. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для xray ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ xray.
  2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π½ΠΎΠ΄Ρƒ
  3. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ хост. Π₯ост - это Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π’ ΠΏΠΎΠ»Π΅ адрСс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½ Π° Π² ΠΏΠΎΠ»Π΅ ΠΏΠΎΡ€Ρ‚Π° ΠΏΠΎΡ€Ρ‚ ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ½Π±Π°ΡƒΠ½Π΄Π°.
  4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ½Π±Π°ΡƒΠ½Π΄Ρ‹ Π° Π½Π΅ хосты, Π½Π° Π²Ρ‹Π±ΠΎΡ€ Π±ΡƒΠ΄ΡƒΡ‚ доступны всС хосты свяханныС с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠ½Π±Π°ΡƒΠ½Π΄ΠΎΠΌ.

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ‹:

ΠžΠ±Ρ‰ΠΈΠΉ порядок установки описан Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ скриптом:

sudo bash -c "$(curl -sL https://github.com/DigneZzZ/remnawave-scripts/raw/main/remnanode.sh)" @ install

Из рСпозитория: GitHub - DigneZzZ/remnawave-scripts

Π’Π°ΠΆΠ½ΠΎ

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ‹ ΠΊ ΠΏΠ°Π½Π΅Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ рСкомСндуСтся ΠΏΠΎ ip адрСсу

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½ΠΎΠ΄Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈΠ½Π±Π°ΡƒΠ½Π΄Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’Π΅ΡΡŒ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ пСрСдаСтся Π½Π° Π½ΠΎΠ΄Ρƒ, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅.

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½ΠΎΠ΄Ρ‹ ΠΊ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ Π½ΠΎΠ΄Ρ‹ Π² ΠΏΠ°Π½Π΅Π»ΠΈ.

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° подписки

Π’Ρ‹Π²ΠΎΠ΄ страницы подписки осущСствляСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ remnawave/subscription-page настройки Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ. МоТно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ шаблон, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ прилоТСния ΠΈ сообщСния.

ДокумСнтация: Remnawave Documentation

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³

ПанСль ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Prometheus для сбора Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° доступны ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎ адрСсу remnawave:3001/metrics

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для prometheus:

  - job_name: 'remnawave'
    scrape_interval: 5s
    metrics_path: /metrics
    static_configs:
      - targets: ['panel:3001']
    basic_auth:
      username: username
      password: password

ПанСль для Π³Ρ€Π°Ρ„Π°Π½Ρ‹: <Π² процСссС настройки>