# Medi-WOL - Wake-on-LAN Manager Ein moderner Wake-on-LAN Manager, entwickelt mit Go und einer schönen Web-Oberfläche. ## Features - **PC-Verwaltung**: Hinzufügen, Anzeigen, Bearbeiten und Löschen von PC-Einträgen - **Wake-on-LAN**: Ein-Klick-Aufwecken von Computern über MAC-Adressen - **Moderne Web-Oberfläche**: Responsive Design mit Bootstrap und FontAwesome - **SQLite-Datenbank**: Einfache lokale Datenspeicherung - **Cross-Platform**: Läuft auf Windows und Linux - **Konfigurierbarer Port**: Über Umgebungsvariablen oder Kommandozeilenparameter ## Voraussetzungen - Go 1.21 oder höher - Git ## Installation 1. **Repository klonen:** ```bash git clone https://gitea.medisoftware.org/Markus/medi-wol.git cd medi-wol ``` 2. **Abhängigkeiten installieren:** ```bash go mod tidy ``` 3. **Anwendung starten:** ```bash # Standard-Port 8080 go run cmd/server/main.go # Benutzerdefinierter Port go run cmd/server/main.go -port 9090 # Mit Umgebungsvariable set PORT=9090 # Windows export PORT=9090 # Linux go run cmd/server/main.go ``` 4. **Im Browser öffnen:** ``` http://localhost:8080 # Standard http://localhost:9090 # Benutzerdefiniert ``` ## Konfiguration ### Port-Konfiguration Der Server-Port kann auf verschiedene Weise konfiguriert werden: #### 1. Kommandozeilenparameter ```bash # Port 9090 verwenden ./medi-wol.exe -port 9090 # Hilfe anzeigen ./medi-wol.exe -help ``` #### 2. Umgebungsvariable ```bash # Windows set PORT=9090 medi-wol.exe # Linux/macOS export PORT=9090 ./medi-wol # Oder direkt PORT=9090 ./medi-wol ``` #### 3. Standard-Port Falls weder Kommandozeilenparameter noch Umgebungsvariable gesetzt sind, wird Port 8080 verwendet. ### Prioritätsreihenfolge 1. **Kommandozeilenparameter** (`-port`) - Höchste Priorität 2. **Umgebungsvariable** (`PORT`) - Mittlere Priorität 3. **Standard-Port** (8080) - Niedrigste Priorität ## Verwendung ### PC hinzufügen 1. Geben Sie den Namen des PCs ein 2. Geben Sie die MAC-Adresse im Format `XX:XX:XX:XX:XX:XX` ein 3. Klicken Sie auf "PC hinzufügen" ### PC bearbeiten 1. Klicken Sie auf den "Bearbeiten"-Button neben dem gewünschten PC 2. Ändern Sie Name und/oder MAC-Adresse 3. Klicken Sie auf "Speichern" ### PC aufwecken - Klicken Sie auf den "Aufwecken"-Button neben dem gewünschten PC - Das System sendet automatisch ein Wake-on-LAN Paket ### PC löschen - Klicken Sie auf den "Löschen"-Button neben dem gewünschten PC - Bestätigen Sie die Löschung ## Build-Anweisungen ### Windows Build #### Lokaler Build (Windows) ```bash # Einfacher Build go build -o medi-wol.exe cmd/server/main.go # Build mit Optimierungen go build -ldflags="-s -w" -o medi-wol.exe cmd/server/main.go # Build für Release go build -ldflags="-s -w -X main.version=1.0.0" -o medi-wol.exe cmd/server/main.go ``` #### Cross-Compilation von Windows für Linux ```bash # Für Linux AMD64 set GOOS=linux set GOARCH=amd64 go build -o medi-wol-linux-amd64 cmd/server/main.go # Für Linux ARM64 (Raspberry Pi, etc.) set GOOS=linux set GOARCH=arm64 go build -o medi-wol-linux-arm64 cmd/server/main.go # Zurücksetzen auf Windows set GOOS=windows set GOARCH=amd64 ``` ### Linux Build #### Lokaler Build (Linux) ```bash # Einfacher Build go build -o medi-wol cmd/server/main.go # Build mit Optimierungen go build -ldflags="-s -w" -o medi-wol cmd/server/main.go # Build für Release go build -ldflags="-s -w -X main.version=1.0.0" -o medi-wol cmd/server/main.go ``` #### Cross-Compilation von Linux für Windows ```bash # Für Windows AMD64 GOOS=windows GOARCH=amd64 go build -o medi-wol-windows-amd64.exe cmd/server/main.go # Für Windows ARM64 GOOS=windows GOARCH=arm64 go build -o medi-wol-windows-arm64.exe cmd/server/main.go ``` ### Build-Flags Erklärung - `-ldflags="-s -w"`: Reduziert die Binary-Größe durch Entfernung von Debug-Informationen - `-X main.version=1.0.0`: Setzt eine Version-Variable zur Laufzeit - `-o filename`: Bestimmt den Ausgabedateinamen ### Build-Skripte #### Windows Build-Skript (`build.bat`) ```batch @echo off echo Building Medi-WOL for multiple platforms... REM Erstelle dist-Verzeichnis if not exist dist mkdir dist echo Building for Windows AMD64... go build -ldflags="-s -w" -o dist/medi-wol-windows-amd64.exe cmd/server/main.go echo Building for Linux AMD64... set GOOS=linux set GOARCH=amd64 go build -ldflags="-s -w" -o dist/medi-wol-linux-amd64 cmd/server/main.go echo Building for Linux ARM64... set GOOS=linux set GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-linux-arm64 cmd/server/main.go echo Building for Windows ARM64... set GOOS=windows set GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-windows-arm64.exe cmd/server/main.go REM Zurücksetzen auf Windows AMD64 set GOOS=windows set GOARCH=amd64 echo. echo Build complete! Binaries created in dist/ folder: dir dist echo. pause ``` #### Linux Build-Skript (`build.sh`) ```bash #!/bin/bash echo "Building Medi-WOL for multiple platforms..." # Erstelle dist-Verzeichnis mkdir -p dist echo "Building for Linux AMD64..." go build -ldflags="-s -w" -o dist/medi-wol-linux-amd64 cmd/server/main.go echo "Building for Linux ARM64..." GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-linux-arm64 cmd/server/main.go echo "Building for Windows AMD64..." GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o dist/medi-wol-windows-amd64.exe cmd/server/main.go echo "Building for Windows ARM64..." GOOS=windows GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-windows-arm64.exe cmd/server/main.go echo "" echo "Build complete! Binaries created in dist/ folder:" ls -la dist/ echo "" ``` ## Projektstruktur ``` medi-wol/ ├── cmd/server/ # Hauptanwendung ├── internal/ # Interne Pakete │ ├── database/ # Datenbanklogik │ ├── handlers/ # HTTP-Handler │ ├── models/ # Datenmodelle │ └── wol/ # Wake-on-LAN Service ├── web/ # Web-Oberfläche │ ├── static/ # CSS, JavaScript │ └── templates/ # HTML-Templates ├── go.mod # Go-Module ├── build.bat # Windows Build-Skript ├── build.sh # Linux Build-Skript └── README.md # Diese Datei ``` ## API-Endpunkte - `GET /` - Hauptseite - `GET /api/pcs` - Alle PCs abrufen - `POST /api/pcs` - Neuen PC erstellen - `PUT /api/pcs/:id` - PC aktualisieren - `DELETE /api/pcs/:id` - PC löschen - `POST /api/pcs/:id/wake` - PC aufwecken ## Datenbank Die Anwendung verwendet SQLite als lokale Datenbank. Die Datenbankdatei `medi-wol.db` wird automatisch im Projektverzeichnis erstellt. ## Wake-on-LAN Das System sendet Magic Packets an die gespeicherten MAC-Adressen. Stellen Sie sicher, dass: 1. Die Zielcomputer Wake-on-LAN unterstützen 2. Die Netzwerkkarte für Wake-on-LAN konfiguriert ist 3. Die Computer im gleichen Netzwerksegment sind ## Entwicklung ### Lokale Entwicklung ```bash # Standard-Port 8080 go run cmd/server/main.go # Benutzerdefinierter Port go run cmd/server/main.go -port 9090 ``` ### Build für Produktion ```bash # Windows go build -ldflags="-s -w" -o medi-wol.exe cmd/server/main.go # Linux go build -ldflags="-s -w" -o medi-wol cmd/server/main.go ``` ### Tests ausführen ```bash go test ./... ``` ### Code-Qualität prüfen ```bash # Code formatieren go fmt ./... # Linting (falls golint installiert ist) golint ./... # Vet prüfen go vet ./... ``` ## Deployment ### Windows Service ```bash # Mit NSSM (Non-Sucking Service Manager) nssm install Medi-WOL "C:\path\to\medi-wol.exe" nssm set Medi-WOL AppDirectory "C:\path\to\medi-wol" nssm set Medi-WOL AppParameters "-port 9090" # Optional: Port setzen nssm start Medi-WOL ``` ### Linux Systemd Service ```ini # /etc/systemd/system/medi-wol.service [Unit] Description=Medi-WOL Wake-on-LAN Manager After=network.target [Service] Type=simple User=medi-wol WorkingDirectory=/opt/medi-wol ExecStart=/opt/medi-wol/medi-wol -port 9090 Environment="PORT=9090" Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` ### Docker (Optional) ```dockerfile FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN go build -ldflags="-s -w" -o medi-wol cmd/server/main.go FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/medi-wol . EXPOSE 8080 CMD ["./medi-wol", "-port", "8080"] ``` ```bash # Docker Container starten docker run -d -p 9090:9090 -e PORT=9090 medi-wol:latest ``` ## Lizenz Dieses Projekt ist für den internen Gebrauch bestimmt. ## Support Bei Fragen oder Problemen wenden Sie sich an das Entwicklungsteam.