144 lines
3.4 KiB
Markdown
144 lines
3.4 KiB
Markdown
# rtorrent-scgi-proxy
|
|
|
|
Mały broker SCGI -> SCGI dla rTorrenta. Zachowuje protokół SCGI, sprawdza token w ścieżce, ogranicza źródłowy adres IP/CIDR i przekazuje request do lokalnego backendu rTorrent.
|
|
|
|
Repozytorium: https://git.linuxiarz.pl/gru/rtorrent-scgi-proxy
|
|
|
|
Szybkie pobranie:
|
|
|
|
```sh
|
|
git clone https://git.linuxiarz.pl/gru/rtorrent-scgi-proxy.git
|
|
cd rtorrent-scgi-proxy/bin
|
|
```
|
|
|
|
Archiwum:
|
|
|
|
```sh
|
|
wget https://git.linuxiarz.pl/gru/rtorrent-scgi-proxy/archive/main.tar.gz -O rtorrent-scgi-proxy.tar.gz
|
|
```
|
|
|
|
## Jak to działa
|
|
|
|
Klient łączy się po SCGI do proxy, np.:
|
|
|
|
```text
|
|
scgi://10.10.110.11:5050/proxy/TWOJ_TOKEN
|
|
```
|
|
|
|
Proxy:
|
|
|
|
1. sprawdza IP klienta przez `ALLOW_NET`,
|
|
2. sprawdza token ze ścieżki `/proxy/<TOKEN>`,
|
|
3. przepisuje `REQUEST_URI` na `/RPC2`,
|
|
4. forwarduje request do lokalnego rTorrenta po TCP albo unix sockecie.
|
|
|
|
## Konfiguracja
|
|
|
|
Plik env dla systemd:
|
|
|
|
```sh
|
|
/etc/rtorrent-scgi-proxy.env
|
|
```
|
|
|
|
Przykład:
|
|
|
|
```sh
|
|
LISTEN_ADDR=10.10.110.11:5050
|
|
TOKEN=change-me-long-random-token
|
|
TARGET_NETWORK=tcp
|
|
TARGET_ADDRESS=127.0.0.1:5000
|
|
TARGET_URI=/RPC2
|
|
ALLOW_NET=10.10.0.0/16
|
|
READ_TIMEOUT=15s
|
|
WRITE_TIMEOUT=30s
|
|
DIAL_TIMEOUT=5s
|
|
MAX_HEADER_BYTES=65536
|
|
MAX_CONTENT_BYTES=10485760
|
|
```
|
|
|
|
Backend przez unix socket:
|
|
|
|
```sh
|
|
TARGET_NETWORK=unix
|
|
TARGET_ADDRESS=/run/rtorrent/rtorrent.sock
|
|
```
|
|
|
|
## Budowa i testy
|
|
|
|
```sh
|
|
cd bin
|
|
go test ./...
|
|
./scripts/build.sh
|
|
```
|
|
|
|
Wynik:
|
|
|
|
```text
|
|
dist/rtorrent-scgi-proxy-linux-amd64
|
|
```
|
|
|
|
Cross-build:
|
|
|
|
```sh
|
|
GOOS=linux GOARCH=arm64 ./scripts/build.sh
|
|
```
|
|
|
|
## Instalacja przez systemd
|
|
|
|
```sh
|
|
cd bin
|
|
sudo ./scripts/install.sh
|
|
sudo nano /etc/rtorrent-scgi-proxy.env
|
|
sudo systemctl enable --now rtorrent-scgi-proxy
|
|
sudo systemctl status rtorrent-scgi-proxy
|
|
```
|
|
|
|
Ręcznie:
|
|
|
|
```sh
|
|
sudo useradd --system --no-create-home --shell /usr/sbin/nologin rtproxy
|
|
sudo install -m 0755 dist/rtorrent-scgi-proxy-linux-amd64 /usr/local/bin/rtorrent-scgi-proxy
|
|
sudo install -m 0644 systemd/rtorrent-scgi-proxy.service /etc/systemd/system/rtorrent-scgi-proxy.service
|
|
sudo install -m 0600 examples/rtorrent-scgi-proxy.env /etc/rtorrent-scgi-proxy.env
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now rtorrent-scgi-proxy
|
|
```
|
|
|
|
## Wrzucenie do repo
|
|
|
|
Z katalogu głównego repo:
|
|
|
|
```sh
|
|
git add bin
|
|
git commit -m "Add rTorrent SCGI proxy binary project"
|
|
git push origin main
|
|
```
|
|
|
|
## Bezpieczeństwo
|
|
|
|
Nie wystawiaj tego publicznie bez dodatkowej ochrony. Zalecane minimum:
|
|
|
|
- `ALLOW_NET` ustawione na prywatną podsieć/VPN,
|
|
- długi losowy `TOKEN`,
|
|
- firewall na porcie `LISTEN_ADDR`,
|
|
- najlepiej WireGuard albo inny prywatny tunel,
|
|
- rTorrent SCGI tylko lokalnie: `127.0.0.1` albo unix socket.
|
|
|
|
SCGI nie ma wbudowanego TLS ani auth. Ten proxy dodaje prostą autoryzację tokenem i allowlistę IP, ale nie zastępuje VPN/TLS.
|
|
|
|
## Zmienne środowiskowe
|
|
|
|
| Zmienna | Domyślnie | Opis |
|
|
|---|---:|---|
|
|
| `LISTEN_ADDR` | `127.0.0.1:5050` | Adres nasłuchu proxy. |
|
|
| `TOKEN` | brak | Wymagany token w ścieżce `/proxy/<TOKEN>`. |
|
|
| `TARGET_NETWORK` | `tcp` | `tcp` albo `unix`. |
|
|
| `TARGET_ADDRESS` | `127.0.0.1:5000` | Lokalny backend rTorrent SCGI. |
|
|
| `TARGET_URI` | `/RPC2` | URI przekazywane do rTorrenta. |
|
|
| `ALLOW_NET` | `127.0.0.1` | Dozwolony IP, CIDR, lista po przecinku albo `*`. |
|
|
| `READ_TIMEOUT` | `15s` | Timeout czytania klienta. |
|
|
| `WRITE_TIMEOUT` | `30s` | Timeout zapisu/odpowiedzi. |
|
|
| `DIAL_TIMEOUT` | `5s` | Timeout połączenia z backendem. |
|
|
| `MAX_HEADER_BYTES` | `65536` | Limit nagłówków SCGI. |
|
|
| `MAX_CONTENT_BYTES` | `10485760` | Limit body XML-RPC. |
|