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.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
304
messages/de.json
304
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",
|
||||
|
||||
304
messages/en.json
304
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",
|
||||
|
||||
99
scripts/debug-server-error.sh
Executable file
99
scripts/debug-server-error.sh
Executable file
@@ -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"
|
||||
|
||||
51
scripts/fix-network.sh
Executable file
51
scripts/fix-network.sh
Executable file
@@ -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."
|
||||
|
||||
Reference in New Issue
Block a user