No description
- JavaScript 49.2%
- Python 48%
- Dockerfile 2.1%
- HTML 0.6%
- CSS 0.1%
| backend | ||
| frontend | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
SSH Tunnel Manager
Selbst-gehosteter SSH Tunnel Manager mit automatischem Docker-Deployment und Benutzerverwaltung.
Quick Start
1. Vorbereitung
# .env Datei erstellen
cp .env.example .env
# SECRET_KEY generieren
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
# SERVER_IP anpassen
nano .env
2. Deployment
Docker Socket Permissions prüfen:
# Docker GID herausfinden (falls du group_add nutzen willst)
getent group docker
# Permissions auf Socket setzen (Alternative)
sudo chmod 666 /var/run/docker.sock # ACHTUNG: Weniger sicher!
# Mit Docker Compose (empfohlen)
docker-compose up -d
# Oder manuell bauen
docker build -t tunnel-manager .
docker run -d \
--name tunnel-manager \
--user root \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v tunnel-data:/var/lib/tunnel-manager \
--env-file .env \
tunnel-manager
3. Zugriff
URL: http://your-server-ip:8000
Default Login: admin / admin123
WICHTIG: Ändere sofort das Admin-Passwort!
Projekt-Struktur
.
├── backend/
│ ├── main.py # FastAPI Backend
│ └── requirements.txt # Python Dependencies
├── frontend/
│ ├── src/
│ │ ├── App.jsx # React App
│ │ ├── main.jsx
│ │ └── index.css
│ ├── index.html
│ ├── package.json
│ ├── vite.config.js
│ └── tailwind.config.js
├── Dockerfile # Multi-Stage Build
├── docker-compose.yml
├── .env.example
└── README.md
Konfiguration
Umgebungsvariablen
SERVER_IP: Öffentliche IP/Domain deines ServersSECRET_KEY: Zufälliger Secret Key für JWT
# Generate the SECRET_KEY with this
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
ACCESS_TOKEN_EXPIRE_MINUTES: Token-Gültigkeit (Standard: 1440 = 24h)TUNNEL_DATA_DIR: Daten-Verzeichnis für Tunnels
Benutzerverwaltung
Ersten Admin-User ändern
Nach dem Login als Admin:
- Erstelle neuen Admin-User über API:
curl -X POST http://localhost:8000/api/users \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "newadmin",
"password": "secure-password",
"is_admin": true
}'
- Lösche alten Admin-User:
curl -X DELETE http://localhost:8000/api/users/admin \
-H "Authorization: Bearer YOUR_TOKEN"
Standard-User erstellen
curl -X POST http://localhost:8000/api/users \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "user1",
"password": "password123",
"is_admin": false
}'
Hausmeisterei
Docker Socket Permissions
Der tunnel-manager braucht Zugriff auf /var/run/docker.sock. Es gibt mehrere Optionen:
Option 1: Als root laufen (Standard in docker-compose.yml)
user: root
Ist einfacher, aber Container läuft als root
Option 2: Docker-Gruppe nutzen (sicherer)
# Docker GID herausfinden
getent group docker
# Ausgabe z.B.: docker:x:999:user
# In docker-compose.yml:
group_add:
- "999" # Deine Docker GID
Container läuft nicht als root, aber es Erfordert korrekte GID vom Host
Option 3: Socket Permissions ändern (am wenigsten sicher)
sudo chmod 666 /var/run/docker.sock
Nicht empfohlen für Production!
Weitere Empfohlene Maßnahmen
- Reverse Proxy mit HTTPS (nginx/Caddy)
- Firewall konfigurieren (nur benötigte Ports öffnen)
- Starke Passwörter verwenden
- Regelmäßige Updates durchführen
- SECRET_KEY geheim halten
Nginx Reverse Proxy Beispiel
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Monitoring
# Logs anzeigen
docker-compose logs -f tunnel-manager
# Health Check
curl http://localhost:8000/health
# Container-Status
docker ps | grep ssh-tunnel
Updates
# Code aktualisieren
git pull
# Neu bauen und starten
docker-compose down
docker-compose build --no-cache
docker-compose up -d
Troubleshooting
Container startet nicht
# Logs prüfen
docker-compose logs tunnel-manager
# (HOST) Docker GID Prüfen
getent group docker
Tunnel verbindet nicht
# Port-Bindings prüfen
docker port ssh-tunnel-TUNNEL_ID
# Container logs
docker logs ssh-tunnel-TUNNEL_ID
Frontend lädt nicht
# Static files prüfen
docker exec tunnel-manager ls -la /app/frontend/dist
# Neu bauen
docker-compose build --no-cache
API Endpoints
Swagger Docs available at /api/docs
Authentication
POST /api/auth/login- LoginGET /api/auth/me- Current User
Users (Admin only)
POST /api/users- Create UserGET /api/users- List UsersDELETE /api/users/{username}- Delete User
Tunnels
POST /api/tunnels- Create TunnelGET /api/tunnels- List TunnelsGET /api/tunnels/{id}- Get TunnelPOST /api/tunnels/{id}/start- Start TunnelPOST /api/tunnels/{id}/stop- Stop TunnelDELETE /api/tunnels/{id}- Delete TunnelGET /api/tunnels/{id}/connection-info- Connection Info