Files
free-turn-proxy/docs/deploy.md
T
samosvalishe f1b047e9e5 feat: Client ID шлётся всегда, симметричный wire авторизации
Клиент всегда отправляет Client ID первой DTLS app-record, сервер
всегда читает. Флаг -auth и URI-параметр auth удалены — рассинхрон
client/server невозможен. -clients-file на сервере включает только
проверку ID по allowlist clients.json.

Также:
- clients.json и client_config.json пишутся с правами 0o600
- исправлены все находки golangci-lint (errcheck, gosec, govet shadow)

Примечание: удалён флаг -auth и URI-параметр auth; Client ID теперь
всегда в первой записи туннеля — старые клиенты/серверы несовместимы.
2026-05-25 00:33:26 +03:00

161 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Развёртывание сервера
Для работы сервера 24/7 его необходимо настроить как службу. У вас есть два пути: **Docker** (рекомендуется) или классический **systemd**.
> [!TIP]
> **Автоматическая установка**
> Проще всего развернуть сервер с помощью интерактивного скрипта (выполнит установку Docker/systemd, настройку файрвола и обфускации):
> ```bash
> curl -fsSL https://raw.githubusercontent.com/samosvalishe/free-turn-proxy/master/scripts/install-server.sh -o install-server.sh
> sudo bash install-server.sh
> ```
> Скрипт идемпотентен: **повторный запуск** обнаружит существующую установку и предложит меню — *обновить версию* (конфиг и ключ сохраняются), *переконфигурировать* или *удалить*. При установке можно выбрать конкретную версию релиза или `latest`.
>
> Если вы хотите всё настроить руками — следуйте инструкциям ниже.
---
## Подготовка: Ключ обфускации
Если вы настраиваете всё вручную, сгенерируйте общий 64-символьный hex-ключ. Он должен совпадать на сервере и клиенте:
```bash
openssl rand -hex 32
```
*Скопируйте ключ — далее в примерах он обозначен как `<ВАШ_КЛЮЧ>`.*
---
## Способ 1: Docker Compose (Рекомендуется)
1. Установите Docker, если его еще нет:
```bash
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
```
2. Создайте директорию проекта и файл `docker-compose.yml`:
```bash
mkdir -p /opt/free-turn-proxy && cd /opt/free-turn-proxy
nano docker-compose.yml
```
3. Вставьте конфиг (замените порты и `<ВАШ_КЛЮЧ>` на свои):
```yaml
services:
free-turn-proxy:
image: ghcr.io/samosvalishe/free-turn-proxy:latest
container_name: free-turn-proxy
network_mode: "host" # Важно для прямого доступа к локальному WireGuard (127.0.0.1:51820)
restart: unless-stopped
environment:
- CONNECT_ADDR=127.0.0.1:51820 # Порт ВАШЕГО VPN (WG/AmneziaWG/Xray)
- LISTEN_ADDR=0.0.0.0:56000 # Внешний порт, к которому будет подключаться клиент
- MODE=udp # udp для WG/Amnezia, tcp для Xray/VLESS
- OBF_PROFILE=rtpopus # Обязательная маскировка
- OBF_KEY=<ВАШ_КЛЮЧ> # Ваш сгенерированный 64-hex ключ
# Раскомментируйте ниже, чтобы включить авторизацию по Client ID
# - CLIENTS_FILE=/opt/free-turn-proxy/clients.json
# volumes:
# - /opt/free-turn-proxy/clients.json:/opt/free-turn-proxy/clients.json
```
4. Запустите контейнер:
```bash
docker compose up -d
```
*Посмотреть логи: `docker compose logs -f`*
---
## Способ 2: systemd (Без Docker)
1. Скачайте бинарник в `/opt/free-turn-proxy`:
```bash
sudo mkdir -p /opt/free-turn-proxy
sudo curl -L -o /opt/free-turn-proxy/server https://github.com/samosvalishe/free-turn-proxy/releases/latest/download/server-linux-amd64
sudo chmod +x /opt/free-turn-proxy/server
```
*(Для ARM-сервера замените `-amd64` на `-arm64`)*
2. Создайте файл службы:
```bash
sudo nano /etc/systemd/system/free-turn-proxy.service
```
3. Вставьте конфиг (замените порты и `<ВАШ_КЛЮЧ>` на свои):
```ini
[Unit]
Description=Free TURN Proxy Server
After=network.target
[Service]
Type=simple
# Укажите ваши порты и ключ обфускации.
# Для авторизации по Client ID добавьте: -clients-file /opt/free-turn-proxy/clients.json
ExecStart=/opt/free-turn-proxy/server -listen 0.0.0.0:56000 -connect 127.0.0.1:51820 -obf-profile rtpopus -obf-key <ВАШ_КЛЮЧ>
Restart=always
RestartSec=5
User=nobody
Group=nogroup
[Install]
WantedBy=multi-user.target
```
*(Примечание: `User=nobody` не может биндить порты < 1024 — используйте внешний порт > 1024)*
4. Запустите службу и добавьте в автозагрузку:
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now free-turn-proxy.service
```
*Статус: `sudo systemctl status free-turn-proxy.service`*
---
## Настройка Файрвола
Откройте внешний порт. Сервер слушает по **UDP** (DTLS-over-UDP), даже если вы используете `MODE=tcp` для Xray:
```bash
# Для UFW (Ubuntu/Debian)
sudo ufw allow 56000/udp
# Либо через iptables напрямую
sudo iptables -I INPUT -p udp --dport 56000 -j ACCEPT
sudo netfilter-persistent save # если установлен
```
---
## Авторизация по Client ID (Опционально)
По умолчанию любой клиент с верным `-obf-key` может релеить трафик. Чтобы ограничить доступ конкретным списком клиентов, включите авторизацию.
1. Создайте пустой список на сервере:
```bash
echo "[]" | sudo tee /opt/free-turn-proxy/clients.json
```
2. Включите авторизацию:
- **В Docker:** раскомментируйте переменные `CLIENTS_FILE` и `volumes` в `docker-compose.yml`, затем выполните `docker compose up -d`.
- **В systemd:** добавьте флаг `-clients-file /opt/free-turn-proxy/clients.json` в `ExecStart`, затем `systemctl daemon-reload && systemctl restart free-turn-proxy`.
3. Управляйте клиентами (см. раздел [Управление Client ID в flags.md](flags.md#управление-client-id-команды-сервера)).
4. На клиенте задайте `-client-id <id>` (либо используйте автогенерируемый) и добавьте этот ID в `clients.json` на сервере. Клиент отправляет ID автоматически.
---
## Справка: Переменные окружения для Docker
Если вы запускаете через голый `docker run`, вам пригодятся эти переменные (аналогичны флагам бинарника):
| Переменная | По умолчанию | Описание |
| --- | --- | --- |
| `CONNECT_ADDR` | **обязательна** | IP и порт вашего VPN (бэкенда) |
| `LISTEN_ADDR` | `0.0.0.0:56000` | Внешний адрес прослушивания |
| `MODE` | `udp` | Режим туннеля: `udp` (для WG/Amnezia) \| `tcp` (для Xray/VLESS) |
| `OBF_PROFILE` | `none` | Значение `-obf-profile`: `none` \| `rtpopus` |
| `OBF_KEY` | пусто | Значение `-obf-key` (обязателен при `OBF_PROFILE != none`) |
| `CLIENTS_FILE`| пусто | Путь к JSON-файлу (`/opt/free-turn-proxy/clients.json`) для авторизации |
| `DEBUG` | `false` | Включает debug-логи (`true` / `false`) |
> **Внимание при Bridge Mode:** Если вы уберете `network_mode: "host"` и пробросите порты через `-p 56000:56000/udp`, то `CONNECT_ADDR=127.0.0.1:51820` будет указывать **внутрь** контейнера Docker. В таком случае прокси не найдет ваш WireGuard. Используйте IP хоста в `CONNECT_ADDR` или оставляйте `network_mode: "host"`.