Dataverse Docker v.5.13

Stop all run Containers

docker stop $(docker ps -q)

Delete all Containers

docker rm -f $(docker ps -aq)

Delete all Images

docker rmi -f $(docker images -q)

Delete traefic

docker network prune

Версия  5.13 оказалась наименее безпроблемной, с моей точки зрения. На ней и остановлюсь.

# git clone https://github.com/IQSS/dataverse-docker dataverse-docker-5.13
# cp ./distros/docker-compose-ssl.yml ./

Заполняем файл с переменными:

# cp .env_sample .env && vi .env
#COMPOSE_FILE=./distros/docker-compose-ssl.yml
COMPOSE_FILE=./docker-compose-ssl.yml
#MAINLANG=ua
VERSION=5.13.allclouds
# Dataverse database settings
DATAVERSE_URL=dataverse.tst-amo.net.ua
DATAVERSE_SERVICE_HOST=www.dataverse.tst-amo.net.ua
# Domain configuration and init folder
hostname=www.dataverse.tst-amo.net.ua
traefikhost=dataverse.tst-amo.net.ua
# traefik email settings
useremail=dataverseimp@imp.kiev.ua
# DOI parameters
# https://guides.dataverse.org/en/latest/installation/config.html#doi-baseurlstring
doi_authority=10.82100
doi_provider=DataCite
doi_shoulder=DVUA
doi_username=XXXXX
doi_password=XXXXXXXXXX
dataciterestapiurlstring=https\\:\/\/api.test.datacite.org
baseurlstring=https\:\/\/mds.test.datacite.org
# Mail relay
# https://guides.dataverse.org/en/latest/developers/troubleshooting.html
system_email=dataverseimp@imp.kiev.ua
mailhost=mail.imp.kiev.ua
mailuser=dataverseimp
no_reply_email=dataverseimp@imp.kiev.ua
smtp_password=XXXXXXXXXX
smtp_port=587
socket_port=587
starttls=true

Не забываем поменять версию продукта и в этом файле:

# vi docker-compose-ssl.yml
 dataverse:
networks:
- traefik
image: coronawhy/dataverse:5.13.allclouds

Правим скрипты под наши нужды:

# vi dataverse-5.13/dataverse-docker/init.d/010-mailrelay-set.sh
#!/bin/bash
# Setup mail relay
# https://guides.dataverse.org/en/latest/developers/troubleshooting.html
if [ "${system_email}" ]; then
   curl -X PUT -d ${system_email} http://localhost:8080/api/admin/settings/:SystemEmail
   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} delete-javamail-resource mail/notifyMailSession
   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-javamail-resource --mailhost ${mailhost} --mailuser ${mailuser} --fromaddress ${no_reply_email} --property mail.smtp.auth=true:mail.smtp.password=${smtp_password}:mail.smtp.port=${smtp_port}:mail.smtp.socketFactory.port=${socket_port}:mail.smtp.socketFactory.fallback=false:mail.smtp.starttls.enable=true mail/notifyMailSession
