diff --git a/app/components/ActivityFeed.tsx b/app/components/ActivityFeed.tsx index f3eda7d..6061b49 100644 --- a/app/components/ActivityFeed.tsx +++ b/app/components/ActivityFeed.tsx @@ -13,8 +13,6 @@ import { ChevronUp, Activity, X, - Eye, - EyeOff, } from "lucide-react"; // Types matching your n8n output @@ -1190,7 +1188,7 @@ export default function ActivityFeed() { className="flex items-center gap-2 text-white/60 hover:text-white transition-colors" title="Activity tracking is disabled. Click to enable." > - + Tracking disabled @@ -1218,19 +1216,8 @@ export default function ActivityFeed() {

Loading...

-
- -
+
+
@@ -1299,22 +1286,6 @@ export default function ActivityFeed() {
- {/* Toggle Tracking Button */} -
{ e.stopPropagation(); diff --git a/docs/PRODUCTION_TROUBLESHOOTING.md b/docs/PRODUCTION_TROUBLESHOOTING.md new file mode 100644 index 0000000..c5311a2 --- /dev/null +++ b/docs/PRODUCTION_TROUBLESHOOTING.md @@ -0,0 +1,283 @@ +# Production Troubleshooting Guide + +## 502 Bad Gateway Errors + +### Symptome +- Website zeigt 502 Bad Gateway +- Activity Feed zeigt nur "Loading" +- Chat funktioniert nicht +- API-Endpunkte geben 502 zurück + +### Ursachen +1. **Container läuft nicht** - Der `portfolio-app` Container ist gestoppt oder crashed +2. **Proxy Netzwerk fehlt** - Das `proxy` Netzwerk existiert nicht oder Container ist nicht verbunden +3. **Nginx Proxy Manager Konfiguration** - Falsche Hostname/IP oder Port-Konfiguration +4. **Container Health Check fehlgeschlagen** - Container läuft, aber die Anwendung ist nicht bereit + +### Lösungsschritte + +#### 1. Diagnose ausführen +```bash +./scripts/diagnose-production.sh +``` + +Dieses Script prüft: +- Container-Status +- Netzwerk-Verbindungen +- Health Checks +- API-Endpunkte +- Environment Variables + +#### 2. Automatischer Fix +```bash +./scripts/fix-production.sh +``` + +Dieses Script: +- Erstellt das `proxy` Netzwerk falls es fehlt +- Verbindet den Container mit dem `proxy` Netzwerk +- Startet den Container neu falls nötig +- Prüft Health Checks + +#### 3. Manuelle Schritte + +**Container-Status prüfen:** +```bash +docker ps -a | grep portfolio-app +docker logs portfolio-app --tail=50 +``` + +**Proxy Netzwerk prüfen:** +```bash +docker network ls | grep proxy +docker inspect portfolio-app | grep -A 10 Networks +``` + +**Container neu starten:** +```bash +cd /workspace/denshooter/portfolio +docker compose -f docker-compose.production.yml restart portfolio +``` + +**Container mit Proxy-Netzwerk verbinden:** +```bash +# Falls Netzwerk fehlt +docker network create proxy + +# Container neu erstellen +docker compose -f docker-compose.production.yml up -d --force-recreate +``` + +#### 4. Nginx Proxy Manager Konfiguration prüfen + +1. **Gehe zu Nginx Proxy Manager** → Hosts → Proxy Hosts +2. **Öffne die Konfiguration für `dk0.dev`** +3. **Details Tab prüfen:** + - **Forward Hostname/IP:** Muss `portfolio-app` sein (NICHT `localhost` oder `127.0.0.1`) + - **Forward Port:** `3000` + - **Forward Scheme:** `http` +4. **Advanced Tab prüfen:** + ``` + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + ``` + +#### 5. Container-Logs prüfen +```bash +# Alle Logs +docker logs portfolio-app + +# Letzte 100 Zeilen +docker logs portfolio-app --tail=100 + +# Logs in Echtzeit +docker logs portfolio-app -f +``` + +## React Hydration Error #418 + +### Symptome +- Browser Console zeigt: `Error: Minified React error #418` +- Website funktioniert, aber es gibt Warnungen +- Unterschiede zwischen Server- und Client-Rendering + +### Ursachen +1. **Client-only Komponenten werden auf dem Server gerendert** +2. **Unterschiedliche Daten zwischen Server und Client** +3. **Browser-spezifische APIs auf dem Server** + +### Lösung + +**ActivityFeed Komponente:** +- Die Komponente ist bereits als `"use client"` markiert +- Verwendet `ClientOnly` Wrapper für client-only Features +- Loading-State verhindert Hydration-Mismatches + +**Wenn der Fehler weiterhin auftritt:** +1. Browser Cache leeren +2. Hard Refresh (Ctrl+Shift+R / Cmd+Shift+R) +3. Container-Logs auf React-Fehler prüfen + +## Activity Feed zeigt nur "Loading" + +### Ursachen +1. **n8n Webhook nicht erreichbar** - `N8N_WEBHOOK_URL` ist nicht gesetzt oder falsch +2. **API-Endpunkt gibt Fehler zurück** - `/api/n8n/status` funktioniert nicht +3. **CORS-Probleme** - n8n blockiert Requests +4. **Rate Limiting** - Zu viele Requests + +### Lösung + +**1. Environment Variables prüfen:** +```bash +docker exec portfolio-app printenv | grep N8N +``` + +**2. API-Endpunkt direkt testen:** +```bash +# Von außen +curl https://dk0.dev/api/n8n/status + +# Von innen +docker exec portfolio-app curl http://localhost:3000/api/n8n/status +``` + +**3. n8n Webhook testen:** +```bash +# Ersetze WEBHOOK_URL mit deiner tatsächlichen URL +curl "https://n8n.dk0.dev/webhook/denshooter-71242/status" +``` + +**4. Gitea Variables prüfen:** +- Gehe zu Gitea → Repository → Settings → Variables +- Prüfe ob `N8N_WEBHOOK_URL`, `N8N_SECRET_TOKEN`, `N8N_API_KEY` gesetzt sind +- Stelle sicher, dass diese auch in `docker-compose.production.yml` verwendet werden + +## Chat funktioniert nicht + +### Ursachen +1. **n8n Webhook nicht erreichbar** - Gleiche Ursache wie Activity Feed +2. **API-Endpunkt gibt 502 zurück** - Container-Problem +3. **CORS-Probleme** - n8n blockiert Requests +4. **Timeout** - n8n antwortet zu langsam + +### Lösung + +**1. API-Endpunkt testen:** +```bash +# POST Request testen +curl -X POST https://dk0.dev/api/n8n/chat \ + -H "Content-Type: application/json" \ + -d '{"message": "Hello"}' +``` + +**2. Container-Logs prüfen:** +```bash +docker logs portfolio-app | grep -i "chat\|n8n" +``` + +**3. n8n Webhook direkt testen:** +```bash +curl -X POST "https://n8n.dk0.dev/webhook/chat" \ + -H "Content-Type: application/json" \ + -d '{"message": "Hello", "history": []}' +``` + +## Häufige Probleme und Lösungen + +### Problem: Container startet, aber Health Check schlägt fehl +**Lösung:** +```bash +# Prüfe ob curl im Container verfügbar ist +docker exec portfolio-app which curl + +# Teste Health Endpoint manuell +docker exec portfolio-app curl -f http://localhost:3000/api/health +``` + +### Problem: Container läuft, aber Port 3000 ist nicht erreichbar +**Lösung:** +```bash +# Prüfe Port-Mapping +docker port portfolio-app + +# Teste von innen +docker exec portfolio-app curl http://localhost:3000/api/health + +# Teste von außen (sollte funktionieren wenn Port gemappt ist) +curl http://localhost:3000/api/health +``` + +### Problem: Proxy Netzwerk existiert nicht +**Lösung:** +```bash +# Erstelle Proxy Netzwerk +docker network create proxy + +# Verbinde Container +docker network connect proxy portfolio-app + +# Oder Container neu erstellen +docker compose -f docker-compose.production.yml up -d --force-recreate +``` + +### Problem: Nginx Proxy Manager kann Container nicht erreichen +**Lösung:** +1. Stelle sicher, dass beide im `proxy` Netzwerk sind: + ```bash + docker network inspect proxy + ``` +2. Prüfe Nginx Proxy Manager Container: + ```bash + docker ps | grep nginx + docker inspect | grep -A 10 Networks + ``` +3. Teste Verbindung von Nginx Container zu Portfolio Container: + ```bash + docker exec ping portfolio-app + ``` + +## Nützliche Befehle + +```bash +# Container-Status +docker ps -a | grep portfolio + +# Container-Logs +docker logs portfolio-app --tail=100 -f + +# Container-Netzwerke +docker inspect portfolio-app | grep -A 20 Networks + +# Health Check Status +docker inspect portfolio-app --format='{{.State.Health.Status}}' + +# Environment Variables +docker exec portfolio-app printenv + +# Shell im Container öffnen +docker exec -it portfolio-app sh + +# Container neu starten +docker compose -f docker-compose.production.yml restart portfolio + +# Container neu erstellen +docker compose -f docker-compose.production.yml up -d --force-recreate + +# Alle Container stoppen +docker compose -f docker-compose.production.yml down + +# Container mit Logs starten +docker compose -f docker-compose.production.yml up +``` + +## Support + +Wenn die Probleme weiterhin bestehen: +1. Führe `./scripts/diagnose-production.sh` aus +2. Speichere die Ausgabe +3. Prüfe Container-Logs: `docker logs portfolio-app --tail=100` +4. Prüfe Nginx Proxy Manager Logs +5. Erstelle ein Issue mit allen Informationen diff --git a/scripts/diagnose-production.sh b/scripts/diagnose-production.sh new file mode 100755 index 0000000..4f353ce --- /dev/null +++ b/scripts/diagnose-production.sh @@ -0,0 +1,158 @@ +#!/bin/bash +# Production diagnosis script +# Checks container status, network connectivity, and API endpoints + +set -e + +echo "🔍 Production Diagnosis Script" +echo "==============================" +echo "" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check if docker is running +if ! docker info > /dev/null 2>&1; then + echo -e "${RED}❌ Docker is not running${NC}" + exit 1 +fi + +echo -e "${GREEN}✅ Docker is running${NC}" +echo "" + +# Check container status +echo "📦 Container Status:" +echo "-------------------" +CONTAINER_ID=$(docker ps -q -f "name=portfolio-app") +if [ -z "$CONTAINER_ID" ]; then + echo -e "${RED}❌ portfolio-app container is not running${NC}" + echo "" + echo "Checking for stopped containers:" + docker ps -a -f "name=portfolio-app" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + exit 1 +else + echo -e "${GREEN}✅ Container is running (ID: ${CONTAINER_ID})${NC}" + docker ps -f "name=portfolio-app" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}\t{{.Health}}" +fi +echo "" + +# Check container health +echo "🏥 Container Health:" +echo "-------------------" +HEALTH=$(docker inspect portfolio-app --format='{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck") +STATUS=$(docker inspect portfolio-app --format='{{.State.Status}}' 2>/dev/null || echo "unknown") +echo "Status: $STATUS" +echo "Health: $HEALTH" +echo "" + +# Check networks +echo "🌐 Network Connectivity:" +echo "----------------------" +if docker network ls | grep -q "proxy"; then + echo -e "${GREEN}✅ 'proxy' network exists${NC}" + if docker inspect portfolio-app --format='{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}' | grep -q "proxy"; then + echo -e "${GREEN}✅ Container is connected to 'proxy' network${NC}" + else + echo -e "${YELLOW}⚠️ Container is NOT connected to 'proxy' network${NC}" + echo "Connected networks:" + docker inspect portfolio-app --format='{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}' + fi +else + echo -e "${RED}❌ 'proxy' network does not exist${NC}" + echo "Creating proxy network..." + docker network create proxy || echo "Failed to create network (may already exist)" +fi +echo "" + +# Check port mapping +echo "🔌 Port Mapping:" +echo "---------------" +PORT_MAPPING=$(docker port portfolio-app 2>/dev/null | grep 3000 || echo "No port mapping found") +if [ -n "$PORT_MAPPING" ]; then + echo -e "${GREEN}✅ Port mapping: $PORT_MAPPING${NC}" +else + echo -e "${RED}❌ No port mapping found for port 3000${NC}" +fi +echo "" + +# Test from inside container +echo "🧪 Testing from inside container:" +echo "-------------------------------" +if docker exec portfolio-app curl -f -s --max-time 5 http://localhost:3000/api/health > /dev/null 2>&1; then + echo -e "${GREEN}✅ Health endpoint responds from inside container${NC}" + docker exec portfolio-app curl -s http://localhost:3000/api/health | head -5 +else + echo -e "${RED}❌ Health endpoint does not respond from inside container${NC}" + echo "Container logs (last 20 lines):" + docker logs portfolio-app --tail=20 +fi +echo "" + +# Test from host +echo "🧪 Testing from host:" +echo "-------------------" +if curl -f -s --max-time 5 http://localhost:3000/api/health > /dev/null 2>&1; then + echo -e "${GREEN}✅ Health endpoint responds from host${NC}" + curl -s http://localhost:3000/api/health | head -5 +else + echo -e "${RED}❌ Health endpoint does not respond from host${NC}" + echo "This is normal if the container is only accessible via proxy network" +fi +echo "" + +# Check environment variables +echo "🔐 Environment Variables:" +echo "------------------------" +echo "N8N_WEBHOOK_URL: $(docker exec portfolio-app printenv N8N_WEBHOOK_URL 2>/dev/null | grep -v '^$' || echo 'NOT SET')" +echo "N8N_SECRET_TOKEN: $(docker exec portfolio-app printenv N8N_SECRET_TOKEN 2>/dev/null | grep -v '^$' | sed 's/./*/g' || echo 'NOT SET')" +echo "N8N_API_KEY: $(docker exec portfolio-app printenv N8N_API_KEY 2>/dev/null | grep -v '^$' | sed 's/./*/g' || echo 'NOT SET')" +echo "NODE_ENV: $(docker exec portfolio-app printenv NODE_ENV 2>/dev/null || echo 'NOT SET')" +echo "NEXT_PUBLIC_BASE_URL: $(docker exec portfolio-app printenv NEXT_PUBLIC_BASE_URL 2>/dev/null || echo 'NOT SET')" +echo "" + +# Check container logs for errors +echo "📋 Recent Container Logs (last 30 lines):" +echo "----------------------------------------" +docker logs portfolio-app --tail=30 2>&1 | tail -30 +echo "" + +# Check API endpoints +echo "🌐 Testing API Endpoints:" +echo "------------------------" +ENDPOINTS=("/api/health" "/api/n8n/status" "/api/n8n/chat") +for endpoint in "${ENDPOINTS[@]}"; do + echo -n "Testing $endpoint: " + if docker exec portfolio-app curl -f -s --max-time 5 "http://localhost:3000${endpoint}" > /dev/null 2>&1; then + echo -e "${GREEN}✅ OK${NC}" + else + echo -e "${RED}❌ FAILED${NC}" + fi +done +echo "" + +# Summary +echo "📊 Summary:" +echo "---------" +if [ "$STATUS" == "running" ] && [ "$HEALTH" == "healthy" ]; then + echo -e "${GREEN}✅ Container appears to be healthy${NC}" + echo "" + echo "If you're still seeing 502 errors:" + echo "1. Check Nginx Proxy Manager configuration" + echo "2. Ensure the proxy host points to: portfolio-app:3000 (not localhost:3000)" + echo "3. Ensure the proxy network is correctly configured" + echo "4. Check Nginx Proxy Manager logs" +else + echo -e "${RED}❌ Container has issues${NC}" + echo "" + echo "Recommended actions:" + if [ "$STATUS" != "running" ]; then + echo "1. Restart the container: docker compose -f docker-compose.production.yml restart portfolio" + fi + if [ "$HEALTH" != "healthy" ]; then + echo "2. Check container logs: docker logs portfolio-app --tail=50" + echo "3. Check if the application is starting correctly" + fi +fi diff --git a/scripts/fix-production.sh b/scripts/fix-production.sh new file mode 100755 index 0000000..e6bf632 --- /dev/null +++ b/scripts/fix-production.sh @@ -0,0 +1,118 @@ +#!/bin/bash +# Quick fix script for production issues +# Ensures proxy network exists and container is properly connected + +set -e + +echo "🔧 Production Fix Script" +echo "=======================" +echo "" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +COMPOSE_FILE="docker-compose.production.yml" + +# Check if proxy network exists +echo "🌐 Checking proxy network..." +if docker network ls | grep -q "proxy"; then + echo -e "${GREEN}✅ 'proxy' network exists${NC}" +else + echo -e "${YELLOW}⚠️ 'proxy' network does not exist. Creating...${NC}" + docker network create proxy || { + echo -e "${RED}❌ Failed to create proxy network${NC}" + echo "This might be because Nginx Proxy Manager hasn't created it yet." + echo "Please ensure Nginx Proxy Manager is running and has created the 'proxy' network." + exit 1 + } + echo -e "${GREEN}✅ 'proxy' network created${NC}" +fi +echo "" + +# Check if container is running +echo "📦 Checking container status..." +CONTAINER_ID=$(docker ps -q -f "name=portfolio-app") +if [ -z "$CONTAINER_ID" ]; then + echo -e "${RED}❌ Container is not running${NC}" + echo "Starting container..." + docker compose -f $COMPOSE_FILE up -d + echo "Waiting for container to start..." + sleep 10 +else + echo -e "${GREEN}✅ Container is running${NC}" +fi +echo "" + +# Check if container is connected to proxy network +echo "🔗 Checking network connectivity..." +if docker inspect portfolio-app --format='{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}' | grep -q "proxy"; then + echo -e "${GREEN}✅ Container is connected to 'proxy' network${NC}" +else + echo -e "${YELLOW}⚠️ Container is NOT connected to 'proxy' network${NC}" + echo "Connecting container to proxy network..." + + # Stop container + docker compose -f $COMPOSE_FILE stop portfolio + + # Connect to proxy network + docker network connect proxy portfolio-app || { + echo -e "${RED}❌ Failed to connect container to proxy network${NC}" + echo "Trying to recreate container..." + docker compose -f $COMPOSE_FILE up -d --force-recreate + } + + # Start container + docker compose -f $COMPOSE_FILE start portfolio + + echo -e "${GREEN}✅ Container recreated and connected to proxy network${NC}" +fi +echo "" + +# Wait for health check +echo "⏳ Waiting for container to be healthy..." +for i in {1..30}; do + HEALTH=$(docker inspect portfolio-app --format='{{.State.Health.Status}}' 2>/dev/null || echo "starting") + if [ "$HEALTH" == "healthy" ]; then + echo -e "${GREEN}✅ Container is healthy${NC}" + break + fi + if [ $i -eq 30 ]; then + echo -e "${YELLOW}⚠️ Container health check timeout${NC}" + echo "Container logs:" + docker logs portfolio-app --tail=30 + else + echo "Waiting... ($i/30)" + sleep 2 + fi +done +echo "" + +# Test API endpoints +echo "🧪 Testing API endpoints..." +if docker exec portfolio-app curl -f -s --max-time 5 http://localhost:3000/api/health > /dev/null 2>&1; then + echo -e "${GREEN}✅ Health endpoint is working${NC}" +else + echo -e "${RED}❌ Health endpoint is not working${NC}" + echo "Container logs:" + docker logs portfolio-app --tail=50 + exit 1 +fi +echo "" + +# Summary +echo "📊 Summary:" +echo "---------" +echo -e "${GREEN}✅ Production fix completed${NC}" +echo "" +echo "Next steps:" +echo "1. Verify Nginx Proxy Manager configuration:" +echo " - Forward Hostname/IP: portfolio-app" +echo " - Forward Port: 3000" +echo " - Ensure 'proxy' network is selected" +echo "" +echo "2. Test the website: https://dk0.dev" +echo "" +echo "3. If still having issues, run: ./scripts/diagnose-production.sh"