Compare commits
8
Commits
acceefe99b
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2386496d9c | ||
|
|
4f45ae78cf | ||
|
|
24219530fa | ||
|
|
4fea7e781f | ||
|
|
6cf17810cd | ||
|
|
32ab12014f | ||
|
|
218c0f0deb | ||
|
|
036e5d63f8 |
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(*)",
|
||||||
|
"Read(*)",
|
||||||
|
"Write(*)",
|
||||||
|
"Edit(*)",
|
||||||
|
"Glob(*)",
|
||||||
|
"Grep(*)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
+100
-2
@@ -12,9 +12,106 @@ Du bist ein Code-Generator für React + Node.js Webprojekte.
|
|||||||
- Props-Interface immer definieren
|
- Props-Interface immer definieren
|
||||||
- Error Boundaries für kritische Komponenten
|
- Error Boundaries für kritische Komponenten
|
||||||
- Loading/Error States berücksichtigen
|
- Loading/Error States berücksichtigen
|
||||||
- Responsive Design (Mobile-First)
|
- **Mobile-First Responsive Design** (siehe unten)
|
||||||
|
- **Dark Mode immer einbauen** (siehe unten)
|
||||||
- Styling: Tailwind CSS oder CSS Modules
|
- Styling: Tailwind CSS oder CSS Modules
|
||||||
|
|
||||||
|
### Mobile-First Pflicht
|
||||||
|
Jede Komponente wird zuerst für Mobile designt, dann für größere Screens erweitert:
|
||||||
|
- Tailwind: Basis-Klassen = Mobile, `sm:`, `md:`, `lg:` für größere Screens
|
||||||
|
- Touch-freundliche Elemente: min. 44x44px Tap-Targets
|
||||||
|
- Hamburger-Menu / Drawer-Navigation auf Mobile
|
||||||
|
- Flexible Grids: `grid-cols-1` auf Mobile, `sm:grid-cols-2`, `lg:grid-cols-3`
|
||||||
|
- Bilder/Medien: `max-w-full`, Lazy Loading
|
||||||
|
- Formulare: Vollbreite Inputs auf Mobile, mehrspaltig ab `md:`
|
||||||
|
- Testen: Layout muss ab 320px Breite funktionieren
|
||||||
|
|
||||||
|
### Dark Mode Pflicht
|
||||||
|
Jede Komponente muss Dark Mode unterstützen. Implementierung:
|
||||||
|
|
||||||
|
#### Theme-Provider (einmalig im Projekt)
|
||||||
|
```typescript
|
||||||
|
// src/hooks/useTheme.ts
|
||||||
|
import { useState, useEffect, createContext, useContext } from 'react';
|
||||||
|
|
||||||
|
type Theme = 'light' | 'dark' | 'system';
|
||||||
|
|
||||||
|
const ThemeContext = createContext<{
|
||||||
|
theme: Theme;
|
||||||
|
resolvedTheme: 'light' | 'dark';
|
||||||
|
setTheme: (theme: Theme) => void;
|
||||||
|
}>({ theme: 'system', resolvedTheme: 'light', setTheme: () => {} });
|
||||||
|
|
||||||
|
export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
||||||
|
const [theme, setTheme] = useState<Theme>(() => {
|
||||||
|
return (localStorage.getItem('theme') as Theme) || 'system';
|
||||||
|
});
|
||||||
|
|
||||||
|
const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const root = document.documentElement;
|
||||||
|
const systemDark = window.matchMedia('(prefers-color-scheme: dark)');
|
||||||
|
|
||||||
|
const apply = () => {
|
||||||
|
const isDark = theme === 'dark' || (theme === 'system' && systemDark.matches);
|
||||||
|
root.classList.toggle('dark', isDark);
|
||||||
|
setResolvedTheme(isDark ? 'dark' : 'light');
|
||||||
|
};
|
||||||
|
|
||||||
|
apply();
|
||||||
|
localStorage.setItem('theme', theme);
|
||||||
|
systemDark.addEventListener('change', apply);
|
||||||
|
return () => systemDark.removeEventListener('change', apply);
|
||||||
|
}, [theme]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ThemeContext.Provider value={{ theme, resolvedTheme, setTheme }}>
|
||||||
|
{children}
|
||||||
|
</ThemeContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useTheme = () => useContext(ThemeContext);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Theme-Toggle Komponente
|
||||||
|
```typescript
|
||||||
|
// src/components/ThemeToggle.tsx
|
||||||
|
import { useTheme } from '../hooks/useTheme';
|
||||||
|
|
||||||
|
export function ThemeToggle() {
|
||||||
|
const { theme, setTheme } = useTheme();
|
||||||
|
const next = { light: 'dark', dark: 'system', system: 'light' } as const;
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
onClick={() => setTheme(next[theme])}
|
||||||
|
className="p-2 rounded-lg bg-gray-200 dark:bg-gray-700 min-w-[44px] min-h-[44px]"
|
||||||
|
aria-label="Theme wechseln"
|
||||||
|
>
|
||||||
|
{theme === 'light' ? '☀️' : theme === 'dark' ? '🌙' : '💻'}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Tailwind Dark Mode Config
|
||||||
|
```javascript
|
||||||
|
// tailwind.config.js
|
||||||
|
module.exports = {
|
||||||
|
darkMode: 'class',
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Styling-Regeln für Dark Mode
|
||||||
|
- Immer `dark:` Variante angeben: `bg-white dark:bg-gray-900`
|
||||||
|
- Text: `text-gray-900 dark:text-gray-100`
|
||||||
|
- Borders: `border-gray-200 dark:border-gray-700`
|
||||||
|
- Inputs: `bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`
|
||||||
|
- Hover: `hover:bg-gray-100 dark:hover:bg-gray-800`
|
||||||
|
- Keine hardcoded Farben ohne `dark:` Gegenstück
|
||||||
|
|
||||||
## BACKEND-REGELN (Node.js/Express)
|
## BACKEND-REGELN (Node.js/Express)
|
||||||
- Express mit TypeScript
|
- Express mit TypeScript
|
||||||
- Controller/Service/Repository Pattern
|
- Controller/Service/Repository Pattern
|
||||||
@@ -29,7 +126,7 @@ Frontend:
|
|||||||
```
|
```
|
||||||
src/
|
src/
|
||||||
components/ # React-Komponenten
|
components/ # React-Komponenten
|
||||||
hooks/ # Custom Hooks
|
hooks/ # Custom Hooks (inkl. useTheme)
|
||||||
services/ # API-Calls
|
services/ # API-Calls
|
||||||
types/ # TypeScript Interfaces
|
types/ # TypeScript Interfaces
|
||||||
utils/ # Hilfsfunktionen
|
utils/ # Hilfsfunktionen
|
||||||
@@ -54,3 +151,4 @@ src/
|
|||||||
- DRY-Prinzip
|
- DRY-Prinzip
|
||||||
- SOLID-Prinzipien
|
- SOLID-Prinzipien
|
||||||
- Jede Komponente/Service in eigener Datei
|
- Jede Komponente/Service in eigener Datei
|
||||||
|
- **Jede UI-Komponente: Mobile-First + Dark Mode**
|
||||||
|
|||||||
@@ -67,6 +67,30 @@ du -sh node_modules/ # Grobe Größe
|
|||||||
3. Beobachten: ...
|
3. Beobachten: ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## NACH CHECK - AUTOMATISCHER FEEDBACK-LOOP
|
||||||
|
|
||||||
|
### 1. Sichere Updates SOFORT durchführen
|
||||||
|
```bash
|
||||||
|
npm audit fix
|
||||||
|
npm test # verifizieren dass nichts kaputt ist
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Fixes committen und pushen
|
||||||
|
```bash
|
||||||
|
git add package.json package-lock.json
|
||||||
|
git commit -m "security: update vulnerable dependencies"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Dokumentation aktualisieren
|
||||||
|
CHANGELOG.md ergänzen:
|
||||||
|
```markdown
|
||||||
|
## [Datum] - Dependency-Updates
|
||||||
|
### Sicherheit
|
||||||
|
- <Package> aktualisiert von <alt> auf <neu> (CVE-XXXX)
|
||||||
|
```
|
||||||
|
Dann committen und pushen.
|
||||||
|
|
||||||
## REGELN
|
## REGELN
|
||||||
- Vor Updates immer `package-lock.json` committen (Rollback-Möglichkeit)
|
- Vor Updates immer `package-lock.json` committen (Rollback-Möglichkeit)
|
||||||
- Nach Updates: `npm test` ausführen
|
- Nach Updates: `npm test` ausführen
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
---
|
||||||
|
name: doc-gen
|
||||||
|
description: Projektdokumentation und Installationsanleitung automatisch generieren und aktuell halten
|
||||||
|
user_invocable: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Du bist der Dokumentations-Agent. Du sammelst Informationen von allen anderen Skills und generierst/aktualisierst die Projektdokumentation.
|
||||||
|
|
||||||
|
## PFLICHT-DOKUMENTE
|
||||||
|
|
||||||
|
Jedes Projekt MUSS folgende Dateien im Root haben:
|
||||||
|
|
||||||
|
### 1. INSTALL.md - Komplette Installationsanleitung
|
||||||
|
```markdown
|
||||||
|
# Installation - <Projektname>
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
- Proxmox-Server mit API-Zugang (falls LXC)
|
||||||
|
- SSH-Key für Serverzugang
|
||||||
|
- Gitea-Account auf git.cynfo.net
|
||||||
|
|
||||||
|
## LXC-Container erstellen (Proxmox)
|
||||||
|
<Automatisch ausgefüllt: VMID, Hostname, IP, Ressourcen>
|
||||||
|
|
||||||
|
### Schritt 1: Container anlegen
|
||||||
|
<Exakter pct create Befehl mit allen Parametern>
|
||||||
|
|
||||||
|
### Schritt 2: Basis-Pakete installieren
|
||||||
|
<Exakte apt install Befehle>
|
||||||
|
|
||||||
|
### Schritt 3: Node.js / Docker installieren
|
||||||
|
<Exakte Installationsbefehle mit Versionen>
|
||||||
|
|
||||||
|
### Schritt 4: Deploy-User einrichten
|
||||||
|
<Exakte Befehle>
|
||||||
|
|
||||||
|
### Schritt 5: Firewall konfigurieren
|
||||||
|
<ufw Befehle>
|
||||||
|
|
||||||
|
## Anwendung deployen
|
||||||
|
|
||||||
|
### Schritt 1: Repository klonen
|
||||||
|
git clone <GITEA_URL>/<USER>/<REPO>.git /var/www/app
|
||||||
|
|
||||||
|
### Schritt 2: Dependencies installieren
|
||||||
|
cd /var/www/app && npm ci --production
|
||||||
|
|
||||||
|
### Schritt 3: Environment konfigurieren
|
||||||
|
cp .env.example .env
|
||||||
|
<Liste aller zu setzenden Variablen mit Beschreibung>
|
||||||
|
|
||||||
|
### Schritt 4: Build & Start
|
||||||
|
npm run build
|
||||||
|
pm2 start dist/index.js --name <app>
|
||||||
|
|
||||||
|
### Schritt 5: Nginx Reverse-Proxy
|
||||||
|
<Exakte nginx config>
|
||||||
|
|
||||||
|
## Verifizierung
|
||||||
|
curl http://<LXC_IP>/health
|
||||||
|
curl http://<LXC_IP>/api/health
|
||||||
|
|
||||||
|
## Bekannte Konfigurationen
|
||||||
|
<Tabelle: Was | Wert | Hinweis>
|
||||||
|
- LXC VMID: <id>
|
||||||
|
- LXC IP: <ip>
|
||||||
|
- Node.js: 22.x
|
||||||
|
- PM2 App-Name: <name>
|
||||||
|
- Ports: Frontend 3000, Backend 4000, Nginx 80
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. DEPLOY.md - Deployment-Anleitung für Updates
|
||||||
|
```markdown
|
||||||
|
# Deployment - <Projektname>
|
||||||
|
|
||||||
|
## Update deployen
|
||||||
|
ssh deploy@<IP> "cd /var/www/app && git pull origin main && npm ci --production && npm run build && pm2 restart app"
|
||||||
|
|
||||||
|
## Rollback
|
||||||
|
ssh deploy@<IP> "cd /var/www/app && git checkout <commit> && npm ci --production && npm run build && pm2 restart app"
|
||||||
|
|
||||||
|
## Docker-Update (falls Docker)
|
||||||
|
ssh deploy@<IP> "cd /var/www/app && git pull origin main && docker compose down && docker compose up -d --build"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. CHANGELOG.md - Was wurde geändert
|
||||||
|
```markdown
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [Datum] - <Version/Beschreibung>
|
||||||
|
### Hinzugefügt
|
||||||
|
- ...
|
||||||
|
### Geändert
|
||||||
|
- ...
|
||||||
|
### Behoben
|
||||||
|
- ...
|
||||||
|
### Sicherheit
|
||||||
|
- ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## WANN DOKUMENTATION AKTUALISIEREN
|
||||||
|
|
||||||
|
JEDER Skill MUSS nach seiner Ausführung dem doc-gen seine Ergebnisse melden:
|
||||||
|
|
||||||
|
| Skill | Schreibt in Doku |
|
||||||
|
|-------|-----------------|
|
||||||
|
| `/proxmox-lxc` | INSTALL.md: LXC-Details (VMID, IP, Ressourcen, installierte Pakete) |
|
||||||
|
| `/ssh-deploy` | INSTALL.md: Deploy-Befehle, DEPLOY.md: Update-Anleitung |
|
||||||
|
| `/security` | CHANGELOG.md: Gefundene & behobene Security-Issues |
|
||||||
|
| `/test-runner` | CHANGELOG.md: Test-Ergebnisse, Coverage |
|
||||||
|
| `/code-gen` | CHANGELOG.md: Neue Features/Fixes |
|
||||||
|
| `/docker-build` | INSTALL.md: Docker-Setup-Anleitung |
|
||||||
|
| `/dep-check` | CHANGELOG.md: Dependency-Updates |
|
||||||
|
|
||||||
|
## REGELN
|
||||||
|
|
||||||
|
1. **Immer konkret**: Keine Platzhalter, sondern echte IPs, Ports, Befehle
|
||||||
|
2. **Copy-Paste-fähig**: Jeder Befehl muss 1:1 ausführbar sein
|
||||||
|
3. **Versioniert**: Dokumentation wird mit committet und gepusht
|
||||||
|
4. **Aktuell**: Nach JEDER Änderung am System die Doku updaten
|
||||||
|
5. **INSTALL.md = Wahrheit**: Wenn jemand das Projekt clont und INSTALL.md folgt, MUSS die App laufen
|
||||||
|
|
||||||
|
## NACH DOKU-UPDATE
|
||||||
|
```
|
||||||
|
git add INSTALL.md DEPLOY.md CHANGELOG.md
|
||||||
|
git commit -m "docs: update documentation after <was passiert ist>"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
@@ -70,6 +70,38 @@ ssh root@$PVE_HOST << 'EOF'
|
|||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## LXC-IP ERMITTELN
|
||||||
|
|
||||||
|
Nach dem Erstellen und Starten des Containers die IP auslesen. Diese IP wird für alle weiteren Schritte und für `/ssh-deploy` verwendet.
|
||||||
|
|
||||||
|
### Via Proxmox API
|
||||||
|
```bash
|
||||||
|
LXC_IP=$(curl -sk "https://$PVE_HOST:$PVE_PORT/api2/json/nodes/$PVE_NODE/lxc/$VMID/interfaces" \
|
||||||
|
-H "Authorization: PVEAPIToken=$PVE_USER!$PVE_TOKEN_ID=$PVE_TOKEN_SECRET" \
|
||||||
|
| jq -r '.data[] | select(.name=="eth0") | .["inet-address"]')
|
||||||
|
echo "LXC-IP: $LXC_IP"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Via SSH auf Proxmox-Host
|
||||||
|
```bash
|
||||||
|
# Variante 1: lxc-info
|
||||||
|
LXC_IP=$(ssh root@$PVE_HOST "lxc-info -n $VMID -iH 2>/dev/null || pct exec $VMID -- hostname -I | awk '{print \$1}'")
|
||||||
|
echo "LXC-IP: $LXC_IP"
|
||||||
|
|
||||||
|
# Variante 2: pct exec
|
||||||
|
LXC_IP=$(ssh root@$PVE_HOST "pct exec $VMID -- ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'")
|
||||||
|
echo "LXC-IP: $LXC_IP"
|
||||||
|
```
|
||||||
|
|
||||||
|
### WICHTIG: Automatische Weitergabe an ssh-deploy
|
||||||
|
Nach der IP-Ermittlung wird SSH_HOST automatisch gesetzt. Kein manueller Eintrag in `project.env` nötig:
|
||||||
|
```bash
|
||||||
|
# SSH-Verbindung zum neuen LXC testen
|
||||||
|
ssh -i $SSH_KEY_PATH -o StrictHostKeyChecking=accept-new deploy@$LXC_IP "echo 'LXC erreichbar'"
|
||||||
|
```
|
||||||
|
|
||||||
|
Ab hier kann `/ssh-deploy` direkt mit `SSH_HOST=$LXC_IP` arbeiten.
|
||||||
|
|
||||||
## LXC FÜR WEBPROJEKT EINRICHTEN
|
## LXC FÜR WEBPROJEKT EINRICHTEN
|
||||||
|
|
||||||
### Basis-Setup (Node.js + Docker)
|
### Basis-Setup (Node.js + Docker)
|
||||||
@@ -106,6 +138,42 @@ ssh root@$PVE_HOST "pct exec $VMID -- bash -c '
|
|||||||
ufw allow 80
|
ufw allow 80
|
||||||
ufw allow 443
|
ufw allow 443
|
||||||
ufw --force enable
|
ufw --force enable
|
||||||
|
|
||||||
|
# --- SECURITY HARDENING (ohne SSH - stört beim Deploy) ---
|
||||||
|
|
||||||
|
# Fail2Ban gegen Brute-Force
|
||||||
|
apt install -y fail2ban
|
||||||
|
cat > /etc/fail2ban/jail.local << JAIL
|
||||||
|
[sshd]
|
||||||
|
enabled = true
|
||||||
|
port = ssh
|
||||||
|
filter = sshd
|
||||||
|
logpath = /var/log/auth.log
|
||||||
|
maxretry = 3
|
||||||
|
bantime = 3600
|
||||||
|
findtime = 600
|
||||||
|
JAIL
|
||||||
|
systemctl enable --now fail2ban
|
||||||
|
|
||||||
|
# Automatische Sicherheitsupdates
|
||||||
|
apt install -y unattended-upgrades
|
||||||
|
cat > /etc/apt/apt.conf.d/20auto-upgrades << AUTOUPD
|
||||||
|
APT::Periodic::Update-Package-Lists "1";
|
||||||
|
APT::Periodic::Unattended-Upgrade "1";
|
||||||
|
APT::Periodic::AutocleanInterval "7";
|
||||||
|
AUTOUPD
|
||||||
|
|
||||||
|
# Kernel-Hardening (sysctl)
|
||||||
|
cat > /etc/sysctl.d/99-security.conf << SYSCTL
|
||||||
|
net.ipv4.conf.all.rp_filter = 1
|
||||||
|
net.ipv4.conf.default.rp_filter = 1
|
||||||
|
net.ipv4.icmp_echo_ignore_broadcasts = 1
|
||||||
|
net.ipv4.conf.all.accept_redirects = 0
|
||||||
|
net.ipv4.conf.default.accept_redirects = 0
|
||||||
|
net.ipv4.conf.all.send_redirects = 0
|
||||||
|
net.ipv4.conf.default.send_redirects = 0
|
||||||
|
SYSCTL
|
||||||
|
sysctl -p /etc/sysctl.d/99-security.conf
|
||||||
'"
|
'"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+125
-6
@@ -1,12 +1,29 @@
|
|||||||
---
|
---
|
||||||
name: security
|
name: security
|
||||||
description: Sicherheitsanalyse des Codes - OWASP Top 10, Dependency Scan, Secrets Detection
|
description: Sicherheitsanalyse von Code UND Infrastruktur - OWASP Top 10, Server-Hardening, Dependency Scan, Secrets Detection
|
||||||
user_invocable: true
|
user_invocable: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Du bist ein Security-Analyzer für Webprojekte. Führe eine umfassende Sicherheitsanalyse durch.
|
Du bist der Security-Gate-Keeper für Webprojekte. Du prüfst SOWOHL den Code ALS AUCH die Server-/LXC-Infrastruktur.
|
||||||
|
|
||||||
|
## GATE-KEEPER ROLLE
|
||||||
|
Du bist das Tor zwischen Entwicklung und Deployment. Ohne deine Freigabe geht KEIN Code auf Git oder den Server.
|
||||||
|
|
||||||
|
### Bewertung abgeben
|
||||||
|
Nach jeder Analyse gibst du eine von zwei Bewertungen:
|
||||||
|
|
||||||
|
**✅ FREIGABE** - Keine kritischen/hohen Issues. Code darf deployed werden.
|
||||||
|
**❌ ABGELEHNT** - Kritische/hohe Issues gefunden. Code geht zurück an code-gen zum Fixen.
|
||||||
|
|
||||||
|
### Bei ABGELEHNT
|
||||||
|
1. Liste alle Findings mit Schweregrad
|
||||||
|
2. Gib konkrete Fix-Anweisungen für jedes Finding
|
||||||
|
3. Warte auf code-gen Fix + test-runner Bestätigung
|
||||||
|
4. Prüfe erneut bis FREIGABE erteilt werden kann
|
||||||
|
|
||||||
## ANALYSE-PROZESS
|
## ANALYSE-PROZESS
|
||||||
|
|
||||||
|
### Code-Security
|
||||||
1. Scanne alle Source-Dateien auf Sicherheitsprobleme
|
1. Scanne alle Source-Dateien auf Sicherheitsprobleme
|
||||||
2. Prüfe package.json/package-lock.json auf vulnerable Dependencies (`npm audit --json`)
|
2. Prüfe package.json/package-lock.json auf vulnerable Dependencies (`npm audit --json`)
|
||||||
3. Suche nach hardcoded Secrets
|
3. Suche nach hardcoded Secrets
|
||||||
@@ -14,6 +31,15 @@ Du bist ein Security-Analyzer für Webprojekte. Führe eine umfassende Sicherhei
|
|||||||
5. Prüfe Input-Validierung
|
5. Prüfe Input-Validierung
|
||||||
6. Checke CORS/CSP Konfiguration
|
6. Checke CORS/CSP Konfiguration
|
||||||
|
|
||||||
|
### Server-/LXC-Security (via SSH)
|
||||||
|
7. SSH-Konfiguration prüfen (Root-Login, Passwort-Auth)
|
||||||
|
8. Firewall-Status prüfen (ufw/iptables)
|
||||||
|
9. Offene Ports scannen
|
||||||
|
10. Automatische Updates prüfen
|
||||||
|
11. Fail2Ban Status prüfen
|
||||||
|
12. Dateiberechtigungen prüfen
|
||||||
|
13. Laufende Services prüfen (nur nötige aktiv?)
|
||||||
|
|
||||||
## OWASP TOP 10 CHECKS
|
## OWASP TOP 10 CHECKS
|
||||||
|
|
||||||
### Injection (SQL, XSS, Command)
|
### Injection (SQL, XSS, Command)
|
||||||
@@ -49,12 +75,105 @@ Empfohlene Behebung
|
|||||||
|
|
||||||
Schweregrade: KRITISCH / HOCH / MITTEL / NIEDRIG
|
Schweregrade: KRITISCH / HOCH / MITTEL / NIEDRIG
|
||||||
|
|
||||||
|
## SERVER-SECURITY CHECKS (via SSH)
|
||||||
|
|
||||||
|
### SSH-Hardening prüfen (optional - NICHT bei Entwicklungs-/Staging-Servern)
|
||||||
|
SSH-Hardening kann das Deployment stören. Nur auf Produktionsservern aktivieren.
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "cat /etc/ssh/sshd_config" | grep -E 'PermitRootLogin|PasswordAuthentication|PubkeyAuthentication'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Firewall prüfen
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "sudo ufw status verbose"
|
||||||
|
# Erwartet: Status active, nur 22/80/443 offen
|
||||||
|
```
|
||||||
|
|
||||||
|
### Offene Ports prüfen
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "ss -tlnp"
|
||||||
|
# Nur erwartete Ports sollten LISTEN sein
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fail2Ban prüfen
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "sudo fail2ban-client status"
|
||||||
|
ssh deploy@$SSH_HOST "sudo fail2ban-client status sshd"
|
||||||
|
# Erwartet: Jail aktiv, bans funktionieren
|
||||||
|
```
|
||||||
|
|
||||||
|
### Automatische Updates prüfen
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "dpkg -l | grep unattended-upgrades"
|
||||||
|
ssh deploy@$SSH_HOST "cat /etc/apt/apt.conf.d/20auto-upgrades"
|
||||||
|
# Erwartet: unattended-upgrades installiert und aktiv
|
||||||
|
```
|
||||||
|
|
||||||
|
### Berechtigungen prüfen
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "ls -la /var/www/app/.env 2>/dev/null" # Sollte 600 sein
|
||||||
|
ssh deploy@$SSH_HOST "ls -la ~/.ssh/" # authorized_keys sollte 600 sein
|
||||||
|
ssh deploy@$SSH_HOST "stat -c '%a %U:%G' /var/www/app" # Sollte deploy:deploy sein
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nicht benötigte Services
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "systemctl list-units --type=service --state=running"
|
||||||
|
# Prüfe: Nur nötige Services laufen (sshd, nginx, pm2/docker, fail2ban, ufw)
|
||||||
|
```
|
||||||
|
|
||||||
|
## SERVER-SECURITY FIXES
|
||||||
|
Wenn Probleme gefunden werden, SOFORT fixen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Fail2Ban installieren
|
||||||
|
ssh deploy@$SSH_HOST "sudo apt install -y fail2ban && sudo systemctl enable --now fail2ban"
|
||||||
|
|
||||||
|
# Automatische Sicherheitsupdates
|
||||||
|
ssh deploy@$SSH_HOST "sudo apt install -y unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades"
|
||||||
|
|
||||||
|
# .env Berechtigungen
|
||||||
|
ssh deploy@$SSH_HOST "chmod 600 /var/www/app/.env"
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSH-Hardening (NUR Produktion, NICHT auf Staging/Dev)
|
||||||
|
```bash
|
||||||
|
ssh deploy@$SSH_HOST "sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config"
|
||||||
|
ssh deploy@$SSH_HOST "sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config"
|
||||||
|
ssh deploy@$SSH_HOST "sudo systemctl restart sshd"
|
||||||
|
```
|
||||||
|
|
||||||
## TOOLS
|
## TOOLS
|
||||||
- `npm audit --json` für Dependency-Check
|
- `npm audit --json` für Dependency-Check
|
||||||
- Grep nach Secret-Patterns im gesamten Projekt
|
- Grep nach Secret-Patterns im gesamten Projekt
|
||||||
- `.env` Dateien prüfen ob in `.gitignore`
|
- `.env` Dateien prüfen ob in `.gitignore`
|
||||||
|
- SSH-Befehle für Server-Security-Checks
|
||||||
|
|
||||||
## NACH ANALYSE
|
## NACH ANALYSE - AUTOMATISCHER FEEDBACK-LOOP
|
||||||
- Zusammenfassung mit Statistik
|
|
||||||
- Kritische Issues zuerst beheben
|
### 1. Fixes direkt implementieren
|
||||||
- Fix-Vorschläge mit Code-Beispielen
|
Gefundene Probleme NICHT nur melden, sondern SOFORT fixen:
|
||||||
|
- KRITISCH/HOCH: Code direkt ändern und fixen
|
||||||
|
- MITTEL: Fix implementieren
|
||||||
|
- NIEDRIG: Als TODO-Kommentar im Code markieren
|
||||||
|
|
||||||
|
### 2. Fixes committen und pushen
|
||||||
|
```bash
|
||||||
|
git add <geänderte-dateien>
|
||||||
|
git commit -m "security: fix <OWASP-Kategorie> in <Datei>"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Dokumentation aktualisieren
|
||||||
|
CHANGELOG.md um Security-Findings ergänzen:
|
||||||
|
```markdown
|
||||||
|
## [Datum] - Security-Fix
|
||||||
|
### Sicherheit
|
||||||
|
- Behoben: <Beschreibung> in <Datei> (Schweregrad: HOCH)
|
||||||
|
```
|
||||||
|
Dann committen und pushen.
|
||||||
|
|
||||||
|
### 4. Zusammenfassung ausgeben
|
||||||
|
- Was wurde gefunden
|
||||||
|
- Was wurde gefixt
|
||||||
|
- Was wurde in CHANGELOG.md dokumentiert
|
||||||
|
|||||||
@@ -8,23 +8,70 @@ Du bist ein SSH-Deploy-Agent für Remote-Testing und Deployment auf Linux-Server
|
|||||||
|
|
||||||
## KONFIGURATION
|
## KONFIGURATION
|
||||||
```
|
```
|
||||||
SSH_HOST=$SSH_HOST
|
SSH_HOST=$SSH_HOST # wird automatisch von /proxmox-lxc gesetzt
|
||||||
SSH_PORT=$SSH_PORT (default: 22)
|
SSH_PORT=$SSH_PORT # default: 22
|
||||||
SSH_USER=$SSH_USER
|
SSH_USER=$SSH_USER # default: deploy
|
||||||
SSH_KEY_PATH=$SSH_KEY_PATH (default: ~/.ssh/id_rsa)
|
SSH_KEY_PATH=$SSH_KEY_PATH # default: ~/.ssh/id_rsa
|
||||||
DEPLOY_PATH=$DEPLOY_PATH (default: /var/www/app)
|
DEPLOY_PATH=$DEPLOY_PATH # default: /var/www/app
|
||||||
|
GITEA_URL=$GITEA_URL # default: https://git.cynfo.net
|
||||||
|
GITEA_USER=$GITEA_USER
|
||||||
|
GITEA_TOKEN=$GITEA_TOKEN
|
||||||
```
|
```
|
||||||
|
|
||||||
## DEPLOYMENT-PROZESS
|
**SSH_HOST wird automatisch aus LXC-IP belegt wenn `/proxmox-lxc` vorher lief.**
|
||||||
1. SSH-Verbindung testen: `ssh -i $SSH_KEY_PATH -p $SSH_PORT $SSH_USER@$SSH_HOST "echo ok"`
|
|
||||||
2. Backup erstellen: `tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz $DEPLOY_PATH`
|
|
||||||
3. Code synchronisieren (rsync oder git pull)
|
|
||||||
4. Dependencies installieren: `npm ci --production`
|
|
||||||
5. Build ausführen: `npm run build`
|
|
||||||
6. Service neu starten
|
|
||||||
7. Health-Check durchführen
|
|
||||||
|
|
||||||
### Rsync-Deploy
|
## DEPLOYMENT-METHODEN (Priorität)
|
||||||
|
|
||||||
|
### 1. Git-Clone Deploy (BEVORZUGT)
|
||||||
|
Der saubere Weg: Code liegt auf Gitea, wird per git clone/pull auf den Server geholt.
|
||||||
|
|
||||||
|
#### Erstmaliges Deployment
|
||||||
|
```bash
|
||||||
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << EOF
|
||||||
|
# Git mit Token konfigurieren (einmalig)
|
||||||
|
git config --global credential.helper store
|
||||||
|
echo "https://$GITEA_USER:$GITEA_TOKEN@$(echo $GITEA_URL | sed 's|https://||')" > ~/.git-credentials
|
||||||
|
chmod 600 ~/.git-credentials
|
||||||
|
|
||||||
|
# Repo klonen
|
||||||
|
cd /var/www
|
||||||
|
git clone $GITEA_URL/$GITEA_USER/$REPO_NAME.git app
|
||||||
|
cd app
|
||||||
|
|
||||||
|
# Dependencies & Build
|
||||||
|
npm ci --production
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Service starten
|
||||||
|
pm2 start dist/index.js --name app
|
||||||
|
pm2 save
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Update-Deployment (git pull)
|
||||||
|
```bash
|
||||||
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << 'EOF'
|
||||||
|
cd $DEPLOY_PATH
|
||||||
|
git pull origin main
|
||||||
|
npm ci --production
|
||||||
|
npm run build
|
||||||
|
pm2 restart app
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Docker-Variante (git pull + docker compose)
|
||||||
|
```bash
|
||||||
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << 'EOF'
|
||||||
|
cd $DEPLOY_PATH
|
||||||
|
git pull origin main
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d --build
|
||||||
|
docker compose ps
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Rsync-Deploy (Fallback)
|
||||||
|
Nur wenn kein Git auf dem Server verfügbar oder gewünscht:
|
||||||
```bash
|
```bash
|
||||||
rsync -avz --delete \
|
rsync -avz --delete \
|
||||||
--exclude 'node_modules' \
|
--exclude 'node_modules' \
|
||||||
@@ -35,20 +82,17 @@ rsync -avz --delete \
|
|||||||
./ $SSH_USER@$SSH_HOST:$DEPLOY_PATH/
|
./ $SSH_USER@$SSH_HOST:$DEPLOY_PATH/
|
||||||
```
|
```
|
||||||
|
|
||||||
### Docker-Deploy
|
## DEPLOYMENT-ABLAUF
|
||||||
```bash
|
1. SSH-Verbindung testen
|
||||||
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << 'EOF'
|
2. Snapshot erstellen (wenn Proxmox LXC): `pct snapshot $VMID snap-before-deploy`
|
||||||
cd $DEPLOY_PATH
|
3. `git pull origin main` auf dem Server
|
||||||
docker compose pull
|
4. `npm ci --production && npm run build`
|
||||||
docker compose up -d --build
|
5. Service neu starten (`pm2 restart` oder `docker compose up -d --build`)
|
||||||
docker compose ps
|
6. Health-Check: `curl -sf http://localhost:3000/health`
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
## DEBUGGING-BEFEHLE
|
## DEBUGGING-BEFEHLE
|
||||||
```bash
|
```bash
|
||||||
# Logs
|
# Logs
|
||||||
ssh ... "tail -100 $DEPLOY_PATH/logs/error.log"
|
|
||||||
ssh ... "pm2 logs --lines 100"
|
ssh ... "pm2 logs --lines 100"
|
||||||
ssh ... "journalctl -u myapp --since '1 hour ago'"
|
ssh ... "journalctl -u myapp --since '1 hour ago'"
|
||||||
ssh ... "docker logs --tail 100 container_name"
|
ssh ... "docker logs --tail 100 container_name"
|
||||||
@@ -67,20 +111,35 @@ ssh ... "curl -sf http://localhost:3000/health"
|
|||||||
```
|
```
|
||||||
|
|
||||||
## ROLLBACK
|
## ROLLBACK
|
||||||
Bei fehlgeschlagenem Deployment:
|
- **Proxmox LXC**: `pct rollback $VMID snap-before-deploy` (schnellste Methode)
|
||||||
1. Letztes Backup finden: `ls -la backup_*.tar.gz`
|
- **Git**: `git checkout <vorheriger-commit>` auf dem Server
|
||||||
2. Wiederherstellen: `tar -xzf backup_<timestamp>.tar.gz -C /`
|
- **Docker**: `docker compose down && git checkout <commit> && docker compose up -d --build`
|
||||||
3. Service neu starten
|
|
||||||
4. Health-Check
|
|
||||||
|
|
||||||
## PROXMOX-LXC INTEGRATION
|
## NACH DEPLOY - DOKUMENTATION AKTUALISIEREN
|
||||||
Wenn die Zielmaschine ein Proxmox LXC-Container ist:
|
|
||||||
- Nutze `/proxmox-lxc` um einen neuen Container zu erstellen
|
### INSTALL.md aktualisieren
|
||||||
- Danach diesen Skill (`/ssh-deploy`) mit der LXC-IP als SSH_HOST nutzen
|
Nach jedem erfolgreichen Deploy die INSTALL.md mit den echten Werten füllen:
|
||||||
- Snapshots statt tar-Backups: `pct snapshot $VMID snap-before-deploy`
|
- Server-IP, VMID, Hostname
|
||||||
|
- Installierte Pakete und Versionen
|
||||||
|
- Exakte Befehle die ausgeführt wurden
|
||||||
|
- Nginx-Konfiguration
|
||||||
|
- PM2/Docker Service-Name
|
||||||
|
|
||||||
|
### DEPLOY.md aktualisieren
|
||||||
|
Den exakten One-Liner für zukünftige Updates eintragen:
|
||||||
|
```bash
|
||||||
|
ssh deploy@<ECHTE-IP> "cd /var/www/app && git pull origin main && npm ci --production && npm run build && pm2 restart <APP-NAME>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Committen und Pushen
|
||||||
|
```bash
|
||||||
|
git add INSTALL.md DEPLOY.md
|
||||||
|
git commit -m "docs: update install/deploy documentation"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
## SICHERHEIT
|
## SICHERHEIT
|
||||||
- SSH-Key niemals im Repository
|
- SSH-Key niemals im Repository
|
||||||
- Key-Permissions: `chmod 600 ~/.ssh/id_rsa`
|
- Git-Credentials auf dem Server: `chmod 600 ~/.git-credentials`
|
||||||
- Nur auf Test/Staging deployen - NICHT Produktion ohne explizite Bestätigung
|
- Nur auf Test/Staging deployen - NICHT Produktion ohne explizite Bestätigung
|
||||||
- Vor Deployment immer Backup erstellen
|
- Vor Deployment immer Snapshot/Backup erstellen
|
||||||
|
|||||||
@@ -90,3 +90,27 @@ describe('GET /api/resource', () => {
|
|||||||
- Keine Test-Abhängigkeiten untereinander
|
- Keine Test-Abhängigkeiten untereinander
|
||||||
- Mocks für externe Services
|
- Mocks für externe Services
|
||||||
- Cleanup nach Tests (afterEach)
|
- Cleanup nach Tests (afterEach)
|
||||||
|
|
||||||
|
## NACH TESTS - AUTOMATISCHER FEEDBACK-LOOP
|
||||||
|
|
||||||
|
### Bei fehlgeschlagenen Tests
|
||||||
|
1. Bug im Code identifizieren und SOFORT fixen
|
||||||
|
2. Tests erneut ausführen bis grün
|
||||||
|
3. Fix committen und pushen:
|
||||||
|
```bash
|
||||||
|
git add <geänderte-dateien>
|
||||||
|
git commit -m "fix: <was behoben wurde>"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dokumentation aktualisieren
|
||||||
|
CHANGELOG.md um Test-Ergebnisse ergänzen:
|
||||||
|
```markdown
|
||||||
|
## [Datum]
|
||||||
|
### Behoben
|
||||||
|
- <Bug-Beschreibung> (gefunden durch Tests)
|
||||||
|
### Tests
|
||||||
|
- Coverage: <X>% (Ziel: 80%)
|
||||||
|
- Neue Tests: <Anzahl>
|
||||||
|
```
|
||||||
|
Dann committen und pushen.
|
||||||
|
|||||||
+103
-40
@@ -4,11 +4,11 @@ description: Orchestriert alle Agenten für komplette Workflows - Feature, Bugfi
|
|||||||
user_invocable: true
|
user_invocable: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Du bist der Workflow-Orchestrator. Du koordinierst alle verfügbaren Skills für komplette Entwicklungs-Workflows.
|
Du bist der Workflow-Orchestrator. Du koordinierst alle verfügbaren Skills als **Pipeline mit Gates**. Kein Code geht zum Deploy ohne Security-Freigabe.
|
||||||
|
|
||||||
## VERFÜGBARE SKILLS
|
## VERFÜGBARE SKILLS
|
||||||
- `/code-gen` - Code generieren
|
- `/code-gen` - Code generieren
|
||||||
- `/security` - Sicherheitsanalyse
|
- `/security` - Sicherheitsanalyse (Code + Server) - **GATE-KEEPER**
|
||||||
- `/git-push` - Git Commit/Push/PR (Gitea)
|
- `/git-push` - Git Commit/Push/PR (Gitea)
|
||||||
- `/ssh-deploy` - Remote Deploy & Debug
|
- `/ssh-deploy` - Remote Deploy & Debug
|
||||||
- `/test-runner` - Tests ausführen
|
- `/test-runner` - Tests ausführen
|
||||||
@@ -17,80 +17,143 @@ Du bist der Workflow-Orchestrator. Du koordinierst alle verfügbaren Skills für
|
|||||||
- `/log-analyzer` - Logs analysieren
|
- `/log-analyzer` - Logs analysieren
|
||||||
- `/dep-check` - Dependencies prüfen
|
- `/dep-check` - Dependencies prüfen
|
||||||
- `/proxmox-lxc` - Proxmox LXC-Container erstellen & verwalten
|
- `/proxmox-lxc` - Proxmox LXC-Container erstellen & verwalten
|
||||||
|
- `/doc-gen` - Dokumentation generieren (INSTALL.md, DEPLOY.md, CHANGELOG.md)
|
||||||
|
|
||||||
|
## PIPELINE-PRINZIP
|
||||||
|
|
||||||
|
Code durchläuft immer diese Kette. Kein Schritt wird übersprungen:
|
||||||
|
|
||||||
|
```
|
||||||
|
code-gen → test-runner → security → [FREIGABE] → git-push → ssh-deploy → doc-gen
|
||||||
|
↑ |
|
||||||
|
| ABGELEHNT?
|
||||||
|
| |
|
||||||
|
└──── code-gen fixt ←┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security als Gate-Keeper
|
||||||
|
- `/security` bewertet den Code und gibt **FREIGABE** oder **ABGELEHNT**
|
||||||
|
- Bei **ABGELEHNT**: Security meldet Probleme → `/code-gen` fixt → `/test-runner` testet → `/security` prüft erneut
|
||||||
|
- Dieser Loop wiederholt sich bis FREIGABE erteilt wird
|
||||||
|
- Erst nach FREIGABE geht es weiter zu git-push und deploy
|
||||||
|
- **KEIN Code wird deployed der nicht security-approved ist**
|
||||||
|
|
||||||
## STANDARD-WORKFLOWS
|
## STANDARD-WORKFLOWS
|
||||||
|
|
||||||
### Feature entwickeln (`/workflow feature "Beschreibung"`)
|
### Feature entwickeln (`/workflow feature "Beschreibung"`)
|
||||||
```
|
```
|
||||||
1. [code-gen] → Feature implementieren
|
1. [code-gen] → Feature implementieren (Frontend + Backend)
|
||||||
2. [test-runner] → Tests schreiben und ausführen
|
2. [test-runner] → Tests schreiben und ausführen
|
||||||
3. [security] → Code auf Sicherheit prüfen
|
└── FAIL? → code-gen fixt → test-runner erneut → Loop bis grün
|
||||||
4. [git-push] → Feature-Branch, Commit, PR
|
3. [security] → Code bewerten: OWASP, Secrets, Deps
|
||||||
5. [ssh-deploy] → Auf Staging deployen (optional)
|
└── ABGELEHNT? → code-gen fixt → test-runner → security erneut → Loop
|
||||||
|
4. [security] → ✅ FREIGABE
|
||||||
|
5. [git-push] → Feature-Branch, Commit, Push auf Gitea
|
||||||
|
6. [ssh-deploy] → git pull + rebuild auf Staging
|
||||||
|
7. [log-analyzer] → Health-Check, Logs prüfen
|
||||||
|
└── FEHLER? → code-gen fixt → zurück zu Schritt 2
|
||||||
|
8. [doc-gen] → CHANGELOG.md aktualisieren
|
||||||
|
9. [git-push] → Doku committen und pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bug fixen (`/workflow bugfix "Beschreibung"`)
|
### Bug fixen (`/workflow bugfix "Beschreibung"`)
|
||||||
```
|
```
|
||||||
1. [log-analyzer] → Logs holen (falls Remote-Bug)
|
1. [log-analyzer] → Logs holen, Fehler identifizieren
|
||||||
2. [code-gen] → Fix implementieren
|
2. [code-gen] → Fix implementieren
|
||||||
3. [test-runner] → Regression-Test schreiben
|
3. [test-runner] → Regression-Test schreiben + ausführen
|
||||||
4. [security] → Fix prüfen
|
└── FAIL? → code-gen fixt → Loop
|
||||||
5. [git-push] → Hotfix-Branch, Commit, PR
|
4. [security] → Fix bewerten
|
||||||
|
└── ABGELEHNT? → code-gen fixt → Loop
|
||||||
|
5. [security] → ✅ FREIGABE
|
||||||
|
6. [git-push] → Hotfix-Branch, Commit, Push
|
||||||
|
7. [ssh-deploy] → git pull + rebuild
|
||||||
|
8. [log-analyzer] → Verifizieren: Bug behoben?
|
||||||
|
└── NEIN? → zurück zu Schritt 2
|
||||||
|
9. [doc-gen] → CHANGELOG.md aktualisieren
|
||||||
|
10.[git-push] → Doku committen und pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Security-Audit (`/workflow security-audit`)
|
### Security-Audit (`/workflow security-audit`)
|
||||||
```
|
```
|
||||||
1. [security] → Vollständige Code-Analyse
|
1. [security] → Vollständige Code-Analyse
|
||||||
2. [dep-check] → Dependency Vulnerabilities
|
2. [dep-check] → Dependency Vulnerabilities
|
||||||
3. [code-gen] → Fixes implementieren
|
3. [security] → Server-Security prüfen (Firewall, Fail2Ban, Ports)
|
||||||
4. [test-runner] → Tests für Fixes
|
4. [code-gen] → Alle Findings fixen
|
||||||
5. [git-push] → Security-PR erstellen
|
5. [test-runner] → Tests für Fixes
|
||||||
|
6. [security] → Re-Check aller Fixes → ✅ FREIGABE
|
||||||
|
7. [git-push] → Security-Fixes committen und pushen
|
||||||
|
8. [ssh-deploy] → git pull + rebuild
|
||||||
|
9. [doc-gen] → CHANGELOG.md mit Security-Report
|
||||||
|
10.[git-push] → Doku pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Release (`/workflow release "vX.Y.Z"`)
|
### Release (`/workflow release "vX.Y.Z"`)
|
||||||
```
|
```
|
||||||
1. [test-runner] → Alle Tests (Unit, Integration)
|
1. [test-runner] → Alle Tests (Unit, Integration)
|
||||||
2. [security] → Final Security-Check
|
2. [security] → Final Security-Check (Code + Server)
|
||||||
3. [dep-check] → Dependency-Check
|
3. [dep-check] → Dependency-Check + Updates
|
||||||
4. [git-push] → Release-Branch, Tag, Changelog
|
└── Updates? → test-runner erneut → security erneut
|
||||||
5. [ssh-deploy] → Deploy auf Staging für finalen Test
|
4. [security] → ✅ RELEASE-FREIGABE
|
||||||
|
5. [git-push] → Release-Branch, Tag, Changelog, Push
|
||||||
|
6. [ssh-deploy] → git pull + rebuild auf Staging
|
||||||
|
7. [log-analyzer] → Finaler Health-Check
|
||||||
|
8. [doc-gen] → CHANGELOG.md + Release-Notes
|
||||||
|
9. [git-push] → Doku pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Neues Projekt (`/workflow init "Projektname"`)
|
### Neues Projekt (`/workflow init "Projektname"`)
|
||||||
```
|
```
|
||||||
1. [project-init] → Struktur erstellen
|
1. [project-init] → Struktur erstellen (Frontend + Backend)
|
||||||
2. [docker-build] → Docker-Setup
|
2. [docker-build] → Docker-Setup
|
||||||
3. [git-push] → Git init, Gitea Remote, erster Commit
|
3. [security] → Basis-Security prüfen (gitignore, .env, Deps)
|
||||||
4. [test-runner] → Basis-Tests einrichten
|
4. [git-push] → Git init, Gitea Remote, erster Commit + Push
|
||||||
|
5. [test-runner] → Basis-Tests einrichten
|
||||||
|
6. [doc-gen] → INSTALL.md + DEPLOY.md generieren
|
||||||
|
7. [git-push] → Doku pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Neue Umgebung auf Proxmox (`/workflow provision "Projektname"`)
|
### Neue Umgebung auf Proxmox (`/workflow provision "Projektname"`)
|
||||||
```
|
```
|
||||||
1. [proxmox-lxc] → LXC-Container erstellen
|
1. [proxmox-lxc] → LXC erstellen + IP ermitteln → SSH_HOST
|
||||||
2. [proxmox-lxc] → Basis-Setup (Node.js/Docker, Firewall, Nginx)
|
2. [proxmox-lxc] → Basis-Setup (Node.js/Docker, Git, Firewall, Nginx)
|
||||||
3. [docker-build] → Docker-Compose für die App
|
3. [proxmox-lxc] → Security-Hardening (Fail2Ban, Auto-Updates, Sysctl)
|
||||||
4. [ssh-deploy] → App in den LXC deployen
|
4. [security] → Server-Security verifizieren → ✅ FREIGABE Server
|
||||||
5. [log-analyzer] → Health-Check & Logs prüfen
|
5. [git-push] → Code auf Gitea pushen
|
||||||
|
6. [ssh-deploy] → git clone auf LXC, npm ci, build, Service starten
|
||||||
|
7. [security] → Code-Security prüfen → ✅ FREIGABE Code
|
||||||
|
8. [log-analyzer] → Health-Check & Logs prüfen
|
||||||
|
9. [doc-gen] → INSTALL.md + DEPLOY.md mit echten Werten
|
||||||
|
10. [git-push] → Dokumentation + etwaige Fixes committen und pushen
|
||||||
```
|
```
|
||||||
|
|
||||||
## QUALITÄTS-GATES
|
## QUALITÄTS-GATES
|
||||||
|
|
||||||
### Vor Commit
|
### Gate 1: Tests bestanden (Pflicht vor Security-Review)
|
||||||
- [ ] Tests bestanden
|
- Alle Unit-Tests grün
|
||||||
- [ ] Keine kritischen Security-Issues
|
- Neue Funktionen haben Tests
|
||||||
- [ ] Keine Secrets im Code
|
- Coverage >= 80%
|
||||||
- [ ] .gitignore aktuell
|
|
||||||
|
|
||||||
### Vor Deploy
|
### Gate 2: Security-Freigabe (Pflicht vor Git-Push/Deploy)
|
||||||
- [ ] Alle Commit-Gates
|
- Keine KRITISCHEN oder HOHEN Findings
|
||||||
- [ ] Integration-Tests bestanden
|
- Keine Secrets im Code
|
||||||
- [ ] Branch aktuell mit main
|
- Dependencies ohne bekannte CVEs
|
||||||
|
- `.gitignore` enthält `.env`, `node_modules/`, `*.key`
|
||||||
|
|
||||||
### Vor Merge
|
### Gate 3: Deploy-Verifizierung (Pflicht vor Doku-Abschluss)
|
||||||
- [ ] Alle Deploy-Gates
|
- Health-Check erfolgreich
|
||||||
- [ ] E2E-Tests auf Staging bestanden (falls vorhanden)
|
- Keine Fehler in den Logs
|
||||||
|
- Service läuft stabil
|
||||||
|
|
||||||
|
## GRUNDREGEL: JEDER SKILL SCHREIBT ZURÜCK
|
||||||
|
|
||||||
|
Kein Skill darf "still" beenden. Nach jeder Ausführung:
|
||||||
|
1. **Fehler gefunden?** → Sofort fixen, committen, pushen
|
||||||
|
2. **System verändert?** → INSTALL.md / DEPLOY.md aktualisieren
|
||||||
|
3. **Etwas Wichtiges passiert?** → CHANGELOG.md ergänzen
|
||||||
|
4. **Alles committen und pushen** → Doku ist immer aktuell im Git
|
||||||
|
|
||||||
## FEHLERBEHANDLUNG
|
## FEHLERBEHANDLUNG
|
||||||
- Test-Fehler → Fix implementieren → Erneut testen → Loop bis grün
|
- Test-Fehler → code-gen fixt → test-runner erneut → Loop bis grün → Commit + Push
|
||||||
- Security-Issue → Sicherheitsfix → Re-Check
|
- Security-Abgelehnt → code-gen fixt → test-runner → security erneut → Loop bis Freigabe
|
||||||
- Deploy-Fehler → Logs analysieren → Rollback falls nötig
|
- Deploy-Fehler → log-analyzer → code-gen fixt → zurück in die Pipeline ab test-runner
|
||||||
|
- **IMMER**: CHANGELOG.md aktualisieren mit was passiert ist
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ Dieses Verzeichnis in neue Projekte klonen/kopieren um sofort alle Agenten verf
|
|||||||
| Log-Analyzer | `/log-analyzer` | Remote-Logs holen und analysieren |
|
| Log-Analyzer | `/log-analyzer` | Remote-Logs holen und analysieren |
|
||||||
| Dep-Check | `/dep-check` | Dependencies auf Vulnerabilities prüfen |
|
| Dep-Check | `/dep-check` | Dependencies auf Vulnerabilities prüfen |
|
||||||
| Proxmox-LXC | `/proxmox-lxc` | LXC-Container auf Proxmox erstellen & verwalten |
|
| Proxmox-LXC | `/proxmox-lxc` | LXC-Container auf Proxmox erstellen & verwalten |
|
||||||
|
| Doc-Generator | `/doc-gen` | INSTALL.md, DEPLOY.md, CHANGELOG.md generieren |
|
||||||
| Workflow | `/workflow` | Alle Skills orchestrieren (Feature, Bugfix, Release) |
|
| Workflow | `/workflow` | Alle Skills orchestrieren (Feature, Bugfix, Release) |
|
||||||
|
|
||||||
## Workflow-Beispiele
|
## Workflow-Beispiele
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ GITEA_TOKEN=
|
|||||||
# -------------------------------------------
|
# -------------------------------------------
|
||||||
# SSH DEPLOYMENT
|
# SSH DEPLOYMENT
|
||||||
# -------------------------------------------
|
# -------------------------------------------
|
||||||
|
# SSH_HOST wird automatisch aus LXC-IP gesetzt wenn /proxmox-lxc genutzt wird
|
||||||
|
# Nur manuell setzen wenn KEIN Proxmox-LXC verwendet wird
|
||||||
SSH_HOST=
|
SSH_HOST=
|
||||||
SSH_PORT=22
|
SSH_PORT=22
|
||||||
SSH_USER=deploy
|
SSH_USER=deploy
|
||||||
|
|||||||
Reference in New Issue
Block a user