init
All checks were successful
release-tag / release-image (push) Successful in 2m3s

This commit is contained in:
2026-05-04 22:25:50 +02:00
parent be81c2bf92
commit 270c13af5b
21 changed files with 1839 additions and 1 deletions

130
README.md
View File

@@ -1,2 +1,130 @@
# patchpinglite
# ReleaseWatcher
ReleaseWatcher ist eine webbasierte Go-Anwendung zur Pflege und Veröffentlichung von Software-Releases.
## Funktionen
- Hersteller, Software und Release-Historie verwalten
- Release-Felder: Software, Version, Channel, Architektur, Release-Datum, Download-Link, Release-Link, Informationen
- Schwachstellen je Release im Format `CVE | Schweregrad | Beschreibung | Referenz`
- Rollenmodell:
- `admin`: Releases erstellen, Benutzer anlegen, Audit-Log ansehen
- `employee`: Hersteller- und Softwaredaten pflegen, Releases ansehen
- HMAC-signierte Session-Cookies
- Passwort-Hashing mit PBKDF2-SHA256 ohne externe Abhängigkeiten
- JSON-Dateipersistenz mit atomarem Schreiben
- Audit-Log
- Discord-Bot-Integration:
- DMs per `/subscribe` und `/unsubscribe`
- automatische Software-Kanäle pro Software
- Release-Pings in den passenden Software-Kanal
## Start
```bash
go mod tidy
go run ./cmd/releasewatcher
```
Danach im Browser öffnen:
```text
http://localhost:8080
```
Standard-Admin:
```text
E-Mail: admin@example.local
Passwort: admin12345
```
## Produktion
Setze mindestens diese Variablen:
```bash
export RW_SECRET='lange-zufaellige-session-secret'
export RW_ADMIN_EMAIL='admin@firma.example'
export RW_ADMIN_PASSWORD='langes-sicheres-passwort'
export RW_ADDR=':8080'
export RW_DATA='data/releasewatcher.json'
```
Baue und starte:
```bash
go mod tidy
go build -o releasewatcher ./cmd/releasewatcher
./releasewatcher
```
Empfehlung: Hinter einem Reverse Proxy mit HTTPS betreiben. In `internal/auth/auth.go` kann `Secure: true` für Cookies aktiviert werden, sobald HTTPS erzwungen ist.
## Discord-Integration
Die Integration liegt in:
```text
internal/discordbot/bot.go
```
Aktivierung über Umgebungsvariablen:
```bash
export RW_DISCORD_TOKEN='dein-bot-token'
export RW_DISCORD_APP_ID='deine-discord-application-id'
export RW_DISCORD_GUILD_ID='deine-server-id'
export RW_DISCORD_CATEGORY_NAME='Software Releases'
# optional, wenn die Kategorie schon existiert und explizit genutzt werden soll:
# export RW_DISCORD_CATEGORY_ID='deine-kategorie-id'
# optionaler Ping-Text; Standard ist @here
export RW_DISCORD_RELEASE_MENTION='@here'
# optional DMs deaktivieren, Kanäle bleiben aktiv:
# export RW_DISCORD_SEND_DMS='false'
go run ./cmd/releasewatcher
```
Wenn `RW_DISCORD_TOKEN` gesetzt ist, startet die Webapp zusätzlich die Discord-Session. Wenn `RW_DISCORD_APP_ID` gesetzt ist, werden diese Commands registriert:
- `/subscribe`: Nutzer trägt sich selbst als DM-Empfänger ein
- `/unsubscribe`: Nutzer trägt sich aus
- User-Command `Zu Empfängern hinzufügen`: Nutzer mit Manage-Guild-Recht kann andere Empfänger hinzufügen
### Automatische Software-Kanäle
Wenn zusätzlich `RW_DISCORD_GUILD_ID` gesetzt ist, erstellt der Bot beim Anlegen einer Software automatisch einen Textkanal unter der konfigurierten Kategorie.
Das Kanalformat ist:
```text
hersteller-software
```
Beispiele:
```text
microsoft-edge
mozilla-firefox
adobe-acrobat-reader
```
Die erzeugte Discord-Channel-ID wird direkt am Software-Datensatz gespeichert (`discord_channel_id`). Beim Erstellen eines Releases postet der Bot dann einen Embed in genau diesen Kanal. Zusätzlich werden weiterhin DMs an Subscriber versendet, außer `RW_DISCORD_SEND_DMS=false` ist gesetzt.
Der Bot benötigt auf dem Discord-Server mindestens diese Rechte:
- `Manage Channels`, wenn Kategorien oder Kanäle automatisch erstellt werden sollen
- `Send Messages`
- `Embed Links`
- optional `Mention @everyone, @here, and All Roles`, wenn `RW_DISCORD_RELEASE_MENTION='@here'` oder Rollen-Mentions genutzt werden
## Datenhaltung
Die Anwendung speichert Daten standardmäßig in:
```text
data/releasewatcher.json
```
Für größere Installationen wäre der nächste professionelle Schritt ein Wechsel auf PostgreSQL oder SQLite mit Migrationen. Die Store-Schicht ist dafür bewusst gekapselt.