[Eisfair] languagetool-Server auf eis

Peter Bäumer peter at baeumer.duckdns.org
Fr Mär 20 08:30:37 CET 2026


Am 16.03.2026 um 19:38 schrieb Marcus Röckrath:
> Hallo,
> 
> in der aktuellen c't (6/26) ist auf den Seiten 138ff beschrieben, wie man
> die Rechtschreib- und Grammatikprüfung in LanguageTool (languagetool.org) in
> LibreOffice einbindet. LanguageTool kann auch auch in andere Software
> eingebunden werden, was man auf languagetool.org nachlesen kann.
> 
> Üblicherweise läft die Prüfung über eine API auf languagetool.org, d. h. der
> zu prüfende Text geht an eine externe Instanz.
> 
> Wenn man das nicht möchte, kann man die kostenfreie Variante auch als
> lokalen Dienst betreiben. Der c't-Artiekl beschreibt hier nur die Variante
> als Docker-Image, die manuelle Einrichtung des Server sei "deutlich
> komplexer".
> 
> Das "Komplexe" wollte ich mal ausprobieren und es war eigentlich nicht
> wirklich komplex.
> 
> Achtung: Es wird hier kein eisfair-Paket geben, weil der Datenumfang die
> Größe eines eisfair-Paketes sprengt - man muss mindestens 2 GB an Archiven
> herunterladen.
> 
> Daher will ich hier fürs Erste mal ein Installationsanleitung machen, die
> nach Diskussion auch zu einem HowTo werden kann.
> 
> 1. Folgende eisfair-Pakete brauchen wir vorab:
> 
> eisman install java-headless
> eisman install python313-fasttext
> 
> 2. Wir legen eines Systemuser languagetool an:
> 
> /var/install/bin/add-user -r -d languagetool '*' '' nogroup 'LanguageTool'
> '/var/lib/empty' '/sbin/nologin'
> 
> 3. Nun laden wir 4 Archive herunter:
> 
> wget https://languagetool.org/download/LanguageTool-stable.zip
> wget https://languagetool.org/download/fasttext.tar.gz
> wget https://languagetool.org/download/ngram-data/ngrams-de-20150819.zip
> 
> Das sind rund 2 GB.
> 
> Wer auch für Englisch eine Prüfung haben möchte, lädt noch
> 
> wget https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip
> 
> herunter - das hat alleine über 8 GB!
> 
> 4. Installation (auf E64; bei E1 Pfade anpassen /usr/lib64 -> /usr/lib), ich
> habe es zunächst nur auf E64 installiert und getestet.
> 
> cd /usr/lib64/java
> 
> unzip /pfad/zu/LanguageTool-stable.zip
> 
> Das dabei entstehende Unterverzeichnis bennen wir um:
> 
> mv LanguageTool-6.6 languagetool
> 
> Auspacken des fasttext-Archives:
> 
> cd languagetool
> 
> tar -xvzf /pfad/zu/fasttext.tar.gz
> 
> Das fasttext-Binary im fasttext-Unterverzeichnis kann/sollte gelöscht
> werden, das kommt mit dem vorab installierten python313-fasttext-Paket aufs
> System.
> 
> Nun kommen das oder die ngrams-Archive dran; deren Installation optional
> ist, jedoch die Sprachprüfung deutlich erweitert/verbessert:
> 
> mkdir ngrams
> 
> cd ngrams
> 
> unzip /pfad/zu/ngrams-de-20150819.zip
> unzip /pfad/zu/ngrams-en-20150817.zip
> 
> Danach muss für jede installierte Sprache ein Unterverzeichnis vorhanden
> sein, also z. B. de und en.
> 
> cd /usr/lib64/java/languagetool
> 
> Nun brauchen wir noch eine Konfigurationsdatei languagetool.cfg mit
> folgendem Inhalt:
> 
> ----------------------------------------------------
> languageModel=/usr/lib64/java/languagetool/ngrams
> fasttextModel=/usr/lib64/java/languagetool/fasttext/lid.176.bin
> fasttextBinary=/usr/bin/fasttext
> ----------------------------------------------------
> 
> Nun übergeben wir den gesamten Verzeichnisbaum dem User languagetool:
> 
> cd /usr/lib64/java
> 
> chown -R languagetool:nogroup languagetool
> 
> Nun fehlt nur noch die systemd-Servicedatei languagetool.service, die wir in
> /etc/systemd/system anlegen - die ExecStart-Zeile ist hier umbrochen):.
> 
> ----------------------------------------------------
> [Unit]
> Description=LanguageTool
> After=syslog.target
> After=network.target
> 
> [Service]
> Type=simple
> User=languagetool
> Group=nogroup
> WorkingDirectory=/usr/lib64/java/languagetool
> ExecStart=/usr/bin/java -cp /usr/lib64/java/languagetool/languagetool-
> server.jar org.languagetool.server.HTTPServer --config languagetool.cfg --
> port 8081 --allow-origin "*" --public
> Restart=always
> 
> [Install]
> WantedBy=multi-user.target
> ----------------------------------------------------
> 
> Dienst starten:
> 
> service start languagetool.service
> 
> Dienst stoppen:
> 
> service stop languagetool.service
> 
> Dienst automatisch beim Boot starten:
> 
> service enable languagetool.service
> 
> Die URL zu Einbindung des Languagetool-Servers in LibreOffice oder anderen
> Programmen lautet:
> 
> http://<ip_des_servers>:8081/v2
> 
> Im Browser kann man mit der URL http://<ip_des_servers>/v2/languages prüfen,
> ob der Languagetool-Service läft, denn er erscheint eine Liste der
> unterstützten Sprachen.
> 
> Vielleicht hat ja jemand Lust die Anleitung nachzuvollziehen und zu
> kommentieren, vielleicht ist mir in der Erinnerung auch schon etwas
> "verloren" gegangen.
> 
Danke für die Anleitung!

