Chayka VPN

Self-hosting guide

Руководство по своему серверу

Create your own access key

Создайте свой ключ доступа

Chayka VPN is a free Xray-core client. Remnawave and Xray-core are open-source projects you can run on your own server. This guide takes you from a new VPS to a subscription link that you can paste into the app.

Чайка ВПН — бесплатный клиент Xray-core. Remnawave и Xray-core — проекты с открытым исходным кодом, которые можно запустить на своём сервере. Здесь показан путь от нового VPS до ссылки подписки, которую можно вставить в приложение.

No fee to create an access key in Chayka VPNСоздание ключа в Чайка ВПН бесплатно

Before you begin

Что понадобится

Prepare a VPS running a current Ubuntu or Debian release, with at least 2 GB of RAM, a public IPv4 address, SSH access, and a domain name. For the panel, subscription page, and node together, 4 GB or more is recommended. Remnawave recommends a separate VPS for the node in production.

Подготовьте VPS с актуальной версией Ubuntu или Debian, минимум 2 ГБ ОЗУ, публичным IPv4-адресом, доступом по SSH и доменным именем. Для совместной работы панели, страницы подписки и ноды рекомендуется от 4 ГБ. Для рабочего использования Remnawave рекомендует отдельный VPS для ноды.

panel.example.comPanel administrationУправление панелью
sub.example.comPublic subscription linksПубличные ссылки подписок
Public IPv4A record target for both namesАдрес для двух DNS-записей A

Replace example.com everywhere below with your domain. Create DNS A records for panel and sub pointing to the VPS. Allow inbound TCP ports 80 and 443 for HTTPS. Your Xray inbound will use its own port later. If a firewall is enabled, keep SSH open.

Замените example.com на свой домен во всех примерах ниже. Создайте DNS-записи A для panel и sub, указывающие на VPS. Откройте входящие TCP-порты 80 и 443 для HTTPS. Входящее подключение Xray позже получит отдельный порт. Если включён файрвол, сохраните доступ по SSH.

This is a starter setup on one VPS. The panel and node share the machine, so plan distinct ports for Caddy, the node API, and the Xray inbound. Never expose the panel database, Redis, or node management port to everyone.

Это начальная конфигурация на одном VPS. Панель и нода используют одни ресурсы, поэтому порты Caddy, API ноды и входящего подключения Xray должны различаться. Не открывайте базу данных панели, Redis и порт управления нодой для всех.

1Install the Remnawave panelУстановите панель Remnawave

Connect to the VPS by SSH. Install Docker and its Compose plugin, then download the deployment files from Remnawave:

Подключитесь к VPS по SSH. Установите Docker с плагином Compose и загрузите файлы развертывания Remnawave:

Terminal · From your computer
ssh YOUR_USER@YOUR_VPS_IP
Terminal · Docker
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version
Terminal · Remnawave
sudo mkdir -p /opt/remnawave
cd /opt/remnawave
sudo curl -fL -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
sudo curl -fL -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample

Generate unique secrets and replace the sample database password. These commands follow Remnawave’s installation guide:

Создайте уникальные секреты и замените пример пароля базы данных. Команды соответствуют руководству Remnawave:

Terminal · Secrets
cd /opt/remnawave
sudo sed -i "s/^APP_SECRET=.*/APP_SECRET=$(openssl rand -hex 64)/" .env
sudo sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env
sudo sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .env
pw=$(openssl rand -hex 24)
sudo sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env
sudo sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^@]*\(@.*\)|\1$pw\2|" .env
unset pw

Open /opt/remnawave/.env with sudo nano /opt/remnawave/.env. Set these two values without https://. Keep the rest of the generated secrets private.

Откройте /opt/remnawave/.env командой sudo nano /opt/remnawave/.env. Укажите два значения без https://. Остальные созданные секреты храните в тайне.

/opt/remnawave/.env · values to edit
FRONT_END_DOMAIN=panel.example.com
SUB_PUBLIC_DOMAIN=sub.example.com
Terminal · Start panel
cd /opt/remnawave
sudo docker compose up -d
sudo docker compose ps

The panel is running internally, but it needs an HTTPS reverse proxy before you can sign in.

Панель уже работает внутри сервера, но для входа ей нужен обратный прокси с HTTPS.

2Publish the panel over HTTPSОткройте панель через HTTPS

Caddy obtains and renews the TLS certificate automatically. Create its directory and the following two files. Replace the example panel domain in the Caddyfile.

Caddy автоматически получает и обновляет TLS-сертификат. Создайте каталог и два файла ниже. Замените пример домена панели в Caddyfile.

