Initial commit: Notes Manager App (notes.braetter-int.de)

- Python/Flask Backend
- SQLAlchemy Models (notes, tasks, templates, users)
- Gunicorn + Nginx Deploy-Konfiguration
- Static Assets (CSS/JS)
- Jinja2 Templates
This commit is contained in:
2026-04-15 09:28:33 +02:00
commit 5c7ce5d0ca
24 changed files with 1666 additions and 0 deletions

199
claude.md Executable file
View File

@@ -0,0 +1,199 @@
# Claude-Code Prompt für Deployment von NotesManager auf Proxmox LXC
Nutze den folgenden Prompt direkt in Claude Code.
---
Du arbeitest als selbstständig handelnder Linux-, Proxmox-, Netzwerk-, DNS-, Reverse-Proxy- und Deployment-Administrator.
## Ziel
Deploye das beigefügte Webprojekt **NotesManager** als produktives System in einem **neuen LXC-Container** auf dem Proxmox-Host **pve-braetter.braetter.local**. Das Ergebnis muss vollständig lauffähig und sauber dokumentiert sein.
## Harte Vorgaben
- Proxmox-Host: `pve-braetter.braetter.local`
- Container-Typ: **LXC**
- Container-OS: **Ubuntu 24.04**
- LXC Template: pve-braetter.braetter.local/Isos/CT Templates
- LXC Laufwerk: osdisk -> Größe 150GB
- LXC-ID: **nicht fest vorgegeben** → ermittle selbstständig eine **freie LXC-ID** auf `pve-braetter.braetter.local`
- IP-Adresse: **nicht fest vorgegeben** → ermittle per **nmap** eine **freie statische IP** im Netz `192.168.0.0/24`
- Gateway: `192.168.0.1`
- DNS-Server: `192.168.0.202`
- Hostname/FQDN lokal: `notes.braetter.local`
- Externe Domain hinter Reverse Proxy: `notes.braetter-int.de`
- Hauptbenutzer im Container: `nicolay`
- Passwort Hauptbenutzer: `N17b011975`
- Remoteinstallationsbenutzer: `claude`
- Passwort Remoteinstallationsbenutzer: `Agent`
- Der Benutzer `claude` soll volle `sudo`-Rechte **ohne Passwortabfrage** erhalten
- Der Benutzer `claude` besitzt eine vollständige Public-Key-Authentifizierung; nutze die vorhandene Konfiguration bzw. Schlüssel aus `/home/claude/.ssh/config` zur Verteilung an Zielsysteme, falls benötigt
- Reverse Proxy / SSL läuft über **Nginx Proxy Manager**
- Das SSL-Zertifikat für `*.braetter-int.de` ist **bereits im Proxy vorhanden**
- DNS-Zusatzaufgabe: Auf dem DNS-Server muss für die Zone `braetter.local` ein Hosteintrag `notes` auf die ermittelte statische Container-IP angelegt werden
- Zentrales Logging: `logserver.braetter.local`
- Das System soll nach Abschluss **vollständig erreichbar und getestet** sein
- Arbeite weitgehend autonom und beantworte notwendige Standardfragen selbst
## Wichtige Arbeitsweise
1. Triff sinnvolle Entscheidungen selbst.
2. Frage nur dann nach, wenn es absolut technisch unmöglich ist, ohne Rückfrage weiterzumachen.
3. Prüfe jede Annahme aktiv.
4. Validiere jeden großen Schritt direkt nach der Umsetzung.
5. Gib am Ende eine klare Zusammenfassung mit:
- gewählter LXC-ID
- gewählter IP-Adresse
- Hostname
- Pfaden
- Diensten
- Testergebnissen
- Zugangsdaten
- offenen Punkten, falls etwas extern blockiert ist
## Technische Zielarchitektur
Das bereitgestellte Projekt **NotesManager** soll im Container produktiv betrieben werden mit:
- Python 3
- virtuelle Umgebung (`venv`)
- Flask-Anwendung
- Gunicorn als App-Server
- Nginx lokal im Container als Reverse Proxy zu Gunicorn
- systemd-Service für Gunicorn
- SQLite-Datenbank lokal im Applikationsverzeichnis bzw. Instance-Verzeichnis
- UFW so restriktiv wie sinnvoll, aber funktional für Webbetrieb
- Logging an `logserver.braetter.local`
## Deployment-Aufgaben im Detail
### 1. Proxmox vorbereiten
- Verbinde dich mit `pve-braetter.braetter.local`
- Ermittle eine freie LXC-ID automatisch
- Benutze den vorgabe Storage selbstständig
- Verwende ein Ubuntu-24.04-kompatibles LXC-Template, sofern vorhanden; falls mehrere vorhanden sind, nimm das sinnvollste aktuelle Template
- Prüfe RAM-, CPU-Ressourcen des Hosts und wähle eine sinnvolle Containergröße für eine kleine bis mittlere interne Webanwendung
- Dokumentiere die gewählten Ressourcen
### 2. Freie statische IP ermitteln
- Nutze **nmap**, um im Netz `192.168.0.0/24` eine freie IP zu ermitteln
- Verifiziere zusätzlich, dass die gewählte IP nicht bereits in ARP-/Lease-/DNS-Kontexten auffällig belegt ist
- Konfiguriere diese IP statisch im Container mit:
- IP: automatisch ermittelt
- Gateway: `192.168.0.1`
- DNS: `192.168.0.202`
### 3. Container anlegen
- Erstelle den LXC-Container
- Hostname: `notes.braetter.local`
- Lege die Benutzer `nicolay` und `claude` an
- Setze die vorgegebenen Passwörter
- Hinterlege für `claude` funktionierende SSH-Authentifizierung
- Setze `claude` als Passwortlos-Sudoer
- Führe Systemupdates durch
### 4. NotesManager deployen
- Übertrage das mitgelieferte Projekt in den Container, vorzugsweise nach `/opt/notesmanager`
- Prüfe die Projektstruktur
- Erstelle eine Python-`venv`
- Installiere alle Abhängigkeiten aus `requirements.txt`
- Stelle sicher, dass die Anwendung im Produktionsmodus mit Gunicorn läuft
- Nutze die vorhandenen Deployment-Dateien im Projekt, wenn sinnvoll (`deploy/notesmanager.service`, `gunicorn.conf.py`, Beispiel-Nginx-Datei)
- Passe Konfigurationen auf die echte Zielumgebung an
- Setze Dateirechte sinnvoll
- Sorge dafür, dass die App nach Reboot automatisch startet
### 5. Nginx im Container konfigurieren
- Installiere und konfiguriere Nginx im Container
- Lokales Nginx soll Requests an Gunicorn auf `127.0.0.1:5000` weiterreichen oder auf den final gewählten lokalen Gunicorn-Socket/-Port
- Prüfe die Konfiguration mit `nginx -t`
- Aktiviere und starte Nginx sauber per systemd
### 6. Reverse Proxy in Nginx Proxy Manager
- Lege in **Nginx Proxy Manager** einen neuen Proxy Host für `notes.braetter-int.de` an
- Ziel ist der neue Container mit seiner statischen IP und dem internen HTTP-Port der Anwendung
- Weise das bereits vorhandene Zertifikat für `*.braetter-int.de` zu
- Aktiviere sinnvolle SSL-/Proxy-Optionen
- Teste den externen Zugriff über `https://notes.braetter-int.de`
### 7. DNS-Eintrag anlegen
- Lege auf dem DNS-Server einen A-Record für `notes` in der Zone `braetter.local` an
- Ziel ist die ermittelte statische IP des Containers
- Prüfe die Namensauflösung mit `dig`, `host` oder `nslookup`
### 8. Logging anbinden
- Richte System- und Web-Logging so ein, dass Logs an `logserver.braetter.local` weitergeleitet werden
- Nutze dafür eine saubere rsyslog- oder journald-kompatible Lösung
- Prüfe die Übertragung mit einem Testlogeintrag
### 9. Sicherheit und Betriebsfähigkeit
- Deaktiviere unnötige Dienste
- Härte die Standardkonfiguration sinnvoll ab, ohne die Funktion zu beeinträchtigen
- Stelle sicher, dass nur notwendige Ports erreichbar sind
- Prüfe Boot-Verhalten, Service-Status und Web-Erreichbarkeit
- Führe Smoke-Tests durch:
- Container pingbar
- DNS-Auflösung intern funktioniert
- Nginx lokal antwortet
- Gunicorn-Service aktiv
- NotesManager Login-Seite erreichbar
- Reverse-Proxy-Zugriff extern erreichbar
### 10. Funktionstest der Anwendung
- Öffne die Weboberfläche
- Prüfe, ob Login funktioniert
- Prüfe, ob die Flask-App korrekt antwortet
- Prüfe, ob statische Inhalte geladen werden
- Falls nötig, führe einen minimalen App-Test durch, z. B. Startseite/Login-Seite und HTTP-Statuscodes
## Erwartete Ergebnisdokumentation
Gib am Ende eine strukturierte Abschlussdokumentation aus mit:
1. Gewählter LXC-ID
2. Gewählter statischer IP
3. Container-Hostname
4. Installierter Software
5. Verwendetem Storage
6. CPU/RAM/Disk-Zuweisung
7. Pfad der Anwendung
8. Aktivierten Diensten
9. Reverse-Proxy-Konfiguration
10. DNS-Eintrag
11. Logging-Anbindung
12. Testresultaten
13. Zugangsdaten:
- `nicolay / N17b011975`
- `claude / Agent`
14. Hinweisen, welche Standard-Anwendungsanmeldung initial gesetzt wurde
15. Ggf. Restarbeiten oder manuelle Nacharbeiten
## Zusatzanforderung für die Anwendung
Falls im Projekt noch Standardwerte enthalten sind, passe sie produktiv an:
- Setze einen sicheren Flask-Secret-Key
- Falls die App einen Demo-Admin enthält, dokumentiere diesen Zustand sauber oder ändere ihn auf einen produktiven Erstlogin-Mechanismus
- Stelle sicher, dass keine Entwicklungsoptionen wie `debug=True` produktiv aktiv bleiben
## Wichtig
- Arbeite sauber, nachvollziehbar und mit sichtbaren Prüfungen.
- Bevorzuge robuste, wartbare Standardlösungen.
- Kein unfertiges Ergebnis abliefern.
- Wenn ein externer Zugriff auf Nginx Proxy Manager oder DNS technisch nicht möglich ist, dokumentiere exakt, **welcher konkrete Schritt** blockiert war und liefere die **genauen finalen Befehle oder Klickschritte**, die noch auszuführen sind.
---
Falls die Projektdaten lokal vorliegen, nutze sie direkt als Quelle für das Deployment. Projektname: **NotesManager**.