3.2 Docker

Einleitung

Die folgende Installationsanleitung für den Goobi viewer bezieht sich auf Ubuntu Linux 20.04. Sie ist als Schritt für Schritt Anleitung von oben nach unten geschrieben, das bedeutet, dass Einstellungen und Konfigurationen aufeinander aufbauen. Wird die Reihenfolge nicht eingehalten, können unter Umständen bestimmte Befehle fehlschlagen.
Als Domainname wird in dieser Anleitung VIEWER.EXAMPLE.ORG verwendet, dies bitte an den eigenen DNS Namen anpassen.
Für den produktiven Einsatz wird eine virtuelle Maschine mit mindestens 4 CPUs und 8GB RAM empfohlen.
Befehle aus dieser Anleitung werden am besten mit einem Klick auf das entsprechende Icon kopiert. Andernfalls besteht die Gefahr ungewollte Whitespaces mit zu kopieren

Vorbereitung

Zuerst auf dem Server, auf dem der Goobi viewer installiert werden soll, anmelden und root Rechte erlangen:
1
ssh VIEWER.EXAMPLE.ORG
2
sudo -i
Copied!
Anschließend ein Passwort für die Goobi viewer Datenbank und einen Token generieren und als Variable in der Session ablegen. Dort wird ebenfalls der DNS Name hinterlegt:
1
export VIEWER_HOSTNAME=VIEWER.EXAMPLE.ORG
2
export PW_SQL_ROOT=SECRETROOTPASSWORD
3
export PW_SQL_VIEWER=SECRETPASSWORD
4
export VIEWER_USERNAME=[email protected]
5
export VIEWER_USERPASS=SECRETPASSWORD
6
export VIEWER_IMAGE=intranda/goobi-viewer-theme-reference:develop
7
export VIEWER_THEME=reference
8
export TOKEN=$(uuidgen)
Copied!
Nun die folgenden Pakete installieren:
1
apt -y install docker.io docker-compose mariadb-client python3-passlib python3-bcrypt
Copied!
Es empfiehlt sich zum jetzigen Zeitpunkt einen DNS Eintrag für den Server gesetzt zu haben.

Verzeichnisstruktur erstellen

Mit den folgenden Befehlen wird die erforderliche Ordnerstruktur erzeugt:
1
mkdir -p /opt/digiverso/{indexer,logs,viewer/{abbyy,cmdi,db,deleted_mets,dev,hotfolder,media,orig_lido,orig_denkxweb,success,ugc,alto,cms_media,error_mets,indexed_lido,mix,pdf,tei,updated_mets,cache,config/{PDFTitlePage,watermark,docker},fulltext,indexed_mets,oai/token,ptif,themes,wc}}
2
mkdir -p /opt/digiverso/zookeeper/{data,datalog}/
3
mkdir -p /opt/digiverso/solr/data/solr
4
sudo chown -R 8983:8983 /opt/digiverso/solr
Copied!

Konfigurationsdateien

Bevor die Container gestartet werden, müssen im Dateisystem die Verzeichnisse und Konfigurationsdateien für den Produktivbetrieb vorliegen.

config_viewer.xml

