Für ein Uni-Projekt muss ich momentan eine größere Menge LaTeX schreiben und diesen Code mit meinen Mitstreitern teilen. Nachdem wir eine Woche lang (es geht um wöchentliche Labor-Protokolle) uns den Code per Mail zugeschickt haben und so nicht wirklich produktiv arbeiten konnten, habe ich mich am Wochenende hingesetzt und eine Online-Umgebung aufgesetzt.

Im Internet gab es zwei große LaTeX-Online-IDEs, Overleaf und ShareLaTeX. Letzterer ist in Overleaf übergegangen, also gibt es nun nur noch einen großen Anbieter, der im kollaborativen Arbeiten €14/mo kostet (ohne Rabatte).

ShareLaTeX hat jedoch ihre Community-Version auf GitHub zur Verfügung gestellt; Interessierte können sie sich herunterladen und ausprobieren. Leider wurde das Docker-Image seit über einem Jahr nicht mehr weiterentwickelt, es gibt also einige Aufholarbeit, wenn man es verwenden möchte.

tlmgr, the good, the bad and the ugly parts

Disclaimer: Ich erhebe keinen Anspruch, irgendetwas von LaTeX, Tex Live oder Paketmanagern im Generellen zu verstehen. Alles, was ich hier schreibe, ist mir im Laufe des letzten Wochenendes aufgefallen und kann falsch oder nicht vollständig sein.

Kommen wir zu TeX Live. Das ist wohl die Compiler-Engine hinter LaTeX, zumindest eine mögliche und der De-Facto-Standard, wenn man auf Linux-System mit LaTeX hantieren möchte. TeX Live ist in sich selbst jetzt nicht schlank, aber hinnehmbar. Um die mannigfaltigen Möglichkeiten von LaTeX auszunutzen, benötigt man Pakete (die im Code dann mit \usePackage{bla} inkludiert werden) und was liegt da näher als einen Paketmanager zu initieren? Dieser hat sich dann in CTAN gefunden.

Um mit CTAN zu sprechen, benötigt man jedoch einen aktuellen Paketmanager auf dem System. Und hier kommt die Krux an dem eben-erwähnten, alten Docker-Image: ShareLaTeX ist zwar mehr oder weniger aktuell - es sind aber kaum LaTeX-Pakete installiert und der Paketmanager ist auf der 2017-Version stehen geblieben.

hack hack hack, docker docker docker

Es gibt also einiges zu hackeln, bevor unser eigener ShareLaTeX-Service online gehen kann.

  1. tlmgr aktualisieren.
  2. Eins der Meta-Pakete (bei Tex Live “scheme” genannt) installieren. Weil auf meinem Server nicht mehr soo viel Platz war, habe ich mich für scheme-medium entschieden (siehe letzte Zeile im Dockerfile), es gibt aber mehrere Möglichkeiten. scheme-full sollte (wenn ich es richtig verstanden habe) alle verfügbaren Pakete installieren.
  3. Die Software nutzen.

Meine Dockerfile sieht also so aus:

# Nimm die alte Version
FROM sharelatex/sharelatex:latest

# Update texlive/tlmgr nach dieser Anleitung:
# https://www.tug.org/texlive/upgrade.html
WORKDIR /usr/local/texlive
RUN cp -a 2017 2018
ENV PATH="/usr/local/texlive/2018/bin/x86_64-linux:$PATH"
RUN curl -OL http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
RUN sh update-tlmgr-latest.sh -- --upgrade

# Update alle vorhandenen Pakete und installiere
# die Pakete, auf die scheme-medium dependet.
RUN tlmgr update --self --all
RUN tlmgr install scheme-medium

Anschließend baue ich das Image mit docker build -t jannik/sharelatex2018:latest . (Achtung, das dauert je nach Internet-Verbindung schon mal etwas) und setze mit docker-compose ein Mongo und ein Redis daneben:

version: '2'
services:
    sharelatex:
        restart: always
        image: jannik/sharelatex2018:latest
        container_name: sharelatex
        depends_on:
            - mongo
            - redis
        privileged: true
        ports:
            - 80:80
        links:
            - mongo
            - redis
        volumes:
            - sharelatex_data:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
            SHARELATEX_REDIS_HOST: redis
            
    mongo:
        restart: always
        image: mongo
        container_name: mongo
        expose:
            - 27017
        volumes:
            - mongo_data:/data/db

    redis:
        restart: always
        image: redis
        container_name: redis
        expose:
            - 6379
        volumes:
            - redis_data:/data
volumes:
    sharelatex_data:
    redis_data:
    mongo_data:

Als Grafik sieht das dann ungefähr so aus:

Compose visualisiert

Im Wiki von ShareLaTeX gibt es noch mehr Umgebungsvariablen, die ich hier aus Übersicht­lich­keits­gründen ausgelassen habe.

Wenn das alles funktioniert hat, können wir den Service mit docker-compose up einmal testweise hochfahren (Mit Ctrl+Z kann man das Log ohne Crash des Servers verlassen) und die Umgebung im Browser ansehen. Auf http://<ip>:<port>/launchpad sollte eine GUI angezeigt werden, oder eine Nginx-502-Fehlermeldung. Im letzteren Fall einfach noch ein wenig warten, bis der Server wirklich da ist.

Und Action!

Nach der Registration und dem Login können wir dann endlich anfangen, LaTeX-Code zu schreiben.

Weitere Benutzer - der Grund, warum wir das alles machen hier - können über http://<ip>:<port>/admin/register hinzugefügt werden. In meiner Konfiguration kommen die Emails selbstverständlich nicht an, der angezeigte Link verhilft aber zum Glück. Achte beim Kopieren darauf, dass der Link nicht http://localhost/... lautet sondern wirklich auf Deine Server-Domain zeigt. Im Zweifel, einfach ein wenig nachhelfen.

In Portainer sollten diese Container zu sehen sein:

Portainer-Anzeige


Das war eine ganz kurze Zusammenfassung meines Wochenendes. Aktuell läuft der Server noch ohne Probleme, wenn auch ohne HTTPS-Proxy. Das wird dann mein nächstes Projekt. Leider ist die Integration nicht ganz einfach, weil ShareLaTeX stark auf WebSockets setzt und ich da noch ein wenig Testing benötige.

Avatar

Veröffentlicht am von Jannik

Technik Open Source

19 | der blasse, dünne Junge aus der Nachbarschaft | Macht Web Design, Theatertechnik und Pfadfinder | Ist #Wö‑Leiter | Studiert was mit Medien