Questo piccola guida illustra l'istallazione di Alfresco 7.4 dal pacchetto ZIP in un server Ubuntu 22 LTS.


zip Guida per installare Alfresco 7 dal pacchetto zip in Linux Ubuntu


Controcorrente rispetto alle architetture container e cloud, questa guida illustra il vecchio processo.
Obiettivo della guida è di abilitare il system manager ad un'installazione stand-alone.
Questa installazione oltre ad esser completamente funzionante è il passo necessario per i nodi di un cluster Alfresco.
In conclusione: una guida necessaria per un uso personale offline, per un sistemista del cluster Alfresco, una guida necessaria per gli informatici esperti Java e cloud per Alfresco.

1.  Panoramica

Questa guida ipotizza la seguente situazione:
    • un host unico che contiene tutto (spazio, Java, Alfresco e reverseproxy)
    • connessioni di rete in coppie di 2 in bond con:
        ◦ bond 1: su rete di gestione amministrazione
        ◦ bond 2: su rete del cluster di nodi Alfresco
        ◦ bond 3: su rete LAN/WAN
    • OS: Ubuntu Server 22.04 LTS
    • backend:
        ◦ storage ZFS
        ◦ DB con MariaDB
        ◦ Java con JDK OpenJava 11.x
        ◦ accesso amministrativo via SSH.
Dopo la descrizione iniziale delle configurazioni la guida proseguirà come se non usassimo ZFS, né 3 reti differenti.

Panoramica Alfresco

2.  Installazione OS

Installiamo Ubuntu come sopra illustrato:
    • / l'OS
    • /var i log
    • /opt tutto il resto per Alfresco e lo storage.

3.  Alfresco

3.1.  Installazione

Dopo aver installato Ubuntu Server 22.04 LTS secondo le indicazioni sopra esposte procediamo a configurare l'ambiente come segue:
    • Hostname: alfresco1
    • nel file /etc/hosts inseriti questi record
      NB 1: IP e hostname sono da personalizzare per la propria situazione
      NB 2: si inserisce anche un presunto record DNS MX. Di seguito non si descrive né l'implementazione di un mail server, né la configurazione e registrazione DNS.

[ ... ]
Alias    srv1.example.com srv1
Alias    www.example.com www
Alias    mx1.example.com

    • aggiorniamo

apt update && apt upgrade -y && apt autoremove -y && systemctl reboot

3.2.  Tool

    • Installiamo un set di tool base

sudo apt install -y vim tmux mc htop iftop neofetch mc iotop lnav wget curl net-tools nmap && apt install -y ethtool net-tools lsof apt-transport-https unzip ethtool openssl

    • configuriamo sudo

sudo vim /etc/sudoers.d/sudo

[ ... ]
# %sudo   ALL= NOPASSWD: ALL
%sudo   ALL=(ALL:ALL) ALL

    • settare la rete:

        ◦ installiamo le parti terze e carichiamo il modulo bonding

sudo apt install -y ifenslave
sudo modprobe bonding
sudo lsmod | grep bonding
sudo echo 'bonding' | sudo tee -a /etc/modules

        ◦ creare il descrittore della configurazione
          NB: personalizzare IP e route in base alla propria rete

sudo mv /etc/netplan/00-installer-config.yaml{,.ORG}
sudo vim /etc/netplan/01-bonding-config.yaml

 

network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: no
      match:
        macaddress: 52:54:00:05:d4:44
      wakeonlan: true
    enp11s0:
      dhcp4: no
      match:
        macaddress: 52:54:00:E5:b7:04
      wakeonlan: true
    enp12s0:
      dhcp4: no
    enp13s0:
      dhcp4: no
    enp14s0:
      dhcp4: no
    enp15s0:
      dhcp4: no

  bonds:
    bond0:
      interfaces: [enp1s0, enp11s0]
      addresses:
      - 192.168.122.90/24

      nameservers:
        addresses:
        - 192.168.122.1
        search: []
      routes:
      - to: default
        via: 192.168.122.1
      parameters:
        mode: 802.3ad
        transmit-hash-policy: layer3+4
        mii-monitor-interval: 1

    bond1:
      interfaces: [enp12s0, enp13s0]
      addresses:
      - 192.168.100.90/24
      parameters:
        mode: 802.3ad
        transmit-hash-policy: layer3+4
        mii-monitor-interval: 1

    bond2:
      interfaces: [enp14s0, enp15s0]
      dhcp4: yes
      dhcp6: yes
      parameters:
        mode: 802.3ad
        transmit-hash-policy: layer3+4
        mii-monitor-interval: 1

 

sudo netplan try
sudo netplan apply
sudo systemctl restart networking
    • personalizzazione di /etc/hosts

sudo vim /etc/hosts

[ ... ]
127.0.0.1      srv1
[ ... ]
192.168.122.2    srv1.example.com
192.168.122.2    www.example.com www
192.168.122.2    mx1.example.com mx1

3.3.  Storage ZFS

A titolo d'esempio provvediamo a creare un dataset ZRAID che monteremo in /opt .
    • Installiamo ZFS

sudo apt install zfsutils-linux -y

    • creiamo il dataset data

sudo zpool create -m /opt data raid2 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj spare /dev/sdk /dev/sdl

    • verifichiamo il pool creato

sudo zpool list

3.4.  NTP

    • Installiamo l'NTP chrony e settiamolo

sudo apt install -y chrony

    • editiamo /etc/chrony/chrony.conf

sudo vim /etc/chrony/chrony.conf

[ ... ]
# pool ntp.ubuntu.com        iburst maxsources 4
# pool 0.ubuntu.pool.ntp.org iburst maxsources 1
# pool 1.ubuntu.pool.ntp.org iburst maxsources 1
# pool 2.ubuntu.pool.ntp.org iburst maxsources 2
server 0.it.pool.ntp.org iburst
server 1.it.pool.ntp.org iburst
server 2.it.pool.ntp.org iburst
server 3.it.pool.ntp.org iburst
[ ... ]

    • riavviamo e verifichiamo lo stato

sudo systemctl stop chrony
sudo chronyd -q 'server 0.it.pool.ntp.org iburst'
sudo chronyd -q 'server 0.it.pool.ntp.org iburst'
sudo systemctl restart chrony
sudo chronyc sources -v
sudo chronyc sourcestats

4.  Parti terze

4.1.  Applicativi generali

Installiamo le parti terze che servono ad Alfresco.

    • Installiamo e settiamo lm-sensor

sudo apt install -y lm-sensors
sudo sensors-detect
sudo systemctl restart kmod
sudo sensors

    • installiamo alcune utility

sudo apt install -y wamerican-huge wspanish wogerman witalian fonts-crosextra-caladea fonts-crosextra-carlito 
sudo apt install -y hunspell hunspell-es hunspell-de-de hunspell-en-us hunspell-it

    • Installiamo unoconv

sudo apt install -y unoconv

    • installiamo LibreOffice

sudo apt install -y libreoffice

    • installiamo ImageMagick

sudo apt install -y imagemagick

    • installiamo ExifTool

sudo apt install -y exiftool

    • installiamo ffmpeg

sudo apt install -y ffmpeg

4.2.  Java JDK

    • Installiamo il JDK ed il JRE 1.11

      NB: Alfresco CE non gira OpenJDK 17

sudo apt install -y openjdk-11-jdk openjdk-11-jdk-headless && apt install -y openjdk-11-jre openjdk-11-jre-headless

    • verificare la versione installata

java --version

