[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