Complete SSH, VMess, and Outline VPN management panel with all bugs fixed.
✅ SSH User Management
- Create/Delete SSH accounts
- Set expiry dates and connection limits
- Real-time online/offline status detection (FIXED)
- Active connection count per user
- Custom SSH banner with ANSI colors
✅ VMess Management (Xray)
- Create VMess users with WebSocket
- Port 80 support (HTTP) (FIXED)
- Port 443 support (HTTPS/TLS)
- Auto-generate UUID and QR codes
- Config export
✅ Outline VPN Management
- Create Shadowsocks users
- Auto-start with systemd services (FIXED)
- Correct binding to 0.0.0.0 (FIXED)
- Sequential port assignment (8388+)
- Access key generation with QR codes
Problem: Certbot HTTPS redirect blocked /ws endpoint on port 80
Fix: Nginx config now bypasses HTTPS redirect for /ws path:
location /ws {
# Direct proxy to Xray, no redirect
proxy_pass http://127.0.0.1:10000;
}Problem: Shadowsocks binding to 127.0.0.1 instead of 0.0.0.0
Fix: Service binds to all interfaces:
ExecStart=/usr/bin/ss-server -s 0.0.0.0 -p $PORT ...Problem: Connection stats not attached to user objects
Fix: Route now attaches stats dynamically:
for user in all_users:
stats = user_stats.get(user.username, {...})
user.is_online = (stats['status'] == 'online')
user.device_count = stats['device_count']- Fresh Ubuntu 20.04/22.04 VPS
- Root access
- Domain pointing to VPS IP
- Ports 22, 80, 443 open
One-line installation (recommended):
curl -sL https://raw.githubusercontent.com/yannaing86tt/ssh-panel/main/install-no-ssl.sh | bashAlternative - Git clone:
git clone https://github.com/yannaing86tt/ssh-panel.git
cd ssh-panel
bash install-no-ssl.shInstallation takes 5-7 minutes. Zero prompts, fully automatic!
After installation:
- Domain name (e.g., ssh.example.com)
- Email for SSL certificate
- Python 3 + virtualenv
- Nginx (reverse proxy)
- Xray (VMess core)
- Shadowsocks-libev (Outline VPN)
- Certbot (SSL certificates)
- UFW firewall rules
Protocol: VMess
Address: [YOUR_VPS_IP]
Port: 80 (HTTP) or 443 (HTTPS)
Network: WebSocket (ws)
Path: /ws
TLS: none (port 80) or tls (port 443)
Method: chacha20-ietf-poly1305
Server: [YOUR_VPS_IP]
Ports: 8388, 8389, 8390... (sequential)
Binding: 0.0.0.0 (all interfaces)
Port: 22
Auth: Password
Shell: /bin/bash
Banner: Custom ANSI banner
- Access panel:
https://your-domain.com - Login with generated admin credentials
- Credentials saved at:
/root/ssh-panel-credentials.txt
- Go to "SSH Users" page
- Click "Create"
- Set username, password, expiry, max connections
- User can connect via:
ssh username@your-domain.com
- Go to "VMess Users" page
- Click "Create"
- Enter name, expiry date
- Scan QR code or copy link
- Import to v2rayNG/v2rayN client
- Go to "Outline VPN" page
- Click "Create"
- Enter name, expiry date
- Scan QR code or copy access key
- Import to Outline client
- Check Nginx config:
/etc/nginx/sites-available/ssh-panel - Verify /ws location block exists
- Test:
curl -I http://your-domain.com/wsshould NOT redirect
- Check service:
systemctl status shadowsocks-outline-8388 - Verify binding:
ss -tulnp | grep 8388should show0.0.0.0:8388 - Check firewall:
ufw status | grep 8388
- Refresh page after connecting
- Check function: Route attaches connection stats
- Verify SSH session:
ps aux | grep "sshd: username"
/opt/ssh-panel/
├── app.py # Main Flask application
├── models.py # Database models
├── requirements.txt # Python dependencies
├── templates/ # HTML templates
├── static/ # CSS/JS assets
├── scripts/ # Management scripts
│ ├── manage_ssh_user.sh
│ ├── manage_vmess_user.sh
│ └── manage_outline_user.sh
├── venv/ # Python virtual environment
└── instance/
└── ssh_panel.db # SQLite database
/etc/nginx/sites-available/
└── ssh-panel # Nginx reverse proxy config
/etc/systemd/system/
├── ssh-panel.service # Panel service
└── shadowsocks-outline-*.service # Outline services
/usr/local/etc/xray/
└── config.json # Xray VMess config
# Panel
systemctl status ssh-panel
systemctl restart ssh-panel
# VMess
systemctl status xray
systemctl restart xray
# Outline (per-user)
systemctl status shadowsocks-outline-8388
systemctl restart shadowsocks-outline-8388
# Nginx
systemctl status nginx
systemctl reload nginx# Panel logs
journalctl -u ssh-panel -f
# Xray logs
journalctl -u xray -f
# Outline logs
journalctl -u shadowsocks-outline-8388 -f
# Nginx logs
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log- Admin password is randomly generated (22 characters)
- SSL/TLS enabled by default (Let's Encrypt)
- UFW firewall configured
- SSH password authentication enabled (required for panel)
- All services run with minimal privileges
For issues or questions, check:
- Service status:
systemctl status [service] - Logs:
journalctl -u [service] -n 50 - Nginx config:
nginx -t - Database:
/opt/ssh-panel/instance/ssh_panel.db
- ✅ Fixed VMess port 80 (Nginx /ws bypass)
- ✅ Fixed Outline auto-start (systemd + 0.0.0.0 binding)
- ✅ Fixed SSH online detection (stats attachment)
- ✅ Production-ready installer
- Initial release with all three features
- Known bugs (now fixed in v5)
Free to use for personal and commercial purposes.