From 5613e5d48edbcdb006e19e575044faceeb752414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=B6rdle=20Bot?= Date: Mon, 1 Dec 2025 16:48:04 +0100 Subject: [PATCH] docs: update Caddy setup documentation and clarify network warnings - Corrected the container port for health check from 3010 to 3000 in Caddy setup instructions. - Added a section addressing a harmless network warning during deployment, including an optional fix script for user convenience. - Enhanced clarity and usability of the documentation for better user experience. --- CADDY_SETUP.md | 20 ++- messages/de.json | 304 +++++++++++++++++----------------- messages/en.json | 304 +++++++++++++++++----------------- scripts/debug-server-error.sh | 99 +++++++++++ scripts/fix-network.sh | 51 ++++++ 5 files changed, 473 insertions(+), 305 deletions(-) create mode 100755 scripts/debug-server-error.sh create mode 100755 scripts/fix-network.sh diff --git a/CADDY_SETUP.md b/CADDY_SETUP.md index 623e0e6..0c4d43b 100644 --- a/CADDY_SETUP.md +++ b/CADDY_SETUP.md @@ -210,8 +210,26 @@ openssl s_client -connect xn--hrdle-jua.de:443 -servername xn--hrdle-jua.de < /d 2. Prüfe, ob hoerdle-Container läuft: `docker ps | grep hoerdle` 3. Teste Verbindung von Caddy zu Hördle: ```bash - docker exec hoerdle-caddy wget -O- http://hoerdle:3010/api/health + docker exec hoerdle-caddy wget -O- http://hoerdle:3000/api/health ``` + **Hinweis**: Der Container-Port ist 3000 (nicht 3010, das ist nur der Host-Port). + +### Netzwerk-Warnung beim Deployment + +**Problem**: Warnung `network hoerdle_default was found but has incorrect label` + +**Erklärung**: Diese Warnung ist **harmlos** und kann ignoriert werden. Docker Compose funktioniert trotzdem einwandfrei. Sie entsteht, wenn das Netzwerk bereits existiert, aber nicht von Docker Compose erstellt wurde. + +**Optional: Warnung beheben** (nur wenn sie stört): +```bash +# Reparatur-Skript ausführen (stoppt Container kurz) +./scripts/fix-network.sh + +# Danach Container neu starten +docker compose up -d +``` + +**Hinweis**: Das Reparatur-Skript stoppt alle Container kurz, die das Netzwerk nutzen. In Produktion sollte dies außerhalb der Hauptnutzungszeit erfolgen. ## Deployment-Workflow diff --git a/messages/de.json b/messages/de.json index 458c51b..b75ef05 100644 --- a/messages/de.json +++ b/messages/de.json @@ -1,156 +1,156 @@ { - "Common": { - "loading": "Laden...", - "error": "Ein Fehler ist aufgetreten", - "save": "Speichern", - "cancel": "Abbrechen", - "delete": "Löschen", - "edit": "Bearbeiten", - "back": "Zurück" - }, - "Navigation": { - "home": "Startseite", - "admin": "Admin", - "global": "Global", - "news": "Neuigkeiten" - }, - "Game": { - "play": "Abspielen", - "pause": "Pause", - "skip": "Überspringen", - "submit": "Raten", - "next": "Nächstes", - "won": "Gewonnen!", - "lost": "Verloren", - "correct": "Richtig!", - "wrong": "Falsch", - "guessPlaceholder": "Lied oder Interpret eingeben...", - "attempts": "Versuche", - "share": "Teilen", - "nextPuzzle": "Nächstes Rätsel in", - "noPuzzleAvailable": "Kein Rätsel verfügbar", - "noPuzzleDescription": "Tägliches Rätsel konnte nicht generiert werden.", - "noPuzzleGenre": "Bitte stelle sicher, dass Songs in der Datenbank vorhanden sind", - "goToAdmin": "Zum Admin-Dashboard gehen", - "loadingState": "Lade Status...", - "attempt": "Versuch", - "unlocked": "freigeschaltet", - "start": "Start", - "skipWithBonus": "Überspringen (+{seconds}s)", - "solveGiveUp": "Lösen (Aufgeben)", - "comeBackTomorrow": "Komm morgen zurück für ein neues Lied.", - "theSongWas": "Das Lied war:", - "score": "Punkte", - "scoreBreakdown": "Punkteaufschlüsselung", - "albumCover": "Album-Cover", - "released": "Veröffentlicht", - "yourBrowserDoesNotSupport": "Ihr Browser unterstützt das Audio-Element nicht.", - "thanksForRating": "Danke für die Bewertung!", - "rateThisPuzzle": "Bewerte dieses Rätsel:", - "shared": "✓ Geteilt!", - "copied": "✓ Kopiert!", - "shareFailed": "✗ Fehlgeschlagen", - "bonusRound": "Bonus-Runde!", - "guessReleaseYear": "Errate das Veröffentlichungsjahr für", - "points": "Punkte", - "skipBonus": "Bonus überspringen", - "notQuite": "Nicht ganz!", - "youGuessed": "Du hast geraten", - "actuallyReleasedIn": "Tatsächlich veröffentlicht in", - "skipped": "Übersprungen", - "gameOverPlaceholder": "Spiel beendet", - "knowItSearch": "Weißt du es? Suche nach Interpret / Titel", - "special": "Special", - "genre": "Genre" - }, - "Statistics": { - "yourStatistics": "Deine Statistiken", - "totalPuzzles": "Gesamte Rätsel", - "try": "Versuch", - "failed": "Verloren" - }, - "OnboardingTour": { - "done": "Fertig", - "next": "Weiter", - "previous": "Zurück", - "genresSpecials": "Genres & Specials", - "genresSpecialsDescription": "Wähle hier ein bestimmtes Genre oder ein kuratiertes Special-Event.", - "news": "Neuigkeiten", - "newsDescription": "Bleibe auf dem Laufenden mit den neuesten Nachrichten und Ankündigungen.", - "hoerdle": "Hördle", - "hoerdleDescription": "Das ist das tägliche Rätsel. Ein neues Lied jeden Tag pro Genre.", - "attempts": "Versuche", - "attemptsDescription": "Du hast eine begrenzte Anzahl von Versuchen, um das Lied zu erraten.", - "score": "Punkte", - "scoreDescription": "Deine aktuelle Punktzahl. Versuche sie hoch zu halten!", - "player": "Player", - "playerDescription": "Höre dir den Ausschnitt an. Jedes zusätzliche Abspielen reduziert deine mögliche Punktzahl.", - "input": "Eingabe", - "inputDescription": "Gib hier deine Vermutung ein. Suche nach Interpret oder Titel.", - "controls": "Steuerung", - "controlsDescription": "Starte die Musik oder überspringe zum nächsten Ausschnitt, wenn du feststeckst." - }, - "InstallPrompt": { - "installApp": "Hördle App installieren", - "installDescription": "Installiere die App für eine bessere Erfahrung und schnellen Zugriff!", - "iosInstructions": "Tippe auf", - "iosShare": "Teilen", - "iosThen": "dann \"Zum Home-Bildschirm hinzufügen\"", - "installButton": "App installieren" - }, - "Home": { - "welcome": "Willkommen bei Hördle", - "subtitle": "Errate den Song anhand kurzer Ausschnitte", - "globalTooltip": "Ein zufälliger Song aus der gesamten Sammlung", - "comingSoon": "Demnächst", - "curatedBy": "Kuratiert von" - }, - "Admin": { - "title": "Hördle Admin Dashboard", - "login": "Admin Login", - "password": "Passwort", - "loginButton": "Login", - "logout": "Abmelden", - "manageSpecials": "Specials verwalten", - "manageGenres": "Genres verwalten", - "manageNews": "News & Ankündigungen verwalten", - "uploadSongs": "Songs hochladen", - "todaysPuzzles": "Heutige tägliche Rätsel", - "show": "▶ Anzeigen", - "hide": "▼ Ausblenden", - "addSpecial": "Special hinzufügen", - "addGenre": "Genre hinzufügen", - "addNews": "News hinzufügen", - "edit": "Bearbeiten", - "delete": "Löschen", - "save": "Speichern", - "cancel": "Abbrechen", - "curate": "Kurieren", - "name": "Name", - "subtitle": "Untertitel", - "maxAttempts": "Max. Versuche", - "unlockSteps": "Freischalt-Schritte", - "launchDate": "Startdatum", - "endDate": "Enddatum", - "curator": "Kurator", - "active": "Aktiv", - "newGenreName": "Neuer Genre-Name", - "editSpecial": "Special bearbeiten", - "editGenre": "Genre bearbeiten", - "editNews": "News bearbeiten", - "newsTitle": "News-Titel", - "content": "Inhalt (Markdown unterstützt)", - "author": "Autor (optional)", - "featured": "Hervorgehoben", - "noSpecialLink": "Kein Special-Link", - "noNewsItems": "Noch keine News-Einträge. Erstelle einen oben!", - "noPuzzlesToday": "Keine täglichen Rätsel für heute gefunden.", - "category": "Kategorie", - "song": "Song", - "artist": "Interpret", - "actions": "Aktionen", - "deletePuzzle": "Löschen", - "wrongPassword": "Falsches Passwort" + "Common": { + "loading": "Laden...", + "error": "Ein Fehler ist aufgetreten", + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "back": "Zurück" + }, + "Navigation": { + "home": "Startseite", + "admin": "Admin", + "global": "Global", + "news": "Neuigkeiten" + }, + "Game": { + "play": "Abspielen", + "pause": "Pause", + "skip": "Überspringen", + "submit": "Raten", + "next": "Nächstes", + "won": "Gewonnen!", + "lost": "Verloren", + "correct": "Richtig!", + "wrong": "Falsch", + "guessPlaceholder": "Lied oder Interpret eingeben...", + "attempts": "Versuche", + "share": "Teilen", + "nextPuzzle": "Nächstes Rätsel in", + "noPuzzleAvailable": "Kein Rätsel verfügbar", + "noPuzzleDescription": "Tägliches Rätsel konnte nicht generiert werden.", + "noPuzzleGenre": "Bitte stelle sicher, dass Songs in der Datenbank vorhanden sind", + "goToAdmin": "Zum Admin-Dashboard gehen", + "loadingState": "Lade Status...", + "attempt": "Versuch", + "unlocked": "freigeschaltet", + "start": "Start", + "skipWithBonus": "Überspringen (+{seconds}s)", + "solveGiveUp": "Lösen (Aufgeben)", + "comeBackTomorrow": "Komm morgen zurück für ein neues Lied.", + "theSongWas": "Das Lied war:", + "score": "Punkte", + "scoreBreakdown": "Punkteaufschlüsselung", + "albumCover": "Album-Cover", + "released": "Veröffentlicht", + "yourBrowserDoesNotSupport": "Ihr Browser unterstützt das Audio-Element nicht.", + "thanksForRating": "Danke für die Bewertung!", + "rateThisPuzzle": "Bewerte dieses Rätsel:", + "shared": "✓ Geteilt!", + "copied": "✓ Kopiert!", + "shareFailed": "✗ Fehlgeschlagen", + "bonusRound": "Bonus-Runde!", + "guessReleaseYear": "Errate das Veröffentlichungsjahr für", + "points": "Punkte", + "skipBonus": "Bonus überspringen", + "notQuite": "Nicht ganz!", + "youGuessed": "Du hast geraten", + "actuallyReleasedIn": "Tatsächlich veröffentlicht in", + "skipped": "Übersprungen", + "gameOverPlaceholder": "Spiel beendet", + "knowItSearch": "Weißt du es? Suche nach Interpret / Titel", + "special": "Special", + "genre": "Genre" + }, + "Statistics": { + "yourStatistics": "Deine Statistiken", + "totalPuzzles": "Gesamte Rätsel", + "try": "Versuch", + "failed": "Verloren" + }, + "OnboardingTour": { + "done": "Fertig", + "next": "Weiter", + "previous": "Zurück", + "genresSpecials": "Genres & Specials", + "genresSpecialsDescription": "Wähle hier ein bestimmtes Genre oder ein kuratiertes Special-Event.", + "news": "Neuigkeiten", + "newsDescription": "Bleibe auf dem Laufenden mit den neuesten Nachrichten und Ankündigungen.", + "hoerdle": "Hördle", + "hoerdleDescription": "Das ist das tägliche Rätsel. Ein neues Lied jeden Tag pro Genre.", + "attempts": "Versuche", + "attemptsDescription": "Du hast eine begrenzte Anzahl von Versuchen, um das Lied zu erraten.", + "score": "Punkte", + "scoreDescription": "Deine aktuelle Punktzahl. Versuche sie hoch zu halten!", + "player": "Player", + "playerDescription": "Höre dir den Ausschnitt an. Jedes zusätzliche Abspielen reduziert deine mögliche Punktzahl.", + "input": "Eingabe", + "inputDescription": "Gib hier deine Vermutung ein. Suche nach Interpret oder Titel.", + "controls": "Steuerung", + "controlsDescription": "Starte die Musik oder überspringe zum nächsten Ausschnitt, wenn du feststeckst." + }, + "InstallPrompt": { + "installApp": "Hördle App installieren", + "installDescription": "Installiere die App für eine bessere Erfahrung und schnellen Zugriff!", + "iosInstructions": "Tippe auf", + "iosShare": "Teilen", + "iosThen": "dann \"Zum Home-Bildschirm hinzufügen\"", + "installButton": "App installieren" + }, + "Home": { + "welcome": "Willkommen bei Hördle", + "subtitle": "Errate den Song anhand kurzer Ausschnitte", + "globalTooltip": "Ein zufälliger Song aus der gesamten Sammlung", + "comingSoon": "Demnächst", + "curatedBy": "Kuratiert von" + }, + "Admin": { + "title": "Hördle Admin Dashboard", + "login": "Admin Login", + "password": "Passwort", + "loginButton": "Login", + "logout": "Abmelden", + "manageSpecials": "Specials verwalten", + "manageGenres": "Genres verwalten", + "manageNews": "News & Ankündigungen verwalten", + "uploadSongs": "Songs hochladen", + "todaysPuzzles": "Heutige tägliche Rätsel", + "show": "▶ Anzeigen", + "hide": "▼ Ausblenden", + "addSpecial": "Special hinzufügen", + "addGenre": "Genre hinzufügen", + "addNews": "News hinzufügen", + "edit": "Bearbeiten", + "delete": "Löschen", + "save": "Speichern", + "cancel": "Abbrechen", + "curate": "Kurieren", + "name": "Name", + "subtitle": "Untertitel", + "maxAttempts": "Max. Versuche", + "unlockSteps": "Freischalt-Schritte", + "launchDate": "Startdatum", + "endDate": "Enddatum", + "curator": "Kurator", + "active": "Aktiv", + "newGenreName": "Neuer Genre-Name", + "editSpecial": "Special bearbeiten", + "editGenre": "Genre bearbeiten", + "editNews": "News bearbeiten", + "newsTitle": "News-Titel", + "content": "Inhalt (Markdown unterstützt)", + "author": "Autor (optional)", + "featured": "Hervorgehoben", + "noSpecialLink": "Kein Special-Link", + "noNewsItems": "Noch keine News-Einträge. Erstelle einen oben!", + "noPuzzlesToday": "Keine täglichen Rätsel für heute gefunden.", + "category": "Kategorie", + "song": "Song", + "artist": "Interpret", + "actions": "Aktionen", + "deletePuzzle": "Löschen", + "wrongPassword": "Falsches Passwort" }, "About": { "title": "Über Hördle & Impressum", diff --git a/messages/en.json b/messages/en.json index 66477db..898e2c6 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1,156 +1,156 @@ { - "Common": { - "loading": "Loading...", - "error": "An error occurred", - "save": "Save", - "cancel": "Cancel", - "delete": "Delete", - "edit": "Edit", - "back": "Back" - }, - "Navigation": { - "home": "Home", - "admin": "Admin", - "global": "Global", - "news": "News" - }, - "Game": { - "play": "Play", - "pause": "Pause", - "skip": "Skip", - "submit": "Guess", - "next": "Next", - "won": "You won!", - "lost": "Game Over", - "correct": "Correct!", - "wrong": "Wrong", - "guessPlaceholder": "Type song or artist...", - "attempts": "Attempts", - "share": "Share", - "nextPuzzle": "Next puzzle in", - "noPuzzleAvailable": "No Puzzle Available", - "noPuzzleDescription": "Could not generate a daily puzzle.", - "noPuzzleGenre": "Please ensure there are songs in the database", - "goToAdmin": "Go to Admin Dashboard", - "loadingState": "Loading state...", - "attempt": "Attempt", - "unlocked": "unlocked", - "start": "Start", - "skipWithBonus": "Skip (+{seconds}s)", - "solveGiveUp": "Solve (Give Up)", - "comeBackTomorrow": "Come back tomorrow for a new song.", - "theSongWas": "The song was:", - "score": "Score", - "scoreBreakdown": "Score Breakdown", - "albumCover": "Album Cover", - "released": "Released", - "yourBrowserDoesNotSupport": "Your browser does not support the audio element.", - "thanksForRating": "Thanks for rating!", - "rateThisPuzzle": "Rate this puzzle:", - "shared": "✓ Shared!", - "copied": "✓ Copied!", - "shareFailed": "✗ Failed", - "bonusRound": "Bonus Round!", - "guessReleaseYear": "Guess the release year for", - "points": "points", - "skipBonus": "Skip Bonus", - "notQuite": "Not quite!", - "youGuessed": "You guessed", - "actuallyReleasedIn": "Actually released in", - "skipped": "Skipped", - "gameOverPlaceholder": "Game Over", - "knowItSearch": "Know it? Search for the artist / title", - "special": "Special", - "genre": "Genre" - }, - "Statistics": { - "yourStatistics": "Your Statistics", - "totalPuzzles": "Total puzzles", - "try": "try", - "failed": "Failed" - }, - "OnboardingTour": { - "done": "Done", - "next": "Next", - "previous": "Previous", - "genresSpecials": "Genres & Specials", - "genresSpecialsDescription": "Choose a specific genre or a curated special event here.", - "news": "News", - "newsDescription": "Stay updated with the latest news and announcements.", - "hoerdle": "Hördle", - "hoerdleDescription": "This is the daily puzzle. One new song every day per genre.", - "attempts": "Attempts", - "attemptsDescription": "You have a limited number of attempts to guess the song.", - "score": "Score", - "scoreDescription": "Your current score. Try to keep it high!", - "player": "Player", - "playerDescription": "Listen to the snippet. Each additional play reduces your potential score.", - "input": "Input", - "inputDescription": "Type your guess here. Search for artist or title.", - "controls": "Controls", - "controlsDescription": "Start the music or skip to the next snippet if you're stuck." - }, - "InstallPrompt": { - "installApp": "Install Hördle App", - "installDescription": "Install the app for a better experience and quick access!", - "iosInstructions": "Tap", - "iosShare": "share", - "iosThen": "then \"Add to Home Screen\"", - "installButton": "Install App" - }, - "Home": { - "welcome": "Welcome to Hördle", - "subtitle": "Guess the song from short snippets", - "globalTooltip": "A random song from the entire collection", - "comingSoon": "Coming soon", - "curatedBy": "Curated by" - }, - "Admin": { - "title": "Hördle Admin Dashboard", - "login": "Admin Login", - "password": "Password", - "loginButton": "Login", - "logout": "Logout", - "manageSpecials": "Manage Specials", - "manageGenres": "Manage Genres", - "manageNews": "Manage News & Announcements", - "uploadSongs": "Upload Songs", - "todaysPuzzles": "Today's Daily Puzzles", - "show": "▶ Show", - "hide": "▼ Hide", - "addSpecial": "Add Special", - "addGenre": "Add Genre", - "addNews": "Add News", - "edit": "Edit", - "delete": "Delete", - "save": "Save", - "cancel": "Cancel", - "curate": "Curate", - "name": "Name", - "subtitle": "Subtitle", - "maxAttempts": "Max Attempts", - "unlockSteps": "Unlock Steps", - "launchDate": "Launch Date", - "endDate": "End Date", - "curator": "Curator", - "active": "Active", - "newGenreName": "New Genre Name", - "editSpecial": "Edit Special", - "editGenre": "Edit Genre", - "editNews": "Edit News", - "newsTitle": "News Title", - "content": "Content (Markdown supported)", - "author": "Author (optional)", - "featured": "Featured", - "noSpecialLink": "No Special Link", - "noNewsItems": "No news items yet. Create one above!", - "noPuzzlesToday": "No daily puzzles found for today.", - "category": "Category", - "song": "Song", - "artist": "Artist", - "actions": "Actions", - "deletePuzzle": "Delete", - "wrongPassword": "Wrong password" + "Common": { + "loading": "Loading...", + "error": "An error occurred", + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "back": "Back" + }, + "Navigation": { + "home": "Home", + "admin": "Admin", + "global": "Global", + "news": "News" + }, + "Game": { + "play": "Play", + "pause": "Pause", + "skip": "Skip", + "submit": "Guess", + "next": "Next", + "won": "You won!", + "lost": "Game Over", + "correct": "Correct!", + "wrong": "Wrong", + "guessPlaceholder": "Type song or artist...", + "attempts": "Attempts", + "share": "Share", + "nextPuzzle": "Next puzzle in", + "noPuzzleAvailable": "No Puzzle Available", + "noPuzzleDescription": "Could not generate a daily puzzle.", + "noPuzzleGenre": "Please ensure there are songs in the database", + "goToAdmin": "Go to Admin Dashboard", + "loadingState": "Loading state...", + "attempt": "Attempt", + "unlocked": "unlocked", + "start": "Start", + "skipWithBonus": "Skip (+{seconds}s)", + "solveGiveUp": "Solve (Give Up)", + "comeBackTomorrow": "Come back tomorrow for a new song.", + "theSongWas": "The song was:", + "score": "Score", + "scoreBreakdown": "Score Breakdown", + "albumCover": "Album Cover", + "released": "Released", + "yourBrowserDoesNotSupport": "Your browser does not support the audio element.", + "thanksForRating": "Thanks for rating!", + "rateThisPuzzle": "Rate this puzzle:", + "shared": "✓ Shared!", + "copied": "✓ Copied!", + "shareFailed": "✗ Failed", + "bonusRound": "Bonus Round!", + "guessReleaseYear": "Guess the release year for", + "points": "points", + "skipBonus": "Skip Bonus", + "notQuite": "Not quite!", + "youGuessed": "You guessed", + "actuallyReleasedIn": "Actually released in", + "skipped": "Skipped", + "gameOverPlaceholder": "Game Over", + "knowItSearch": "Know it? Search for the artist / title", + "special": "Special", + "genre": "Genre" + }, + "Statistics": { + "yourStatistics": "Your Statistics", + "totalPuzzles": "Total puzzles", + "try": "try", + "failed": "Failed" + }, + "OnboardingTour": { + "done": "Done", + "next": "Next", + "previous": "Previous", + "genresSpecials": "Genres & Specials", + "genresSpecialsDescription": "Choose a specific genre or a curated special event here.", + "news": "News", + "newsDescription": "Stay updated with the latest news and announcements.", + "hoerdle": "Hördle", + "hoerdleDescription": "This is the daily puzzle. One new song every day per genre.", + "attempts": "Attempts", + "attemptsDescription": "You have a limited number of attempts to guess the song.", + "score": "Score", + "scoreDescription": "Your current score. Try to keep it high!", + "player": "Player", + "playerDescription": "Listen to the snippet. Each additional play reduces your potential score.", + "input": "Input", + "inputDescription": "Type your guess here. Search for artist or title.", + "controls": "Controls", + "controlsDescription": "Start the music or skip to the next snippet if you're stuck." + }, + "InstallPrompt": { + "installApp": "Install Hördle App", + "installDescription": "Install the app for a better experience and quick access!", + "iosInstructions": "Tap", + "iosShare": "share", + "iosThen": "then \"Add to Home Screen\"", + "installButton": "Install App" + }, + "Home": { + "welcome": "Welcome to Hördle", + "subtitle": "Guess the song from short snippets", + "globalTooltip": "A random song from the entire collection", + "comingSoon": "Coming soon", + "curatedBy": "Curated by" + }, + "Admin": { + "title": "Hördle Admin Dashboard", + "login": "Admin Login", + "password": "Password", + "loginButton": "Login", + "logout": "Logout", + "manageSpecials": "Manage Specials", + "manageGenres": "Manage Genres", + "manageNews": "Manage News & Announcements", + "uploadSongs": "Upload Songs", + "todaysPuzzles": "Today's Daily Puzzles", + "show": "▶ Show", + "hide": "▼ Hide", + "addSpecial": "Add Special", + "addGenre": "Add Genre", + "addNews": "Add News", + "edit": "Edit", + "delete": "Delete", + "save": "Save", + "cancel": "Cancel", + "curate": "Curate", + "name": "Name", + "subtitle": "Subtitle", + "maxAttempts": "Max Attempts", + "unlockSteps": "Unlock Steps", + "launchDate": "Launch Date", + "endDate": "End Date", + "curator": "Curator", + "active": "Active", + "newGenreName": "New Genre Name", + "editSpecial": "Edit Special", + "editGenre": "Edit Genre", + "editNews": "Edit News", + "newsTitle": "News Title", + "content": "Content (Markdown supported)", + "author": "Author (optional)", + "featured": "Featured", + "noSpecialLink": "No Special Link", + "noNewsItems": "No news items yet. Create one above!", + "noPuzzlesToday": "No daily puzzles found for today.", + "category": "Category", + "song": "Song", + "artist": "Artist", + "actions": "Actions", + "deletePuzzle": "Delete", + "wrongPassword": "Wrong password" }, "About": { "title": "About Hördle & Imprint", diff --git a/scripts/debug-server-error.sh b/scripts/debug-server-error.sh new file mode 100755 index 0000000..0394637 --- /dev/null +++ b/scripts/debug-server-error.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# Script zum Debuggen von Server-Errors in Hördle +# Zeigt relevante Logs und Status-Informationen + +set -e + +echo "🔍 Hördle Server Error Debugging" +echo "==================================" +echo "" + +# Container-Status prüfen +echo "📦 Container-Status:" +docker ps --filter "name=hoerdle" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +echo "" + +# Prüfe ob Container läuft +if ! docker ps | grep -q "hoerdle"; then + echo "❌ FEHLER: hoerdle Container läuft nicht!" + echo "" + echo "Versuche Container zu starten..." + docker compose up -d + sleep 5 + echo "" +fi + +# Letzte Logs anzeigen +echo "📋 Letzte 50 Zeilen der Container-Logs:" +echo "----------------------------------------" +docker logs --tail=50 hoerdle 2>&1 | tail -50 +echo "" +echo "" + +# Suche nach Fehlern in den Logs +echo "🚨 Fehler in den Logs (letzte 100 Zeilen):" +echo "----------------------------------------" +docker logs --tail=100 hoerdle 2>&1 | grep -i -E "error|exception|failed|fatal|panic" || echo "Keine offensichtlichen Fehler gefunden" +echo "" +echo "" + +# Container Health Status +echo "💚 Health Check Status:" +docker inspect hoerdle --format='{{json .State.Health}}' | python3 -m json.tool 2>/dev/null || docker inspect hoerdle --format='{{.State.Status}}' +echo "" +echo "" + +# Prüfe ob der Server auf Port 3000 antwortet (intern) +echo "🔌 Port-Verbindungstest (intern, Port 3000):" +echo "----------------------------------------" +docker exec hoerdle curl -f -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:3000/api/daily 2>&1 || echo "❌ Verbindung fehlgeschlagen" +echo "" +echo "" + +# Prüfe Datenbank +echo "💾 Datenbank-Status:" +echo "----------------------------------------" +if docker exec hoerdle test -f /app/data/prod.db; then + echo "✅ Datenbankdatei existiert" + DB_SIZE=$(docker exec hoerdle stat -c%s /app/data/prod.db 2>/dev/null || echo "unbekannt") + echo " Größe: $DB_SIZE Bytes" +else + echo "❌ Datenbankdatei nicht gefunden!" +fi +echo "" + +# Prüfe Umgebungsvariablen (wichtige) +echo "🔐 Wichtige Umgebungsvariablen:" +echo "----------------------------------------" +docker exec hoerdle env | grep -E "DATABASE_URL|NODE_ENV|PORT|HOSTNAME" || echo "Keine gefunden" +echo "" + +# Prüfe ob Next.js Server läuft +echo "🌐 Next.js Prozess-Status:" +echo "----------------------------------------" +docker exec hoerdle ps aux | grep -E "node|next" | grep -v grep || echo "Keine Next.js Prozesse gefunden" +echo "" + +# Netzwerk-Verbindung prüfen +echo "🌐 Netzwerk-Verbindungen:" +echo "----------------------------------------" +docker network inspect hoerdle_default --format='{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"\n"}}{{end}}' 2>/dev/null || echo "Netzwerk nicht gefunden" +echo "" + +# Caddy Status (falls vorhanden) +if docker ps | grep -q "hoerdle-caddy"; then + echo "🚪 Caddy-Container Status:" + echo "----------------------------------------" + docker logs --tail=20 hoerdle-caddy 2>&1 | tail -20 + echo "" +fi + +echo "==================================" +echo "✅ Debug-Informationen gesammelt" +echo "" +echo "💡 Nächste Schritte:" +echo "1. Prüfe die Fehler-Logs oben" +echo "2. Prüfe ob die Datenbank erreichbar ist" +echo "3. Prüfe ob alle Umgebungsvariablen gesetzt sind" +echo "4. Bei weiteren Problemen: docker logs hoerdle --tail=200" + diff --git a/scripts/fix-network.sh b/scripts/fix-network.sh new file mode 100755 index 0000000..56f1e6c --- /dev/null +++ b/scripts/fix-network.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# Script zum Reparieren des Docker-Netzwerks hoerdle_default +# Dieses Script behebt die Warnung über falsche Netzwerk-Labels + +set -e + +echo "🔧 Repariere Docker-Netzwerk hoerdle_default..." + +# Prüfe, ob Container laufen +RUNNING_CONTAINERS=$(docker ps --filter "network=hoerdle_default" --format "{{.Names}}" | wc -l) + +if [ "$RUNNING_CONTAINERS" -gt 0 ]; then + echo "⚠️ Warnung: Es laufen noch Container, die das Netzwerk nutzen." + echo "📋 Container, die betroffen sind:" + docker ps --filter "network=hoerdle_default" --format " - {{.Names}}" + echo "" + echo "Möchtest du fortfahren? Die Container müssen neu gestartet werden. (j/n)" + read -r response + if [ "$response" != "j" ] && [ "$response" != "J" ]; then + echo "❌ Abgebrochen." + exit 1 + fi + + echo "🛑 Stoppe Container..." + docker compose down || true + if [ -f "docker-compose.caddy.yml" ]; then + docker compose -f docker-compose.caddy.yml down || true + fi +fi + +# Prüfe, ob Netzwerk existiert +if docker network ls | grep -q "hoerdle_default"; then + echo "🗑️ Lösche altes Netzwerk..." + docker network rm hoerdle_default || { + echo "❌ Netzwerk konnte nicht gelöscht werden. Möglicherweise sind noch Container verbunden." + echo " Versuche, alle Container zu trennen..." + docker network disconnect hoerdle_default $(docker ps -q --filter "network=hoerdle_default") 2>/dev/null || true + sleep 2 + docker network rm hoerdle_default || { + echo "❌ Netzwerk konnte immer noch nicht gelöscht werden." + echo " Bitte manuell prüfen: docker network inspect hoerdle_default" + exit 1 + } + } +fi + +echo "✨ Netzwerk erfolgreich gelöscht." +echo "📝 Das Netzwerk wird beim nächsten 'docker compose up' automatisch neu erstellt." +echo "" +echo "✅ Fertig! Du kannst jetzt 'docker compose up -d' ausführen." +