====== Installer Solr ======
Sources :
* [[https://www.howtoforge.com/tutorial/how-to-install-and-configure-solr-on-ubuntu-1604/|Creating a Solr search collection]] (en) (howtoforge.com)
* [[https://lucene.apache.org/solr/guide/6_6/getting-started.html|Apache Solr Reference Guide : Getting Started]] (en) (lucene.apache.org)
* [[https://www.digitalocean.com/community/tutorials/how-to-install-solr-on-ubuntu-14-04|How To Install Solr on Ubuntu 14.04]] the dirty way (en)
===== Cas d'utilisation =====
Le cas d'utilisation décrit est l'installation d'une instance de Solr sur un serveur Debian 7/8 en vue de prototypage((Comprendre : à ne pas suivre pour une mise en production.)).
Plus précisément, on choisit la version de Solr que l'ont installe et on utilise une version packagée intégrant un serveur de servlet. Autrement dit, aucun autre composant serveur ne sera nécessaire. En revanche, la présence d'une version minimale de Java JRE reste un pré-requis.
Bien que le système cible soit équipé de Virtualmin, l'installation de Solr sera indépendante de Virtualmin((Comprendre : //Solr// ne sera pas un serveur virtuel au sens de Virtualmin.)).
===== Récupération de la version =====
Dans notre cas, le choix de version de Solr (5.4.1) est dicté par l'application, basée sur une instance Drupal 7 et interfacée via un module communautaire.
On récupère la version souhaitée de Solr via la [[http://archive.apache.org/dist/lucene/solr/|page d'archivage des versions]].
===== Installation =====
Comme indiqué en introduction, la version de Solr choisie incorpore le serveur de servlet. Il est donc inutile d'installer Java, Tomcat, etc.
==== Principe ====
* télécharger l'archive et la somme de contrôle
* vérifier la somme de contrôle
* décompresser l'archive dans un répertoire de travail
* installer //JRE//, s'il n'est pas déjà présent((La commande : "which java" indiquera si java est disponible.))
* lancer le script d'installation de Solr en tant que service
==== Pré-requis ====
Afin de procéder correctement à une installation correcte :
* le système doit être muni de la commande sudo (sinon //apt-get install sudo//)
* l'installation doit être effectué par une utilisatrice disposant des droits de sudo (et non par //root//)
Dans tous les cas, Solr sera installé et configuré pour être exécuté avec les droits de l'utilisatrice //solr//, automatiquement créée.
==== Actions ====
$ cd /tmp
$ wget http://archive.apache.org/dist/lucene/solr/5.4.1/solr-5.4.1.tgz
$ wget http://archive.apache.org/dist/lucene/solr/5.4.1/solr-5.4.1.tgz.md5
$ md5sum -c solr-5.4.1.tgz.md5
Sachant syntaxe du script d'installation est la suivante :
install_solr_service.sh [OPTIONS]
il est inutile de décompresser toute l'archive. On se contente d'extraire le script d'installation :
$ tar xf solr-5.4.1.tgz solr-5.4.1/bin/install_solr_service.sh --strip-components=2
Installer Java (on a choisi une version légère de //JRE//)
$ sudo apt-get install openjdk-7-jre-headless
puis de lancer l'exécution du script:
$ sudo ./install_solr_service.sh solr-5.4.1.tgz
Voici l'affichage typique produit par le script d'installation se déroulant sans erreur((En cas d'erreur, lire les messages **depuis le début** qui peut être chassé par le mode d'emploi du script, par défilement dans la fenêtre de terminal.)).
id: solr : utilisateur inexistant
Creating new user: solr
Ajout de l'utilisateur système « solr » (UID 117) ...
Ajout du nouveau groupe « solr » (GID 122) ...
Ajout du nouvel utilisateur « solr » (UID 117) avec pour groupe d'appartenance « solr » ...
Création du répertoire personnel « /var/solr »...
Extracting solr-5.4.1.tgz to /opt
Installing symlink /opt/solr -> /opt/solr-5.4.1 ...
Installing /etc/init.d/solr script ...
Installing /etc/default/solr.in.sh ...
● solr.service - LSB: Controls Apache Solr as a Service
Loaded: loaded (/etc/init.d/solr)
Active: active (running) since lun. 2017-07-17 15:35:02 CEST; 5s ago
Process: 9215 ExecStart=/etc/init.d/solr start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/solr.service
└─9264 java -server -Xms512m -Xmx512m -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:TargetSurvivorRat...
juil. 17 15:34:56 server8 su[9217]: Successful su for solr by root
juil. 17 15:34:56 server8 su[9217]: + ??? root:solr
juil. 17 15:34:56 server8 su[9217]: pam_unix(su:session): session opened for user solr by (uid=0)
juil. 17 15:35:02 server8 solr[9215]: [169B blob data]
juil. 17 15:35:02 server8 solr[9215]: Started Solr server on port 8983 (pid=9264). Happy searching!
juil. 17 15:35:02 server8 systemd[1]: Started LSB: Controls Apache Solr as a Service.
juil. 17 15:35:02 server8 solr[9215]: [14B blob data]
Service solr installed.
On constate que l'installation a été suivie de l'activation réussie du service. À tout moment, il est possible de s'informer sur l'état du service Solr :
$ sudo service solr status
On s'assure que l'interface web d'administration est bien accessible. D'abord localement sur depuis le serveur lui-même :
$ lynx http://localhost:8983/
puis, depuis un autre système/ordi, avec un navigateur graphique, en pointant sur l'url :
//http://hostname:8983/ //, où //hostname// est le nom du serveur.
Si tout s'est bien déroulé, on constate que Solr est actif mais qu'il n'existe aucun //Core//.
===== Créer un Core =====
Solr ayant été installé en mode standalone((Et non //SolrCloud//.)), nous allons créer un Core((Et non une //Collection//.)).
Notre objectif étant d'exploiter Solr à travers le module communautaire de Drupal dénommé //Search API Solr Search//, nous allons nous appuyer sur les fichiers de configuration Solr proposés par ce module. Ces fichiers sont contenus dans un répertoire modèle structuré au format attendu par Solr.
Dans l'exemple traité, on crée deux Core Solr : un pour l'application en production, l'autre pour l'application en pré-production.
==== Principe ====
- récupérer le module
- en extraire le répertoire de configuration de Solr correspondant à la version installée
- créer un le core de prodcution à partir de cette configuration
- créer un le core de pré-prodcution à partir de cette même((Logique ! En production et pré-production, il s'agit de la même application, la même interface et les mêmes données.)) configuration.
==== Action ====
$ cd /tmp
$ wget https://ftp.drupal.org/files/projects/search_api_solr-7.x-1.12.tar.gz
$ tar xf search_api_solr-7.x-1.12.tar.gz search_api_solr/solr-conf/5.x --strip-components=2
$ sudo su - solr -c "/opt/solr/bin/solr create -c drupal_prod -d /tmp/5.x -n drupal_prod"
$ sudo su - solr -c "/opt/solr/bin/solr create -c drupal_pre_prod -d /tmp/5.x -n drupal_pre_prod"
Dans l'exemple, le répertoire cible de configuration (-c) et le "nom logique" (-n) qui sera utilisé par Solr sont identiques. C'est un choix, par une obligation ! En revanche, on voit que le répertoire contenant le //modèle// de configuration (-d) utilisé (/tmp/5.x) existe de manière autonome.
Si l'on souhaite supprimer un core existant, on le désigne par le nom du répertoire cible de configuration.
$ sudo su - solr -c "/opt/solr/bin/solr delete -c drupal_pre_prod"
Et pour en savoir plus sur la commande de création de Core, autant demander à la commande elle-même :
$ sudo su - solr -c "/opt/solr/bin/solr create -help"
===== Protection =====
L'interface Web d'administration de Solr ne bénéficie d'aucune protection. Si le serveur ne se trouve derrière un pare-feu correctement configuré, il convient de mettre en place un contrôle d'accès.
À défaut d'inspiration ou de temps pour installer une protection efficace et proportionnée, mettre en place un blocage total depuis internet tout en autorisant l'accès local depuis le serveur:
$ sudo iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 8983 -j DROP
Il pourra être intéressant d'autoriser un poste d'adaministration ou tout un réseau. La première règle donne le motif à utiliser, en remplaçant //localhost// par ce qui convient à votre cas.
Suppression des règles(Pour un mini-mémo sur l'ajout et la suppression de règles : [[https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules|How To List and Delete Iptables Firewall Rules]].)) :
$ sudo iptables -D INPUT -p tcp --dport 8983 -j DROP
$ sudo iptables -D INPUT -p tcp -s localhost --dport 8983 -j ACCEPT