Skip to main content

Software Components

LAUDATIO Docker containers

LAUDATIO is available as a set of Docker containers that are orchestrated via docker compose. The following table gives an overview of the containers:

Container NameCurrent VersionFunctionalityContainer Dependencies
Elasticsearch (three shards: es01, es02, es03)8.19.4Indexes the corpus (meta)data and delivers search functionalityes02 depends on es01, es03 depends on es02
redisredis:alpine (currently, 8.6.1)The cache for corpus and file data + used as queue backendNone
postgres9.6.24Single point of truth, containing data tables for the Laravel framework, as well as corpus metadata; needed for the corpus management interfaceNone
app(see Release Notes)Our LAUDATIO app container (details, see below)redis, postgres
webnginx:alpine (currently, 1.29.6)The nginx reverse proxy server to expose our containers to the hostapp

Container app

The majority of the actual LAUDATIO code sits in the app Docker container. The Dockerfile for the container installs the following dependencies into the container as a preliminary step to the LAUDATIO dependencies described after that:

RUN apt-get update && apt-get install -y \
bash \
openssl \
libldap2-dev \
libnss-ldap libpam-ldap ldap-utils \
wget \
curl \
python3 \
python3-pip \
python3-venv \
git \
zip \
libzip-dev \
procps \
openjdk-21-jre-headless \
libpq-dev nano lsof \
postgresql-client \
&& docker-php-ext-configure ldap --with-libdir=lib/$(uname -m)-linux-gnu/ && \
docker-php-ext-install ldap zip \
&& apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

The web application that runs inside the container is further split into two components:

  1. A Laravel/VueJS-based Frontend
  2. A Python-based Backend

We thus summarize the tech stack and dependencies of those two components further.

Frontend

Laravel serves as the overarching frontend framework and provides the bulk of routes and controllers. There are, however, some routes that require more sophisticated JavaScript-based interactivity and features. In these routes, we therefore use VueJS-based views as the main UI components. While Laravel and VueJS are tightly integrated, their installation procedures and ecosystems are separate (composer vs npm), so we describe their dependencies separately as well.

The frontend code can be found in the repository laudatio-repository-update.

Laravel

PHP 8.4.x is installed via Docker. The main app dependencies that are installed within the container via composer are:

Package NameCurrent VersionFunctionality
laravel/framework"^12.0"Base framework
elasticsearch/elasticsearch"^7.17.2"PHP Elasticsearch client (used to mainly get data from ES; the only data ingestion made with this is on corpus duplication)
bistrosk/elasticsearch-dsl"^8.0"PHP query builder for Elasticsearch
graham-campbell/gitlab"^8.0"GitLab client for creating/managing corpus git repos
mailerlite/laravel-elasticsearch"*" (installed is 11.2.0)Laravel wrapper for PHP Elasticsearch client
ldaprecord-laravel"^3.3"LDAP client for user authentication
predis/predis"^2.2.2" (installed is 2.4.0)PHP Redis client

VueJS

The VueJS part of the frontend requires Node.js in at least version 22 and has the following npm dependencies (base package, utility packages, the rest are UI/UX-related libraries):

Package NameCurrent VersionFunctionality
vue2.7.16Base framework
axios"^1.12.2"HTTP client
dayjs"^1.11.18"General date utilities (e.g. making dates human-readable)
jquery"^3.7.1"Enables general DOM manipulation, event listeners, HTTP calls for both VueJS part as well as Laravel part of app
vite"^6.0.0" (installed is 6.3.5)Code bundler
vuex3.6.2State management
bootstrap"^4.6.1"Framework for responsive UI
bootstrap-vue"^2.23.1"Vue wrapper for Bootstrap 4
d3"^7.9.0"Interactive visualization library
dropzone"^5.9.3"User interface and handler for file uploads
@fortawesome/fontawesome-free"^7.0.1"Icon library
unsliderjs"^0.2.0"Carousel/slider plugin (used on front page)
vue-good-table"^2.21.11"Table component for easy data display and filtering
vue-simple-suggest"^1.11.2"Enables search suggestions

Backend

The backend component refers to our Python-based data validation and ingestion API. This API is separate from the Laravel-based API described above and can therefore be found in a distinct repository: laudatio-backend.

The new re-write of this component moved the architecture away from a workflow based on git pre-commit hooks and towards a standardized and modularized Flask API. The backend pipeline runs on Python 3, but also requires to run shell scripts with a Java installation; we use openjdk-21-jre-headless (see above).

Furthermore, for the extraction of plaintexts, there are two tools bundled that are used depending on the format from which the plaintext are to be extracted (corpora in the format tei are handled by the Flask API directly):

  1. annatto in version 0.45.0 for corpora in the formats annis, relannis, or graphannis
  2. Pepper in version 2023.05.15 for corpora in the formats exmaralda/exb, paula, ptb, or txt
Package NameCurrent VersionFunctionality
flask~=3.1.0Base API framework
beautifulsoup44.14.3Used for parsing and extracting plaintext from corpus data provided in tei
datacite1.0.1API wrapper to create DOIs via DataCite
elasticsearch8.18.0Python client for Elasticsearch (used to put data into ES)
elastic-transport8.17.1Utilities for Python client for Elasticsearch
GitPython3.1.50Library to interact with git repos, used to manage corpus git repos
lxml6.0.4For parsing TEI header files
pandas2.3.3annatto produces output as .csv files, so we use pandas to read them for post-processing and extracting plaintext
redis7.4.0Python client for Redis
rq2.9Job queues with Redis, used for dispatching plaintext extraction jobs
(UNUSED) python-gitlab8.3.0
thefuzz0.22.1Used for fuzzy matching plaintext file names to uploaded document header .xml file names