In der lokalen config_viewer.xml müssen verschiedene Einstellungen hinterlegt werden, hierbei muss gegebenenfalls das Protokoll angepasst werden:
1
sed -e "s|VIEWER.EXAMPLE.ORG|${VIEWER_HOSTNAME}/viewer|g" -e "s|TOKEN|${TOKEN}|g" -e "s|VIEWERTHEME|${VIEWER_THEME}|g" << "EOF" >/opt/digiverso/viewer/config/config_viewer.xml
2
<?xml version="1.0" encoding="UTF-8" ?>
3
<config>
4
<urls>
5
<metadata>
6
<sourcefile>https://VIEWER.EXAMPLE.ORG/sourcefile?id=</sourcefile>
7
<marc>https://VIEWER.EXAMPLE.ORG/oai?verb=GetRecord&amp;metadataPrefix=marcxml&amp;identifier=</marc>
8
<dc>https://VIEWER.EXAMPLE.ORG/oai?verb=GetRecord&amp;metadataPrefix=oai_dc&amp;identifier=</dc>
9
<ese>https://VIEWER.EXAMPLE.ORG/oai?verb=GetRecord&amp;metadataPrefix=europeana&amp;identifier=</ese>
10
</metadata>
11
12
<contentServerWrapper>https://VIEWER.EXAMPLE.ORG/content/</contentServerWrapper>
13
<download>https://VIEWER.EXAMPLE.ORG/download/</download>
14
<rest>https://VIEWER.EXAMPLE.ORG/api/v1/</rest>
15
<connectorVersion>http://viewer:8080/oai/tools?action=getVersion</connectorVersion>
16
</urls>
17
18
<viewer>
19
<theme mainTheme="VIEWERTHEME" discriminatorField="" />
20
</viewer>
21
22
<rss>
23
<numberOfItems>50</numberOfItems>
24
<title>Goobi viewer RSS Feed</title>
25
<description>new items</description>
26
<copyright>(c) Goobi viewer using institution </copyright>
27
</rss>
28
29
<webapi>
30
<authorization>
31
<token>TOKEN</token>
32
</authorization>
33
</webapi>
34
</config>
35
EOF
Copied!

config_oai.xml

Auch eine lokale config_oai.xml wird benötigt:
1
sed -e "s|VIEWER.EXAMPLE.ORG|${VIEWER_HOSTNAME}|g" << "EOF" >/opt/digiverso/viewer/config/config_oai.xml
2
<?xml version="1.0" encoding="UTF-8"?>
3
<config>
4
<identifyTags>
5
<baseURL useInRequestElement="true">https://VIEWER.EXAMPLE.ORG/viewer/oai</baseURL>
6
<adminEmail>[email protected]</adminEmail>
7
</identifyTags>
8
<urnResolverUrl>https://VIEWER.EXAMPLE.ORG/viewer/resolver?urn=</urnResolverUrl>
9
<piResolverUrl>https://VIEWER.EXAMPLE.ORG/viewer/piresolver?id=</piResolverUrl>
10
</config>
11
EOF
Copied!

config_indexer.xml

Die folgenden Befehle ausführen um die aktuelle config_indexer.xml herunterzuladen und entsprechend anzupassen:
1
wget -O /opt/digiverso/indexer/config_indexer.xml https://raw.githubusercontent.com/intranda/goobi-viewer-indexer/master/goobi-viewer-indexer/src/main/resources/config_indexer.xml
2
sed -e 's|<solrUrl>.*</solrUrl>|<solrUrl>http://solr:8983/solr/collection1</solrUrl>|' -e 's|C:/|/|g' -e "s|<viewerUrl>.*</viewerUrl>|<viewerUrl>https://${VIEWER_HOSTNAME}/viewer/</viewerUrl>|" -i /opt/digiverso/indexer/config_indexer.xml
Copied!

Cronjob