Ab weichen habe ich den Ordner /usr/lib64/java nach /data/java, per fstab Eintrag, verbogen:
/data/java /usr/lib64/java none  bind                                0 0
Die root partiotion war zu klein...



Lokalen Test mit curl und einmal das json Ergebnis durch das Programm jq - für die bessere Lesbarkeit:

curl -d "language=de-DE" -d "text=Das ist ein test" http://localhost:8081/v2/check | jq

   % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                  Dload  Upload  Total   Spent   Left   Speed
100   1408 100   1372 100     36   3122     81                              0
{
   "software": {
     "name": "LanguageTool",
     "version": "6.6",
     "buildDate": "2025-03-27 20:50:25 +0100",
     "apiVersion": 1,
     "premium": false,
     "premiumHint": "You might be missing errors only the Premium version can find. Contact us at support<at>languagetoolplus.com.",
     "status": ""
   },
   "warnings": {
     "incompleteResults": false
   },
   "language": {
     "name": "German (Germany)",
     "code": "de-DE",
     "detectedLanguage": {
       "name": "German (Germany)",
       "code": "de-DE",
       "confidence": 0.528,
       "source": "fasttext"
     }
   },
   "matches": [
     {
       "message": "Möglicher Tippfehler gefunden.",
       "shortMessage": "Rechtschreibfehler",
       "replacements": [
         {
           "value": "Test"
         },
         {
           "value": "des"
         },
         {
           "value": "fest"
         },
         {
           "value": "West"
         },
         {
           "value": "Rest"
         },
         {
           "value": "desto"
         },
         {
           "value": "Nest"
         },
         {
           "value": "Pest"
         },
         {
           "value": "tust"
         },
         {
           "value": "lest"
         },
         {
           "value": "teste"
         },
         {
           "value": "tost"
         },
         {
           "value": "Fest"
         },
         {
           "value": "duzt"
         },
         {
           "value": "döst"
         },
         {
           "value": "düst"
         },
         {
           "value": "käst"
         },
         {
           "value": "säst"
         }
       ],
       "offset": 12,
       "length": 4,
       "context": {
         "text": "Das ist ein test",
         "offset": 12,
         "length": 4
       },
       "sentence": "Das ist ein test",
       "type": {
         "typeName": "UnknownWord"
       },
       "rule": {
         "id": "GERMAN_SPELLER_RULE",
         "description": "Möglicher Rechtschreibfehler",
         "issueType": "misspelling",
         "category": {
           "id": "TYPOS",
           "name": "Mögliche Tippfehler"
         }
       },
       "ignoreForIncompleteSentence": false,
       "contextForSureMatch": 0
     }
   ],
   "sentenceRanges": [
     [
       0,
       16
     ]
   ],
   "extendedSentenceRanges": [
     {
       "from": 0,
       "to": 16,
       "detectedLanguages": [
         {
           "language": "de",
           "rate": 1.0
         }
       ]
     }
   ]
}

PS.: Bleibt noch die Frage, ob es spielrei ist oder sinnvoll benutzt werden kann, auch in Hinsicht des Platzverbrauch - Nutzen...


MfG
   Peter B.


Mehr Informationen über die Mailingliste Eisfair