4.3.  Apache Tomcat

Procediamo installando Tomcat 09.
NB: procediamo prima con l'installazione standard. Al momento di deployare il WAR di Alfresco faremo le personalizzazioni del caso con la rimozione del tool di gestione dell'AS.

    • Scarichiamo la versione 9 di Tomcat

mkdir Temp
cd Temp
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.80/bin/apache-tomcat-9.0.80.tar.gz

    • creiamo l'utente dedicato

sudo mkdir /opt/alfresco
sudo useradd -m -U -d /opt/alfresco/tomcat -s /bin/false tomcat

    • estraiamo il pacchetto Tomcat e sistemiamo nomi e permessi

sudo tar xfz apache-tomcat-9.0.80.tar.gz -C /opt/alfresco
sudo mv /opt/alfresco/apache-tomcat-9.0.80 /opt/alfresco/tomcat
sudo chown tomcat:tomcat -R /opt/alfresco/tomcat
sudo chmod +x /opt/alfresco/tomcat/bin/*sh
sudo rm /opt/alfresco/tomcat/bin/*bat

    • creiamo la unit

sudo vim /usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat 10 servlet container
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"

Environment="CATALINA_BASE=/opt/alfresco/tomcat"
Environment="CATALINA_HOME=/opt/alfresco/tomcat"
Environment="CATALINA_PID=/opt/alfresco/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/alfresco/tomcat/bin/startup.sh
ExecStop=/opt/alfresco/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl start tomcat
sudo systemctl status tomcat

    • verifichiamo il corretto avvio connettendoci all'URL  http://www.server.com:8080/

    • stoppiamo Tomcat

systemctl stop tomcat

4.4.  MariaDB

    • Installiamo i certificati

sudo curl -fsSL http://mirror.mariadb.org/PublicKey_v2 | sudo gpg --dearmor | sudo tee /usr/share/keyrings/mariadb.gpg > /dev/null

    • Installiamo i repo

sudo echo "deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/mariadb.gpg] http://mirror.mariadb.org/repo/11.1/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mariadb.list

    • e installiamo MariaDB

sudo apt install -y mariadb-server

    • attiviamo e avviamo MariaDB

sudo systemctl enable mariadb
sudo systemctl restart mariadb
sudo systemctl status mariadb

    • verifichiamo la versione

mariadb --version

    • securizziamo MariaDB

sudo mariadb-secure-installation

[ ... ]
Switch to unix_socket authentication [Y/n] n
[ ... ]
Change the root password? [Y/n]
[ ... ]
New password: <standard easy>
Re-enter new password: <standard easy>
[ ... ]

4.5.  ActiveMQ

Ubuntu ha nei repo la 5.16, ma serve almeno la 5.17, pertanto installiamo a mano 5.18.2 (attualmente la più recente).

    • Aggiungiamo l'utente riservato per ActiveMQ

sudo useradd -m -U -d /opt/activemq -s /bin/false activemq

    • scarichiamo il pacchetto

wget https://dlcdn.apache.org//activemq/5.18.2/apache-activemq-5.18.2-bin.tar.gz

    • estraiamo e sistemiamo la sicurezza

sudo tar xfz apache-activemq-5.18.2-bin.tar.gz -C /opt/
sudo mv /opt/apache-activemq-5.18.2 /opt/activemq
sudo chown activemq:activemq -R /opt/activemq

    • personalizziamo la configurazione
      NB: nel portarlo in produzione rimetterlo su localhost!!

sudo vim  /opt/activemq/conf/jetty.xml

 

[ ... ]
    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
             <!-- the default port number for the web console -->
        <!-- property name="host" value="127.0.0.1"/ -->
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8161"/>
    </bean>
[ ... ]

    • creiamo la unit systemd

sudo vim /usr/lib/systemd/system/activemq.service

 

[Unit]
Description=Apache ActiveMQ Message Broker
After=network-online.target

[Service]
Type=forking

User=activemq
Group=activemq

WorkingDirectory=/opt/activemq/bin
ExecStart=/opt/activemq/bin/activemq start
ExecStop=/opt/activemq/bin/activemq stop
Restart=on-abort

[Install]
WantedBy=multi-user.target

    • avviare e verificare ActiveMQ

sudo systemctl daemon-reload
sudo systemctl start activemq
sudo systemctl status activemq

    • verificare accedendo al pannello di controllo
    http://vm09.kbsb.loc:8161/admin
    Username: admin
    Password: admin

    • spegnere e disattivare ActiveMQ

sudo systemctl stop activemq
sudo systemctl disable activemq

    • cambiare la password

sudo vim  /opt/activemq/conf/jetty-realm.properties

 

[ ... ]
admin: activePass23, admin
#user: user, user
alfresco: alfrescoPass, user

5.  Install Alfresco

5.1.  Attività preparatorie

    • Installiamo Tesseract con alcune lingue

sudo apt install -y tesseract-ocr tesseract-ocr-ita tesseract-ocr-eng tesseract-ocr-spa tesseract-ocr-fra

    • Impostiamo MariaDB e creiamo il DB:

        ◦ editiamo /etc/mysql/mariadb.conf.d/50-server.cnf

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

        ◦ impostiamo max_connections a 275 come segue

[ ... ]
#max_connections       = 100
max_connections        = 275
[ ... ]

        ◦ e riavviamo MariaDB

sudo systemctl restart mariadb

    • creare il DB

mariadb -h localhost -u root

CREATE DATABASE alfresco DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
GRANT ALL PRIVILEGES ON alfresco.* TO alfresco@localhost IDENTIFIED BY 'alfresco';
FLUSH PRIVILEGES;
quit;

    • scaricamento e pubblicazione connector

wget https://repo1.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/2.2.6/mariadb-java-client-2.2.6.jar
sudo cp mariadb-java-client-2.2.6.jar /opt/alfresco/tomcat/lib/
sudo chown tomcat:tomcat /opt/alfresco/tomcat/lib/mariadb-java-client-2.2.6.jar

5.2.  Preparazione Alfresco

    • Scarichiamo lo zip Alfresco

wget https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-content-services-community-distribution/7.4.0.1/alfresco-content-services-community-distribution-7.4.0.1.zip

    • estrarre il pacchetto

sudo mkdir /opt/alfresco_data
mkdir alfresco-content-services-community-distribution-7.4
cp alfresco-content-services-community-distribution-7.4.0.1.zip alfresco-content-services-community-distribution-7.4/
cd alfresco-content-services-community-distribution-7.4
unzip alfresco-content-services-community-distribution-7.4.0.1.zip
sudo rm -R /opt/alfresco/tomcat/webapps/*
sudo cp -r web-server/conf/* /opt/alfresco/tomcat/conf/
sudo cp -r web-server/lib/* /opt/alfresco/tomcat/lib/
sudo cp -r web-server/shared /opt/alfresco/tomcat/shared
sudo mkdir /opt/alfresco/tomcat/shared/lib
sudo cp -r web-server/webapps/* /opt/alfresco/tomcat/webapps/
sudo cp -r amps /opt/alfresco/
sudo cp -r bin /opt/alfresco/
sudo cp -r licenses /opt/alfresco/
sudo cp -r keystore /opt/alfresco_data
sudo cp ../mariadb-java-client-2.2.6.jar /opt/alfresco/tomcat/lib/

    • aggiungere il classpath per Alfresco

sudo vim /opt/alfresco/tomcat/conf/catalina.properties

 

[ ... ]
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
[ ... ]

   • impostare il connector di Tomcat

sudo vim /opt/alfresco/tomcat/conf/server.xml

 

[ ... ]
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               URIEncoding="UTF-8"
               maxHttpHeaderSize="32768"
            />
[ ... ]

    • creare setenv.sh e impostare le variabili per lo store di criptazione
      NB 1: tipo e password del keystore sono nel file keystore-passwords.properties 
      NB 2: questo settaggio fino alla versione 6.x non era necessario. Dalla 7.x la criptazione è obbligatoria
      NB 3: per creare nuovi keystore usare il programma https://github.com/Alfresco/alfresco-ssl-generator
      NB 4: la manualistica indica di usare la variabile JAVA_TOOL_OPTIONS per passare i parametri del keystore alla JVM. In Linux con Tomcat bisogna usare JAVA_OPTS

sudo vim /opt/alfresco/tomcat/bin/setenv.sh

 

#
# Settaggio e chiavi per la criptazione

JAVA_OPTS="$JAVA_OPTS -Dencryption.keystore.type=JCEKS -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding -Dencryption.keyAlgorithm=DESede -Dencryption.keystore.location=/opt/alfresco_data/keystore/metadata-keystore/keystore -Dmetadata-keystore.password=mp6yc0UD9e -Dmetadata-keystore.aliases=metadata -Dmetadata-keystore.metadata.password=oKIWzVdEdA -Dmetadata-keystore.metadata.algorithm=DESede"


#
# Dimensionamento RAM: necessario aumentarla per gli indici
# Farlo anche in Solr altrimenti crasha durante l'attività

JAVA_OPTS="-Xms1G -Xmx5G $JAVA_OPTS " # java-memory-settings

    • impostiamo le proprietà globali come segue

sudo cp /opt/alfresco/tomcat/shared/classes/alfresco-global.properties.sample /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

sudo vim /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

 

# The server mode. Set value here
# UNKNOWN | TEST | BACKUP | PRODUCTION
system.serverMode=TEST

#
# Solr connection
# solr.secureComms=https

#
# Criptation store
#alfresco.secureComms=none

#
# Content and index data location and keystore to crypt
#
dir.root=/opt/alfresco_data/
dir.keystore=/opt/alfresco_data/keystore

#
# Setting to keystore


db.schema.update=true

db.name=alfresco
db.username=alfresco
db.password=alfresco
db.host=localhost
db.port=3306
db.pool.max=275
db.driver=org.mariadb.jdbc.Driver
db.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?useUnicode=yes&characterEncoding=UTF-8

 dir.license.external=/opt/licenses

 alfresco.context=alfresco
 alfresco.host=${localname}
 alfresco.port=8080
 alfresco.protocol=http

 share.context=share
 share.host=${localname}
 share.port=8080
 share.protocol=http

    • sistemare i permessi

sudo chown tomcat:tomcat -R /opt/alfresco_data /opt/alfresco

5.3.  Applicare share.amp

NB: se non si pubblica il modulo share.amp Alfresco parte regolarmente, si accede anche a Share, ma non si ha accesso e possibilità di gestione alle directory e non si può caricare-gestire alcun file!

sudo su - -s /bin/bash tomcat
cd /opt/alfresco/bin
bash apply_amps.sh
exit

5.4.  Ultimi setting

    • Creiamo le directory dei moduli

mkdir -p /opt/alfresco/modules/platform
mkdir -p /opt/alfresco/modules/share
chown tomcat:tomcat -R /opt/alfresco

    • impostiamo i log di Alfresco

sudo su - -s /bin/bash tomcat

cd /opt/alfresco/tomcat/webapps/
mkdir alfresco
cp alfresco.war alfresco/
cd alfresco/
jar -xvf alfresco.war
rm alfresco.war
vim WEB-INF/classes/log4j2.properties

[ ... ]
# appender.rolling.fileName=alfresco.log
# appender.rolling.filePattern=alfresco.log.%d{yyyy-MM-dd}
appender.rolling.fileName=/opt/alfresco/tomcat/logs/alfresco.log
appender.rolling.filePattern=/opt/alfresco/tomcat/logs/alfresco.log.%d{yyyy-MM-dd}
[ ... ]

    • impostiamo i log di Share

cd /opt/alfresco/tomcat/webapps/
mkdir share
cp share.war share/
cd share/
jar -xvf share.war
rm share.war
vim WEB-INF/classes/log4j2.properties

[ ... ]
# appender.rolling.fileName=share.log
# appender.rolling.filePattern=share.log.%d{yyyy-MM-dd}
appender.rolling.fileName=/opt/alfresco/tomcat/logs/share.log
appender.rolling.filePattern=/opt/alfresco/tomcat/logs/share.log.%d{yyyy-MM-dd}
[ ... ]

exit

5.5.  Installiamo il Servizio di Trasformazione

NB: a differenza delle versioni fino alla 6.x il servizio trasformazione dei file non è più nel core e istanziato dal file di configurazione principale: è diventato un servizio esterno.

    • Installiamo alfresco-pdf-renderer

wget https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-pdf-renderer/1.1/alfresco-pdf-renderer-1.1-linux.tgz
tar xfz alfresco-pdf-renderer-1.1-linux.tgz
cp alfresco-pdf-renderer /opt/alfresco/bin/
sudo chown tomcat:tomcat /opt/alfresco/bin/alfresco-pdf-renderer
sudo chmod +x /opt/alfresco/bin/alfresco-pdf-renderer

    • scarichiamo il servizio

wget https://nexus.alfresco.com/nexus/content/repositories/releases/org/alfresco/alfresco-transform-core-aio-boot/2.7.0-A1/alfresco-transform-core-aio-boot-2.7.0-A1.jar

    • e copiamolo in /opt/alfresco/bin

cp alfresco-transform-core-aio-boot-2.7.0-A1.jar /opt/alfresco/bin/
sudo chmod -x /opt/alfresco/bin/alfresco-transform-core-aio-boot-2.7.0-A1.jar
sudo chown tomcat:tomcat /opt/alfresco/bin/alfresco-transform-core-aio-boot-2.7.0-A1.jar

    • creiamo lo script di avvio-configurazione

sudo vim /opt/alfresco/bin/alfrescots.sh

 

#!/bin/bash

#
# Set global variables
#
SERVICE_NAME=LTS_-_Local_Tranfromation_Service
LOCAL_TRANSFORM_SERVICE_HOME=/opt/alfresco
PID_PATH_NAME=$LOCAL_TRANSFORM_SERVICE_HOME/tomcat/temp/LTS.pid 

#
# Set Variables of run application
#

# -DPDFRENDERER_EXE
TS_PDF-RENDERER=/opt/alfresco/bin/alfresco-pdf-renderer

# -DLIBREOFFICE_HOME
TS_OFFICE=/usr/lib/libreoffice

# -DIMAGEMAGICK_ROOT -DIMAGEMAGICK_DYN
TS_IMAGEMAGICK=/usr/bin

# -DIMAGEMAGICK_EXE
TS_IMAGEMAGICK_CONVERT=/usr/bin/convert

# -DIMAGEMAGICK_CODERS
TS_IMAGEMAGICK_CONVERT_CODERS=/usr/lib/x86_64-linux-gnu/ImageMagick-6.9.11/modules-Q16/coders

# -DIMAGEMAGICK_CONFIG
TS_IMAGEMAGICK_CONVERT_CONFIG=/usr/lib/x86_64-linux-gnu/ImageMagick-6.9.11/config-Q16

# alfresco-transform-core-aio-boot-2.7.0-A1.jar
TS_JAR=/opt/alfresco/bin/alfresco-transform-core-aio-boot-2.7.0-A1.jar


#
# Function Start Transform Service
#
TsStart()
{
nohup java -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 \
    -DPDFRENDERER_EXE="$TS_PDF-RENDERER" \
    -DLIBREOFFICE_HOME="$TS_OFFICE" \
    -DIMAGEMAGICK_ROOT="$TS_IMAGEMAGICK" \
    -DIMAGEMAGICK_DYN="$TS_IMAGEMAGICK" \
    -DIMAGEMAGICK_EXE="$TS_IMAGEMAGICK_CONVERT" \
    -DIMAGEMAGICK_CODERS="$TS_IMAGEMAGICK_CONVERT_CODERS" \
    -DIMAGEMAGICK_CONFIG="$TS_IMAGEMAGICK_CONVERT_CONFIG" \
    -DACTIVEMQ_URL="failover:(tcp://localhost:61616)?timeout=3000" \
    -jar $TS_JAR \
     /tmp 2>> /dev/null >>/dev/null \
     & echo $! > $PID_PATH_NAME  
}

#
# Function Stop Transform Service
#
TsStop()
{
    # PID=$(cat $PID_PATH_NAME);
    # printf "\n $SERVICE_NAME stoping ... \n" 
    /bin/kill $PID;         
    # printf "\n $SERVICE_NAME stopped ...\n" 
    # rm $PID_PATH_NAME       
}


echo "Process id path: $PID_PATH_NAME"

case $1 in 
start)
  echo "Starting $SERVICE_NAME ..."
  if [ ! -f $PID_PATH_NAME ]; then
    TsStart
    printf "\n $SERVICE_NAME started ...\n"
  else
    printf "\n $SERVICE_NAME is already running ...\n"
  fi
;;

stop)
  if [ -f $PID_PATH_NAME ]; then
        PID=$(cat $PID_PATH_NAME);
        printf "\n $SERVICE_NAME stoping ... \n"
        TsStop
        printf "\n $SERVICE_NAME stopped ...\n"
        rm $PID_PATH_NAME
  else          
         printf "\n $SERVICE_NAME is not running ...\n"
  fi    
;;
    
restart)  
  if [ -f $PID_PATH_NAME ]; then
        #
        # Process Stop
        PID=$(cat $PID_PATH_NAME);
        printf "\n Stoping $SERVICE_NAME ... \n"
        TsStop
        printf "\n Stopped $SERVICE_NAME ...\n"
        rm $PID_PATH_NAME
        #
        # Process Start
        echo "Starting $SERVICE_NAME ..."
        TsStart
        printf "\n Started $SERVICE_NAME ...\n"
    else
        printf "\n $SERVICE_NAME is not running ...\n"
    fi
 esac

    • settiamo i permessi dello script

sudo chmod +x /opt/alfresco/bin/alfrescots.sh
sudo chown tomcat:tomcat /opt/alfresco/bin/alfrescots.sh

    • infine creiamo e carichiamo la unit di avvio

sudo vim /usr/lib/systemd/system/alfrescots.service

[Unit]
Description=Alfresco Transform Service
After=network.target

[Service]
Type=forking
Restart=always

User=tomcat
Group=tomcat

ExecStart=/opt/alfresco/bin/alfrescots.sh start
ExecStop=/opt/alfresco/bin/alfrescots.sh stop

[Install]
WantedBy=multi-user.target

    • abilitiamo la nuova unit

sudo systemctl daemon-reload

    • aggiungiamo le seguenti righe di configurazione in /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

sudo vim /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

 

[ ... ]
#This property is default true, here it it for information purpose.
local.transform.service.enabled=true

localTransform.core-aio.url=http://localhost:8090/

Testiamo il servizio di trasformazione

    • avviare il servizio

sudo systemctl start alfrescots.service

    • accedere all'URL http://localhost:8090: vedremo una finestra con le impostazioni e la possibilità di caricare file da trasformare di formato

    • stoppiamo il servizio

sudo systemctl stop alfrescots.service

5.6.  Installiamo il Servizio di Ricerca

NB: la documentazione Community non sembra completamente è corretta

    • Scaricare il pacchetto Search

wget https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-search-services/2.0.7/alfresco-search-services-2.0.7.zip

    • estraiamo il pacchetto

unzip alfresco-search-services-2.0.7.zip

    • creiamo l'utente dedicato

sudo useradd -r -U -d /opt/solr -s /bin/false solr

    • copiamo Solr in /opt/

sudo cp -R alfresco-search-services /opt/
sudo mv /opt/alfresco-search-services /opt/solr

    • personalizziamo /opt/solr/solrhome/templates/rerank/conf/solrcore.properties come segue

vim /opt/solr/solrhome/templates/rerank/conf/solrcore.properties

 

[ ... ]
alfresco.secureComms=secret
[ ... ]

    • personalizziamo /opt/solr/solrhome/conf/shared.properties come segue

vim /opt/solr/solrhome/conf/shared.properties

 

#Host details an external client would use to connect to Solr
solr.host=localhost

#If not set then solr.port will be the jetty.port
#solr.port=8983
solr.baseurl=/solr

# Properties treated as identifiers when indexed
alfresco.identifier.property.0={http://www.alfresco.org/model/content/1.0}creator
alfresco.identifier.property.1={http://www.alfresco.org/model/content/1.0}modifier
alfresco.identifier.property.2={http://www.alfresco.org/model/content/1.0}userName
alfresco.identifier.property.3={http://www.alfresco.org/model/content/1.0}authorityName

# Suggestable Properties
alfresco.suggestable.property.0={http://www.alfresco.org/model/content/1.0}name
alfresco.suggestable.property.1={http://www.alfresco.org/model/content/1.0}title
alfresco.suggestable.property.2={http://www.alfresco.org/model/content/1.0}description
alfresco.suggestable.property.3={http://www.alfresco.org/model/content/1.0}content

# Data types that support cross locale/word splitting/token patterns if tokenised
alfresco.cross.locale.property.0={http://www.alfresco.org/model/content/1.0}name

# Data types that support cross locale/word splitting/token patterns if tokenised
alfresco.cross.locale.datatype.0={http://www.alfresco.org/model/dictionary/1.0}text
alfresco.cross.locale.datatype.1={http://www.alfresco.org/model/dictionary/1.0}content
alfresco.cross.locale.datatype.2={http://www.alfresco.org/model/dictionary/1.0}mltext

    • settiamo la configurazione di avvio di Solr

      NB: la password per securizzare il dialogo tra Alfresco e Solr va impostata prima del primo lancio del servizio. Durante il l'avvio vengono create le istanze alfresco e archive con la password scelta. Dopo il primo avvio non è più possibile cambiare la password a meno di cancellare le due istanze, farle ricreare e ri-indicizzare tutto.

sudo vim /opt/solr/solr.in.sh

 

SOLR_JAVA_MEM="-Xms2g -Xmx2g"
SOLR_OPTS="$SOLR_OPTS -Dsolr.jetty.request.header.size=1000000 -Dsolr.jetty.threads.stop.timeout=300000 -Ddisable.configEdit=true"
SOLR_LOGS_DIR=../../logs
LOG4J_PROPS=$SOLR_LOGS_DIR/log4j.properties
SOLR_SOLR_HOST=localhost
SOLR_SOLR_PORT=8983
SOLR_SOLR_BASEURL=/solr
SOLR_ALFRESCO_HOST=localhost
SOLR_ALFRESCO_PORT=8080
SOLR_ALFRESCO_BASEURL=/alfresco
SOLR_ALFRESCO_SECURECOMMS=secret
export JAVA_TOOL_OPTIONS="-Dalfresco.secureComms.secret=secret"

    • aggiorniamo la configurazione di Alfresco

sudo vim /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

 

[ ... ]
#
# Index Setting
#

#index.recovery.mode=AUTO
index.subsystem.name=solr6
solr.secureComms=secret
solr.sharedSecret=secret
solr.host=localhost
solr.port=8983
solr.base.url=/solr

    • correggiamo i permessi

sudo chown solr:solr -R /opt/solr
sudo chmod +x /opt/solr/solr.in.sh
sudo rm  /opt/solr/solr.in.cmd

    • primo avvio: lo faremo manualmente in modo da avere subito il feedback di funzionamento

sudo su - solr -s /bin/bash
/opt/solr/solr/bin/solr start -a "-Dcreate.alfresco.defaults=alfresco,archive"

    • stoppiamo Solr

sudo /opt/solr/solr/bin/solr stop -all

    • creiamo la unit di avvio per SystemD

sudo vim /usr/lib/systemd/system/solr.service

 

[Unit]
Description=Alfresco search service Solr
#ConditionPathExists=/opt/solr
After=network.target

[Service]
Type=forking
Restart=always

User=solr
Group=solr

LimitNOFILE=8192:65536

ExecStart=/opt/solr/solr/bin/solr start -a '-Dcreate.alfresco.defaults=alfresco,archive'
ExecStop=/opt/solr/solr/bin/solr stop -all

[Install]
WantedBy=multi-user.target

    • carichiamo la unit

systemctl daemon-reload

    • facciamo il primo avvio di tutto lo stack Alfresco

systemctl start activemq
systemctl start mariadb
systemctl start tomcat
systemctl start solr
systemctl start alfrescots

      NB: il completamento dell'avvio di Alfresco impiega anche qualche minuto: dipende dalla velocità e dalla potenza di calcolo del computer su cui gira.

    • accediamo all'URL http://<ipserver|fqdn>:8080/ "-> Alfresco Repository -> Alfresco Share"

    • autentichiamoci con l'utente default:
      Username: admin      Password: admin

    • dopo l'accesso cambiare la password dell'utente admin e uscire

    • stoppiamo lo stack

systemctl stop alfrescots
systemctl stop solr
systemctl stop tomcat
systemctl stop mariadb
systemctl stop activemq

    • creiamo lo script per l'avvio e lo stop automatico di tutto lo stack

sudo vim /etc/init.d/alfresco-stack

 

#!/bin/bash

#
# Definizione variabili
#
AS_ACT=$1
AS_STATUS=
AS_ERR=0
AS_RESTART=
ST_S=0
ST_MAX=4
ST_COUNT=0
RTN=0

#
# Definizione funzioni start, stop, restart
#

#
# Avvio dello stack Alfresco
#
stStart()
{
    systemctl start activemq
    systemctl start mariadb
    systemctl start tomcat
    sleep 20
    systemctl start solr
    sleep 20
    systemctl start alfrescots

    return 0
}

#
# Stop dello stack Alfresco
#
stStop()
{
    systemctl stop alfrescots
    systemctl stop solr
    systemctl stop tomcat
    systemctl stop mariadb
    systemctl stop activemq

    return 0
}

#
# Verifica la reale terminazione dei servizi
#
stCheck()
{
    #
    # Reset status del check
    #
    ST_ERR=0
    AS_STATUS=0

    #
    # Check ActiveMQ
    #
    systemctl status activemq > /dev/null 2>&1;AS_STATUS=$?
    if [ "$AS_STATUS" != "3" ] && [ "$ST_ERR" = "0" ]; then
        ST_ERR=1
    fi

    #
    # Check MariaDB
    #
    systemctl status mariadb > /dev/null 2>&1;AS_STATUS=$?
    if [ "$AS_STATUS" != "3" ] && [ "$ST_ERR" = "0" ]; then
        ST_ERR=1
    fi

    #
    # Check Tomcat
    #
    systemctl status tomcat > /dev/null 2>&1;AS_STATUS=$?
    if [ "$AS_STATUS" != "3" ] && [ "$ST_ERR" = "0" ]; then
        ST_ERR=1
    fi

    #
    # Check Solr
    #
    systemctl status solr > /dev/null 2>&1;AS_STATUS=$?
    if [ "$AS_STATUS" != "3" ] && [ "$ST_ERR" = "0" ]; then
        ST_ERR=1
    fi

    #
    # Check AlfrescoTS
    #
    systemctl status alfrescots > /dev/null 2>&1;AS_STATUS=$?
    if [ "$AS_STATUS" != "3" ] && [ "$ST_ERR" = "0" ]; then
        ST_ERR=1
    fi

    #
    # ritorna lo stato:
    #   0 = tutti i servizi sono stoppati
    #   1 = uno o più serivi sono ancora running
    #
    echo "$ST_ERR"
    return $ST_ERR
}

case "$AS_ACT" in
    start)
        echo "Starting ..."
        stStart
        echo "Started"
        ;;
    stop)
        echo "Stopping ..."
        stStop
        echo "Stopped"
        ;;
    restart)
        echo "Stopping ..."
        stStop

        # Attesa per fine terminazione servizi
        sleep 30

        # verivica terminazione completa con piccolo loop
        # 0 = tutto STOP
        # 1 = uno o più RUNNING
        ST_S=$(stCheck)

        while [ "$ST_S" = "1" ] && [ "$ST_COUNT" -le "$ST_MAX" ]; do
            ((ST_COUNT++))
            sleep 30
            ST_S=$(stCheck)
        done

        case "$ST_S" in
            0)
                # Avvio dei servizi
                echo "Sttopped"
                echo "Starting ..."
                stStart
                echo "Started"
                RTN=0
                ;;
            1)
                # errore!!
                echo "ERROR: Alfresco Stack no sttoped."
                echo "Try by hand again or contact to system administrator."
                RTN=1
                ;;
        esac
        ;;
    *)
        echo "alfresco-stack.sh run, stop or restart the Alfresco stack (ActiveMQ+MariaDB+Tomcat-Alfresco-Share+Solr+AlfrescoTransformationService)"
        echo "Usage:"
        echo -e "\n\talfresco-stack.sh (start|stop|restart|help)"
        echo -e "\nstart"
        echo -e "\tStart all Alfresco stack services"
        echo -e "\nstop"
        echo -e "\tStop all Alfresco stack services"
        echo -e "\nrestart"
        echo -e "\tStop and Restart the services"
        echo -e "\nhelp"
        echo -e "\tPrint this help"
        ;;
esac

# return $RTN
exit $RTN

 

sudo chmod 754 /etc/init.d/alfresco-stack
sudo chown root:root /etc/init.d/alfresco-stack

 

sudo systemctl daemon-reload

    • testiamo l'avvio tramite SystemD, ci colleghiamo e stoppiamo sempre tramite SystemD

sudo systemctl start alfresco-stack

 

URL http://<ipserver|fqdn>:8080/

 

sudo systemctl stop alfresco-stack

A questo punto tutta l'installazione e la configura dello Stack Alfresco è pronta e funzionante come singolo nodo.
Impostarlo per l'avvio automatico

sudo systemctl enable alfresco-stack

Per disattivarlo come avvio automatico:

sudo systemctl disable alfresco-stack

6.  Completamento

Dopo aver portato in produzione il cuore di Alfresco procediamo con alcuni completamenti e perfezionamenti.
Iniziamo con il mettere un ReverseProxy \davanti\ ad Alfresco e attiviamo il firewall securizzando il server.
Successivamente procediamo con alcune configurazioni di Alfresco e di alcuni suoi componenti.

6.1.  ReverseProxy

Per il reverseproxy useremo Nginx. L'FQDN del nostro server è www.server.com .
Successivamente accenneremo all'attivazione del protocollo HTTPS usando sempre il reverseproxy come frontend per la securizzazione con CertBot (https://certbot.eff.org/) per avere un certificato valido.

    • Installiamo Nginx

sudo apt install -y nginx

    • creiamo il file di configurazione per il server

sudo vim /etc/nginx/sites-available/www.server.com.conf

 

# Set proxy cache config
proxy_buffering on;
proxy_cache_path  /var/cache/nginx   keys_zone=alfresco-cache:1512m   inactive=1d;
proxy_cache_key "$scheme$request_method$host$request_uri";

# tomcats we're forwarding to
upstream tomcat_server_https {
  server 127.0.0.1:8080 fail_timeout=0;
}
upstream tomcat_server_http {
  server 127.0.0.1:8080 fail_timeout=0;
}
upstream sharepoint {
  server 127.0.0.1:7070 fail_timeout=0;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
            try_files $uri $uri/ =404;
        }


        location /share {
            proxy_pass      http://tomcat_server_http/share;
            include         /etc/nginx/proxy_params;
            proxy_cache     alfresco-cache;
            # add_header    X-Proxy-Cache $upstream_cache_status;
        }

        location /alfresco {
            proxy_pass      http://tomcat_server_http/alfresco;
            include         /etc/nginx/proxy_params;
            proxy_cache     alfresco-cache;
            # add_header    X-Proxy-Cache $upstream_cache_status;
        }

        location  ~ (^/share/.*\.js$|^/share/.*\.css$|^/share/.*\.gif$|^/share/.*\.png$|^/share/.*\.woff$|^/share/.*\.ttf$|^/share/.*\.eot$|^/share/.*/images/|^/share/.*icons/) {
            add_header  Cache-Control  public;
            #add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            expires  7d ;

            include         /etc/nginx/proxy_params;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass      http://tomcat_server_https;
            proxy_cache   alfresco-cache;
            add_header X-Proxy-Cache $upstream_cache_status;
        }

    location ~ (^/share/.*/thumbnails/.*$) {
            proxy_cache_valid   200   301  302  10m ;
            proxy_cache_valid 404 1m;
            include         /etc/nginx/proxy_params;
            expires  20m ;
            proxy_cache   alfresco-cache;
            #add_header X-Proxy-Cache $upstream_cache_status;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass      http://tomcat_server_https;
        }
}

    • abilitiamo la configurazione appena fatta

