URnetwork Wizard - Complete decentralized privacy network skill for creating HTTPS/SOCKS/WireGuard proxies (consumer mode) and earning rewards by providing egress bandwidth (provider mode). Use when needing anonymous internet access, setting up VPN connections, scraping through proxies, or running a provider node to earn USDC. Formerly proxy-vpn, now enriched with full official documentation.
Pro scans all 2 files and shows the line behind each finding
Scanned 9/6/2026
npx -y skills add LeoYeAI/openclaw-master-skills --skill ur-wizard --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Ur Wizard?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/leoyeai-ur-wizard)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: ur-wizard
description: URnetwork Wizard - Complete decentralized privacy network skill for creating HTTPS/SOCKS/WireGuard proxies (consumer mode) and earning rewards by providing egress bandwidth (provider mode). Use when needing anonymous internet access, setting up VPN connections, scraping through proxies, or running a provider node to earn USDC. Formerly proxy-vpn, now enriched with full official documentation.
---
# URnetwork (proxy-vpn) Skill
URnetwork is a decentralized privacy network where users can either:
1. **Consume** - Use the network for secure, anonymous internet access via HTTPS/SOCKS/WireGuard proxies
2. **Provide** - Share egress bandwidth and earn rewards (USDC payouts)
**Official Docs:** https://docs.ur.io
## Endpoints
| Service | URL |
|---------|-----|
| API | https://api.bringyour.com |
| MCP Server | https://mcp.bringyour.com |
| API Spec | https://github.com/urnetwork/connect/blob/main/api/bringyour.yml |
| Web UI | https://ur.io |
---
## Authentication
All API calls require a JWT token in the Authorization header:
```bash
# Get auth code from human (from https://ur.io web UI)
# Then exchange for JWT:
curl -X POST https://api.bringyour.com/auth/code-login \
-d '{"auth_code": "<AUTH CODE>"}' | jq ".by_jwt"
```
Store the JWT and reuse. To refresh, get a new auth code and repeat.
---
## Consumer Mode: Creating Proxies
### Proxy Types
| Use Case | Protocol | Config Source |
|----------|----------|---------------|
| **Web Scraping/Browsing** | HTTPS | `proxy_config_result.https_proxy_url` |
| **Low-level Sockets/UDP** | SOCKS5 | `proxy_config_result.socks_proxy_url` |
| **System-wide/OS Level** | WireGuard | `proxy_config_result.wg_config.config` |
**SOCKS5 Note:** Use `access_token` as username, empty password. Supports SOCKS5H (remote DNS resolution).
**WireGuard Note:** Must set `proxy_config.enable_wg: true` in the auth-client request.
### Method 1: MCP Skill (Recommended)
The MCP skill simplifies location search and proxy creation:
1. Ask user for desired location (country/region/city)
2. Search and create proxy via MCP
3. If no matches, broaden search (city → region → country)
4. If still no matches, show top 10 available countries
### Method 2: API - By Country
```bash
# Step 1: Find locations
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/find-locations \
-d '{"query": "Germany"}' | jq '.locations'
# Step 2: Note country_code (e.g., "DE")
# Step 3: Create proxy
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/auth-client \
-d '{
"proxy_config": {
"initial_device_state": {
"country_code": "DE"
}
}
}'
```
### Method 3: API - By Location ID
```bash
# Step 1: Find locations
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/find-locations \
-d '{"query": "Berlin"}' | jq '.locations'
# Step 2: Note location_id
# Step 3: Create proxy with specific location
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/auth-client \
-d '{
"proxy_config": {
"initial_device_state": {
"location": {
"connect_location_id": {
"location_id": "<LOCATION_ID>"
}
}
}
}
}'
```
### Method 4: API - Enumerate Egress IPs
For rotating through multiple providers in a location:
```bash
# Step 1-2: Get location_id as above
# Step 3: Find providers (egress IPs) for location
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/find-providers2 \
-d '{
"specs": [{"client_id": "<CLIENT_ID>"}],
"count": 10
}' | jq '.providers'
# Step 4: Create proxy for each client_id
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/auth-client \
-d '{
"proxy_config": {
"initial_device_state": {
"location": {
"connect_location_id": {
"client_id": "<CLIENT_ID>"
}
}
}
}
}'
```
### Location Types
When searching, filter by `location_type`:
| Type | Description |
|------|-------------|
| `country` | Countries |
| `region` | States, provinces, metro areas |
| `city` | Cities |
---
## Provider Mode: Earning by Sharing Bandwidth
### Advanced: Providers Through Shadowsocks Proxy
### Advanced: Providers Through SOCKS5 Proxy (Transparent Routing)
Run URnetwork providers through an upstream SOCKS5 proxy for added anonymity or to match specific egress IPs.
**Architecture:**
```
┌─────────────────────────────────────────┐
│ URnetwork Provider Container │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Provider │──│ Redsocks │────┼───▶ Upstream SOCKS5
│ │ (egress) │ │ (iptables) │ │ (residential/datacenter)
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────┘
```
**Dockerfile Setup:**
```dockerfile
FROM bringyour/community-provider:g4-latest
USER root
RUN apt-get update && apt-get install -y redsocks iptables supervisor curl
# Copy configs
COPY redsocks.conf /etc/redsocks/redsocks.conf
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY start-proxied.sh /usr/local/bin/start-proxied.sh
RUN chmod +x /usr/local/bin/start-proxied.sh
EXPOSE 80
ENTRYPOINT ["/usr/local/bin/start-proxied.sh"]
```
**redsocks.conf:**
```
base {
log_debug = off;
log_info = on;
daemon = off;
redirector = iptables;
}
redsocks {
local_ip = 0.0.0.0;
local_port = 12345;
ip = <SOCKS5_PROXY_IP>;
port = <SOCKS5_PROXY_PORT>;
type = socks5;
login = "<USERNAME>";
password = "<PASSWORD>";
}
```
**start-proxied.sh:**
```bash
#!/bin/bash
set -e
# Configure iptables to redirect all TCP through redsocks
iptables -t nat -N REDSOCKS 2>/dev/null || true
iptables -t nat -F REDSOCKS 2>/dev/null || true
# Exclude local networks and proxy server
iptables -t nat -A REDSOCKS -d <SOCKS5_PROXY_IP> -j RETURN
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
# Redirect to redsocks
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
# Start supervisor (manages redsocks + provider)
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
```
**Run Container:**
```bash
docker run --name urnetwork-proxied \
--cap-add=NET_ADMIN \
--mount type=bind,source=$HOME/.urnetwork,target=/root/.urnetwork \
--restart always \
-d urnetwork-proxied:latest
```
**Requirements:**
- `--cap-add=NET_ADMIN` (required for iptables)
- Same JWT file mounted at `/root/.urnetwork/jwt`
- Container uses supervisor to manage redsocks + provider
**Verification:**
```bash
# Check egress IP from inside container
docker exec urnetwork-proxied curl -s http://ipinfo.io/ip
# Should match your SOCKS5 proxy IP
```
**Resilience:**
- Provider auto-restarts on failure
- Redsocks auto-restarts via supervisor
- Container `--restart always` for boot persistence
- Retry wrapper handles proxy outages gracefully
---
### Standard Provider Mode: Earning by Sharing Bandwidth
### What is a Provider?
A provider shares egress capacity (internet connection) with the URnetwork. Users connect through providers to access the internet securely. Providers earn USDC payouts for participating.
**Payout Structure:**
- 10% of premium revenue + $0.10 minimum per MAU (Monthly Active User)
- Referral bonus: 50% of referred user's earnings + 50% of their referral bonus
- Payouts in USDC on Polygon or Solana
- Weekly payout sweeps
### Installation Methods
#### Option 1: One-line Install (Linux)
```bash
curl -fSsL https://raw.githubusercontent.com/urnetwork/connect/refs/heads/main/scripts/Provider_Install_Linux.sh | sh
```
Uninstall:
```bash
curl -fSsL https://raw.githubusercontent.com/urnetwork/connect/refs/heads/main/scripts/Provider_Uninstall_Linux.sh | sh
```
#### Option 2: Windows (PowerShell)
```powershell
powershell -c "irm https://raw.githubusercontent.com/urnetwork/connect/refs/heads/main/scripts/Provider_Install_Win32.ps1 | iex"
```
Uninstall:
```powershell
powershell -c "irm https://raw.githubusercontent.com/urnetwork/connect/refs/heads/main/scripts/Provider_Uninstall_Win32.ps1 | iex"
```
#### Option 3: Build from Source
```bash
mkdir urnetwork && cd urnetwork
git clone https://github.com/urnetwork/connect
git clone https://github.com/urnetwork/protocol
cd connect/provider
go build # Binary at ./provider
```
#### Option 4: Docker Container
Images: `bringyour/community-provider:g1-latest` through `g4-latest` (g4 = most stable)
```bash
# Initialize (first time)
docker run --mount type=bind,source=$HOME/.urnetwork,target=/root/.urnetwork \
bringyour/community-provider:g4-latest auth
# Run provider
docker run --mount type=bind,source=$HOME/.urnetwork,target=/root/.urnetwork \
--restart no -d bringyour/community-provider:g4-latest provide
```
### Setting Up a Provider
1. **Get auth code:**
- Visit https://ur.io
- Create/login to network
- Click "Copy an Auth Code"
2. **Authenticate:**
```bash
./provider auth
# Paste auth code when prompted
# Saved to ~/.urnetwork/jwt
```
3. **Run provider:**
```bash
./provider provide
# "Provider XXX started"
```
4. **Set up wallet in app** for payouts (USDC on Polygon/Solana)
### Running as Background Service
**Linux (systemd):**
```bash
systemctl --user start urnetwork # Start
systemctl --user stop urnetwork # Stop
systemctl --user enable urnetwork # Auto-start on login
systemctl --user disable urnetwork # Disable auto-start
```
**macOS (launchd):**
```bash
# Download launchd template from GitHub
# Edit paths and user
sudo cp urnetwork-provider.plist /Library/LaunchAgents/
sudo launchctl load /Library/LaunchAgents/urnetwork-provider.plist
sudo launchctl start /Library/LaunchAgents/urnetwork-provider.plist
# Check logs
tail -f /var/log/system.log | grep -i provider
```
**Windows:**
- Installer asks about startup programs
- Or run manually in background:
```powershell
powershell -NoProfile -WindowStyle Hidden -Command \
"Start-Process urnetwork.exe -ArgumentList 'provide' -WindowStyle Hidden"
```
### Multi-Platform Builds
Build for multiple architectures:
```bash
cd connect/provider
make build
# Outputs to:
# build/darwin/amd64/provider
# build/darwin/arm64/provider
# build/linux/amd64/provider
# build/linux/arm64/provider
# build/linux/arm/provider
# build/linux/386/provider
# build/windows/amd64/provider
# build/windows/arm64/provider
```
Or download pre-built binaries from nightly releases.
---
## Additional CLIs
| CLI | Purpose |
|-----|---------|
| `provider` | Run egress provider (earn rewards) |
| `tether` | Network interfaces and protocol servers (packet routing) |
| `bringyourctl` | Manage your own network space deployment |
| `warpctl` | Continuous deployment into network space |
---
## Trust and Safety
- Providers follow trust and safety rules
- Network is free with data cap
- Supporters get higher data cap + priority speeds
- Supports email, SMS, Google, Apple auth
- Aggressive deletion of user info after payout (1 week retention)
---
## Economic Model Summary
**For Users:**
- Free tier with data cap
- Premium: ~$5/month for higher cap + priority
**For Providers:**
- 10% of premium revenue + $0.10/MAU minimum
- Up to 20% of premium revenue paid to community
- 50% referral bonus on referred users
- Target margins: 70-80% at scale
**Company Phases:**
1. Phase 0: Build scalable network
2. Phase 1: Break-even at 4% premium conversion
3. Phase 2: Scale with fixed costs
4. Phase 3: Profitable expansion
---
## Quick Reference
**Get JWT:**
```bash
curl -X POST https://api.bringyour.com/auth/code-login \
-d '{"auth_code": "<CODE>"}' | jq ".by_jwt"
```
**Find Locations:**
```bash
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/find-locations \
-d '{"query": "Germany"}' | jq '.locations'
```
**Create Proxy:**
```bash
curl -X POST -H 'Authorization: Bearer <JWT>' \
https://api.bringyour.com/network/auth-client \
-d '{"proxy_config": {"initial_device_state": {"country_code": "DE"}}}'
```
**Install Provider:**
```bash
curl -fSsL https://raw.githubusercontent.com/urnetwork/connect/refs/heads/main/scripts/Provider_Install_Linux.sh | sh
```
---
## Router/IoT Platforms
- **Raspberry Pi:** See docs
- **Ubiquiti EdgeOS:** See docs
- **MikroTik RouterOS:** See docs
All support provider binary deployment.
### Advanced: Providers Through Shadowsocks Proxy
Run URnetwork providers through a Shadowsocks proxy for enhanced privacy or specific egress routing.
**Shadowsocks vs SOCKS5:**
- Shadowsocks uses encryption (AES-256-GCM, etc.) — harder to detect/block
- Better for bypassing firewalls (e.g., China, corporate networks)
- Slightly more overhead than plain SOCKS5
**Architecture:**
```
┌─────────────────────────────────────────┐
│ URnetwork Provider Container │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Provider │──│ ss-local │────┼───▶ Shadowsocks Server
│ │ (egress) │ │ (SOCKS5:1080)│ │ (encrypted tunnel)
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────┘
```
**Shadowsocks Config Format:**
```
Shadowsocks/proxy/server/port/method/country/password
Example:
Shadowsocks/proxy/138.249.106.2/64619/aes-256-gcm/France/NedyYDqp
```
**Dockerfile Setup:**
```dockerfile
FROM bringyour/community-provider:g4-latest
# Install shadowsocks-libev
RUN apt-get update && apt-get install -y \
shadowsocks-libev \
&& rm -rf /var/lib/apt/lists/*
# Copy config
COPY shadowsocks.json /etc/shadowsocks-libev/config.json
# Copy startup script
COPY start-shadowsocks.sh /start-shadowsocks.sh
RUN chmod +x /start-shadowsocks.sh
EXPOSE 1080
ENTRYPOINT ["/start-shadowsocks.sh"]
```
**shadowsocks.json:**
```json
{
"server": "YOURIP",
"server_port": YOURPORT,
"local_port": YOURPORT,
"local_address": "YOURIP",
"password": "YOURpass",
"timeout": 300,
"method": "YOURMETHOD"
}
```
**start-shadowsocks.sh:**
```bash
#!/bin/bash
set -e
# Start shadowsocks client
ss-local -c /etc/shadowsocks-libev/config.json &
SS_PID=$!
echo "Shadowsocks client started (PID: $SS_PID)"
# Wait for shadowsocks to be ready
sleep 3
# Verify shadowsocks is listening
if ! netstat -tlnp 2>/dev/null | grep -q ':1080' && \
! ss -tlnp 2>/dev/null | grep -q ':1080'; then
if ! pgrep -x "ss-local" > /dev/null; then
echo "ERROR: Shadowsocks not running"
exit 1
fi
fi
echo "Shadowsocks proxy ready on 127.0.0.1:1080"
# Start URnetwork provider with proxy environment
export HTTP_PROXY="socks5://127.0.0.1:1080"
export HTTPS_PROXY="socks5://127.0.0.1:1080"
export ALL_PROXY="socks5://127.0.0.1:1080"
exec /usr/local/sbin/bringyour-provider provide
```
**Build Image:**
```bash
docker build -t urnetwork-shadowsocks:latest .
```
**Run Shadowsocks Provider:**
```bash
# Create JWT directory
mkdir -p ~/.urnetwork-ss-1
echo "<JWT>" > ~/.urnetwork-ss-1/jwt
# Run container
docker run -d \
--name urnetwork-shadowsocks-1 \
--restart always \
-v ~/.urnetwork-ss-1:/root/.urnetwork \
-e WARP_ENV=community \
urnetwork-shadowsocks:latest
```
**Scale to Multiple Providers:**
```bash
JWT="<YOUR_JWT>"
for i in $(seq 1 10); do
mkdir -p ~/.urnetwork-ss-$i
echo "$JWT" > ~/.urnetwork-ss-$i/jwt
docker run -d \
--name urnetwork-shadowsocks-$i \
--restart always \
-v ~/.urnetwork-ss-$i:/root/.urnetwork \
-e WARP_ENV=community \
urnetwork-shadowsocks:latest
done
```
**Verification:**
```bash
# Check container status
docker ps --filter "name=urnetwork-shadowsocks"
# Check shadowsocks logs
docker logs urnetwork-shadowsocks-1 | grep "listening"
# Should show: "listening at 0.0.0.0:1080"
# Check provider logs
docker logs urnetwork-shadowsocks-1 | grep "Provider"
# Should show: "Provider XXX started"
```
**Common Shadowsocks Methods:**
| Method | Description |
|--------|-------------|
| `aes-256-gcm` | Recommended, hardware-accelerated |
| `aes-128-gcm` | Faster, slightly less secure |
| `chacha20-ietf-poly1305` | Good for mobile/ARM devices |
**Troubleshooting:**
- **401 Unauthorized:** URnetwork API issue (not Shadowsocks-related)
- **Connection refused:** Check Shadowsocks server IP/port
- **Method not supported:** Ensure method matches server config
---
## Quick Reference: Proxied Provider
**Build Image:**
```bash
docker build -t urnetwork-proxied:latest .
```
**Run Proxied Provider:**
```bash
docker run --name urnetwork-proxied \
--cap-add=NET_ADMIN \
--mount type=bind,source=$HOME/.urnetwork,target=/root/.urnetwork \
--restart always \
-d urnetwork-proxied:latest
```
**Verify Egress IP:**
```bash
docker exec urnetwork-proxied curl -s http://ipinfo.io/ip
```
**Files Needed:**
- `Dockerfile` - extends provider image with redsocks/iptables
- `redsocks.conf` - SOCKS5 proxy configuration
- `start-proxied.sh` - iptables setup + supervisor launch
- `supervisord.conf` - manages redsocks + provider
**Proxy Format:**
```
socks5/45.91.198.75:7778/username/password
```
---
**Quick Reference: Shadowsocks Provider**
**Build Image:**
```bash
docker build -t urnetwork-shadowsocks:latest .
```
**Run Shadowsocks Provider:**
```bash
docker run -d \
--name urnetwork-shadowsocks-1 \
--restart always \
-v ~/.urnetwork-ss-1:/root/.urnetwork \
-e WARP_ENV=community \
urnetwork-shadowsocks:latest
```
**Shadowsocks Config Format:**
```
Shadowsocks/proxy/server/port/method/country/password
Example:
Shadowsocks/proxy/138.249.106.2/64619/aes-256-gcm/France/NedyYDqp
```
**Files Needed:**
- `Dockerfile` - extends provider image with shadowsocks-libev
- `shadowsocks.json` - Shadowsocks client config
- `start-shadowsocks.sh` - starts ss-local + provider
---
## Provider Monitoring
### Quick Status Check
```bash
# All URnetwork containers
docker ps --format "table {{.Names}}\t{{.Status}}" | grep urnetwork
# Count by type
docker ps --format "{{.Names}}" | grep -c "urnetwork-provider"
docker ps --format "{{.Names}}" | grep -c "urnetwork-proxied"
docker ps --format "{{.Names}}" | grep -c "urnetwork-shadowsocks"
```
### Verify Actually Providing vs Restarting
**Check for authentication errors:**
```bash
# Count "Unauthorized" errors in logs
docker logs urnetwork-provider-1 2>&1 | grep -c "Unauthorized"
# Check recent restarts
docker ps --format "table {{.Names}}\t{{.Status}}" | grep urnetwork-provider
# "Up X minutes" = healthy, "Restarting" = auth/connection issues
```
**Check provider logs for success:**
```bash
# Good: "Provider XXX started" without errors
docker logs urnetwork-proxied-1 2>&1 | grep "Provider.*started"
# Bad: Stack traces with "401 Unauthorized"
docker logs urnetwork-provider-1 2>&1 | tail -20
```
### Provider Health Summary Script
```bash
#!/bin/bash
echo "=== URnetwork Provider Health ==="
for container in $(docker ps -a --format "{{.Names}}" | grep urnetwork | sort); do
status=$(docker ps --filter "name=$container" --format "{{.Status}}")
errors=$(docker logs $container 2>&1 | grep -c "Unauthorized" || echo "0")
if echo "$status" | grep -q "Restarting"; then
echo "❌ $container: $status (Errors: $errors)"
else
echo "✅ $container: $status"
fi
done
```
---
## Multi-VPS Deployment
### Architecture Pattern
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ VPS 1 (Host) │ │ VPS 2 (DE) │ │ VPS 3 (US) │
│ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Providers │ │ │ │ Providers │ │ │ │ Providers │ │
│ │ (10 reg) │ │ │ │ (10 reg) │ │ │ │ (10 reg) │ │
│ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │
│ ┌───────────┐ │ │ │ │ │
│ │ Proxied │ │ │ │ │ │
│ │ (10 sock) │ │ │ │ │ │
│ └───────────┘ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└────────────────────┴────────────────────┘
│
Single JWT on each VPS
/root/.urnetwork/jwt
```
### Deployment Steps
**1. Prepare JWT on Host VPS:**
```bash
# Host VPS (source of truth)
mkdir -p /root/.urnetwork
echo "<VALID_JWT>" > /root/.urnetwork/jwt
```
**2. Deploy to Remote VPS:**
```bash
VPS_IP="YOURIP"
VPS_USER="YOURuser"
VPS_PASS="YOURpassword"
# Copy JWT to remote
sshpass -p "$VPS_PASS" scp /root/.urnetwork/jwt $VPS_USER@$VPS_IP:/home/$VPS_USER/.urnetwork/jwt
# SSH and create /root/.urnetwork (if needed)
sshpass -p "$VPS_PASS" ssh $VPS_USER@$VPS_IP 'sudo mkdir -p /root/.urnetwork && sudo cp /home/'$VPS_USER'/.urnetwork/jwt /root/.urnetwork/jwt'
# Launch providers on remote
sshpass -p "$VPS_PASS" ssh $VPS_USER@$VPS_IP '
for i in $(seq 1 10); do
docker run -d --name urnetwork-provider-vps-$i \
-v /root/.urnetwork:/root/.urnetwork \
--restart always \
bringyour/community-provider:g4-latest provide
done
'
```
**3. Scale Pattern:**
```bash
# Launch N providers on current host
launch_providers() {
local count=$1
local prefix=$2
for i in $(seq 1 $count); do
docker run -d --name ${prefix}-$i \
-v /root/.urnetwork:/root/.urnetwork \
--restart always \
bringyour/community-provider:g4-latest provide
done
}
# Usage
launch_providers 10 "urnetwork-provider"
launch_providers 10 "urnetwork-proxied"
```
---
## Troubleshooting Guide
### 401 Unauthorized Errors
**Symptoms:**
- Container status shows "Restarting"
- Logs contain: `"401 Unauthorized: Not authorized"`
- Provider never stays up for more than a few seconds
**Causes & Fixes:**
| Cause | Fix |
|-------|-----|
| JWT expired | Get fresh auth code from https://ur.io |
| JWT malformed | Re-copy JWT, ensure no extra whitespace |
| Wrong JWT location | Verify mounted at `/root/.urnetwork/jwt` |
| JWT permissions | Ensure readable: `chmod 644 /root/.urnetwork/jwt` |
**Quick Fix:**
```bash
# 1. Get new auth code from https://ur.io
# 2. Exchange for JWT
curl -X POST https://api.bringyour.com/auth/code-login \
-d '{"auth_code": "YOUR_CODE"}' | jq -r ".by_jwt" > /root/.urnetwork/jwt
# 3. Restart all providers
docker restart $(docker ps -q --filter "name=urnetwork")
```
### Restart Loops
**Check restart count:**
```bash
docker ps --format "table {{.Names}}\t{{.Status}}" | grep urnetwork
```
**Common causes:**
| Pattern | Likely Cause | Solution |
|---------|--------------|----------|
| Restarting every 5-10s | 401 Unauthorized | Refresh JWT |
| Restarting every 30s | Proxy connection issue | Check SOCKS5/Shadowsocks server |
| Up for hours then restart | Network instability | Check `--restart always` is set |
**Debug restart loop:**
```bash
# Watch real-time logs
docker logs -f urnetwork-provider-1
# Check exit code
docker inspect urnetwork-provider-1 --format='{{.State.ExitCode}}'
```
### Proxy Connection Issues (Proxied Providers)
**Symptoms:**
- Shadowsocks logs show connection refused
- Redsocks can't connect to upstream
- Egress IP doesn't match expected proxy IP
**Diagnose:**
```bash
# Test SOCKS5 proxy manually
curl -x socks5://username:password@proxy_ip:port http://ipinfo.io/ip
# Check shadowsocks is listening
docker exec urnetwork-shadowsocks-1 ss -tlnp | grep 1080
# Verify iptables rules (for proxied containers)
docker exec urnetwork-proxied-1 iptables -t nat -L REDSOCKS
```
**Fix proxy config:**
```bash
# Update shadowsocks.json and rebuild
docker build -t urnetwork-shadowsocks:latest .
docker restart urnetwork-shadowsocks-{1..10}
```
### Container Won't Start
**Check:**
```bash
# Port conflicts
docker logs urnetwork-provider-1 2>&1 | grep "bind"
# Mount issues
docker logs urnetwork-provider-1 2>&1 | grep "mount"
# Disk space
df -h
# Docker daemon
docker system info
```
### Mass Operations
**Restart all providers:**
```bash
docker restart $(docker ps -q --filter "name=urnetwork")
```
**Stop all providers:**
```bash
docker stop $(docker ps -q --filter "name=urnetwork")
```
**Remove all providers (destructive):**
```bash
docker rm -f $(docker ps -aq --filter "name=urnetwork")
```
**View all logs:**
```bash
for c in $(docker ps --format "{{.Names}}" | grep urnetwork); do
echo "=== $c ==="
docker logs $c 2>&1 | tail -5
done
```
---
**Full docs:** https://docs.ur.io
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!