Dump на удаленный сервер

Нужно забекапить старую систему на удаленный сервер. ada1 – новая система на текущем сервере, ada0 – старая система на этом сервере.

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ada1p2 992M 256M 656M 28% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ada1p4 1.9G 517M 1.3G 28% /tmp
/dev/ada1p5 97G 8.7G 80G 10% /usr
/dev/ada1p6 20G 5.3G 13G 28% /home/svm
/dev/ada1p7 1.6T 149G 1.4T 10% /var
mount /dev/ada0p2 /mnt
dump -0uan -f - /dev/ada0p2 | gzip -2 | ssh user@tst-amo.net.ua dd of=/home/user/dump_mail_root.gz
umount /mnt
mount /dev/ada0p5 /mnt
dump -0uan -f - /dev/ada0p5 | gzip -2 | ssh user@tst-amo.net.ua dd of=/home/user/dump_mail_usr.gz
umount /mnt
mount /dev/ada0p6 /mnt
dump -0uan -f - /dev/ada0p6 | gzip -2 | ssh user@tst-amo.net.ua dd of=/home/user/dump_mail_home.gz
umount /mnt
mount /dev/ada0p7 /mnt
dump -0uan -f - /dev/ada0p7 | gzip -2 | ssh user@tst-amo.net.ua dd of=/home/user/dump_mail_var.gz
umount /mnt

 

image_pdfimage_print

Dump / Restore – перенос системы на диск большего размера 

Система – FreeBSD 12.2. Старый диск 1Т (ada0), новый 2Т (ada1).

Выключаем сервер, подключаем диск.

Загружаемся и смотрим