Für regelmäßige Aufgaben müssen Cronjobs eingerichtet werden:
1
sed -e "s|VIEWER.EXAMPLE.ORG|${VIEWER_HOSTNAME}|g" -e "s|TOKEN|${TOKEN}|g" << "EOF" >/etc/cron.d/intranda-goobiviewer
2
PATH=/usr/bin:/bin:/usr/sbin/
4
5
#
6
# Regular cron jobs for the Goobi viewer
7
#
8
9
## This REST call triggers the email notification about new search hits for users,
10
## that enabled notifications for saved searches
11
42 8,12,17 * * * root curl -s -H "Content-Type: application/json" -H "token:TOKEN" -d '{"type":"NOTIFY_SEARCH_UPDATE"}' http://viewer/viewer/api/v1/tasks/ 1>/dev/null
12
13
## This REST call creates an XML sitemap for the Goobi viewer instance. Please always
14
## call it on it's external URL because otherwise the protocol (http/https) might not
15
## be detected correctly
16
18 1 * * * root curl -s -H "Content-Type: application/json" -H "token:TOKEN" -d '{"type":"UPDATE_SITEMAP"}' http://VIEWER.EXAMPLE.ORG/viewer/api/v1/tasks/ 1>/dev/null
17
18
## These two scripts pull the theme git repository regulary. The @daily part is only
19
## a reminder for the 1-minute schedule
20
#*/1 * * * * root cd /opt/digiverso/viewer/themes/goobi-viewer-theme-reference; git pull | grep -v -e "Already up.to.date." -e "Bereits aktuell."
21
#@daily root echo "Please look at the git checkout interval for the Goobi viewer theme" | mail -s "Reference: Theme repository is checked out every minute" [email protected]
22
23
## Optimize the Solr search index once a month
24
@monthly root curl -s 'http://solr/solr/collection1/update?optimize=true&waitFlush=false'
25
EOF
Copied!
ACHTUNG: Wenn die Installation nicht über HTTPS zur Verfügung steht, dann müssen an dieser Stelle die soeben angelegten Dateien geöffnet und das Schema manuell angepasst werden.

my.cnf

Für den einfacheren Zugriff auf die Datenbank später, wird für den Benutzer root eine my.cnf mit den entsprechenden Zugangsdaten abgelegt:
1
test -e /root/.my.cnf && echo 'WARNING, .my.cnf already exists!' ||
2
echo -e "[client]\nhost=127.0.0.1\npassword=${PW_SQL_ROOT}" >> /root/.my.cnf
3
chmod 600 /root/.my.cnf
Copied!

stopwords.txt

Damit der Goobi viewer die Solr Stopwörter auslesen kann muss die entsprechende Sprachdatei abgelegt werden, hier exemplarisch die Deutsche:
1
cp /opt/digiverso/viewer/dev/goobi-viewer-docker/solr/goobiviewer/conf/lang/stopwords.txt /opt/digiverso/viewer/config/stopwords.txt
Copied!

Variablen und Aliase

Folgende Aliase in die /root/.bash_aliases hinzufügen:
1
cat << "EOF" >>/root/.bash_aliases
2
alias cata='docker-compose -f /opt/digiverso/viewer/config/docker/docker-compose.yml logs -f --tail="500" viewer'
3
alias ind='docker-compose -f /opt/digiverso/viewer/config/docker/docker-compose.yml logs -f --tail="500" indexer'
4
EOF
Copied!
Übernahme der Änderungen in der aktuellen Session:
1
. /root/.bashrc
Copied!

Installation

Für die Installation muss das Goobi viewer Docker git Repository geklont werden:
1
cd /opt/digiverso/viewer/dev/
2
git clone https://github.com/intranda/goobi-viewer-docker
Copied!
Wenn ein eigenes Theme vorliegt muss sichergestellt sein, dass dieses auch geladen werden darf. Liegt es zum Beispiel in einem eigenen Nexus Server bei dem der Zugriff auf den Container passwortgeschützt ist, dann müssen die Zugangsdaten erst lokal hinterlegt werden, zum Beispiel:
1
docker login -u INTRANDACUSTOMER nexus.intranda.com:4443
Copied!
Das Setup kennt zwei mögliche Environments. Voreingestellt ist das zum Testen. Für eine Installation im Produktivbetrieb müssen Dateien kopiert und eventuell angepasst werden.
Zuerst die .env-production in das lokale Docker Konfigurationsverzeichnis kopieren, umbenennen und darin Werte anpassen:
1
cp /opt/digiverso/viewer/dev/goobi-viewer-docker/.env-production /opt/digiverso/viewer/config/docker/.env
2
sed -i "s|VIEWER_DOMAIN=VIEWER.EXAMPLE.ORG|VIEWER_DOMAIN=${VIEWER_HOSTNAME}|g" /opt/digiverso/viewer/config/docker/.env
3
sed -i "s|DB_ROOT_PASSWORD=viewer|DB_ROOT_PASSWORD=${PW_SQL_ROOT}|g" /opt/digiverso/viewer/config/docker/.env
4
sed -i "s|DB_VIEWER_PASSWORD=viewer|DB_VIEWER_PASSWORD=${PW_SQL_VIEWER}|g" /opt/digiverso/viewer/config/docker/.env
5
sed -i "s|VIEWER_IMAGE=intranda/goobi-viewer-theme-reference:develop|VIEWER_IMAGE=${VIEWER_IMAGE}|g" /opt/digiverso/viewer/config/docker/.env
Copied!
Anschließend die docker-compose.yml und den solr Ordner kopieren sowie die docker-compose.production.yml kopieren und umbennenen:
1
cp /opt/digiverso/viewer/dev/goobi-viewer-docker/docker-compose.yml /opt/digiverso/viewer/config/docker/docker-compose.yml
2
cp -a /opt/digiverso/viewer/dev/goobi-viewer-docker/solr /opt/digiverso/viewer/config/docker/
3
cp /opt/digiverso/viewer/dev/goobi-viewer-docker/docker-compose.production.yml /opt/digiverso/viewer/config/docker/docker-compose.override.yml
Copied!
Jetzt können die Container mit den folgenden Befehlen erstmalig gestartet werden:
1
cd /opt/digiverso/viewer/config/docker/
2
docker-compose up -d viewer-db solr
3
docker-compose exec solr solr zk upconfig -n goobiviewer -d /opt/goobiviewer
4
docker-compose exec solr solr create -c collection1 -n goobiviewer
5
docker-compose up -d
Copied!

