βοΈ server.toml example (in the same folder)
[server]
bind_addr = "0.0.0.0:2333"
default_token = "YOUR_SUPER_SECRET_TOKEN"
[server.services]
# Services are dynamically registered by clients
Docker compose
version: '3.8'
services:
rathole-server:
image: rapiz1/rathole:latest
container_name: rathole-server
restart: unless-stopped
command:
- rathole-server
- -c
- /etc/rathole/config.toml
volumes:
- ./server.toml:/etc/rathole/config.toml:ro
ports:
- "2333:2333"
- "9000-9999:9000-9999"
environment:
- RUST_LOG=info
deploy:
resources:
limits:
memory: 50M
cpus: '0.20'
πΎ client-template.toml (Template for client config)
[client]
server_addr = "frp.mydomain.com:2333"
default_token = "YOUR_SUPER_SECRET_TOKEN"
tls_name = "frp.mydomain.com"
[client.services]
[client.services.SERVICE_NAME]
local_addr = "127.0.0.1:PORT"
β Will dynamically replace SERVICE_NAME and PORT via script. π₯ start-tunnel.sh (Simple bash script to start tunnels with random ID)
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Usage: $0 <local-port>"
exit 1
fi
LOCAL_PORT=$1
RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1)
cp client-template.toml temp-client.toml
sed -i "s/SERVICE_NAME/${RANDOM_ID}/g" temp-client.toml
sed -i "s/PORT/${LOCAL_PORT}/g" temp-client.toml
echo "Starting tunnel..."
echo "Subdomain: ${RANDOM_ID}.frp.mydomain.com (needs NPM rule!)"
rathole-client -c temp-client.toml
β Script generates:
A random tunnel ID
Creates a temp-client.toml
Runs rathole-client
Connects your app
π Client Usage Example
Suppose you have an app on port 3000:
./start-tunnel.sh 3000
Terminal output:
Starting tunnel...
Subdomain: f93k2lsd.frp.mydomain.com (needs NPM mapping)
Done! Your app is now reachable at:
https://f93k2lsd.frp.mydomain.com
β Ultra fast β Super tiny RAM footprint β Fully self-hosted β Wildcard SSL via NPM
π Nginx Proxy Manager Setup:
β Create a Wildcard SSL Cert for *.frp.mydomain.com β Create a Wildcard Proxy Host:
Domain: *.frp.mydomain.com
Forward IP: your VPS IP or Docker IP
Forward Port: 9000-9999 range (dynamic)
Websockets: enabled β
SSL: Force HTTPS β
β‘ Final Summary Feature Status RAM Usage ~10MB server, ~5MB per client Subdomains Random, client-generated Authentication Secret token SSL NPM Wildcard Cert Ease of Use One-liner script π