- Linux-сервер (любой современный дистрибутив). Примеры ниже используют
aptдля Debian/Ubuntu. - Docker и плагин Docker Compose.
- Node.js 20+ / npm - frontend собирается на хосте, а не внутри Docker.
- Для интеграции с Remnawave: рабочий экземпляр Remnawave и API-токен для него (опционально — можно работать в автономном режиме).
- Для production: домен (два имени, например
olcwave.example.orgиolcsub.example.org), указывающий на сервер. Caddy автоматически получает для них HTTPS-сертификаты.
API-контейнер взаимодействует с Docker daemon хоста через:
/var/run/docker.sock
- так он запускает OLCRTC-контейнеры.
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now dockerПроверка:
docker --version
docker compose versionЕсли вы хотите запускать docker без sudo, добавьте пользователя в группу docker и перезайдите:
sudo usermod -aG docker "$USER"# Debian/Ubuntu - NodeSource
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version # v20+git clone https://github.com/invdevv/olcwave.git
cd olcwavecd backend/olcrtc
docker build . --tag olcrtc
cd ../.. cd backend/xraycore
docker build . --tag xraycore
docker run -d --name olcwave-xraycore xraycore
docker stop olcwave-xraycore
cd ../.. cp backend/.env.example backend/.env
nano backend/.envВсе переменные описаны в configuration.md.
Выберите режим работы:
# Автономный режим (без Remnawave)
RW_ENABLED=false
# Интеграция с Remnawave
# RW_ENABLED=true
# RW_API_URL=https://your-remnawave-host
# RW_API_TOKEN=...Переменные, которые обязательно нужно изменить перед первым запуском:
POSTGRES_PASSWORD=<something strong>
ADMIN_USERNAME=admin
ADMIN_PASSWORD=<something strong>
JWT_SECRET_KEY=<random string> # openssl rand -hex 32Примечание:
backend/.envпередается в API-контейнер во время запуска черезenv_fileвdocker-compose.yaml(он не встраивается в образ - находится в.dockerignore). Если позже изменить файл, достаточно перезапустить API:docker compose up -d api
cp frontend/.env.example frontend/.env
$EDITOR frontend/.env# Куда браузер обращается для API backend.
# Caddy обслуживает SPA и API через один домен и удаляет префикс /api,
# поэтому здесь указывается <домен панели>/api:
VITE_API_URL=https://olcwave.example.org/api
# Ссылка подписки, отображаемая/копируемая в UI.
# {uuid} заменяется для каждого пользователя.
VITE_SUB_URL_TEMPLATE=https://olcsub.example.org/{uuid}Эти значения встраиваются в собранный JavaScript во время сборки (шаг 7).
Изменили их -> пересоберите frontend.
Caddy раздает статические файлы из:
frontend/dist
subscriptionPage/dist
поэтому сборка выполняется один раз на хосте:
cd frontend
npm ci
npm run build # создает frontend/dist
cd ..
cd subscriptionPage
npm ci
npm run build # создает subscriptionPage/dist
cd ..Конфигурация Caddy находится в шаблоне:
caddy/Caddyfile.template
При запуске install.sh он автоматически генерирует caddy/Caddyfile из шаблона, подставляя ваши домены.
При ручной настройке скопируйте шаблон и замените плейсхолдеры:
cp caddy/Caddyfile.template caddy/CaddyfileОтредактируйте caddy/Caddyfile, заменив {{PANEL_DOMAIN}} и {{SUB_DOMAIN}} на свои домены.
Итоговый файл будет выглядеть так:
olcwave.example.org {
handle_path /api/* {
reverse_proxy api:8000
}
handle {
root * /srv/frontend/dist
try_files {path} /index.html
file_server
}
}
olcsub.example.org {
@check path_regexp check ^/(?P<id>[^/]+)/check$
handle @check {
rewrite * /sub/{re.id}/check
reverse_proxy api:8000
}
@browser header_regexp browser User-Agent (?i)^Mozilla/
handle @browser {
root * /srv/subscriptionPage/dist
try_files {path} /index.html
file_server
}
handle {
rewrite * /sub{uri}
reverse_proxy api:8000
}
}olcwave.example.orgобслуживает SPA панели и проксирует/api/*в backend, удаляя префикс/api.olcsub.example.orgобрабатывает три типа запросов:GET /<uuid>/check— проверка существования подписки (проксируется в/sub/<uuid>/check);- Браузерные запросы — обслуживает SPA страницы подписки;
- Все остальное (OLCBox, curl) — возвращает raw-текст подписки.
Compose публикует порты:
80
443
Они нужны Caddy для автоматического HTTPS на настоящих доменах.
Если нужен только обычный HTTP для быстрого тестирования, используйте:
:80 {
handle_path /api/* {
reverse_proxy api:8000
}
handle {
root * /srv/frontend/dist
try_files {path} /index.html
file_server
}
}В таком режиме Caddy работает через HTTP без сертификатов.
docker compose up -dБудут запущены три контейнера:
olcwave-postgres- база данныхolcwave-api- FastAPI backend (ждет, пока PostgreSQL станет готов)olcwave-caddy- reverse proxy + сервер статических файлов
Backend автоматически создает таблицы базы данных при первом запуске.
Отдельный шаг миграции пока не требуется.
Caddy использует два Docker volume для хранения данных:
caddy_data— сертификаты TLS/ACME;caddy_config— директория конфигурации API.
docker psВы должны увидеть:
olcwave-postgres
olcwave-api
olcwave-caddy
Все должны иметь статус:
Up
Если routing включён, также будет запущен olcwave-xraycore.
Проверить логи API:
docker compose logs -f apiПосле этого вашу панель и войдите используя:
ADMIN_USERNAME
ADMIN_PASSWORD
из:
backend/.env
Есть файл:
docker-compose-dev.yaml
который запускает только:
- PostgreSQL;
- API.
Без Caddy.
Для локальной разработки обычно проще запускать backend и frontend напрямую на хосте.
См. development.md.
git pull
cd frontend && npm ci && npm run build && cd ..
cd subscriptionPage && npm ci && npm run build && cd ..
cd backend/olcrtc && docker build . --tag olcrtc --no-cache && cd ../..
cd backend/xraycore && docker build . --tag xraycore --no-cache && docker run -d --name olcwave-xraycore xraycore && docker stop olcwave-xraycore && cd ../..
docker compose up -d --buildЧто происходит:
- frontend пересобирается, если он изменился;
- API image пересобирается;
- контейнеры перезапускаются.
Если изменился только:
backend/.env
пересборка не нужна.
Файл читается при старте контейнера, поэтому достаточно:
docker compose up -d api