first commit

This commit is contained in:
Mateusz Gruszczyński
2026-05-02 20:45:07 +02:00
commit 7922e2ad93
9 changed files with 871 additions and 0 deletions

143
README.md Normal file
View File

@@ -0,0 +1,143 @@
# 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. |