Benutzeraccount anlegen

Der Goobi viewer verfügt über ein Backend. Mit dem folgenden Kommando wird ein Testaccount mit dem Benutzernamen [email protected] und dem anfangs festgelegten Passwort in die Datenbank eingefügt:
1
VIEWER_USERPASS_HASH=$(python3 -c "from passlib.hash import bcrypt; print(bcrypt.using(rounds=10, ident='2a').hash('${VIEWER_USERPASS}'))")
2
mysql -u viewer -p -D viewer -h 127.0.0.1 -e "INSERT INTO users (active,email,password_hash,score,superuser) VALUES (1,'${VIEWER_USERNAME}','${VIEWER_USERPASS_HASH}',0,1);"
Copied!

Updates

Zum Einspielen von Updates muss zuerst das goobi-viewer-docker Repository gepullt werden:
1
cd /opt/digiverso/viewer/dev/goobi-viewer-docker
2
git pull
Copied!
Danach müssen die Unterschiede der folgenden drei Dateien verglichen und entsprechend übernommen beziehungsweise angepasst werden:
1
diff -u ../../config/docker/.env .env-production | colordiff
2
diff -u ../../config/docker/docker-compose.override.yml docker-compose.production.yml | colordiff
3
diff -u ../../config/docker/docker-compose.yml docker-compose.yml | colordiff
Copied!
Am Ende ist noch zu überprüfen, ob es im Solr Verzeichnis Änderungen gegeben hat.
Diese Punkte sind zusätzlich zu dem bestehenden Core- und Theme Changelog zu verstehen.

Allgemeine Kommandos

An dieser Stelle sind einige Kommandos dokumentiert, um in die Container zu kommen etc.
1
# Alle Container als Daemon starten,
2
# wenn -d weggelassen wird wird es im Vordergrund ausgeführt
3
docker-compose up -d
4
5
# Logdateien eines Containers angucken.
6
# Mögliche Werte sind solr, zookeeper, viewer, viewer-db, indexer, connector, proxy
7
docker-compose logs indexer -f
8
9
# Einen Docker Container betreten:
10
docker-compose exec viewer /bin/bash
11
12
# Einen Docker Container neu starten
13
docker-compose restart indexer
14
15
# Alles herunterfahren
16
docker-compose down
17
18
# Docker container aktualisieren
19
docker-compose pull
Copied!
In einem Container kann zum Beispiel vim mit dem folgenden Kommando nachinstalliert werden:
1
apt update && apt install vim-noxU
Copied!
Last modified 2d ago