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:
199
claude.md
Executable file
199
claude.md
Executable 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**.
|
||||
Reference in New Issue
Block a user