Files
panel/docs/installation/quick-start.md

4.1 KiB

sidebar_position, slug, title
sidebar_position slug title
1 /installation/quick-start Quick start

Installation

Remnawave consists of two parts:

  • Main panel (aka backend)
  • Node (with XRay Core inside)

You can install both parts on the same machine or separate machines.

Minimum requirements for Backend:

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

Minimum requirements for Node:

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

Configuration

First of all, you need to configure the environment variables.

You can find the list of all environment variables in the Environment Variables page.

:::warning

Be sure to change the default credentials in the environment variables.

:::

Installation

Main Panel

:::info

This guide written for Ubuntu 22.04, instructions may vary for other distributions. :::

  1. First of all, you need to install docker.
sudo curl -fsSL https://get.docker.com | sh
  1. Create separate directory for the project.
mkdir /opt/remnawave && cd /opt/remnawave
  1. Download and configure the environment variables.
curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample
  1. Configure the environment variables.
nano .env
  1. Create docker-compose.yml file, example below.

:::danger

Do not expose the services to the public internet, use only 127.0.0.1 for Remnawave services.

You must use Nginx/Caddy/Apache/etc. to expose the services to the public internet.

This guide does not cover the configuration of the reverse proxy, but just a bit later we will use Cloudflare Tunnel to expose the services to the public internet.

:::

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
  1. Run containers.
docker compose up -d
  1. Check the logs.
docker compose logs -f
  1. Remnawave is now running on http://127.0.0.1:3000.

Now we are ready to move on the Reverse Proxy installation.

:::danger

Do not expose the services to the public internet, use only 127.0.0.1 for Remnawave services.

You must use Nginx/Caddy/Apache/etc. to expose the services to the public internet.

<Button label="Continue to Reverse Proxy installation" link="/installation/rp/nginx" variant="secondary" size="md" outline style={{ marginBottom: '1rem' }} />

:::