April 15, 2025

Установка  Remnawave

Установка Remnawave состоит из нескольких частей :

  • Основная панель (aka backend)
  • Нода (aka Node )

Минимальные требования для Backend: Timeweb - 550 р в месяц (1/2)

  • 2GB of RAM
  • 2 CPU cores
  • Docker Engine

Минимальные требования для Node: Inferno

  • 1GB of RAM
  • 1 CPU core
  • Docker Engine

Важно про настройку DNS:

  • Домены panel.domen.com, subs.domen.com должны указывать на IP-адрес сервера с панелью
  • Домен steel.domen.com для сайта-заглушки Self Steal должен указывать на IP-адрес сервера с нодой

1. Установка Основная панель

  • Устанавливаем docker.
sudo curl -fsSL https://get.docker.com | sh
  • Создаем папку и переходим в нее.
mkdir /opt/remnawave && cd /opt/remnawave
  • Загружаем файл конфигурации env.
curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample
  • Настраиваем переменные.
nano .env

Важные пункты в env :

FRONT_END_DOMAIN=panel.domen.com указываем адрес панели

SUB_PUBLIC_DOMAIN=subs.domen.com указываем адрес страницы подписок

и обязательно прописать данные для БД

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Создаем файл docker-compose.yml.
nano docker-compose.yml

Вставляем данные:

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:
            - '127.0.0.1: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:latest
        container_name: 'remnawave'
        hostname: remnawave
        restart: always
        ports:
            - '127.0.0.1:3000:3000'
        env_file:
            - .env
        networks:
            - remnawave-network
        depends_on:
            remnawave-db:
                condition: service_healthy
            remnawave-redis:
                condition: service_healthy

    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

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Запускаем контейнер
docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f
  • Создаем файл Caddyfile в папке /opt/remnawave/caddy
mkdir -p /opt/remnawave/caddy && cd /opt/remnawave/caddy && nano Caddyfile

и вставляем данные предварительно заменив panel.domen.com на домен панели

https://panel.domen.com {
        reverse_proxy * http://remnawave:3000
}
:443 {
    tls internal
    respond 204
}

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Создаем файл docker-compose.yml в папке /opt/remnawave/caddy
cd /opt/remnawave/caddy && nano docker-compose.yml

Вставляем данные

services:
    caddy:
        image: caddy:2.9
        container_name: 'caddy'
        hostname: caddy
        restart: always
        ports:
            - '0.0.0.0:443:443'
        networks:
            - remnawave-network
        volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile
            - caddy-ssl-data:/data

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

volumes:
    caddy-ssl-data:
        driver: local
        external: false
        name: caddy-ssl-data

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Запускаем контейнер
docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f

Ваша панель установлена и теперь доступна по адресу: https://panel.domen.com

2. Установка страницы подписок

  • Создаем файл docker-compose.yml в папке /opt/remnawave/subscription
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml

и вставляем данные предварительно заменив panel.domen.com на домен панели

services:
    remnawave-subscription-page:
        image: remnawave/subscription-page:latest
        container_name: remnawave-subscription-page
        hostname: remnawave-subscription-page
        restart: always
        environment:
            - REMNAWAVE_PANEL_URL=https://panel.com
            - APP_PORT=3010
            - META_TITLE="Subscription Page Title"
            - META_DESCRIPTION="Subscription Page Description"
        ports:
            - '127.0.0.1:3010:3010'
        networks:
            - remnawave-network

networks:
    remnawave-network:
        driver: bridge
        external: true

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Запускаем контейнер
docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f
  • Открываем Caddy
cd /opt/remnawave/caddy && nano Caddyfile

И добавляем в самый низ строки предварительно заменив sub.domen.com на поддомен подписок

https://sub.domen.com {
        reverse_proxy * http://remnawave-subscription-page:3010
}

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Перезапускаем контейнер
docker compose down && docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f

3. Установка Ноды

  • Устанавливаем docker.
sudo curl -fsSL https://get.docker.com | sh
  • Создаем папку и переходим в нее.
mkdir -p /opt/remnanode && cd /opt/remnanode
  • Настраиваем переменные
nano .env

Добавляем данные

APP_PORT=2222

SSL_CERT=CERT_FROM_MAIN_PANEL

APP_PORT - указываем любой, это порт для подключения к ноде с панели (но не 61001)
SSL_CERT=CERT_FROM_MAIN_PAN - полностью удаляем данную строку.

Переходим в основную панель panel.domen.com Раздел: Ноды- Управление -Создать новую ноду, нажимаем скопировать сертификат и вставляем полностью текст в файл nano.env вместо SSL_CERT=CERT_FROM_MAIN_PAN

