diff --git a/conf/cron/miab_solr b/conf/cron/miab_solr
index 898404cb..cfb102a6 100644
--- a/conf/cron/miab_solr
+++ b/conf/cron/miab_solr
@@ -1,2 +1,2 @@
-* 1 * * * root /usr/bin/curl -s http://127.0.0.1:8080/solr/update?commit=true >/dev/null 2>&1
-30 3 * * * root /usr/bin/curl -s http://127.0.0.1:8080/solr/update?optimize=true >/dev/null 2>&1
+* 1 * * * root /usr/bin/curl -s http://127.0.0.1:8983/solr/update?commit=true >/dev/null 2>&1
+30 3 * * * root /usr/bin/curl -s http://127.0.0.1:8983/solr/update?optimize=true >/dev/null 2>&1
diff --git a/conf/solr/solr-config-7.7.0.xml b/conf/solr/solr-config-7.7.0.xml
new file mode 100644
index 00000000..3661874d
--- /dev/null
+++ b/conf/solr/solr-config-7.7.0.xml
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+ 7.7.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${solr.data.dir:}
+
+
+
+
+
+
+ ${solr.ulog.dir:}
+ ${solr.ulog.numVersionBuckets:65536}
+
+
+
+
+ ${solr.autoCommit.maxTime:15000}
+ false
+
+
+
+
+ ${solr.autoSoftCommit.maxTime:-1}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ 20
+
+
+ 200
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ explicit
+ 10
+
+
+
+
+
+ _text_
+
+
+
+
+
+
diff --git a/conf/solr-jetty.xml b/conf/solr/solr-jetty.xml
similarity index 100%
rename from conf/solr-jetty.xml
rename to conf/solr/solr-jetty.xml
diff --git a/conf/solr/solr-schema-7.7.0.xml b/conf/solr/solr-schema-7.7.0.xml
new file mode 100644
index 00000000..601a290c
--- /dev/null
+++ b/conf/solr/solr-schema-7.7.0.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id
+
diff --git a/conf/solr/solr.service b/conf/solr/solr.service
new file mode 100644
index 00000000..599d9c64
--- /dev/null
+++ b/conf/solr/solr.service
@@ -0,0 +1,21 @@
+[Unit]
+Description=Apache SOLR
+After=network.target
+
+[Service]
+Type=forking
+User=solr
+PIDFile=/var/run/solr-8983.pid
+Environment=SOLR_INCLUDE=/etc/default/solr.in.sh
+ExecStart=/usr/local/lib/solr/bin/solr start
+ExecStop=/usr/local/lib/solr/bin/solr stop
+Restart=on-failure
+ReadWritePaths=/var/lib/solr/
+ReadWritePaths=/var/lib/solr/data/
+LimitNOFILE=65000
+LimitNPROC=65000
+TimeoutSec=180s
+PrivateTmp=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/management/status_checks.py b/management/status_checks.py
index 9f78a004..be3def9f 100755
--- a/management/status_checks.py
+++ b/management/status_checks.py
@@ -40,7 +40,7 @@ def get_services():
{ "name": "Mail Filters (Sieve/dovecot)", "port": 4190, "public": True, },
{ "name": "HTTP Web (nginx)", "port": 80, "public": True, },
{ "name": "HTTPS Web (nginx)", "port": 443, "public": True, },
- { "name": "Solr Full Text Search (Jetty)", "port": 8080, "public": False, },
+ { "name": "Solr Full Text Search (Jetty)", "port": 8983, "public": False, },
]
def run_checks(rounded_values, env, output, pool):
diff --git a/setup/solr.sh b/setup/solr.sh
index e4371a9a..0277073b 100644
--- a/setup/solr.sh
+++ b/setup/solr.sh
@@ -1,8 +1,5 @@
#!/bin/bash
#
-# Inspired by the solr.sh from jkaberg (https://github.com/jkaberg/mailinabox-sogo)
-# with some modifications
-#
# IMAP search with lucene via solr
# --------------------------------
#
@@ -13,6 +10,12 @@
#
# Solr runs as a Jetty process. The dovecot solr plugin talks to solr via its
# HTTP interface, searching indexed mail and returning results back to dovecot.
+#
+# Based on https://forum.iredmail.org/topic17251-dovecot-fts-full-text-search-using-apache-solr-on-ubuntu-1804-lts.html
+# https://doc.dovecot.org/configuration_manual/fts/solr/ and https://solr.apache.org/guide/8_8/installing-solr.html
+#
+# solr-jetty package is removed from Ubuntu 21.04 onward. This installation
+# therefore depends on manual installation of solr instead of an ubuntu package
source setup/functions.sh # load our functions
source /etc/mailinabox.conf # load global vars
@@ -22,14 +25,62 @@ source /etc/mailinabox.conf # load global vars
echo "Installing Solr..."
-# Install packages
-apt_install solr-jetty dovecot-solr
+# TODO remove after testing
+set -x
-# Solr requires a schema to tell it how to index data, this is provided by dovecot
-cp /usr/share/dovecot/solr-schema.xml /etc/solr/conf/schema.xml
+apt_install dovecot-solr default-jre-headless
+
+VERSION=8.8.2
+HASH=7c3e2ed31a4412e7dac48d68c3abd52f75684577
+
+needs_update=0
+
+if [ ! -f /usr/local/lib/solr/bin/solr ]; then
+ # not installed yet
+ needs_update=1
+elif [[ "$VERSION" != `/usr/local/lib/solr/bin/solr version` ]]; then
+ # checks if the version is what we want
+ needs_update=1
+fi
+
+if [ $needs_update == 1 ]; then
+ # install SOLR
+ wget_verify \
+ https://www.apache.org/dyn/closer.lua?action=download&filename=lucene/solr/$VERSION/solr-$VERSION.tgz \
+ $HASH \
+ /tmp/solr.tgz
+
+ tar xzf /tmp/solr.tgz solr-$VERSION/bin/install_solr_service.sh --strip-components=2
+ # install to usr/local, force update, do not start service on installation complete
+ bash /tmp/install_solr_service.sh solr.tgz -i /usr/local/lib -f -n
+
+ # TODO uncomment after testing
+ #rm -f /tmp/solr.tgz
+ rm -f /tmp/install_solr_service.sh
+
+ # stop and remove the init.d script
+ rm -f /etc/init.d/solr
+ update-rc.d solr remove
+fi
+
+# Install systemd service
+if [ ! -f "/lib/systemd/system/solr.service" ]; then
+ cp -f conf/solr/solr.service /lib/systemd/system/solr.service
+ hide_output systemctl link -f /lib/systemd/system/solr.service
+
+ # Reload systemctl to pickup the above changes
+ hide_output systemctl daemon-reload
+fi
+
+# Make sure service is enabled
+hide_output systemctl enable solr.service
+
+# TODO: necessary? Solr requires a schema to tell it how to index data, this is provided by dovecot
+# cp -f /usr/share/dovecot/solr-schema.xml /etc/solr/conf/schema.xml
# Default config has an error with our config, placing our custom version
-cp conf/solr-jetty.xml /etc/solr/solr-jetty.xml
+# TBD necessary?
+#cp -f conf/solr/solr-jetty.xml /etc/solr/solr-jetty.xml
# Update the dovecot plugin configuration
#
@@ -45,7 +96,7 @@ cat > /etc/dovecot/conf.d/90-plugin-fts.conf << EOF;
plugin {
fts = solr
fts_autoindex = yes
- fts_solr = break-imap-search url=http://127.0.0.1:8080/solr/
+ fts_solr = break-imap-search url=http://127.0.0.1:8983/solr/
}
EOF
@@ -53,50 +104,33 @@ EOF
hide_output install -m 755 conf/cron/miab_dovecot /etc/cron.daily/
hide_output install -m 644 conf/cron/miab_solr /etc/cron.d/
-# PERMISSIONS
+# Initialize solr dovecot instance
+if [ ! -d "/var/sorl/data/dovecot" ]; then
+ sudo -u solr /usr/local/lib/solr/bin/solr create -c dovecot
+ rm -f /var/solr/data/dovecot/conf/schema.xml
+ rm -f /var/solr/data/dovecot/conf/managed-schema
+ rm -f /var/solr/data/dovecot/conf/solrconfig.xml
+ cp -f conf/solr/solr-config-7.7.0.xml /var/solr/data/dovecot/conf/solrconfig.xml
+ cp -f conf/solr/solr-schema-7.7.0.xml /var/solr/data/dovecot/conf/schema.xml
+fi
-# Ensure configuration files are owned by dovecot and not world readable.
-chown -R mail:dovecot /etc/dovecot
-chmod -R o-rwx /etc/dovecot
+# TODO: add security
+#SOLR_IP_WHITELIST="127.0.0.1, [::1]"
-# Newer updates to jetty9 restrict write directories, this allows for
-# jetty to write to solr database directories
-mkdir -p /etc/systemd/system/jetty9.service.d/
-cat > /etc/systemd/system/jetty9.service.d/solr-permissions.conf << EOF
-[Service]
-ReadWritePaths=/var/lib/solr/
-ReadWritePaths=/var/lib/solr/data/
-EOF
-
-# Reload systemctl to pickup the above override.
-systemctl daemon-reload
-
-# Fix Logging
-# Due to the new systemd security permissions placed when running jetty.
-# The log file directory at /var/log/jetty9 is reset to jetty:jetty
-# at every program start. This causes syslog to fail to add the
-# rsyslog filtered output to this folder. We will move this up a
-# directory to /var/log/ since solr-jetty is quite noisy.
-
-# Remove package config file since it points to a folder that
-# it does not have permissions to, and is also too far down the
-# /etc/rsyslog.d/ order to work anyway.
-rm -f /etc/rsyslog.d/jetty9.conf
-
-# Create new rsyslog config for jetty9 for its new location
-cat > /etc/rsyslog.d/10-jetty9.conf < /etc/rsyslog.d/10-solr.conf < /etc/logrotate.d/jetty9 < /etc/logrotate.d/solr < /etc/logrotate.d/jetty9 <