Terminal
sudo mkdir -p /opt/remnawave/caddy
cd /opt/remnawave/caddy
sudo nano Caddyfile
/opt/remnawave/caddy/Caddyfile
https://panel.example.com {
    encode
    reverse_proxy http://remnawave:3000
}
Terminal
sudo nano /opt/remnawave/caddy/docker-compose.yml
/opt/remnawave/caddy/docker-compose.yml
services:
  caddy:
    image: caddy:2.9
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - remnawave-network
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy-data:/data
networks:
  remnawave-network:
    external: true
volumes:
  caddy-data:
Terminal · Start Caddy
cd /opt/remnawave/caddy
sudo docker compose up -d
sudo docker compose ps

Visit https://panel.example.com. Register the first account; Remnawave makes this account the super-admin. Use a strong password and keep the administration URL private.

Откройте https://panel.example.com. Зарегистрируйте первый аккаунт — Remnawave назначит ему роль суперадминистратора. Используйте надёжный пароль и не публикуйте адрес панели.

3Install a Remnawave nodeУстановите ноду Remnawave

The panel manages subscriptions; the node runs Xray-core and carries traffic. In the panel, open Nodes → Management → Create new node. For this one-VPS example, use the VPS address. Choose a node API port that is different from 80, 443, and your planned Xray inbound port. The node API port is for panel-to-node communication, not client traffic.

Панель управляет подписками, а нода запускает Xray-core и передаёт трафик. В панели откройте Nodes → Management → Create new node. Для примера с одним VPS укажите адрес этого VPS. Порт API ноды должен отличаться от 80, 443 и будущего порта входящего подключения Xray. API-порт нужен для связи панели с нодой, а не для клиентов.

  1. Fill in the node name, country, address, and node API port.
  2. Click Copy docker-compose.yml in Remnawave. The generated file contains this node’s connection settings; use it instead of a generic example.
  3. On the VPS, create /opt/remnanode/docker-compose.yml, paste the generated file, and save it.
  1. Укажите название, страну, адрес и API-порт ноды.
  2. Нажмите Copy docker-compose.yml в Remnawave. Созданный файл содержит настройки связи именно этой ноды; используйте его вместо общего шаблона.
  3. На VPS создайте /opt/remnanode/docker-compose.yml, вставьте полученный файл и сохраните.
Terminal · Start node
sudo mkdir -p /opt/remnanode
cd /opt/remnanode
sudo nano docker-compose.yml
sudo docker compose up -d
sudo docker compose ps

Return to the node creation card, click Next, choose a Config Profile whose inbound does not use 80 or 443, and click Create. Check that the node appears online. Restrict the node API port so only the panel server can reach it; on this single-host setup, review the generated port binding and firewall before continuing. If the panel cannot reach the node using the same public address, follow Remnawave’s node installation guide for a separate VPS.

Вернитесь к созданию ноды, нажмите Next, выберите Config Profile, у которого входящее подключение не использует 80 или 443, и нажмите Create. Проверьте, что нода отображается онлайн. Ограничьте доступ к API-порту ноды только сервером панели; при размещении на одном VPS проверьте привязку порта в созданном файле и правила файрвола. Если панель не может подключиться к ноде по тому же публичному адресу, следуйте руководству Remnawave для отдельного VPS.

4Make a usable connectionНастройте подключение для клиентов

An online node alone is not enough. The subscription must include an enabled Xray inbound and a Host pointing to it. Remnawave creates a default Config Profile; use its existing inbound to start, or create one in Config Profiles. On this shared VPS, do not set the Xray inbound to ports 80 or 443 because Caddy uses them.

Одной работающей ноды недостаточно. Подписка должна содержать включённое входящее подключение Xray и Host, который на него указывает. Для начала используйте входящее подключение из стандартного Config Profile или создайте своё в Config Profiles. На общем VPS не занимайте порты 80 и 443 для Xray: их использует Caddy.

  1. In Nodes → Management, ensure the chosen Config Profile and its inbound are enabled for the node.
  2. In Hosts → Create new host, select that inbound. Set the Host address to the node’s public IP or a DNS name pointing to it, and keep its port aligned with the inbound.
  3. In Internal Squads, edit the default squad and enable the same inbound. Save the changes.
  4. Allow the inbound’s TCP or UDP port in your VPS firewall as required by the selected protocol.
  1. В Nodes → Management убедитесь, что нужный Config Profile и его входящее подключение включены для ноды.
  2. В Hosts → Create new host выберите это входящее подключение. Укажите публичный IP ноды или домен, ведущий на неё; порт Host должен совпадать с портом входящего подключения.
  3. В Internal Squads откройте стандартную группу и включите то же входящее подключение. Сохраните изменения.
  4. Откройте нужный TCP- или UDP-порт входящего подключения в файрволе VPS в соответствии с выбранным протоколом.
Config Profile / Inbound→Node + Host→Internal Squad→UserПользователь

For protocol-specific Xray settings, use the Remnawave Config Profiles guide. Xray port and transport choices depend on your selected protocol and network.