sudo ln -s /etc/nginx/sites-available/vm09.kbsb.loc /etc/nginx/sites-enabled/vm09.kbsb.loc
sudo rm /etc/nginx/sites-enabled/default

    • cambiamo l'index default
      NB: il file qui di seguito è solo un esempio

sudo vim /var/www/html/index.html

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Home - Alfresco Reverseproxy</title>
</head>
<body>
    <h1 style="text-align: center;">Home - Alfresco Reverseproxy</h1>
    <p><a href="/alfresco">Alfresco</a><br>
    <a href="/share">Share</a></p>
</body>
</html>

 

sudo chown www-data:www-data /var/www/html/index.html

    • lanciamo Nginx

sudo systemctl start nginx

    • avviamo lo stack Alfresco

sudo systemctl start alfresco-stack

    • verifichiamo il reverse accedendo all'URL http://www.server.com 

    • verificato il funzionamento del reverse spegniamo lo stack ed Nginx

sudo systemctl stop alfresco-stack
sudo systemctl stop nginx

    • impostiamo Nginx come servizio default

sudo systemctl enable nginx

6.2.  Attivazione HTTPS

Prima di passare alla parte esecutiva è necessario fare delle puntualizzazioni perché il servizio funzioni:

    • in questa architettura la criptazione SSL/TLS è gestita da Nginx, non da Tomcat
    • per funzionare è necessario che l'hostname sia FQDN (cioè deve essere reale, ovvero su un DNS pubblico)
    • i certificati SSL sono generati da Let’s Encrypt (https://letsencrypt.org/) e gestiti tramite CertBot (https://certbot.eff.org/)
    • la parte circa l'installazione e l'attivazione di CertBot non verrà trattata e rimandiamo a queste guide:
    • Certbot Instructions (https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)
    • How To Secure Apache with Let's Encrypt on Ubuntu 22.04 (https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-22-04)
    • infine ipotizziamo che il nome FQDN sia www.example.com .

Iniziamo installando CertBot e creando il certificato, come illustrato dalle guida sopra indicate.
A questo punto aggiorniamo il file di configurazione del reverse:

    • creiamo il file /etc/nginx/sites-available/www.example.com.conf

sudo vim /etc/nginx/sites-available/www.example.com.conf

 

# Set proxy cache config
proxy_buffering on;
proxy_cache_path  /var/cache/nginx   keys_zone=alfresco-cache:1512m   inactive=1d;
proxy_cache_key "$scheme$request_method$host$request_uri";

# tomcats we're forwarding to
upstream tomcat_server_https {
  server 127.0.0.1:8080 fail_timeout=0;
}
upstream tomcat_server_http {
  server 127.0.0.1:8080 fail_timeout=0;
}
upstream sharepoint {
  server 127.0.0.1:7070 fail_timeout=0;
}

# Default Redirect HTTP --> HTTPS
server {
    listen 80 default_server;
    # access_log  /var/www/digitaldsb.it/log/www.example.com_access.log;

    server_name www.example.com;

    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl default_server;
    access_log  /var/www/digitaldsb.it/log/www.example.com_access.log;

    server_name www.example.com;

    root /var/www/digitaldsb.it/html;
    index index.html index.htm index.nginx-debian.html;

    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location /errorpage {
        root /var/www/digitaldsb.it/html/error;
    }

    #redirect server error pages to the static page /50x.html
    error_page 502 503 504 /errorpage/maintenance.html;
        location = /errorpage/maintenance.html {
        root   /var/www/digitaldsb.it/html/error;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location /share {
        proxy_pass      http://tomcat_server_https/share;
        include         /etc/nginx/proxy_params;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache   alfresco-cache;
       #add_header X-Proxy-Cache $upstream_cache_status;
    }

    location /alfresco {
        proxy_pass       http://tomcat_server_https/alfresco;
        include         /etc/nginx/proxy_params;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache   alfresco-cache;
       #add_header X-Proxy-Cache $upstream_cache_status;
    }

    ## Forcing Web Browsers to Cache CSS , JS , etc
    location  ~ (^/share/.*\.js$|^/share/.*\.css$|^/share/.*\.gif$|^/share/.*\.png$|^/share/.*\.woff$|^/share/.*\.ttf$|^/share/.*\.eot$|^/share/.*/images/|^/share/.*icons/) {
           add_header  Cache-Control  public;
           #add_header Cache-Control "public, must-revalidate, proxy-revalidate";
           expires  7d ;
           
           include         /etc/nginx/proxy_params;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_pass      http://tomcat_server_https;
           proxy_cache   alfresco-cache;
           #add_header X-Proxy-Cache $upstream_cache_status;
    }

    ## Forcing Nginx to cache Document Thumbnail Images on Disk , but NOT by the Web Browser

   location ~ (^/share/.*/thumbnails/.*$)  
    {
       proxy_cache_valid   200   301  302  10m ;
       proxy_cache_valid 404 1m;
       include         /etc/nginx/proxy_params;
       expires  20m ;
        proxy_cache   alfresco-cache;
       add_header X-Proxy-Cache $upstream_cache_status;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass      http://tomcat_server_https;
     }     
     
    # sharepoint config
    location  ~ (^/spp|^/_vti_bin/|^/_vti_history/|^/_vti_inf.html$) {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-By $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect          off;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
            client_max_body_size    0;
            client_body_buffer_size 128k;
            proxy_connect_timeout   500;
            proxy_send_timeout      500;
            proxy_read_timeout      500;
            proxy_buffers           32 4k;
            proxy_headers_hash_max_size     1024;
            proxy_headers_hash_bucket_size  128;
            proxy_http_version 1.1;
            proxy_pass      http://sharepoint;
            proxy_buffering off;
    }
}

    • abilitiamo la nuova configurazione appena fatta

sudo ln -s /etc/nginx/sites-available/www.example.com.conf /etc/nginx/sites-enabled/www.example.com.conf
sudo rm /etc/nginx/sites-enabled/default

    • ricarichiamo Nginx

sudo systemctl restart nginx

    • avviamo lo stack Alfresco

sudo systemctl start alfresco-stack

    • verifichiamo il reverse accedendo all'URL https://www.example.com 
    • verificato spegniamo lo stack ed Nginx

sudo systemctl stop alfresco-stack
sudo systemctl stop nginx

    • impostiamo Nginx come servizio default

sudo systemctl enable nginx

6.3.  Attivare e Settare il Firewall

Di default Ubuntu ha il firewall non attivo.
Cosa buona e saggia è attivarlo. Terremmo aperte le sole porte 22 (SSH), 80 (HTTP) e 443 (HTTPS):

    • installiamo ufw, qualora non fosse ancora installato

sudo apt install ufw

    • apriamo le porte 22, 80 e 443

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

    • abilitiamo ufw

sudo ufw enable

    • verifichiamo lo stato del firewall

sudo ufw status

7.  Tuning di performance

Facciamo alcune azioni di fine tuning.

7.1.  Eliminazione .WAR

L'operazione va fatto dopo il deploy e dopo aver fatto girare Alfresco.
Questa operazione alleggerisce Tomcat e accelera l'avvio:

    • eliminiamo i WAR

sudo rm /opt/alfresco/tomcat/webapps/*.WAR

    • eliminiamo i backup

sudo rm /opt/alfresco/tomcat/webapps/*.bak

    • puliamo Tomcat

sudo rm -R /opt/alfresco/tomcat/work/Catalina/localhost/*

7.2.  Rimuovere gli AMP

Dopo aver applicato i moduli aggiuntivi possiamo rimuovere i file AMP.
NB: i moduli non si possono applicare 2 volte. Pertanto è saggio rimuovere gli AMP dopo l'applicazione.

sudo rm /opt/alfresco/amps/*
sudo rm /opt/alfresco/amps_share/*

7.3.  Password secret

Per mettere in produzione un'installazione Alfresco non possiamo tenere le password messe come esempio nella manualistica.
Pertanto la password "secret" usata in questa guida è da cambiare.
Alcuni accorgimenti:

    • scegliere e impostare la password prima del primo lancio di Alfresco e di Solr
    • se cambiamo la password dopo il primo avvio ricordarsi di:
    • pulire Tomcat prima di avviarlo
    • cancellare alfresco e archive
    • inserire la nuova password in solr.in.sh
    • inserire la nuova password in alfresco-global.properties

7.4.  Log

I log consumano risorse. Possiamo migliorare le performance riducendo o togliendo i log.
L'alternativa, per un'architettura in produzione, è avere un collect con tool di navigazione e ricerca come ELK, Grafana, ecc...
Procediamo togliendo i log dalle configurazioni in modo da poterli ripristinare al bisogno:

    • aggiornare /opt/alfresco/tomcat/bin/catalina.sh come segue

sudo vim /opt/alfresco/tomcat/bin/catalina.sh

 

[ ... ]
 # CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
 CATALINA_OUT=/dev/null
[ ... ]

    • aggiornare /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/log4j2.properties

sudo vim /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/log4j2.properties

 

[ ... ]
# appender.rolling.fileName=/opt/alfresco/tomcat/logs/alfresco.log
appender.rolling.fileName=/dev/null
[ ... ]

    • aggiornare ``/opt/alfresco/tomcat/webapps/share/WEB-INF/classes/log4j2.properties``

sudo vim /opt/alfresco/tomcat/webapps/share/WEB-INF/classes/log4j2.properties

 

[ ... ]
# appender.rolling.fileName=/opt/alfresco/tomcat/logs/share.log
appender.rolling.fileName=/dev/null
[ ... ]

    • puliamo Tomcat

sudo rm /opt/alfresco/tomcat/work/Catalina/localhost/*

    • aggiorniamo /opt/solr/logs/log4j.properties

sudo vim /opt/solr/logs/log4j.properties

[ ... ]
# log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.File=/dev/null
[ ... ]

7.5.  Impostare Xmx Xms per Solr

Il sistema di ricerca Solr è preimpostato con 2GB di Xms e 2GB di Xmx.
Il dimensionamento va bene per un uso base, ma può essere troppo piccolo per un uso in produzione.
Quando il carico d'indicizzazione cresce viene saturata l'Xms e Solr crascia.
Per ovviare al problema basta aumentare la RAM assegnata. Per la quantità giusta è bene procedere in modo empirico con un periodo di monitoraggio del sistema in produzione. Suggeriamo, comunque, di partire da un dimensionamento a 4GB.

Cf.: https://docs.alfresco.com/content-services/community/config/repository/#effects-of-newsize

Per apportare il cambio:

    • aggiorniamo /opt/solr/solr.in.sh

sudo vim /opt/solr/solr.in.sh

 

SOLR_JAVA_MEM="-Xms4g -Xmx4g"
[ ... ]

    • riavviamo Solr

systemctl restart solr

8.  Conclusione

L'installazione e prima configurazione descritta in queste pagine permette di avere un nodo completamente funzionante.
Pur potendolo da subito usare l'installazione come un nodo di produzione bisogna osservare:

    • possono essere utili personalizzazioni ulteriori qui non descritte
    • a seconda dello scopo possono essere necessarie l'aggiunta di moduli specifici
    • l'architettura qui descritta presuppone una situazione semplice.

A valle di questo l'esperienza che si matura con un deploy completamente manuale permette di raggiungere una expertice importate che non si ha con le tecniche docker e\o consultando la documentazione community.

9.  Appendice

9.1.  Requisiti

Le indicazioni al momento riportate nella documentazione pubblica non sembrano sempre corrette per la versione community.

Cf.:  https://docs.alfresco.com/content-services/7.4/support/

Con la versione usata in questa guida l'ambiente e le parti che risultano corrette sono le seguenti:

    • Tomcat: versione 9.0.x
    • JDK: OpenJava 11.x
    • ActiveMQ: 5.17 o superiore
    • MariaDB Server: 10.x e 11.x
    • MariaDB Connector Java: 2.2.6 o precedenti

Inoltre la guida ufficiale descrive, per l'installazione con Tomcat, la personalizzazione di catalina.bat.
La pratica fa riferimento all'ambiente Windows, non sembra ci sia un riferimento ufficiale a Unix\Mac\Linux. Per quest'ultimo ambiente una buona pratica, apparentemente non documentata, è di usare catalina.sh passando i parametri tramite la variabile JAVA_OPTS=.
Infine, a seconda dei moduli che si desidera aggiungere, è necessario creare anche directory amps_share non presente nel pacchetto ZIP, né descritta nella documentazione.

9.2.  Extra

Vale la pena citare alcuni elementi che saranno oggetto di una futura guida.
Sono elementi che non impattano sulla funzionalità, ma servono per le configurazioni di dettaglio e la gestione avanzata.

    • JMX: monitoraggio delle risorse impiegate
    • Alfresco Administration Console: console di manipolazione e ispezione del singolo nodo e della rete di nodi
    • Alfresco WebScripts Home: console di manipolazione e ispezione di Java Script del/i nodo/i
    • WebDav: connessione per caricare-scaricare file tramite il protocollo WebDav.

10.  Repo, risorse e Webgrafia

10.1.  Repo

https://artifacts.alfresco.com/nexus/#nexus-search;gav~org.alfresco~alfresco-content-services-community*~7.4.0~~
https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-content-services-community-distribution/7.4.0.1/alfresco-content-services-community-distribution-7.4.0.1.zip
https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-content-services-share-distribution/7.4.0.1/alfresco-content-services-share-distribution-7.4.0.1.zip
https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-search-services/2.0.7/alfresco-search-services-2.0.7.zip
https://nexus.alfresco.com/nexus/service/local/repositories/releases/content/org/alfresco/alfresco-transform-core-aio/3.1.0/alfresco-transform-core-aio-3.1.0.jar
https://docs.alfresco.com/process-automation/latest/model/connectors/database/#mariadb

10.2.  Risorse

Guide
https://javaworld-abhinav.blogspot.com/2021/06/setup-acs70-ass201-and-transformation-service.html
https://javaworld-abhinav.blogspot.com/2022/05/setup-acs-7-ass-2-and-local-windows.html
https://github.com/abhinavmishra14/alfresco7-solr-localtransform-dist-setup
https://docs.alfresco.com/content-services/community/install/zip/

Post Install
https://docs.alfresco.com/content-services/community/install/zip/additions/#post-installation-checks

Certificate SSL/TLS
https://docs.alfresco.com/content-services/community/config/repository/#ssl-repo

Setting, Fixing, ...
https://docs.alfresco.com/content-services/community/config/repository/#effects-of-newsize

ReverseProxy
alfresco-reverse-proxy, https://github.com/ecm4u/alfresco-reverse-proxy
Configure Community Edition to work with a web proxy, https://docs.alfresco.com/content-services/community/config/repository/#configure-community-edition-to-work-with-a-web-proxy
How To Configure Nginx as a Reverse Proxy on Ubuntu 22.04, https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-on-ubuntu-22-04
https://github.com/ecm4u/alfresco-reverse-proxy/tree/master
https://serverfault.com/questions/472491/how-to-set-up-alfresco-share-behind-apache-reverse-proxy
https://www.eisenvault.com/forum/alfresco-community-q-a/how-to-setup-apache-as-a-reverse-proxy-for-alfresco-with-ssl-encryption
https://stackoverflow.com/questions/67303045/how-to-configure-alfresco-6-community-behind-proxy

Netplan + WOL
https://netplan.readthedocs.io/en/0.105/examples.html
https://wiki.ubuntu.com/Netplan/Design
https://askubuntu.com/questions/1244785/trouble-with-wakeonlan-with-ubuntu-20-04
https://www.golinuxcloud.com/wake-on-lan-ubuntu/
https://vitux.com/how-to-configure-networking-with-netplan-on-ubuntu/

MIME type
https://docs.alfresco.com/content-services/community/config/repository/#add-a-mime-type

Impostare cron
https://docs.alfresco.com/content-services/community/config/repository/#defer-the-start-of-cron-based-jobs

Impostare l'FTP interno ad Alfresco
https://docs.alfresco.com/content-services/community/config/file-servers/#configuring-the-ftp-file-server

Chrony
https://ubuntu.com/server/docs/how-to-serve-the-network-time-protocol-with-chrony

Tomcat
https://linuxize.com/post/how-to-install-tomcat-10-on-ubuntu-22-04/
https://docs.alfresco.com/content-services/community/install/zip/tomcat/

MariaDB
https://www.linuxcapable.com/how-to-install-mariadb-on-ubuntu-linux/
https://docs.alfresco.com/content-services/community/config/databases/#mysql-and-mariadb

ActiveMQ
https://docs.alfresco.com/content-services/community/config/activemq/
https://activemq.apache.org/installation.html
https://tecadmin.net/how-to-install-apache-activemq-on-ubuntu-22-04/

Alfresco
https://hub.alfresco.com/t5/alfresco-content-services-blog/alfresco-community-edition-7-4-release-notes/ba-p/316162
https://docs.alfresco.com/content-services/community/install/zip/
https://www.alfresco.com/it/thank-you/thank-you-downloading-alfresco-community-edition
https://hub.alfresco.com/t5/alfresco-content-services-blog/alfresco-community-edition-7-4-release-notes/ba-p/316162
https://nexus.alfresco.com/nexus/#nexus-search;quick~alfresco-content-services-community-distribution
https://docs.alfresco.com/content-services/7.4/support/

Alfresco Transform Service
Install Transform Service, https://docs.alfresco.com/transform-service/latest/install/
Setup ACS-7.x, ASS-2.x and Local Transformation Service using distribution package step by step Part-1, https://javaworld-abhinav.blogspot.com/2021/06/setup-acs70-ass201-and-transformation-service.html
Alfresco 7.3 - Upgrading to Transform Core 3.0.0, https://hub.alfresco.com/t5/alfresco-content-services-blog/alfresco-7-3-upgrading-to-transform-core-3-0-0/ba-p/315364

Alfresco Search Service
Alfresco Search Services, https://docs.alfresco.com/search-services/latest/install/
Setup ACS7.x, ASS2.x and transformation service using distribution package step by step on Linux platform, https://javaworld-abhinav.blogspot.com/2021/06/setup-acs70-ass201-and-transformation-service.html
Setup ACS7.x, ASS2.x and transformation service using distribution package step by step on Windows platform, https://javaworld-abhinav.blogspot.com/2022/05/setup-acs-7-ass-2-and-local-windows.html
Effects of NewSize, https://docs.alfresco.com/content-services/community/config/repository/#effects-of-newsize

Extention
https://nexus.alfresco.com/nexus/content/repositories/releases/org/alfresco/extension-inspector/
https://github.com/Alfresco/alfresco-extension-inspector
https://github.com/Alfresco/docs-alfresco

Keystore
NB: dalla versione 7.x l'uso delle chiavi di criptazione è obbligatoria. Senza Alfresco non si avvia.
https://github.com/Alfresco/alfresco-ssl-generator
https://hub.alfresco.com/t5/alfresco-content-services-forum/getting-error-while-starting-acs-7-0-keystores-are-invalid/m-p/306500#M23919
https://docs.alfresco.com/search-services/latest/config/keys/
https://docs.alfresco.com/content-services/latest/config/mtls/
https://github.com/Alfresco/alfresco-ssl-generator