Ноды- Управление -Создать новую ноду

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Создаем файл docker-compose.yml.
nano docker-compose.yml

Вставляем данные

services:
    remnanode:
        container_name: remnanode
        hostname: remnanode
        image: remnawave/node:latest
        restart: always
        network_mode: host
        env_file:
            - .env

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Запускаем контейнер
docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f

Переходим в panel.domen.com и продолжаем добавление Ноды

Адрес панели указываем IP, порт тот который указали выше APP_PORT

4. Установка Selfsteel (SNI)

  • Создаем файл Caddyfile в папке /opt/selfsteel
mkdir -p /opt/selfsteel && cd /opt/selfsteel && nano Caddyfile

Вставляем данные

{
    https_port {$SELF_STEAL_PORT}
    default_bind 127.0.0.1
    servers {
        listener_wrappers {
            proxy_protocol {
                allow 127.0.0.1/32
            }
            tls
        }
    }
    auto_https disable_redirects
}

http://{$SELF_STEAL_DOMAIN} {
    bind 0.0.0.0
    redir https://{$SELF_STEAL_DOMAIN}{uri} permanent
}

https://{$SELF_STEAL_DOMAIN} {
    root * /var/www/html
    try_files {path} /index.html
    file_server

}


:{$SELF_STEAL_PORT} {
    tls internal
    respond 204
}

:80 {
    bind 0.0.0.0
    respond 204
}

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Настраиваем переменные.
nano .env

и вставляем данные предварительно заменив steel.domen.com на домен для страницы заглушки

# Домены
SELF_STEAL_DOMAIN=steel.domen.com #Должен совпадать с XRAY конфигом (realitySettings.serverNames)
SELF_STEAL_PORT=9443 #Должен совпадать с XRAY конфигом (realitySettings.dest)

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Создаем файл docker-compose.yml.
nano docker-compose.yml

Вставляем данные

services:
  caddy:
    image: caddy:2.9.1
    container_name: caddy-remnawave
    restart: unless-stopped
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ../html:/var/www/html
      - ./logs:/var/log/caddy
      - caddy_data_selfsteal:/data
      - caddy_config_selfsteal:/config
    env_file:
      - .env
    network_mode: "host"

volumes:
  caddy_data_selfsteal:
  caddy_config_selfsteal:

Сохраняем данные, нажав Ctrl-X далее Y и Enter

  • Запускаем контейнер
docker compose up -d
  • Проверка логов при необходимости.
docker compose logs -f
  • В папке opt создаем папку html и добавляем любой файл index.html

5. Настройка Конфиг

Переходим в панель по адресу panel.domen.com раздел конфиг и меняем данные предварительно заменим данные "меняем" и steel.domen.com(блок Shadowsocks можно в будущем удалить)

{
  "log": {
    "loglevel": "info"
  },
  "inbounds": [
    {
      "tag": "Shadowsocks",
      "port": 1234,
      "protocol": "shadowsocks",
      "settings": {
        "clients": [],
        "network": "tcp,udp"
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    },
    {
      "tag": "VLESS",
      "port": 443,
      "listen": "0.0.0.0",
      "protocol": "vless",
      "settings": {
        "clients": [],
        "decryption": "none"
      },
      "sniffing": {
        "enabled": true,
        "routeOnly": false,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "tcpSettings": {
          "header": {
            "type": "none"
          },
          "acceptProxyProtocol": false
        },
        "realitySettings": {
          "dest": "9443",
          "show": false,
          "xver": 0,
          "spiderX": "/",
          "shortIds": [
            "Меняем"
          ],
          "publicKey": "Меняем",
          "privateKey": "Меняем",
          "fingerprint": "chrome",
          "serverNames": [
            "steel.domen.com"
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "tag": "DIRECT",
      "protocol": "freedom"
    },
    {
      "tag": "BLOCK",
      "protocol": "blackhole"
    }
  ],
  "routing": {
    "rules": [
      {
        "ip": [
          "geoip:private"
        ],
        "type": "field",
        "outboundTag": "BLOCK"
      },
      {
        "type": "field",
        "domain": [
          "geosite:private"
        ],
        "outboundTag": "BLOCK"
      },
      {
        "type": "field",
        "protocol": [
          "bittorrent"
        ],
        "outboundTag": "BLOCK"
      }
    ]
  }
}

Ключи можно сгенерировать на панели нажав

6. Добавление Хоста

Переходим в панель по адресу panel.domen.com раздел Хост

Добавляем хост, Указываем примечание, можно Инбаунд VLESS> адрес меняем на свой из пункта 4