# geom disk list
Geom name: ada0
Providers:
1. Name: ada0
   Mediasize: 1000204886016 (932G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r6w6e11
   descr: TOSHIBA DT01ACA100
   lunid: 5000039feff42490
   ident: 671PPX9MS
   rotationrate: 7200
   fwsectors: 63
   fwheads: 16

Geom name: ada1
Providers:
1. Name: ada1
   Mediasize: 2000398934016 (1.8T)
   Sectorsize: 512
   Mode: r0w0e0
   descr: HGST HUS722T2TALA604
   lunid: 50014ee26929ff50
   ident: WCC6N4ZFKK8H
   rotationrate: 7200
   fwsectors: 63
   fwheads: 16
# gpart show
=>       40  1953525088  ada0  GPT (932G)
         40        1024     1  freebsd-boot (512K)
       1064     2096120     2  freebsd-ufs (1.0G)
    2097184    16777216     3  freebsd-swap (8.0G)
   18874400     4194304     4  freebsd-ufs (2.0G)
   23068704   209715200     5  freebsd-ufs (100G)
  232783904    44040192     6  freebsd-ufs (21G)
  276824096  1676701031     7  freebsd-ufs (800G)
 1953525127           1        - free - (512B)
# df -h
Filesystem    Size   Used   Avail   Capacity   Mounted on
/dev/ada0p2   992M   256M   656M    28%        /
devfs         1.0K   1.0K   0B      100%       /dev
/dev/ada0p4   1.9G   517M   1.3G    28%        /tmp
/dev/ada0p5   97G    8.7G   80G     10%        /usr
/dev/ada0p6   20G    5.3G   13G     28%        /home/svm
/dev/ada0p7   774G   148G   626G    19%        /var

Будем создавать, точно такую схему разделов, за исключением раздела var, он получиться на новом диске намного больше.

Удаляем разметку на всякий случай

# gpart destroy -F ada1
ada1 destroyed

Создаем разметку GPT

# gpart create -s gpt ada1
ada1 created

Пишем загрузчик

# gpart add -b 40 -s 512k -t freebsd-boot ada1
ada1p1 added
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1
partcode written to ada1p1
bootcode written to ada1

Создаем корневой раздел

# gpart add -t freebsd-ufs -s 1g ada1
ada1p2 added

Создаем swap

# gpart add -s 8g -t freebsd-swap ada1
ada1p3 added

Создаем последовательно другие разделы. Разделу ada1p7 (var) отдаем все оставшееся место

# gpart add -t freebsd-ufs -s 100g ada1
ada1p5 added
# gpart add -t freebsd-ufs -s 21g ada1
ada1p6 added
# gpart add -t freebsd-ufs ada1
ada1p7 added

Проверяем

# gpart show
=>      40  1953525088  ada0   GPT (932G)
        40        1024     1   freebsd-boot (512K)
      1064     2096120     2   freebsd-ufs (1.0G)
   2097184    16777216     3   freebsd-swap (8.0G)
  18874400     4194304     4   freebsd-ufs (2.0G)
  23068704   209715200     5   freebsd-ufs (100G)
 232783904    44040192     6   freebsd-ufs (21G)
 276824096  1676701031     7   freebsd-ufs (800G)
1953525127           1         - free - (512B)

=>     40  3907029088   ada1   GPT (1.8T)
       40        1024      1   freebsd-boot (512K)
     1064     2097152      2   freebsd-ufs (1.0G)
  2098216    16777216      3   freebsd-swap (8.0G)
 18875432     4194304      4   freebsd-ufs (2.0G)
 23069736   209715200      5   freebsd-ufs (100G)
232784936    44040192      6   freebsd-ufs (21G)
276825128  3630204000      7   freebsd-ufs (1.7T)

Форматируем

# newfs -U /dev/ada1p2
# newfs -U /dev/ada1p4
# newfs -U /dev/ada1p5
# newfs -U /dev/ada1p6
# newfs -U /dev/ada1p7

Так как это почтовый сервер, остановим сервисы во избежание коллизий.

# service postfix stop
# service dovecot stop
# service apache24 stop

Приступаем к dump/restore

# mount /dev/ada1p2 /mnt 
# cd /mnt 
# dump -0 -f - /dev/ada0p2 | restore -r -f -
# umount /mnt
# mount /dev/ada1p4 /mnt
# cd /mnt
# dump -0 -f - /dev/ada0p4 | restore -r -f -
# umount /mnt
# mount /dev/ada1p5 /mnt
# cd /mnt
# dump -0 -f - /dev/ada0p5 | restore -r -f -
# umount /mnt
# mount /dev/ada1p6 /mnt
# cd /mnt
# dump -0 -f - /dev/ada0p6 | restore -r -f -
# umount /mnt
# mount /dev/ada1p7 /mnt
# cd /mnt
# dump -0 -f - /dev/ada0p7 | restore -r -f -
# umount /mnt

Так как делаю удаленно, то правлю fstab, старый диск отключу потом, как ни будь. Сперва на новом диске правим

# mount /dev/ada1p2 /mnt && cd /mnt
# ee /etc/fstab
# Device        Mountpoint   FStype Options Dump    Pass#
/dev/ada0p2     /            ufs    rw      1       1
/dev/ada0p3     none         swap   sw      0       0
/dev/ada0p4     /tmp         ufs    rw      2       2
/dev/ada0p5     /usr         ufs    rw      2       2
/dev/ada0p6     /home/svm    ufs    rw      2       2
/dev/ada0p7     /var         ufs    rw      2       2

меняем ada0 на ada1

# umount /mnt

И на старом, должно получиться везде примерно так

# cat /etc/fstab
# Device        Mountpoint   FStype Options Dump   Pass#
/dev/ada1p2     /            ufs    rw      1      1
/dev/ada1p3     none         swap   sw      0      0
/dev/ada1p4     /tmp         ufs    rw      2      2
/dev/ada1p5     /usr         ufs    rw      2      2
/dev/ada1p6     /home/svm    ufs    rw      2      2
/dev/ada1p7     /var         ufs    rw      2      2
# reboot

Все заняло по времени – 5,5 часов.

image_pdfimage_print

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

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

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
image_pdfimage_print

dd – клонирование диска

Диск на сервере начал сыпать ошибками и поэтому возникла необходимость переноса системы на новый диск. Пробую на виртуальной машине. Выключаем сервер и подключаем новый диск.

Смотрим диски: ada0 – старый ada1 – новый:

# ls /dev/ad*
/dev/ada0 /dev/ada0p1 /dev/ada0p2 /dev/ada0p3 /dev/ada1
# gpart show ada0
=>    40  33554352  ada0  GPT (16G)
      40      1024  1     freebsd-boot (512K)
    1064  31456256  2     freebsd-ufs (15G)
31457320   1677312  3     freebsd-swap (819M)
33134632    419760        - free - (205M)

Перенос системы решил делать утилитой dd

# dd if=/dev/ada0 of=/dev/ada1
33554432+0 records in
33554432+0 records out
17179869184 bytes transferred in 26121.526733 secs (657690 bytes/sec)

Если в процессе утилита начнет ругаться можно попробывать опцию

conv=noerror,sync [bs=размер_блока]
conv=noerror – продолжать копирование невзирая на interrupt

HDD с битыми секторами можно копировать используя dd, диск должен быть читабельным (с ошибками, но читабельным).

Ооочень долго переносило 16G данных. После окончания переноса правим fstab, нужно заменить ada0 на ada1 и пререгрузиться. Проще конечно просто вынуть старый и на его место подключить новый, но так как я делал это удаленно приходиться временно переназначить диски, а потом на месте уже заменив, вернуть записи обратно:

# ee /etc/fstab

# Device      Mountpoint    FStype  Options  Dump   Pass#
/dev/ada1p2   /             ufs     rw       1      1
/dev/ada1p3   none          swap    sw       0      0
# shutdown -r now

Если после загрузки gpart show покажет предупреждение [CORRUPT], его можно устранить

# gpart recover ada1

где ada1 – текущий загрузочный диск.

image_pdfimage_print

VLAN TRUNK и ACCESS с помощью switch chip

Router R1

  • ether1 – WAN
  • ether4 – trunk/tagged
  • ether2 – access/untugged
  • ether3 – access/untagged (на схеме не указан)

Switch SW1

  • ether24 – trunk/tagged
  • ether15 – access/untagged
  • ether16 – access/untagged

1) СОЗДАЕМ БРИДЖ ИНТЕРФЕЙС

