- Python/Flask Backend - SQLAlchemy Models (notes, tasks, templates, users) - Gunicorn + Nginx Deploy-Konfiguration - Static Assets (CSS/JS) - Jinja2 Templates
200 lines
8.2 KiB
Markdown
Executable File
200 lines
8.2 KiB
Markdown
Executable File
# 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**.
|