fi
# vi dataverse-5.13/dataverse-docker/init.d/01-persistent-id.sh
#!/bin/bash
echo "Setting up the settings" >> /tmp/status.log
echo "- Allow internal signup" >> /tmp/status.log
SERVER=http://${DATAVERSE_URL}/api
echo $SERVER
curl -X PUT -d yes "$SERVER/admin/settings/:AllowSignUp"
curl -X PUT -d /dataverseuser.xhtml?editMode=CREATE "$SERVER/admin/settings/:SignUpUrl"
curl -X PUT -d CV "$SERVER/admin/settings/:CV"
curl -X PUT -d burrito $SERVER/admin/settings/BuiltinUsers.KEY
curl -X PUT -d localhost-only $SERVER/admin/settings/:BlockedApiPolicy
curl -X PUT -d 'native/http' $SERVER/admin/settings/:UploadMethods
curl -X PUT -d solr:8983 "$SERVER/admin/settings/:SolrHostColonPort"
curl -X PUT -d 10.82100 "$SERVER/admin/settings/:Authority"
curl -X PUT -d doi "$SERVER/admin/settings/:Protocol"
curl -X PUT -d "</p><p>Supported by the National Academy of Sciences of Ukraine</p>" http://localhost:8080/api/admin/settings/:FooterCopyright
echo
# Demo server with FAKE DOIs if doi_authority is empty
#if [ -z "${doi_authority}" ]; then
# curl -X PUT -d doi "$SERVER/admin/settings/:Protocol"
# curl -X PUT -d 10.5072 "$SERVER/admin/settings/:Authority"
# curl -X PUT -d "FK2/" "$SERVER/admin/settings/:Shoulder"
# curl -X PUT -d FAKE "$SERVER/admin/settings/:DoiProvider"
#fi
# vi dataverse-5.13/dataverse-docker/init.d/03-doi-set.sh
#!/bin/bash

# Setup DOI parameters
# https://guides.dataverse.org/en/latest/installation/config.html#doi-baseurlstring
if [ "${doi_authority}" ]; then
   curl -X PUT -d ${doi_authority} http://localhost:8080/api/admin/settings/:Authority
   curl -X PUT -d ${doi_provider} http://localhost:8080/api/admin/settings/:DoiProvider
   curl -X PUT -d "DVUA/" http://localhost:8080/api/admin/settings/:Shoulder

   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options "-Ddoi.username\=${doi_username}"
   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options "-Ddoi.password\=${doi_password}"
   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options "-Ddoi.dataciterestapiurlstring\=${dataciterestapiurlstring}"
   asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options "-Ddoi.baseurlstring\=${baseurlstring}"
   #if [ "${doi_shoulder}" ]; then
   #   curl -X PUT -d "${doi_shoulder}/" "$SERVER/admin/settings/:Shoulder"
   #fi
fi

Также пароль от DataCite нужно добавить в:

dataverse-docker-5.13/secrets/doi/password
dataverse-docker-5.13/secrets/doi_asadmin

Для удобства установим mc:

# vi /home/svm/dataverse-docker-5.13/init.d/1004-mc.sh
#!/bin/bash
apt install mc -y

Уберем в footer название сборки билда:

/home/svm/dataverse-docker-5.13/init.d/1007-vers.sh
#!/bin/bash
sed -i -e 's/appVersionWithBuildNumber/appVersion/g' /opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/dataverse_footer.xhtml

Если есть ссылки на языковые файлы добавляем скрипт:

# vi /home/svm/dataverse-docker-5.13/init.d/1005-lang-ua.sh 

#!/bin/bash
mkdir /tmp/languages
cd /tmp/languages
wget --content-disposition https://seafile.tst-amo.net.ua/f/fcd8a4e2655b4d53871e/?dl=1
wget --content-disposition https://seafile.tst-amo.net.ua/f/0c6340ef0b934e7f9419/?dl=1
wget --content-disposition https://seafile.tst-amo.net.ua/f/7c20a484f66c400da88a/?dl=1

cp Bundle_ua.properties /opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/WEB-INF/classes/propertyFiles/
cp BuiltInRoles_ua.properties /opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/WEB-INF/classes/propertyFiles/
cp citation_ua.properties /opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/WEB-INF/classes/propertyFiles/

После установки и проверки удаляем 1005-lang-ua.sh

Если нет, то или из под докера или в общей смонтированной директории помещаем языковые файлы и два скрипта, например в docroot, ссылка на Bundle_ua.properties (файл переведен, но еще не перекодирован для сайта)

 BuiltInRoles.properties
 Bundle.properties
 Bundle_ua.properties
 citation.properties 
*lang-properties-convert.py
 languages.sh