/interface bridge 
add name=bridge-LAN

2) СОЗДАЕМ ИНТЕРФЕЙС ВЛАНЫ ПОД ИНТЕРФЕЙСОМ bridge-LAN

/interface vlan
add interface=bridge-LAN name=vlan36 vlan-id=36
add interface=bridge-LAN name=vlan50 vlan-id=50

3) ДОБАВЛЯЕМ ИНТЕРФЕЙСЫ В БРИДЖ

/interface bridge port
add bridge=bridge-LAN interface=ether2
add bridge=bridge-LAN interface=ether3
add bridge=bridge-LAN interface=ether4

4) НАЗНАЧАЕМ IP АДРЕСА НА ИНТЕРФЕЙСЫ VLAN

/ip address
add address=10.10.36.1/24 interface=vlan36 network=10.10.36.0
add address=10.10.50.1/24 interface=vlan50 network=10.10.50.0

5) НАСТРАИВАЕМ DHCP сервера

6) ДОБАВЛЯЕМ В SWITCH1 ПОРТЫ И ВЛАН КОТОРЫЕ БУДУТ ИСПОЛЬЗОВАТЬ ВЛАН

/interface ethernet switch vlan
add ports=ether2,ether4,switch1-cpu switch=switch1 vlan-id=36
add ports=ether3,ether4,switch1-cpu switch=switch1 vlan-id=50

7) НАСТРАИВАЕМ ПОРТЫ НА SWITCH1 В КАЧЕСТВЕ АКСЕСОВ И ТРАНКОВ (always-strip – это аксес, add-if-missing – это транк, switch-cpu оставляем как есть leave-as-is и делаем secure)

/interface ethernet switch port
set 2 default-vlan-id=36 vlan-header=always-strip vlan-mode=secure
set 3 default-vlan-id=50 vlan-header=always-strip vlan-mode=secure
set switch1-cpu vlan-header=leave-as-is vlan-mode=secure
image_pdfimage_print

VLAN TRUNK и ACCESS порты на роутере

Router R1

  • ether1 – WAN
  • ether4 – trunk/tagged
  • ether2 – access/untugged
  • ether3 – access/untagged (на схеме не указан)

Switch SW1

  • ether24 – trunk/tagged
  • ether15 – access/untagged
  • ether16 – access/untagged

Создаем bridge-LAN, не включая vlan filtering

Добавляем порты ether2-4 в bridge-LAN

Создаем интерфейсы vlan

Добавляем vlan36 в наш bridge-LAN, trunk у нас будет сам бридж bridge-LAN и интерфейс ether4, acces портом будет ether2

Повторяем для vlan50, но access порт будет ether3

Назначаем IP для наших vlan интерфейсов vlan36, vlan50

Создаем DHCP Server для каждой из сетей

Включаем vlan filtering на bridge-LAN

На интерфейсах ether2 и ether3 выставляем соответствующие PVID vlan

