2024

Allgemein

Zum Update des Goobi viewer Indexers auf die neuste Version immer die folgenden Kommandos benutzen:

mkdir -p /root/BACKUP/$(date -I)
systemctl stop solrindexer
mv /opt/digiverso/indexer/solrIndexer.jar /root/BACKUP/$(date -I)
wget -O /opt/digiverso/indexer/solrIndexer.jar https://github.com/intranda/goobi-viewer-indexer/releases/latest/download/solrIndexer.jar
systemctl start solrindexer

24.08

Bei einem Update auf diese Version sind keine Änderungen zu beachten.

24.07

Apache

In der robots.txt sollte die folgende Zeilen hinzugefügt werden:

Disallow: /viewer/*.pdf$

24.06

Tomcat

In der server.xml des Tomcats ist ein CrawlerSessionManagerValve konfiguriert. Hier muss der regex zur Erkennung von Bots angepasst werden. Dafür die folgende Zeile anpassen:

patch /etc/tomcat9/server.xml << "EOF"
@@ -181,7 +181,7 @@
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 	-->
        <Valve className="org.apache.catalina.valves.CrawlerSessionManagerValve"
-              crawlerUserAgents=".*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*|.*Apache-HttpClient.*|.*[Ss]pider.*|.*[Cc]rawler.*|.*nagios.*|.*Yandex.*"
+              crawlerUserAgents=".*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*|.*Apache-HttpClient.*|.*[Ss]pider.*|.*[Cc]rawler.*|.*nagios.*|.*Yandex.*|.*facebookexternalhit.*|.*bytedance.com.*|.*Turnitin.*|.*GoogleOther.*|.*python-requests.*|.*check_http.*"
               sessionInactiveInterval="60"/>
 
       </Host>
EOF

Solr

Für die EAD Unterstützung ist ein weiteres Update des Solr-Schemas erforderlich. Eine Neuindexierung ist nicht notwendig.

mkdir /root/BACKUP/$(date -I)

cp /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/schema.xml /root/BACKUP/$(date -I)
wget -O /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/schema.xml https://raw.githubusercontent.com/intranda/goobi-viewer-indexer/master/goobi-viewer-indexer/src/main/resources/other/schema.xml
cd /opt/digiverso/solr/solr/
sudo -u solr bin/solr zk upconfig -n goobiviewer -d server/solr/configsets/goobiviewer/
curl "http://localhost:8983/solr/admin/collections?action=RELOAD&name=collection1&wt=xml"

Goobi viewer Core

Die folgenden Anpassungen sind nur notwendig, wenn die Funktionalität zur Präsentation von EAD Beständen aktiviert ist.

Sofern die Archivverwaltung genutzt wird, sind verschiedene Anpassungen zu machen, damit die neue Infrastruktur verwendet wird. Dafür wird zuerst ein Backup der config_viewer.xml erstellt:

cp /opt/digiverso/viewer/config/config_viewer.xml /root/BACKUP/$(date -I)

Anschließend kann der Eintrag für basex entfernt werden:

<!-- DELETE -->
<urls>
    <basex>http://localhost:8984/</basex>
</urls>

Für die Suche innerhalb von Archivbeständen kann der folgende Filter aktiviert werden:

<!-- ADD -->
<search>
    <filters>
        <filter>filter_SEARCHTERMS_ARCHIVE</filter>
    </filters>
</search>

Goobi viewer Indexer

Der Indexer muss aktualisiert und in der config_indexer.xml muss das Mapping für die Metadatenfelder ergänzt werden.

systemctl stop solrindexer
mv /opt/digiverso/indexer/solrIndexer.jar /root/BACKUP/$(date -I)
wget -O /opt/digiverso/indexer/solrIndexer.jar https://github.com/intranda/goobi-viewer-indexer/releases/latest/download/solrIndexer.jar
systemctl start solrindexer
<!-- ADD -->

<!-- PI -->
<item>ead:ead/ead:archdesc/ead:dsc/ead:c[@level="collection"]/@id</item>

<!-- ACCESSCONDITION -->
<item>ead:archdesc/ead:dsc/ead:accessrestrict</item>
<item>ead:dsc/ead:accessrestrict[1]</item>

<!-- MD_TITLE -->
<item>ead:did/ead:unittitle</item>
<item>ead:archdesc/ead:did/ead:unittitle</item>
<item>ead:eadheader/ead:filedesc/ead:titlestmt/ead:titleproper</item>

<!-- MD_LANGUAGE -->
<item>ead:archdesc/ead:did/ead:langmaterial/ead:language</item>
<item>ead:did/ead:langmaterial/ead:language</item>

<!-- MD_SUBJECTPERSON -->
<item>ead:archdesc/ead:controlaccess/ead:persname</item>
<item>ead:index/ead:indexentry/ead:persname</item>

<!-- MD_SUBJECTCORPORATE -->
<item>ead:archdesc/ead:controlaccess/ead:corpname</item>
<item>ead:index/ead:indexentry/ead:corpname</item>

<!-- MD_SHELFMARK -->
<item>ead:did/ead:unitid[@type="Altsignatur"]</item>

<!-- MD_DATECREATED -->
<item>ead:did/ead:unitdate</item>
<item>ead:eadheader/ead:profiledesc/ead:creation/ead:date/@normal</item>

<!-- MD_PHYSICALDESCRIPTIONEXTENT -->
<item>ead:did/ead:physdesc/ead:extent</item>

<!-- MD_SUBJECTGEOGRAPHIC -->
<item>ead:archdesc/ead:controlaccess/ead:geogname</item>
<item>ead:index/ead:indexentry/ead:geogname</item>

<!-- MD_SUBJECTTOPIC -->
<item>ead:index/ead:indexentry/ead:subject</item>

<!-- MD_SCOPECONTENT -->
<item>ead:archdesc/ead:dsc/ead:scopecontent[1]</item>
<item>ead:dsc/ead:scopecontent[1]</item>

<!-- MD_PROVENIENCE -->
<item>ead:archdesc/ead:did/ead:origination[1]</item>
<item>ead:did/ead:origination[1]</item>


        <MD_NODEID>
            <list>
                <item>
                    <xpath>mets:xmlData/mods:mods/mods:identifier[@type="archive-entry-id"]</xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item> 
            </list> 
        </MD_NODEID>
        <MD_EADID>  
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:identifier[@type="archive-id"]</item>
                            <item>ead:eadheader/ead:eadid</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item> 
            </list> 
        </MD_EADID> 
        <MD_UNITID> 
            <list>  
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:identifier[@type="unit-id"]</item>
                            <item>ead:archdesc/ead:did/ead:unitid[not(@type)][1]</item>
                            <item>ead:did/ead:unitid[not(@type)][1]</item>
                        </list>
                    </xpath>
                    <addToDefault>false</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_UNITID>
        <MD_UNITID_NUMBER>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>ead:did/ead:unitid[@type="Vorl. Nr."][1]</item>
                        </list>
                    </xpath>
                    <addToDefault>false</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_UNITID_NUMBER>
        <EAD_NODE_ID>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:identifier[@type="archive-entry-id"]</item>
                            <item>@id</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addUntokenizedVersion>false</addUntokenizedVersion>
                </item>
            </list>
        </EAD_NODE_ID>
        <MD_ARCHIVE_ENTRY_LEVEL>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>@level</item>
                            <item>ead:archdesc/@level</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addUntokenizedVersion>false</addUntokenizedVersion>
                </item>
            </list>
        </MD_ARCHIVE_ENTRY_LEVEL>
        <MD_ARCHIVE_ENTRY_OTHERLEVEL>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>@otherlevel</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addUntokenizedVersion>false</addUntokenizedVersion>
                </item>
            </list>
        </MD_ARCHIVE_ENTRY_OTHERLEVEL>
        <MD_RECORDID>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:identifier[@type="record"]</item>
                            <item>mets:xmlData/mods:mods/mods:identifier[@type="record-id"]</item>
                            <item>ead:control/ead:recordid</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                </item>
            </list>
        </MD_RECORDID>
       <MD_BIOGRAPHICALINFORMATION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='bibliography']</item>
                            <item>ead:archdesc/ead:dsc/ead:bibliography[1]</item>
                            <item>ead:dsc/ead:bibliography[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_BIOGRAPHICALINFORMATION>
        <MD_INVENTORYHISTORY>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='bibliographic history']</item>
                            <item>ead:archdesc/ead:dsc/ead:custodhist[1]</item>
                            <item>ead:dsc/ead:custodhist[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_INVENTORYHISTORY>
        <MD_AQUISITIONINFORMATION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='acquisition']</item>
                            <item>ead:archdesc/ead:dsc/ead:acqinfo[1]</item>
                            <item>ead:dsc/ead:acqinfo[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_AQUISITIONINFORMATION>
        <MD_APPRAISALINFORMATION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:extension/intranda:appraisal</item>
                            <item>ead:archdesc/ead:dsc/ead:appraisal[1]</item>
                            <item>ead:dsc/ead:appraisal[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_APPRAISALINFORMATION>
        <MD_ADDITIONS>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:extension/intranda:additions</item>
                            <item>ead:archdesc/ead:dsc/ead:accruals[1]</item>
                            <item>ead:dsc/ead:accruals[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ADDITIONS>
        <MD_ARRANGEMENT>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:classification[@displayLabel='arrangement']</item>
                            <item>ead:archdesc/ead:dsc/ead:arrangement[1]</item>
                            <item>ead:dsc/ead:arrangement[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ARRANGEMENT>
        <MD_USERESTRICTION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:physicalDescription/mods:note[@type='condition']</item>
                            <item>ead:archdesc/ead:dsc/ead:userestrict[1]</item>
                            <item>ead:dsc/ead:userestrict[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_USERESTRICTION>
        <MD_FONTTYPE>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:language/mods:scriptTerm</item>
                            <item>ead:archdesc/ead:did/ead:langmaterial[@label='font'][1]</item>
                            <item>ead:did/ead:langmaterial[@label='font'][1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_FONTTYPE>
        <MD_PHYSTECH>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:physicalDescription/mods:note[@type='physical description']</item>
                            <item>ead:archdesc/ead:dsc/ead:phystech[1]</item>
                            <item>ead:dsc/ead:phystech[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_PHYSTECH>
        <MD_OTHERFINDAID>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:extension/intranda:otherFindAid</item>
                            <item>ead:archdesc/ead:dsc/ead:otherfindaid[1]</item>
                            <item>ead:dsc/ead:otherfindaid[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_OTHERFINDAID>
        <MD_ORIGINALSLOCATION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:location/mods:physicalLocation</item>
                            <item>ead:archdesc/ead:dsc/ead:originalsloc[1]</item>
                            <item>ead:dsc/ead:originalsloc[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ORIGINALSLOCATION>
        <MD_ALTERNATIVEFORMAVAILABLE>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:physicalDescription/mods:note[@type='additional physical form']</item>
                            <item>ead:archdesc/ead:dsc/ead:altformavail[1]</item>
                            <item>ead:dsc/ead:altformavail[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ALTERNATIVEFORMAVAILABLE>
        <MD_SEPARATEDMATERIAL>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='original version']</item>
                            <item>ead:archdesc/ead:dsc/ead:relatedmaterial/ead:separatedmaterial[1]</item>
                            <item>ead:dsc/ead:relatedmaterial/ead:separatedmaterial[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_SEPARATEDMATERIAL>
        <MD_DIDNOTE>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='source identifier']</item>
                            <item>ead:archdesc/ead:did/ead:didnote[1]</item>
                            <item>ead:did/ead:didnote[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_DIDNOTE>
        <MD_ODD>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:note[@type='source note']</item>
                            <item>ead:archdesc/ead:odd[1]</item>
                            <item>ead:odd[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ODD>
        <MD_ODD_HEAD>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>ead:archdesc/ead:odd[1]/ead:head</item>
                            <item>ead:odd[1]/ead:head</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ODD_HEAD>
        <MD_ODD_P>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>ead:archdesc/ead:odd[1]/ead:p</item>
                            <item>ead:odd[1]/ead:p</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_ODD_P>
        <MD_CONVENTIONDECLARATION>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:physicalDescription/mods:note[@type='organization']</item>
                            <item>ead:control/ead:conventiondeclaration[1]</item>
                        </list>
                    </xpath>
                    <addToDefault>true</addToDefault>
                    <addSortField>true</addSortField>
                    <addUntokenizedVersion>true</addUntokenizedVersion>
                </item>
            </list>
        </MD_CONVENTIONDECLARATION>
        <MD_ABSTRACT>
            <list>
                <item>
                    <xpath>
                        <list>
                            <item>mets:xmlData/mods:mods/mods:abstract[not(@type)]</item>
                            <item>lido:descriptiveMetadata/lido:objectIdentificationWrap/lido:objectDescriptionWrap/lido:objectDescriptionSet[@lido:type='Orginaletikett' or @lido:type='description']/lido:descriptiveNoteValue</item>
                            <item>ead:did/ead:abstract</item>
                        </list>
                    </xpath>
                    <onefield>false</onefield>
                    <addToDefault>true</addToDefault>
                    <replace char="10">&lt;br /&gt;</replace>
                    <replace char="10">&lt;br /&gt;</replace>
                    <replace char="10">&lt;br /&gt;</replace>
                </item>
            </list>
        </MD_ABSTRACT>

Damit die Verlinkung von METS/MODS zu EAD Datei funktioniert, muss der Datenbestand jetzt einmal neu indexiert werden.

BaseX

Die EAD Dateien müssen jetzt in den Solr Suchindex überführt werden. Dafür an dem Webinterface der BaseX Datenbank anmelden und unter Databases die XML Dateien herunterladen. Anschließend auf den Goobi viewer Server kopieren und im Hotfolder ablegen:

mv /tmp/ead/*.xml /opt/digiverso/viewer/hotfolder/

Am Ende den Dienst stoppen und ins Backup verschieben:

## DOWNLOAD EAD FILES BEFORE PERFORMING THIS STEPS
systemctl stop basexhttp
systemctl disable basexhttp
mv /etc/systemd/system/basexhttp.service /root/BACKUP/$(date -I)
systemctl daemon-reload

mv /opt/digiverso/basex /root/BACKUP/$(date -I)

Apache

Der Zugriff auf BaseX kann jetzt aus dem VHost im Apache entfernt werden.

24.05

Bei einem Update auf diese Version sind keine Änderungen zu beachten.

24.04

Goobi viewer Core

Der Schalter <sidebarWidgetDownloads /> heißt jetzt <sidebarWidgetAdditionalFiles />. Das Unterelement <hideFileRegex /> wurde entfernt und durch die generische <filter action="hide" /> Möglichkeit ersetzt. Sofern die Funktionalität im Einsatz ist muss diese bei einem Update migriert werden.

24.03

Die hier erwähnten Anpassungen für EAD sind eine Vorbereitung für weitere Anpassungen im Goobi viewer Core. Sie werden dort erst in einem kommenden Release verwendet werden.

Solr

Für die EAD Unterstützung ist ein Update des Solr-Schemas erforderlich. Eine Neuindexierung ist allerdings nicht notwendig.

Neben der schema.xml muss auch die solrconfig.xml einmal gepatched werden:

mkdir /root/BACKUP/$(date -I)

cp /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/schema.xml /root/BACKUP/$(date -I)
wget -O /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/schema.xml https://raw.githubusercontent.com/intranda/goobi-viewer-indexer/master/goobi-viewer-indexer/src/main/resources/other/schema.xml
chown solr. /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/schema.xml

cp /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/solrconfig.xml /root/BACKUP/$(date -I)
patch /opt/digiverso/solr/solr/server/solr/configsets/goobiviewer/conf/solrconfig.xml << "EOF"
@@ -36,6 +36,7 @@
        affect both how text is indexed and queried.
   -->
   <luceneMatchVersion>9.9</luceneMatchVersion>
+  <schemaFactory class="ClassicIndexSchemaFactory"/>
 
   <!-- <lib/> directives can be used to instruct Solr to load any Jars
        identified and use them to resolve any "plugins" specified in
EOF

cd /opt/digiverso/solr/solr/
sudo -u solr bin/solr zk upconfig -n goobiviewer -d server/solr/configsets/goobiviewer/
curl "http://localhost:8983/solr/admin/collections?action=RELOAD&name=collection1&wt=xml"

Goobi viewer Indexer

Um die Indexierung von EAD-Dateien zu ermöglichen muss ein Verzeichnisse angelegt und eine zusätzliche Zeile in die config_indexer.xml eingetragen werden.

Verzeichnis anlegen:

mkdir /opt/digiverso/viewer/indexed_ead/
chown tomcat. /opt/digiverso/viewer/indexed_ead/

Zeile hinzufügen:

config_indexer.xml
<init>
    <indexedEad>indexed_ead</indexedEad>
</init>

24.02

Solr

Mit dem 24.02 Release wird auf eine aktuelle Solr Version aktualisiert werden. Die hier festgehaltenen Schritte sind als Anleitung zu verstehen bei denen die Schritte im Einzelnen durchgespielt und bei Bedarf an lokale Pfade und Gegebenheiten angepasst werden müssen.

# Stop Solr Service and create Backup
systemctl stop solr
mkdir /root/BACKUP/$(date -I)
cd /opt/digiverso/
tar -czf /root/BACKUP/$(date -I)/solr.tar.gz solr/
mv /opt/digiverso/solr/log4j2.xml /root/BACKUP/$(date -I)/
grep ^SOLR_HEAP /etc/default/solr.in.sh # remind for later ;-)
mv /etc/default/solr.in.sh /root/BACKUP/$(date -I)/


# Download and Install
cd /tmp
wget https://archive.apache.org/dist/solr/solr/9.5.0/solr-9.5.0.tgz
tar -xzf solr-9.5.0.tgz solr-9.5.0/bin/install_solr_service.sh --strip-components=2
./install_solr_service.sh solr-9.5.0.tgz -d /opt/digiverso/solr -i /opt/digiverso/solr -p 8983 -s solr  -u solr -f -n


patch /etc/default/solr.in.sh  << "EOF"
@@ -32,7 +32,7 @@
 #SOLR_START_WAIT="$SOLR_STOP_WAIT"
 
 # Increase Java Heap as needed to support your indexing / query needs
-#SOLR_HEAP="512m"
+SOLR_HEAP="2048m"
 
 # Expert: If you want finer control over memory options, specify them directly
 # Comment out SOLR_HEAP if you are using this though, that takes precedence
@@ -50,25 +50,19 @@
 #  -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime"
 
 # These GC settings have shown to work well for a number of common Solr workloads
-#GC_TUNE=" \
-#-XX:+ExplicitGCInvokesConcurrent \
-#-XX:SurvivorRatio=4 \
-#-XX:TargetSurvivorRatio=90 \
-#-XX:MaxTenuringThreshold=8 \
-#-XX:+UseConcMarkSweepGC \
-#-XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 \
-#-XX:+CMSScavengeBeforeRemark \
-#-XX:PretenureSizeThreshold=64m \
-#-XX:+UseCMSInitiatingOccupancyOnly \
-#-XX:CMSInitiatingOccupancyFraction=50 \
-#-XX:CMSMaxAbortablePrecleanTime=6000 \
-#-XX:+CMSParallelRemarkEnabled \
-#-XX:+ParallelRefProcEnabled        etc.
+GC_TUNE=" \
+-XX:+ExplicitGCInvokesConcurrent \
+-XX:SurvivorRatio=4 \
+-XX:TargetSurvivorRatio=90 \
+-XX:MaxTenuringThreshold=8 \
+-XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 \
+-XX:PretenureSizeThreshold=64m \
+-XX:+ParallelRefProcEnabled"
 
 # Set the ZooKeeper connection string if using an external ZooKeeper ensemble
 # e.g. host1:2181,host2:2181/chroot
 # Leave empty if not using SolrCloud
-#ZK_HOST=""
+ZK_HOST="127.0.0.1:2181"
 
 # Set to true if your ZK host has a chroot path, and you want to create it automatically.
 #ZK_CREATE_CHROOT=true
@@ -129,7 +123,7 @@
 
 # Changes the logging level. Valid values: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF. Default is INFO
 # This is an alternative to changing the rootLogger in log4j2.xml
-#SOLR_LOG_LEVEL=INFO
+SOLR_LOG_LEVEL=ERROR
 
 # Location where Solr should write logs to. Absolute or relative to solr start dir
 #SOLR_LOGS_DIR=logs
EOF


patch /etc/init.d/solr << EOF
@@ -16,7 +16,7 @@
 
 ### BEGIN INIT INFO
 # Provides: solr
-# Required-Start:    \$remote_fs \$syslog
+# Required-Start:    \$remote_fs \$syslog zookeeper
 # Required-Stop:     \$remote_fs \$syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
EOF
systemctl daemon-reload


# Migrate old data to new Solr
cp -a /opt/digiverso/solr/solr-8.5.2/server/solr/configsets/goobiviewer /opt/digiverso/solr/solr-9.5.0/server/solr/configsets/
cp /opt/digiverso/solr/solr-9.5.0/server/solr/configsets/_default/conf/solrconfig.xml /opt/digiverso/solr/solr-9.5.0/server/solr/configsets/goobiviewer/conf/

patch /opt/digiverso/solr/solr-9.5.0/server/solr/configsets/goobiviewer/conf/solrconfig.xml << "EOF"
@@ -72,7 +72,7 @@
        The example below can be used to load a Solr Module along
        with their external dependencies.
     -->
-    <!-- <lib dir="${solr.install.dir:../../../..}/modules/ltr/lib" regex=".*\.jar" /> -->
+    <lib dir="${solr.install.dir:../../../..}/modules/analysis-extras/lib" regex=".*\.jar" />
 
   <!-- an exact 'path' can be used instead of a 'dir' to specify a
        specific jar file.  This will cause a serious error to be logged
@@ -666,7 +666,7 @@
   <!-- Shared parameters for multiple Request Handlers -->
   <initParams path="/update/**,/query,/select,/spell">
     <lst name="defaults">
-      <str name="df">_text_</str>
+      <str name="df">DEFAULT</str>
     </lst>
   </initParams>
 
@@ -939,7 +939,7 @@
   </updateProcessor>
 
   <!-- The update.autoCreateFields property can be turned to false to disable schemaless mode -->
-  <updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"
+  <updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:false}"
            processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields">
     <processor class="solr.LogUpdateProcessorFactory"/>
     <processor class="solr.DistributedUpdateProcessorFactory"/>
EOF


cd /opt/digiverso/solr/solr/server/solr-webapp/webapp/WEB-INF/lib/
wget https://github.com/locationtech/jts/releases/download/1.17.0/jts-core-1.17.0.jar
chown solr. jts-core-1.17.0.jar


cd /opt/digiverso/solr/solr
chmod 755 bin/solr
sudo -u solr bin/solr zk upconfig -n goobiviewer -d server/solr/configsets/goobiviewer/

Apache

Damit die Anbindung des Solr nach außen hin funktioniert muss das http2 Modul im Apache aktiviert und den Dienst neu gestartet werden:

a2enmod http2
systemctl restart apache2

Goobi viewer Core

Für die Bereitstellung eines Entwicklerpaketes über das Goobi viewer Backend sowie die Möglichkeit das Theme auf dem Server zu pullen müssen die folgenden beiden Skripte abgelegt werden:

wget -O /opt/digiverso/viewer/config/script_theme-pull.sh https://raw.githubusercontent.com/intranda/goobi-viewer-core-config/master/goobi-viewer-core-config/src/main/resources/install/script_theme-pull.sh
wget -O /opt/digiverso/viewer/config/script_create_package.sh https://raw.githubusercontent.com/intranda/goobi-viewer-core-config/master/goobi-viewer-core-config/src/main/resources/install/script_create_package.sh
chown tomcat:tomcat /opt/digiverso/viewer/config/script_*.sh
chmod 750 /opt/digiverso/viewer/config/script_*.sh

Für das Erstellen des SQL-Dumps ist es erforderlich das Passwort für die Goobi viewer Datenbank im Skript zu hinterlegen.

Sofern vorher andere Lösungen installiert waren (Cronjob, Shell-Skript, Apache) können diese nach entsprechenden Tests zurückgebaut und ins Backup verschoben werden.

24.01

Allgemein

Mit dem 24.01 Release wird Java 17 verwendet. Auf einem Ubuntu Linux 22.04 System sind dafür muss das Paket installiert, als Standard JRE hinterlegt und im Tomcat 9 als JAVA_HOME hinterlegt werden

apt install openjdk-17-jre-headless
update-alternatives --config java
patch /etc/default/tomcat9 << "EOF"
@@ -1,7 +1,7 @@
 # The home directory of the Java development kit (JDK). You need at least
 # JDK version 8. If JAVA_HOME is not set, some common directories for
 # OpenJDK and the Oracle JDK are tried.
-#JAVA_HOME=/usr/lib/jvm/java-8-openjdk
+JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
 
 # You may pass JVM startup parameters to Java here. If you run Tomcat with
 # Java 8 instead of 9 or newer, add "-XX:+UseG1GC" to select a suitable GC.
@@ -15,7 +15,6 @@
 JAVA_OPTS="${JAVA_OPTS} -XX:+UseG1GC"
 JAVA_OPTS="${JAVA_OPTS} -XX:+ParallelRefProcEnabled"
 JAVA_OPTS="${JAVA_OPTS} -XX:+DisableExplicitGC"
-JAVA_OPTS="${JAVA_OPTS} -XX:+CMSClassUnloadingEnabled"
 JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom"
 JAVA_OPTS="${JAVA_OPTS} -Dfile.encoding='utf-8'"
+JAVA_OPTS="${JAVA_OPTS} --add-exports=java.desktop/sun.awt.image=ALL-UNNAMED"
 
EOF

Damit Solr weiterhin startet müssen die folgenden Optionen aus den GC_TUNE="" Einstellungen innerhalb der /etc/default/solr.in.sh entfernt werden:

-XX:+UseCMSInitiatingOccupancyOnly \
-XX:+UseConcMarkSweepGC \
-XX:+CMSScavengeBeforeRemark \
-XX:CMSInitiatingOccupancyFraction=50 \
-XX:CMSMaxAbortablePrecleanTime=6000 \
-XX:+CMSParallelRemarkEnabled \

Zusätzlich sind die folgenden Stichpunkte zu bedenken:

  • Jenkinsfile: Anpassen des Docker images auf maven:3-eclipse-temurin-17

  • pom.xml:

    • Die Einstellung maven.compiler.release auf 17 setzen

    • Im maven-enforcer-plugin die requiredMavenVersion auf 3.8.8 setzen

    • Plugins aktualisieren - mvn versions:display-plugin-updates

    • Rechtschreibfehler - includeArtifacIds vs includeArtifactIds

    • source- und testDirectory entfernen

    • warName entfernen und durch finalName ersetzen

Contentserver

Damit die Bildauslieferung weiterhin funktioniert, muss geprüft werden ob eine lokale config_contentServer.xml existiert. Wenn ja ist dort in den <imageTypeSettings /> für das <type format="default" ... > in den <settings...> das folgende Attribut zu ergänzen:

preferredImageReader="com.github.jaiimageio"

24.03

Last updated