# cat languages.sh
#!/bin/bash
./lang-properties-convert.py Bundle_ua.properties > ./Bundle_ua_1.properties

Запускаем languages.sh, результатом будет перекодированный файл для системы:

  Bundle_ua_1.properties

Его нужно будет переименовать (без _1) и положить в директорию:

/opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/WEB-INF/classes/propertyFiles/

Так делаем для всех нужных файликов.

Если происходит обновление версий, то нужно скопировать в домашнюю директорию такие каталоги:

data - Датасеты/Дававерсы
database-data - БД Postgres
docroot - Логотипы

Поочередно вводим команды и ждем окончания установки:

# export traefikhost=dataverse.tst-amo.net.ua
# docker network create traefik
# export useremail=dataverseimp@imp.kiev.ua
# docker-compose up

После установки, можно изменить отображение версии продукта в строке:

/opt/payara/appserver/glassfish/domains/domain1/applications/dataverse/dataverse_footer.xhtml
<h:outputText class="version" value="v. #{settingsWrapper.appVersion}" rendered="#{!widgetView}"/>

Можно столкнуться с проблемой, после переноса директорий

data
database-data
docroot

не вся информация будет видна после установки обновления. Переиндексировать все надо:

https://guides.dataverse.org/en/latest/admin/solr-search-index.html
docker exec -it dataverse /bin/bash
curl http://localhost:8080/api/admin/index/clear
curl http://localhost:8080/api/admin/index

В этой установке проблем загрузки логотипов – нет. Но есть другая проблема, docroot в основной системе не монтируется в docroot контейнера. Т.е. если, что переносить придётся вручную из под докера.

Для настройки SMTP relay посредством google, нужно проделать в аккаунте такие процедуры:

  1. включить двухфакторную аутентификацию
  2. сгенерировать пароль для приложений которые не умеют в “двухфакторную аутентификацию”
  3. скопировать пароль и вставить в .env

https://support.google.com/accounts/answer/185833?hl=en

Google AuthO

Сперва создаем Google Api.

Редактируем файл google.json подставив полученные clientid и clientSecret

# vi /dataverse-docker-5.13/secrets/google.json

{
   "id":"google",
   "factoryAlias":"oauth2",
   "title":"Google",
   "subtitle":"",
   "factoryData":"type: google | userEndpoint: NONE | clientId: FIXME | clientSecret: FIXME",
   "enabled":true
}

Редактируем .env

# Federated authentification file
# https://guides.dataverse.org/en/latest/installation/shibboleth.html
federated_json_file=/secrets/google.json

И делаем docker-compose up.

Metadata

Раскоментировать строки в .env

# Webhook configuration to bundle external services
WEBHOOK=/opt/payara/triggers/external-services.py
CESSDA=True
CLARIN=True

И перезапустить установку

$ docker-compose up

Внутри докера выполнить команду для каждого из файлов

# curl http://localhost:8080/api/admin/datasetfield/load -H "Content-type: text/tab-separated-values" -X POST --upload-file /opt/docroot/codemeta.tsv

предварительно положив этот/эти файл/файлы в указанную директорию.

Затем через UI активировать эти поля метаданных.

Выборочный автозапуск

Так как у меня занят 443 порт, сделаю выборочный запуск контейнеров после перезагрузки основной системы (т.е. без traefik).

Пишем скрипт запуска контейнеров:

$ cat /home/svm/bin/docker_dataverse_start.sh 
#! /bin/bash
docker start dataverse
docker start whoami
docker start dataverse-docker-513_minio_1
docker start solr
docker start postgres
$ sudo chmod +x /home/svm/bin/docker_dataverse_start.sh
$ sudo cat /etc/systemd/system/docker_dataverse.service
[Unit]
Description=Description for sample script goes here
After=network.target

[Service]
Type=simple
ExecStart=/home/svm/bin/docker_dataverse_start.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable sample.service
$ sudo systemctl start sample.service
$ sudo reboot