Если нужно изолировать сети друг от друга создаем правила

 

Настраиваем SW1. Создаем trunk/tagged на ether24 и access/untagged для vlan36 на порту ether15, access/untagged порт vlan50 на ether16

image_pdfimage_print

VLAN ACCESS/UNTAGGED порты

Алгоритм

  1. Создаем бридж
  2. Создаем интерфейсы vlan и включаем в бридж
  3. Добавляем порты в наш бридж
  4. Назначаем IP для наших vlan
  5. Поднимаем DHCP сервера для этих подсетей
  6. Добавляем vlan в бридж
  7. Включаем Vlan Filtering на бридже

1. Создаем bridge-LAN

2. Создаем vlan интерфейсы – vlan36 и vlan50

3. Добавляем порты ether2 и ether3 в bridge-LAN и назначаем им соответственный PVID

4. Назначаем IP адреса этим vlan интерфейсам

5. Поднимаем DHCP сервера на этих интерфейсах (vlan36, vlan50)

6. Добавляем vlan-ы в bridge-LAN, обязательно делаем Tagged наш bridge-LAN и Untagged порт к которому будет подключен клиент ether2 и потом ether3

7. Включаем на bridge-LAN Vlan Filtering

image_pdfimage_print

VLAN router + L2 switch

Alt text

Devices with built-in switch chip

Warning: Not all devices with a switch chip are capable of VLAN switching on a hardware level, check the supported features for each switch chip, the compatibility table can be found Here. If a device has VLAN table support, then it is capable of VLAN switching using the built-in switch chip. You can check the device’s switch chip either in the provided link or by using /interface ethernet switch print

/interface bridge
add name=bridge1
/interface bridge port
add bridge=bridge1 interface=ether1 hw=yes
add bridge=bridge1 interface=ether2 hw=yes
add bridge=bridge1 interface=ether3 hw=yes
/interface ethernet switch vlan
add ports=ether1,ether2 switch=switch1 vlan-id=20
add ports=ether1,ether3 switch=switch1 vlan-id=30
add ports=ether1,switch1-cpu switch=switch1 vlan-id=99
/interface vlan
add interface=bridge1 vlan-id=99 name=MGMT
/ip address
add address=192.168.99.1/24 interface=MGMT
/interface ethernet switch port
set ether1 vlan-mode=secure vlan-header=add-if-missing
set ether2 vlan-mode=secure vlan-header=always-strip default-vlan-id=20
set ether3 vlan-mode=secure vlan-header=always-strip default-vlan-id=30
set switch1-cpu vlan-header=leave-as-is vlan-mode=secure

devices without a built-in switch chip

It is possible to do VLAN filtering using the CPU, there are multiple ways to do it, but it is highly recommended by using bridge VLAN filtering.

/interface bridge
add name=bridge1
/interface bridge port
add bridge=bridge1 interface=ether1 hw=no
add bridge=bridge1 interface=ether2 hw=no pvid=20
add bridge=bridge1 interface=ether3 hw=no pvid=30
/interface bridge vlan
add bridge=bridge1 tagged=ether1 untagged=ether2 vlan-ids=20
add bridge=bridge1 tagged=ether1 untagged=ether3 vlan-ids=30
add bridge=bridge1 tagged=ether1,bridge1 vlan-ids=99
/interface vlan
add interface=bridge1 vlan-id=99 name=MGMT
/ip address
add address=192.168.99.1/24 interface=MGMT
/interface bridge
set bridge1 vlan-filtering=yes
image_pdfimage_print

Dataverse Docker v5.11.1 – mailrelay, https, lang_ua, branding, users 

Установка

Скачиваем все необходимое:

# cd /home/user &&  git clone https://github.com/IQSS/dataverse-docker dataverse-docker-5.11.1

Скопируем docker-compose-ssl.yml из distros, так как при установке по README получал ошибку solr

# 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
# Domain configuration and init folder
hostname=www.dataverse.tst-amo.net.ua
traefikhost=www.dataverse.tst-amo.net.ua
INIT_SCRIPTS_FOLDER=/opt/payara/init.d

# 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

Отредактировать 010-mailrelay-set.sh

# vi dataverse-5.11.1/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

Отредактировать 01-persistent-id.sh

# vi dataverse-5.11.1/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

Отредактировать 03-doi-set.sh

# vi dataverse-5.11.1/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/secrets/doi/password
dataverse-docker/secrets/doi_asadmin

