No description
  • JavaScript 49.2%
  • Python 48%
  • Dockerfile 2.1%
  • HTML 0.6%
  • CSS 0.1%
Find a file
2026-01-12 18:18:25 +01:00
backend Swag 2026-01-11 21:12:14 +01:00
frontend UI Upgrade 2026-01-12 18:18:25 +01:00
.dockerignore init 2026-01-11 19:40:03 +01:00
.env.example init 2026-01-11 19:40:03 +01:00
.gitignore init 2026-01-11 19:40:03 +01:00
docker-compose.yml init 2026-01-11 19:40:03 +01:00
Dockerfile init 2026-01-11 19:40:03 +01:00
README.md Swag 2026-01-11 21:12:14 +01:00

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 Servers
  • SECRET_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:

  1. 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
  }'
  1. 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

  1. Reverse Proxy mit HTTPS (nginx/Caddy)
  2. Firewall konfigurieren (nur benötigte Ports öffnen)
  3. Starke Passwörter verwenden
  4. Regelmäßige Updates durchführen
  5. 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 - Login
  • GET /api/auth/me - Current User

Users (Admin only)

  • POST /api/users - Create User
  • GET /api/users - List Users
  • DELETE /api/users/{username} - Delete User

Tunnels

  • POST /api/tunnels - Create Tunnel
  • GET /api/tunnels - List Tunnels
  • GET /api/tunnels/{id} - Get Tunnel
  • POST /api/tunnels/{id}/start - Start Tunnel
  • POST /api/tunnels/{id}/stop - Stop Tunnel
  • DELETE /api/tunnels/{id} - Delete Tunnel
  • GET /api/tunnels/{id}/connection-info - Connection Info