{"id":35,"date":"2026-08-15T21:58:57","date_gmt":"2026-08-15T21:58:57","guid":{"rendered":"https:\/\/netguide.io\/homelab\/booklore-zu-grimmory-migrieren\/"},"modified":"2026-08-15T22:10:08","modified_gmt":"2026-08-15T22:10:08","slug":"booklore-zu-grimmory-migrieren","status":"publish","type":"post","link":"https:\/\/netguide.io\/homelab\/de\/booklore-zu-grimmory-migrieren\/","title":{"rendered":"BookLore zu Grimmory migrieren: In-Place-Umzug mit Docker"},"content":{"rendered":"<div id=\"netgu-2343245690\" class=\"netgu-before-content netgu-entity-placement\"><script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6258556257245998\" crossorigin=\"anonymous\"><\/script><ins class=\"adsbygoogle\" style=\"display:block;\" data-ad-client=\"ca-pub-6258556257245998\" \ndata-ad-slot=\"3494115342\" \ndata-ad-format=\"auto\"><\/ins>\n<script> \n(adsbygoogle = window.adsbygoogle || []).push({}); \n<\/script>\n<\/div>\n<p class=\"wp-block-paragraph\"><strong>Grimmory ist der von der Community gepflegte Nachfolger der selbstgehosteten Buch-Bibliothek BookLore. Wer bereits BookLore mit Docker betreibt, kann direkt umziehen, ohne die Bibliothek neu aufzubauen: Grimmory \u00fcbernimmt die bestehende Datenbank, die App-Daten und die Buchpfade. Diese Anleitung zeigt den In-Place-Umzug Schritt f\u00fcr Schritt \u2013 inklusive Backups, vollst\u00e4ndiger Compose-Datei und der Stolperfallen, die dabei tats\u00e4chlich auftreten.<\/strong><\/p>\n\n\n\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-1ffd1ad5      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tInhaltsverzeichnis\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#warum-die-in-place-migration-funktioniert\" class=\"uagb-toc-link__trigger\">Warum die In-Place-Migration funktioniert<\/a><li class=\"uagb-toc__list\"><a href=\"#voraussetzungen\" class=\"uagb-toc-link__trigger\">Voraussetzungen<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-1-backups-anlegen\" class=\"uagb-toc-link__trigger\">Schritt 1: Backups anlegen<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-2-booklore-herunterfahren\" class=\"uagb-toc-link__trigger\">Schritt 2: BookLore herunterfahren<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-3-grimmory-stack-konfigurieren\" class=\"uagb-toc-link__trigger\">Schritt 3: Grimmory-Stack konfigurieren<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-4-starten-und-die-migration-beobachten\" class=\"uagb-toc-link__trigger\">Schritt 4: Starten und die Migration beobachten<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-5-verifizieren\" class=\"uagb-toc-link__trigger\">Schritt 5: Verifizieren<\/a><li class=\"uagb-toc__list\"><a href=\"#nachbereitung\" class=\"uagb-toc-link__trigger\">Nachbereitung<\/a><li class=\"uagb-toc__list\"><a href=\"#h\u00e4ufige-stolperfallen\" class=\"uagb-toc-link__trigger\">H\u00e4ufige Stolperfallen<\/a><li class=\"uagb-toc__list\"><a href=\"#rollback-zu-booklore\" class=\"uagb-toc-link__trigger\">Rollback zu BookLore<\/a><li class=\"uagb-toc__list\"><a href=\"#h\u00e4ufige-fragen-faq\" class=\"uagb-toc-link__trigger\">H\u00e4ufige Fragen (FAQ)<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#bleiben-meine-b\u00fccher-und-metadaten-erhalten\" class=\"uagb-toc-link__trigger\">Bleiben meine B\u00fccher und Metadaten erhalten?<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#muss-ich-meine-benutzer-neu-anlegen\" class=\"uagb-toc-link__trigger\">Muss ich meine Benutzer neu anlegen?<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#kann-ich-booklore-und-grimmory-parallel-testen\" class=\"uagb-toc-link__trigger\">Kann ich BookLore und Grimmory parallel testen?<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#warum-ein-community-fork\" class=\"uagb-toc-link__trigger\">Warum ein Community-Fork?<\/a><\/ul><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<p class=\"wp-block-paragraph\"><strong>F\u00fcr wen ist diese Anleitung?<\/strong> Sie richtet sich an alle, die BookLore bereits mit Docker betreiben und auf Grimmory umziehen m\u00f6chten. Grundlegende Docker-Kenntnisse (Container, <em>Docker Compose<\/em>, Volumes) sind hilfreich, aber wir erkl\u00e4ren die entscheidenden Begriffe unterwegs. Ein \u201eFork&#8221; ist dabei einfach eine eigenst\u00e4ndige Weiterentwicklung eines Projekts \u2013 Grimmory baut also direkt auf BookLore auf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum die In-Place-Migration funktioniert<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eIn-Place&#8221; bedeutet: Wir bauen nichts neu auf, sondern lassen Grimmory die vorhandenen BookLore-Daten direkt weiterverwenden. M\u00f6glich ist das, weil Grimmory ein Fork von BookLore ist und dieselbe Datenbankstruktur als Ausgangspunkt nutzt. Beim ersten Start aktualisiert Grimmory diese Struktur automatisch \u00fcber <strong>Flyway<\/strong> \u2013 ein Werkzeug, das die Datenbank Schritt f\u00fcr Schritt auf den neuen Stand bringt, ohne dass du selbst etwas an der Datenbank \u00e4ndern musst. Das Ergebnis: Alle B\u00fccher, Metadaten, Bibliotheken und Benutzerkonten sind sofort vorhanden, und du meldest dich mit deinem bestehenden BookLore-Account an. Genau das ist auch der vom Projekt empfohlene Migrationsweg.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtigste Regel vorab:<\/strong> BookLore und Grimmory d\u00fcrfen <strong>nicht gleichzeitig laufen<\/strong>. Beide nutzen dieselbe Datenbank, dieselben App-Daten und denselben Port 6060 \u2013 ein Parallelbetrieb w\u00fcrde kollidieren und die Daten gef\u00e4hrden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voraussetzungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine laufende BookLore-Installation mit Docker und MariaDB (die Datenbank, in der BookLore alles speichert).<\/li>\n\n\n\n<li>Zugriff auf den Server, auf dem BookLore l\u00e4uft (z. B. per SSH), und auf die Docker-Compose-Dateien.<\/li>\n\n\n\n<li>Dein BookLore-Datenbankpasswort und die verwendeten Pfade.<\/li>\n\n\n\n<li>Ausreichend Speicherplatz f\u00fcr die Backups.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wo finde ich Passwort und Pfade?<\/strong> Beides steht in deiner bestehenden BookLore-Installation: \u00d6ffne die aktuelle <code>docker-compose.yml<\/code> (und ggf. die <code>.env<\/code>-Datei) deines BookLore-Stacks. Dort findest du das Datenbankpasswort (bei <code>MYSQL_PASSWORD<\/code> bzw. <code>DATABASE_PASSWORD<\/code>) und die Verzeichnisse, in denen die Datenbank, die App-Daten und deine B\u00fccher liegen (die Zeilen unter <code>volumes:<\/code>). Genau diese Werte tragen wir gleich in die Grimmory-Konfiguration ein.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Backups anlegen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Weil die Migration die echte Datenbank ver\u00e4ndert, sichern wir sie zuerst. Ein SQL-Dump plus ein Tarball der App-Daten gen\u00fcgen f\u00fcr einen vollst\u00e4ndigen R\u00fcckweg:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># 1) Datenbank sichern (alle Tabellen als SQL-Dump)\ndocker exec mariadb-booklore \\\n  mariadb-dump -u booklore -p'PLATZHALTER_DB_PASSWORT' booklore \\\n  &gt; booklore-db-$(date +%F).sql\n\n# 2) App-Daten sichern\ntar czf booklore-appdata-$(date +%F).tar.gz \/srv\/docker\/data\/booklore<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># 1) Datenbank sichern (alle Tabellen als SQL-Dump)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> exec<\/span><span style=\"color: #9ECBFF\"> mariadb-booklore<\/span><span style=\"color: #79B8FF\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9ECBFF\">  mariadb-dump<\/span><span style=\"color: #79B8FF\"> -u<\/span><span style=\"color: #9ECBFF\"> booklore<\/span><span style=\"color: #79B8FF\"> -p<\/span><span style=\"color: #9ECBFF\">'PLATZHALTER_DB_PASSWORT'<\/span><span style=\"color: #9ECBFF\"> booklore<\/span><span style=\"color: #79B8FF\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">  ><\/span><span style=\"color: #9ECBFF\"> booklore-db-<\/span><span style=\"color: #E1E4E8\">$(<\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #9ECBFF\"> +%F<\/span><span style=\"color: #E1E4E8\">)<\/span><span style=\"color: #9ECBFF\">.sql<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># 2) App-Daten sichern<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">tar<\/span><span style=\"color: #9ECBFF\"> czf<\/span><span style=\"color: #9ECBFF\"> booklore-appdata-<\/span><span style=\"color: #E1E4E8\">$(<\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #9ECBFF\"> +%F<\/span><span style=\"color: #E1E4E8\">)<\/span><span style=\"color: #9ECBFF\">.tar.gz<\/span><span style=\"color: #9ECBFF\"> \/srv\/docker\/data\/booklore<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfe kurz, dass der Dump nicht leer ist (Dateigr\u00f6\u00dfe > 0) und alle Tabellen enth\u00e4lt. Erst dann geht es weiter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: BookLore herunterfahren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Damit Grimmory das Datenbank-Verzeichnis exklusiv nutzen kann, muss BookLore vollst\u00e4ndig gestoppt werden:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># BookLore stoppen, damit das DB-Datenverzeichnis frei wird\ndocker compose -f \/srv\/docker\/stacks\/booklore\/docker-compose.yml down\n\n# Falls ein alter\/kaputter Grimmory-Versuch laeuft: ebenfalls stoppen\ndocker compose -f \/srv\/docker\/stacks\/grimmory\/docker-compose.yml down<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># BookLore stoppen, damit das DB-Datenverzeichnis frei wird<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> compose<\/span><span style=\"color: #79B8FF\"> -f<\/span><span style=\"color: #9ECBFF\"> \/srv\/docker\/stacks\/booklore\/docker-compose.yml<\/span><span style=\"color: #9ECBFF\"> down<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Falls ein alter\/kaputter Grimmory-Versuch laeuft: ebenfalls stoppen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> compose<\/span><span style=\"color: #79B8FF\"> -f<\/span><span style=\"color: #9ECBFF\"> \/srv\/docker\/stacks\/grimmory\/docker-compose.yml<\/span><span style=\"color: #9ECBFF\"> down<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Grimmory-Stack konfigurieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt legen wir die <code>docker-compose.yml<\/code> f\u00fcr Grimmory an \u2013 am besten in einem eigenen Ordner, z. B. <code>\/srv\/docker\/stacks\/grimmory\/<\/code>. Der Clou: Der Datenbank-Container bindet das <strong>bestehende BookLore-Datenverzeichnis<\/strong> ein, und Grimmory zeigt auf die vorhandene Datenbank <code>booklore<\/code>. Kopiere die folgende Datei und passe die markierten Stellen an:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>services:\n  grimmory:\n    image: ghcr.io\/grimmory-tools\/grimmory:latest\n    container_name: grimmory\n    ports:\n      - \"6060:6060\"\n    environment:\n      USER_ID: 1000\n      GROUP_ID: 1000\n      TZ: Europe\/Berlin\n      # WICHTIG: die BESTEHENDE BookLore-Datenbank weiterverwenden (heisst \"booklore\")\n      DATABASE_URL: jdbc:mariadb:\/\/mariadb-grimmory:3306\/booklore\n      DATABASE_USERNAME: booklore\n      DATABASE_PASSWORD: PLATZHALTER_DB_PASSWORT\n      # ohne diese Zeile startet Grimmory bei lokalem Speicher nicht sauber\n      DISK_TYPE: LOCAL\n      SWAGGER_ENABLED: \"false\"\n      FORCE_DISABLE_OIDC: \"false\"\n    volumes:\n      - \/srv\/docker\/data\/booklore\/app:\/app\/data     # bestehende BookLore-App-Daten\n      - \/srv\/docker\/mnt\/ebooks:\/books               # Buchpfad aus BookLore uebernehmen\n      - \/srv\/docker\/mnt\/ebooks:\/bookdrop\n    depends_on:\n      mariadb-grimmory:\n        condition: service_healthy\n    restart: unless-stopped\n\n  mariadb-grimmory:\n    image: lscr.io\/linuxserver\/mariadb:11.4.8\n    container_name: mariadb-grimmory\n    environment:\n      PUID: 1000\n      PGID: 1000\n      TZ: Europe\/Berlin\n      MYSQL_ROOT_PASSWORD: PLATZHALTER_ROOT_PASSWORT\n      # bestehende BookLore-DB und -Nutzer weiterverwenden\n      MYSQL_DATABASE: booklore\n      MYSQL_USER: booklore\n      MYSQL_PASSWORD: PLATZHALTER_DB_PASSWORT\n    volumes:\n      # HIER liegt die bestehende BookLore-Datenbank -&gt; Grimmory uebernimmt sie\n      - \/srv\/docker\/data\/booklore\/mariadb\/config:\/config\n    healthcheck:\n      test: [\"CMD\", \"mariadb-admin\", \"ping\", \"-h\", \"localhost\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n    restart: unless-stopped<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #85E89D\">services<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">  grimmory<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    image<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">ghcr.io\/grimmory-tools\/grimmory:latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    container_name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">grimmory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    ports<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      - <\/span><span style=\"color: #9ECBFF\">\"6060:6060\"<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    environment<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      USER_ID<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">1000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      GROUP_ID<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">1000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      TZ<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Europe\/Berlin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">      # WICHTIG: die BESTEHENDE BookLore-Datenbank weiterverwenden (heisst \"booklore\")<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      DATABASE_URL<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">jdbc:mariadb:\/\/mariadb-grimmory:3306\/booklore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      DATABASE_USERNAME<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">booklore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      DATABASE_PASSWORD<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">PLATZHALTER_DB_PASSWORT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">      # ohne diese Zeile startet Grimmory bei lokalem Speicher nicht sauber<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      DISK_TYPE<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">LOCAL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      SWAGGER_ENABLED<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">\"false\"<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      FORCE_DISABLE_OIDC<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">\"false\"<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    volumes<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      - <\/span><span style=\"color: #9ECBFF\">\/srv\/docker\/data\/booklore\/app:\/app\/data<\/span><span style=\"color: #6A737D\">     # bestehende BookLore-App-Daten<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      - <\/span><span style=\"color: #9ECBFF\">\/srv\/docker\/mnt\/ebooks:\/books<\/span><span style=\"color: #6A737D\">               # Buchpfad aus BookLore uebernehmen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      - <\/span><span style=\"color: #9ECBFF\">\/srv\/docker\/mnt\/ebooks:\/bookdrop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    depends_on<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      mariadb-grimmory<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">        condition<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">service_healthy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    restart<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">unless-stopped<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">  mariadb-grimmory<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    image<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">lscr.io\/linuxserver\/mariadb:11.4.8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    container_name<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">mariadb-grimmory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    environment<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      PUID<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">1000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      PGID<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">1000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      TZ<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">Europe\/Berlin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      MYSQL_ROOT_PASSWORD<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">PLATZHALTER_ROOT_PASSWORT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">      # bestehende BookLore-DB und -Nutzer weiterverwenden<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      MYSQL_DATABASE<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">booklore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      MYSQL_USER<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">booklore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      MYSQL_PASSWORD<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">PLATZHALTER_DB_PASSWORT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    volumes<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\">      # HIER liegt die bestehende BookLore-Datenbank -> Grimmory uebernimmt sie<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">      - <\/span><span style=\"color: #9ECBFF\">\/srv\/docker\/data\/booklore\/mariadb\/config:\/config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    healthcheck<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      test<\/span><span style=\"color: #E1E4E8\">: [<\/span><span style=\"color: #9ECBFF\">\"CMD\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"mariadb-admin\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"ping\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"-h\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"localhost\"<\/span><span style=\"color: #E1E4E8\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      interval<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">5s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      timeout<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">5s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      retries<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">10<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    restart<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">unless-stopped<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diese Stellen musst du anpassen<\/strong> (die restlichen Werte kannst du \u00fcbernehmen):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>PLATZHALTER_DB_PASSWORT<\/code> und <code>PLATZHALTER_ROOT_PASSWORT<\/code> \u2192 deine echten Datenbankpassw\u00f6rter aus der alten BookLore-Konfiguration. Das DB-Passwort muss an allen drei Stellen identisch sein.<\/li>\n\n\n\n<li>Die Pfade links vom Doppelpunkt unter <code>volumes:<\/code> \u2192 die Verzeichnisse deiner bestehenden BookLore-Installation (DB-Daten, App-Daten, B\u00fccher-Ordner).<\/li>\n\n\n\n<li><code>Europe\/Berlin<\/code> \u2192 deine Zeitzone, falls abweichend.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Zwei Begriffe zum Verst\u00e4ndnis: Ein <em>Volume<\/em> in der Form <code>\/pfad\/auf\/dem\/server:\/pfad\/im\/container<\/code> h\u00e4ngt einen Ordner deines Servers in den Container ein (ein \u201eBind-Mount&#8221;). Deshalb sieht Grimmory die alten Daten. Und der Name <code>mariadb-grimmory<\/code> hinter <code>DATABASE_URL<\/code> ist der <em>Service-Name<\/em> des Datenbank-Containers \u2013 \u00fcber diesen internen Namen finden sich die beiden Container im selben Compose-Stack. Wichtig: Der <code>:\/config<\/code>-Mount muss exakt auf das Verzeichnis zeigen, in dem die bisherigen BookLore-Datenbankdaten liegen \u2013 sonst startet Grimmory mit einer leeren Datenbank.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 4: Starten und die Migration beobachten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt den Stack hochfahren und den Log mitlesen. Grimmory wartet, bis MariaDB \u201ehealthy&#8221; meldet, und f\u00fchrt dann die Flyway-Migration aus:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>docker compose -f \/srv\/docker\/stacks\/grimmory\/docker-compose.yml up -d\n\n# Start live mitverfolgen (Flyway-Migration + App-Start)\ndocker compose -f \/srv\/docker\/stacks\/grimmory\/docker-compose.yml logs -f grimmory<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> compose<\/span><span style=\"color: #79B8FF\"> -f<\/span><span style=\"color: #9ECBFF\"> \/srv\/docker\/stacks\/grimmory\/docker-compose.yml<\/span><span style=\"color: #9ECBFF\"> up<\/span><span style=\"color: #79B8FF\"> -d<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Start live mitverfolgen (Flyway-Migration + App-Start)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> compose<\/span><span style=\"color: #79B8FF\"> -f<\/span><span style=\"color: #9ECBFF\"> \/srv\/docker\/stacks\/grimmory\/docker-compose.yml<\/span><span style=\"color: #9ECBFF\"> logs<\/span><span style=\"color: #79B8FF\"> -f<\/span><span style=\"color: #9ECBFF\"> grimmory<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Im Log solltest du sehen, wie Flyway die Migrationen anwendet (im getesteten Fall 47 Migrationen bis Schema-Version 146) und anschlie\u00dfend Tomcat auf Port 6060 startet. Meldungen wie \u201eSuccessfully applied \u2026 migrations&#8221; und ein laufender Webserver sind das Zeichen f\u00fcr den Erfolg.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 5: Verifizieren<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Container-Status (beide sollten \"healthy\" sein)\ndocker ps --filter name=grimmory\n\n# Erreichbarkeit pruefen (erwartet HTTP 200)\ncurl -I http:\/\/&lt;SERVER-IP&gt;:6060<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A737D\"># Container-Status (beide sollten \"healthy\" sein)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> ps<\/span><span style=\"color: #79B8FF\"> --filter<\/span><span style=\"color: #9ECBFF\"> name=grimmory<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A737D\"># Erreichbarkeit pruefen (erwartet HTTP 200)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">curl<\/span><span style=\"color: #79B8FF\"> -I<\/span><span style=\"color: #9ECBFF\"> http:\/\/<\/span><span style=\"color: #F97583\">&#x3C;<\/span><span style=\"color: #9ECBFF\">SERVER-I<\/span><span style=\"color: #E1E4E8\">P<\/span><span style=\"color: #F97583\">><\/span><span style=\"color: #9ECBFF\">:6060<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ruf anschlie\u00dfend <code>http:\/\/&lt;SERVER-IP&gt;:6060<\/code> im Browser auf und melde dich mit deinem bestehenden BookLore-Konto an. Deine Bibliotheken und B\u00fccher m\u00fcssen vollst\u00e4ndig vorhanden sein \u2013 im Testlauf waren es 144 B\u00fccher, 8 Bibliotheken und der migrierte Benutzer. L\u00e4uft alles, ist der Umzug abgeschlossen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nachbereitung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reverse Proxy:<\/strong> War BookLore z. B. in Zoraxy, Nginx Proxy Manager oder Traefik als Ziel hinterlegt, zeigt der Eintrag dank identischem Port 6060 automatisch auf Grimmory \u2013 hier ist meist keine \u00c4nderung n\u00f6tig.<\/li>\n\n\n\n<li><strong>BookLore-Stack deaktiviert lassen:<\/strong> Starte den alten BookLore-Container nicht erneut. Die Original-Dateien bleiben aber liegen, ein Rollback ist m\u00f6glich.<\/li>\n\n\n\n<li><strong>Passw\u00f6rter rotieren (optional):<\/strong> Die Datenbankpassw\u00f6rter stehen wie zuvor im Klartext in der <code>.env<\/code>\/Compose-Datei. Ein guter Zeitpunkt, sie im Zuge des Umzugs zu erneuern.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">H\u00e4ufige Stolperfallen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u201eUnknownHostException&#8221; beim Start:<\/strong> Der h\u00e4ufigste Fehler. Grimmory kann den Datenbank-Host nicht aufl\u00f6sen, weil die <code>DATABASE_URL<\/code> auf einen Container in einem <em>anderen<\/em> Compose-Projekt\/Netzwerk zeigt (z. B. noch auf den alten <code>mariadb-booklore<\/code>). L\u00f6sung: Datenbank und App im selben Compose-Stack definieren und die <code>DATABASE_URL<\/code> auf den dortigen Service-Namen setzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Grimmory startet, findet aber keine B\u00fccher\/DB:<\/strong> Dann zeigt der <code>:\/config<\/code>-Mount nicht auf das bestehende BookLore-Datenverzeichnis, oder <code>DATABASE_URL<\/code> nennt die falsche Datenbank. Pr\u00fcfe Pfad und Datenbanknamen (<code>booklore<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fehler wegen Speichertyp:<\/strong> Fehlt <code>DISK_TYPE=LOCAL<\/code>, kann Grimmory bei lokalem Speicher den Start verweigern. Die Zeile geh\u00f6rt in die Umgebungsvariablen des App-Containers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Port 6060 belegt:<\/strong> L\u00e4uft BookLore noch, ist der Port blockiert. Stelle sicher, dass der alte Stack mit <code>docker compose down<\/code> gestoppt ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rollback zu BookLore<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Da die Migration das Schema in-place auf Version 146 angehoben hat, ist ein sauberer R\u00fcckweg <strong>\u00fcber das Datenbank-Backup<\/strong> vorgesehen: Grimmory stoppen, das in Schritt 1 erstellte SQL-Backup in die Datenbank zur\u00fcckspielen und anschlie\u00dfend den alten BookLore-Stack wieder starten. Deshalb ist der Dump aus Schritt 1 so wichtig \u2013 ohne ihn l\u00e4sst sich das bereits migrierte Schema nicht ohne Weiteres wieder auf BookLore zur\u00fcckf\u00fchren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">H\u00e4ufige Fragen (FAQ)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Bleiben meine B\u00fccher und Metadaten erhalten?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Grimmory \u00fcbernimmt die bestehende BookLore-Datenbank und die App-Daten vollst\u00e4ndig. Bibliotheken, Metadaten und Lesefortschritt sind nach dem Umzug sofort vorhanden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Muss ich meine Benutzer neu anlegen?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Nein. Die Benutzerkonten werden mitmigriert \u2013 du meldest dich mit deinem bestehenden BookLore-Login an.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Kann ich BookLore und Grimmory parallel testen?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Nein. Beide nutzen dieselbe Datenbank, dieselben Daten und denselben Port. F\u00fcr einen gefahrlosen Test m\u00fcsstest du eine Kopie der Datenbank auf einem anderen Port aufsetzen \u2013 ein Parallelbetrieb auf denselben Daten ist ausgeschlossen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Warum ein Community-Fork?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Grimmory f\u00fchrt BookLore als Community-Projekt weiter und bringt Funktionen wie intelligente Regale, Metadaten-Abgleich, Kobo\/KOReader-Sync, OPDS-Unterst\u00fctzung und einen eingebauten Reader mit. Wer BookLore nutzt, bekommt den vertrauten Funktionsumfang plus aktive Weiterentwicklung.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Quellen: <a href=\"https:\/\/github.com\/grimmory-tools\/grimmory\" target=\"_blank\" rel=\"noopener\">Grimmory auf GitHub<\/a>, <a href=\"https:\/\/github.com\/grimmory-tools\/grimmory\/blob\/develop\/deploy\/compose\/docker-compose.yml\" target=\"_blank\" rel=\"noopener\">offizielle docker-compose.yml<\/a>.<\/em><\/p>\n<div id=\"netgu-1329281673\" class=\"netgu-after-content netgu-entity-placement\"><script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6258556257245998\" crossorigin=\"anonymous\"><\/script><ins class=\"adsbygoogle\" style=\"display:block;\" data-ad-client=\"ca-pub-6258556257245998\" \ndata-ad-slot=\"4559785002\" \ndata-ad-format=\"auto\"><\/ins>\n<script> \n(adsbygoogle = window.adsbygoogle || []).push({}); \n<\/script>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Schritt-f\u00fcr-Schritt: BookLore auf den Community-Fork Grimmory umziehen \u2013 die bestehende Datenbank, App-Daten und Buchpfade \u00fcbernehmen, ganz ohne Datenverlust.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[13],"tags":[],"class_list":["post-35","post","type-post","status-publish","format-standard","hentry","category-docker"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Tobias Pries","author_link":"https:\/\/netguide.io\/homelab\/author\/tobias-pries\/"},"uagb_comment_info":0,"uagb_excerpt":"Schritt-f\u00fcr-Schritt: BookLore auf den Community-Fork Grimmory umziehen \u2013 die bestehende Datenbank, App-Daten und Buchpfade \u00fcbernehmen, ganz ohne Datenverlust.","brizy_media":[],"_links":{"self":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/35","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/comments?post=35"}],"version-history":[{"count":1,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/35\/revisions"}],"predecessor-version":[{"id":36,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/35\/revisions\/36"}],"wp:attachment":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/media?parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/categories?post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/tags?post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}