Настройки Xray для конкретного протокола описаны в руководстве Remnawave по Config Profiles. Порт и транспорт зависят от выбранного протокола и сети.

5Set up the subscription pageНастройте страницу подписки

The subscription page serves public links at sub.example.com while the administration panel stays on panel.example.com. Confirm SUB_PUBLIC_DOMAIN=sub.example.com in /opt/remnawave/.env. If you changed it after starting the panel, recreate the panel container:

Страница подписки выдаёт публичные ссылки через sub.example.com, а панель управления остаётся на panel.example.com. Проверьте SUB_PUBLIC_DOMAIN=sub.example.com в /opt/remnawave/.env. Если вы меняли значение после запуска панели, пересоздайте контейнер панели:

Terminal · If domain changed
cd /opt/remnawave
sudo docker compose up -d --force-recreate remnawave

In the panel, create an API token under Remnawave Settings → API Tokens. Keep the token private. Create the subscription page files below and replace the placeholder token.

В панели создайте API-токен в Remnawave Settings → API Tokens. Держите его в тайне. Создайте файлы страницы подписки ниже и замените пример токена.

Terminal
sudo mkdir -p /opt/remnawave/subscription
sudo nano /opt/remnawave/subscription/docker-compose.yml
/opt/remnawave/subscription/docker-compose.yml
services:
  remnawave-subscription-page:
    image: remnawave/subscription-page:latest
    container_name: remnawave-subscription-page
    restart: always
    env_file:
      - .env
    ports:
      - "127.0.0.1:3010:3010"
    networks:
      - remnawave-network
networks:
  remnawave-network:
    external: true
Terminal
sudo nano /opt/remnawave/subscription/.env
/opt/remnawave/subscription/.env
APP_PORT=3010
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=PASTE_YOUR_PRIVATE_API_TOKEN
TRUST_PROXY=1
Terminal · Start page
cd /opt/remnawave/subscription
sudo chmod 600 .env
sudo docker compose up -d
sudo docker compose ps

Append the following block to /opt/remnawave/caddy/Caddyfile; keep the existing panel block. Then reload Caddy.

Добавьте следующий блок в конец /opt/remnawave/caddy/Caddyfile; существующий блок панели оставьте. Затем перезагрузите Caddy.

Append to Caddyfile
https://sub.example.com {
    encode
    reverse_proxy http://remnawave-subscription-page:3010
}
Terminal · Reload Caddy
cd /opt/remnawave/caddy
sudo docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

Remnawave’s bundled subscription page guide also explains optional branding through Subpage Builder.

Руководство Remnawave по встроенной странице подписки также описывает настройку оформления через Subpage Builder.

6Create a user and import the keyСоздайте пользователя и добавьте ключ

  1. In the panel, open Users → Create user.
  2. Choose a username, traffic limit and expiration, and assign the Internal Squad that contains your enabled inbound. Click Create user.
  3. In the user list, click the link icon to copy the user’s HTTPS subscription URL. It should use sub.example.com. This URL is your access key; treat it like a password.
  4. Open Chayka VPN, tap Add Key, paste the complete URL, and confirm. Select the imported location and connect.
  1. В панели откройте Users → Create user.
  2. Выберите имя, лимит трафика и срок действия, а также назначьте Internal Squad с включённым входящим подключением. Нажмите Create user.
  3. В списке пользователей нажмите значок ссылки, чтобы скопировать HTTPS-ссылку подписки. Она должна начинаться с sub.example.com. Эта ссылка и есть ключ доступа; храните её как пароль.
  4. Откройте Чайка ВПН, нажмите Добавить ключ, вставьте полную ссылку и подтвердите. Выберите импортированную локацию и подключитесь.

Cost: Chayka VPN does not charge for creating or importing a key. You can create a key for your own Remnawave server without buying a VPN subscription. Your VPS and domain provider may charge for hosting. Independent VPN providers may separately charge for access to their servers.

Стоимость: Чайка ВПН не взимает плату за создание или импорт ключа. Для собственного сервера Remnawave ключ можно создать без покупки VPN-подписки. Провайдер VPS и регистратор домена могут взимать плату за свои услуги. Независимые VPN-провайдеры могут отдельно брать плату за доступ к своим серверам.

Checks and official references

Проверка и официальные инструкции

Open the subscription URL in a browser: you should see your subscription page. If the app imports no locations, check that the node is online, the Host is visible and points to the correct address and port, the inbound is enabled in the user’s Internal Squad, and the user has not expired. For container errors, run sudo docker compose logs --tail=100 in the relevant directory.

Откройте ссылку подписки в браузере: должна появиться страница подписки. Если приложение не импортирует локации, проверьте, что нода онлайн, Host включён и указывает на верные адрес и порт, входящее подключение разрешено в Internal Squad пользователя, а срок действия пользователя не истёк. Для ошибок контейнеров выполните sudo docker compose logs --tail=100 в нужном каталоге.