Solr
è un server di indicizzazione basato su Apache
Lucene. Dovecot
communica con esso attraverso delle query HTTP/XML
. Il server di indicizzazione consente di fare ricerche di testo in modo veloce nelle mail, compreso il corpo dei messaggi.
- Scarica l'ultima versione: v. 9.5.0
- Documentazione ufficiale
- Documentazione di Solr FTS Engine per Dovecot
Aggiornamento alla versione 9.5.0
- Maggiori informazioni qui
Dovecot
ha recentemente rilasciato i file schema aggiornati alla versione 9, alternativi a quelli che si trovano qui
Prima di ogni cosa controllare che la propria versione di java
sia almeno la 11.
Scaricare Solr
:
SOLR_VER=9.5.0 wget https://www.apache.org/dyn/closer.lua/solr/solr/${SOLR_VER}/solr-${SOLR_VER}.tgz?action=download -O solr-${SOLR_VER}.tgz
Arrestare quindi il server Solr
e lanciare l'aggiornamento con le opzioni -f
(aggiornamento) e -n
(non lanciare do not start the server when finished) options:
tar xzf solr-${SOLR_VER}.tgz solr-${SOLR_VER}/bin/install_solr_service.sh --strip-components=2 sudo bash ./install_solr_service.sh solr-${SOLR_VER}.tgz -f -n
Gli utenti Slackware
invece dovranno procedere diversamente:
wget https://notes.sagredo.eu/files/qmail/solr/install_solr_slackware.sh chmod +x install_solr_slackware.sh ./install_solr_slackware.sh solr-${SOLR_VER}.tgz -f -n
Scaricare e installare il nuovo schema e il file di configurazione per Dovecot
cd /var/solr/data/dovecot/conf rm -f schema.xml managed-schema.xml solrconfig.xml wget https://notes.sagredo.eu/files/qmail/solr/9.5/solr-schema-${SOLR_VER}.xml -O schema.xml wget https://notes.sagredo.eu/files/qmail/solr/9.5/solrconfig-9.5.0.xml -O solrconfig.xml chown solr:solr solrconfig.xml schema.xml
Il nuovo file di configurazione sostituisce LRUCache
con CaffeineCache
e cambia la locazione delle librerie .jar
(diff).
Configure your /etc/default/solr.in.sh file, as many options are changed. Then restart the Solr
server.
Finally upgrade the indexes (edit the downloaded script to insert your Dovecot
password)
wget https://notes.sagredo.eu/files/qmail/solr/solr_rescan_index.sh chmod +x solr_rescan_index.sh chown root:root solr_rescan_index.sh chmod o-wrx solr_rescan_index.sh ./solr_rescan_index.sh Stopping Dovecot . <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">20</int> </lst> </response> Starting Dovecot.
Se lo script non deve restituire errori (status=0
). Se invece si ottengono degli errori è necessario ricontrollare le autorizzazioni di sicurezza e le credenziali dell'utente dovecot di Solr
.
Installazione
Solr
è un servlet java
che richiede jdk
v. 11 o successivo. E' testato fino ad almeno la versione 17.
# java -version openjdk version "17.0.10" 2024-01-16 OpenJDK Runtime Environment (build 17.0.10+7) OpenJDK 64-Bit Server VM (build 17.0.10+7, mixed mode, sharing)
E' necessario accertarsi che l'eseguibile java
sia nel path e di aver definito la variabileJAVA_HOME
:
PATH=$PATH:/usr/lib64/java/bin/ JAVA_HOME=/usr/lib64/java/
Scaricare i binari di Solr
e installare
SOLR_VER=9.5.0 wget https://www.apache.org/dyn/closer.lua/solr/solr/${SOLR_VER}/solr-${SOLR_VER}.tgz?action=download -O solr-${SOLR_VER}.tgz
Estrarre l'installer dall'archivio e lanciarlo. L'installer funzioznaerà per la maggior parte delle distribuzioni Linux
basate esu systemd
.
tar xzf solr-${SOLR_VER}.tgz solr-${SOLR_VER}/bin/install_solr_service.sh --strip-components=2 sudo bash ./install_solr_service.sh solr-${SOLR_VER}.tgz
Il server verrà avviato da systemd
all'avvio della macchina.
Installazione su Slackware
Su Slackware
l'installer contenuto nell'archivio non funzionerà, perchè basato su systemd
. Usare allora la mia versione modificata install_solr_slackware.sh dello script di installazione :
wget https://notes.sagredo.eu/files/qmail/solr/install_solr_slackware.sh chmod +x install_solr_slackware.sh ./install_solr_slackware.sh solr-${SOLR_VER}.tgz
Configurazione
La locazione del server è /opt/solr, mentre i log sono in /var/solr/logs.
La configurazione del servers è nel file /opt/solr/bin/solr.in.sh.orig, che è stato convenientemente copiato in /etc/defaults/solr.in.sh di modo che ne manteniamo copia dopo ogni aggiornamento. Tenere presente che i doppi apici sono importanti in questo file.
SOLR_TIMEZONE="Europe/Rome" SOLR_IP_ALLOWLIST="127.0.0.1, 10.0.0.0/24" SOLR_JETTY_HOST="10.0.0.111" SOLR_SECURITY_MANAGER_ENABLED=true SOLR_OPTS="$SOLR_OPTS -Dsolr.allowUrls=http://solr.yourdomain.tld:8983"
SOLR_IP_ALLOWLIST
consente le connessioni dalla mia DMZ
. Tenere presente che SOLR_IP_ALLOWLIST
era SOLR_IP_WHITELIST
prima della versione 9.
Settare SOLR_JETTY_HOST="10.0.0.111"
(l'indirizzo IP del server Solr
nella rete locale) è stato un po' complicato per me, in quanto ho il server Solr
in un server virtuale separato rispetto a qmail
e apache
. Questa opzione consente a Solr
di accettare connessioni anche dalla rete esterna. In caso tutti questi server siano nello stesso host, si può tranquillamente lasciare SOLR_JETTY_HOST=127.0.0.1
commentato.
SOLR_PID_DIR="/var/solr/data"
mi ha risolto un problema nel quale il file pid non poteva essere salvato in solr/bin a causa di problemi con i privilegi.
SOLR_HOME="/var/solr/data"
farà in modo che Solr
salvi i dati e la configurazione di dovecot in una directory separata. Questo faciliterà le operazioni di aggiornamento, che non dovranno prevedere spostamenti di questa cartella.
Impostare i limiti
Solr
viene eseguito dall'utente solr:solr
. Questo utente necessità che il limite del numero dei file aperti sia incrementato fino ad almeno 65000. Su Slackware
il limite di default è 1024. Per aumentarlo per l'utente solr
modificare il file /etc/security/limits.conf o creare un file solr.conf nella cartella limits.d con i seguenti contenuti:
solr soft nofile 65536 solr soft nproc 65536 solr hard nofile 65536 solr hard nproc 65536
Nel mio caso solr
vive in un container "unprivileged" LXC
, per cui i limiti devono essere impostati non solo all'interno del container come già spiegato, ma anche nell'host per l'utente proprietario del container. Inoltre, è necessario aggiungere questa opzione nel file di configurazione:
lxc.prlimit.nofile = 65536
Avvio del server
Siamo pronti per (ri)avviare il server:
sudo systemctl stop solr sudo systemctl start solr sudo systemctl status solr
Gli utenti Slackware
trovano lo script di avvio in /etc/init.d (lo script è già stato installato in rc.local
)
/etc/init.d/solr start sleep 5 /etc/init.d/solr status
E' conveniente creare un link simbolico allo script di avvio
ln -s /etc/init.d/solr /usr/local/bin/solrctl
Dovecot
core
Per usare Solr
con Dovecot
, è necessario configurarlo in modo specifico come segue (dopo aver avviato il server):
sudo -u solr /opt/solr/bin/solr create -c dovecot
I file di configurazione per Dovecot
sono nella cartella /var/solr/data/dovecot.
Installare i file di configurazione:
cd /var/solr/data/dovecot/conf rm -f schema.xml managed-schema.xml solrconfig.xml wget https://notes.sagredo.eu/files/qmail/solr/9.1/schema-${SOLR_VER}.xml -O schema.xml wget https://notes.sagredo.eu/files/qmail/solr/9.1/solrconfig-${SOLR_VER}.xml -O solrconfig.xml chown solr:solr solrconfig.xml schema.xml
Il file managed-schema viene generato a partire dal file schema.xml.
Abbiamo già compilato Dovecot
con il supporto per Solr
(--with-solr
al momento della compilazione).
Abilitare il plugin dal file 10-mail.conf:
mail_plugins = $mail_plugins fts fts_solr
e aggiungere le opzioni di configurazionee nel blocco plugin{...}
del file 90-plugin.conf file:
plugin { fts = solr fts_solr = url=http://solr.mydomain.tld:8983/solr/dovecot/ # eventualmente aggiungere l'opzione debug alla linea precedente ... }
dove solr.mydomain.tld
è il dominio dove Solr
è raggiungibile, già definito nel file di configurazione.
Pannello di controllo
Le impostazioni generali del server sono disponibili anche attraverso un pannello di controllo web, allo stesso infirizzo http che abbiamo settato nel plugin di Dovecot
. Questo è un esempio di configurazione di apache
. Ho settato un proxy giusto connettermi a una normale porta 443 anzichè alla 8983, che è quella dove Solr
è in ascolto.
<VirtualHost *:443> SSL stuff here ServerName solr.mydomain.tld ErrorLog ${LOGDIR}/solr_error.log LogLevel warn CustomLog ${LOGDIR}/solr_access.f2b.log combined SSLProxyEngine On ProxyRequests Off ProxyPass / http://solr.mydomain.tld:8983/ ProxyPassReverse / http://solr.mydomain.tld:8983/ </VirtualHost>
Quando si naviga su https://solr.mydomain.tld si noterà che il pannello di controllo è esposto a tutti e che lamenta la mancanza di policy di sicurezza, che ora andiamo a impostare.
Sicurezza
Nella dashbord del pannello di controllo web, guardare qual è il valore della variabile di ambiente solr.home
nella propria distribuzione:
Portarsi in quella directory e installare un file security.json che definisce i plugins authentication, authorization ed eventualmente auditlogging:
cat > /var/solr/data/security.json << __EOF__ { "authentication":{ "blockUnknown": true, "class":"solr.BasicAuthPlugin", "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, "realm":"My Solr users", "forwardCredentials": false }, "authorization":{ "class":"solr.RuleBasedAuthorizationPlugin", "permissions":[{"name":"security-edit", "role":"admin"}], "user-role":{"solr":"admin"} }} } __EOF__ chown solr:solr /var/solr/data/security.json chmod o-r /var/solr/data/security.json
Ora riavviare il server e provare a loggarsi. L'utente è 'solr', con password temporanea 'SolrRocks', che cambieremo al primo login.
La sezione security suggerisce di risolvere alcuni problemi con i permessi. E' anche necessario creare un utente "dovecot" che servirà per le connessioni dal server IMAP e attribuire i privilegi read e update.
Questo è il mio setup:
Ho lasciato TLS
disabilitato perchè la connessione tra il proxy di Apache
e il server Solr
è via http
.
Ora che abbiamo creato l'utente dovecot,
è necessario rritoccare il file 90-plugin.conf in modo che dovecot si connetta al server Solr
con quelle credenziali:
plugin { fts = solr fts_solr = url=http://dovecot:password@solr.mydomain.tld:8983/solr/dovecot/ # eventualmente aggiungere l'opzione debug alla linea precedente ... }
dove solr.mydomain.tld
è il dominio dove Solr
è raggiungibile, già definito nel file di configurazione. Notare che ora l'accesso viene fatto attraverso le credenziali dovecot:password
settate prima.
Test
# telnet 0 143 Trying 0.0.0.0... Connected to 0. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. a login user@mydomain.tld password a OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NA MESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LI TERAL+ NOTIFY SPECIAL-USE QUOTA] Logged in a select Inbox * FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $MDNSent Junk $label3 $Forwarded) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $MDNSent Junk $label3 $Forwarded \*)] Flags permitted. * 308 EXISTS * 0 RECENT * OK [UIDVALIDITY 1285590712] UIDs valid * OK [UIDNEXT 19895] Predicted next UID * OK [HIGHESTMODSEQ 31675] Highest a OK [READ-WRITE] Select completed (0.001 + 0.000 secs). a SEARCH text "Dovecot" * SEARCH 35 50 51 55 56 57 58 62 63 74 75 76 77 121 129 130 146 150 151 158 163 164 165 173 196 201 202 203 213 225 226 227 228 230 231 232 249 250 262 263 264 289 a OK Search completed (0.309 + 0.001 + 0.043 secs). a logout
Guardare il file log di dovecot
e assicurarsi che non vi siano errori. Quindi guardare il file log di Solr
. Questo è un esempio di file /var/solr/logs/solr.log senza errori:
2023-01-04 13:42:44.423 INFO (qtp1141500277-21) [ dovecot] o.a.s.c.S.Request webapp=/solr path=/select params={q={!lucene+q.op%3DAND}(hdr:Dovecot+OR+body:Dovecot)&fl=uid,score&sort=uid+a sc&fq=%2Bbox:8af5d82b9ae4c94cbe610000364df272+%2Buser:user@mydomain.tld&rows=21842&wt=xml} hits=44 status=0 QTime=15 2023-01-04 13:42:44.424 INFO (audit-31-thread-1) [ ] o.a.s.s.SolrLogAuditLoggerPlugin type="COMPLETED" message="Completed" method="GET" status="200" requestType="SEARCH" username="dovecot" resource="/select" queryString="wt=xml&fl=uid,score&rows=21842&sort=uid+asc&q=%7b!lucene+q.op%3dAND%7d(hdr:Dovecot+OR+body:Dovecot)&fq=%2Bbox:8af5d82b9ae4c94cbe610000364df272+%2Buser:user@mydomain.tld" collections=[]
e questo è invece un esempio del file /var/solr/logs/YYYY_MM_DD.request.log regolare. Notare che la richiesta è stata servita correttamente con un codice finale 200:
10.0.0.4 - - [04/Jan/2023:13:42:44 +0000] "GET /solr/dovecot/select?wt=xml&fl=uid,score&rows=21842&sort=uid+asc&q=%7b!lucene+q.op%3dAND%7d(hdr:Dovecot+OR+body:Dovecot)&fq=%2Bbox:8af5d82b9ae 4c94cbe610000364df272+%2Buser:user@mydomain.tld HTTP/1.1" 200 4550
Se invece si ottiene un codice di errore 451 è necessario ricontrollare le autorizzazioni, specialmente riguardo all'account dovecot nel server Solr.