Для решения проблемы загрузки логотипов, пишем скрипты, и размещаем их в /init.d/

# cat /home/user/dataverse-docker-5.11.1/init.d/1003-logos.sh
#!/bin/bash
YES | cp -rf /opt/payara/docroot /opt/
# cat /home/user/dataverse-docker-5.11.1/init.d/1005-apt_inst_cron.sh
#!/bin/bash
apt install cron
service cron start
/bin/chmod +x /opt/payara/init.d/1003-logos.sh
/bin/chmod +x /opt/payara/init.d/1006-crontab.sh
# cat /home/user/dataverse-docker-5.11.1/init.d/1006-crontab.sh
#!/bin/bash
crontab -l ; echo "*/1 * * * * /opt/payara/init.d/1003-logos.sh"| crontab -

Пишем скрипт или вводим поочередно команды:

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

По умолчанию user/password: dataverseAdmin/admin.

Добавляем Украинскую локализацию

Тестовый режим.

# vi /home/user/dataverse-docker-5.11.1/docroot/01-lang_ua.sh
#!/bin/bash

apt-get update
apt-get install zip
wget https://github.com/GlobalDataverseCommunityConsortium/dataverse-language-packs/archive/refs/heads/develop.zip -O /tmp/languages.zip

cd /tmp
   unzip -d dataverse-language-packs languages.zip
   mkdir /tmp/languages
   for locale in dataverse-language-packs/*; do
       for distrib in $locale;
        do
          for lang in $distrib/*; do
             cp "$lang"/Bu*.properties /tmp/languages
          done
       done
    done

cd /tmp/languages
   #rm ./Bundle_ua.properties
   rm ./Bundle_hu.properties
   cp ./Bundle_ua.properties /tmp/
   #cp ./Bundle_hu.properties /tmp/
   /opt/payara/triggers/lang-properties-convert.py /tmp/Bundle_ua.properties > ./Bundle_ua.properties
   #/opt/payara/triggers/lang-properties-convert.py /tmp/Bundle_hu.properties > ./Bundle_hu.properties
   zip languages.zip *.properties
   mkdir /opt/payara/langproperties

curl http://localhost:8080/api/admin/datasetfield/loadpropertyfiles -X POST --upload-file /tmp/languages/languages.zip -H "Content-Type: application/zip"
sleep 1
# Enable language and cache settings
curl http://localhost:8080/api/admin/settings/:Languages -X PUT -d '[{"locale":"en","title":"English"},{"locale":"ua","title":"Українська"}]'
asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options '-Ddataverse.lang.directory=/opt/payara/langproperties'

Пользователи

Список пользователей можно посмотреть через Dashboard (появился в версии 5.11), а также можно вывести через API

curl -H "X-Dataverse-key: $API_TOKEN" http://localhost:8080/api/admin/authenticatedUsers

или, если пользователей много

curl -H "X-Dataverse-key: $API_TOKEN" http://localhost:8080/api/admin/list-users

где $API_TOKEN – токен Администратора.

image_pdfimage_print

grub – error: symbol ‘grub_calloc’ not found

После аварийного отключения света система (у меня soft RAID 1) не захотела загружаться, а на экране красовалась надпись

grub - error: symbol 'grub_calloc' not found.
Entering rescue mode...
grub rescue>

что означает – слетел загрузчик.

Проделываем следующие шаги:

  1. Грузимся с LiveCD (например, с установочной флешки Centos 7), выбираем rescue mode, затем пункт 1
  2. Монтируем корень / в  /mnt, внимательно посмотреть с помощью lsblk какой масив как называется, так как масив отвечаюший за корень при загрузке с LiveCD изменил номер, был md126, стал md127
    # mount /dev/md127 /mnt

    Монтируем boot:

    # mount /dev/md125 /mnt/boot

    Монтируем /dev, /proc и /sys:

    # mount --bind /dev /mnt/dev
    # mount --bind /proc /mnt/proc
    # mount --bind /sys  /mnt/sys
  3. Затем делаем chroot в примонтированную систему:
    # chroot /mnt
  4. Устанавливаем grub на диски:
    # grub2-install /dev/sda
    # grub2-install /dev/sdb
  5. Перегружаемся.

Загрузка заняла прилично времени, почти 7 часов. Это SELinux делал рилейбл.

image_pdfimage_print