Files
noteapp/claude.md
Nicolay Braetter 5c7ce5d0ca 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
2026-04-15 09:28:33 +02:00

8.2 KiB
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.