---
# System prepended metadata

title: 'Searx : install sur serveur dédié Debian 10 [Projet tuteuré]'

---

# Searx : install sur serveur dédié Debian 10 [Projet tuteuré]

Sur la VM : 
`sudo hostnamectl set-hostname searx.ox2.fr`
Edit hosts file :
vi /etc/hosts
    127.0.0.1 searx.ox2.fr searx
`hostnamectl status`

`sudo apt-get update`
`sudo apt-get dist-uprade`
`sudo apt-get install git`

## 0. Serveur http Apache
On installe un serveur httpd Apache et les modules nécessaires :
Install httpd Apache server :
`sudo -H apt-get install apache2`
`sudo -H a2enmod headers`
`sudo -H a2enmod proxy`
`sudo -H a2enmod proxy_http`

## 1. Installation de searx
1. Cloner le dépôt de Searx dans le dossier de son choix`git clone https://github.com/searx/searx searx`
2. `cd searx`
3. Lancer le script pour installer Searx en mode admin (pré-requis : avoir le paquet curl installé)(source: https://searx.github.io/searx/admin/installation.html#installation-scripts):
`sudo -H ./utils/searx.sh install all`

 Ce script permet de réaliser en 1 ligne de commande l'ensemble des opérations suivantes : https://searx.github.io/searx/admin/installation-searx.html#installation-basic


4. `sudo -H ./utils/searx.sh activate service`

> Renvoie le message d'erreur : `Err: Unit searx.service could not be found.`

![](https://i.imgur.com/Ev5PMUP.png)



> 1er bug dans la procédure d'install (à faire remonter sur le dépôt officiel)

![](https://i.imgur.com/p1RsU0p.png)

> Résolution : 
> On ne trouve par le fichier `searx.service` dans `/usr/lib/systemd/system/`. Suite : travail sur uwsgi




## 2. Uwsgi

https://searx.github.io/searx/admin/installation-uwsgi.html#alltogether
1. `cd /etc/uwsgi/apps-available`
2. `ls` 
On observe alors que le fichier `searx.ini` est bien créé

On choisit le mode Emperor car il permet de lancer plusieurs services applicatifs à la fois sur un même serveur http (et pas un seul):
https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html

![](https://i.imgur.com/oQazlqs.png)

3. En faisant `netstat -l` pour voir tous les services qui tournent à un instant t:
On observe que le `searx.ini` tourne sur un socket dédié : `/run/uwsgi/app/searx/socket`


4. On installe le module qui permet de lier le proxy d'apache2 à uwsgi : `sudo -H apt-get install libapache2-mod-proxy-uwsgi`

5. On crée le fichier `/etc/apache2/sites-available/searx.conf` : 

```
LoadModule headers_module /usr/lib/apache2/mod_headers.so
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_uwsgi_module /usr/lib/apache2/modules/mod_proxy_uwsgi.so

ServerName searx-adsillh.melisse.org

# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

<Location />

    Require all granted
    Order deny,allow
    Deny from all
    # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
    Allow from all

    ProxyPreserveHost On
    ProxyPass unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/

</Location>

```

6. Activation searx.conf : `sudo a2ensite searx.conf`
7. Désactivation site par défaut :`sudo a2dissite 000-default.conf`


> Alors Searx fonctionne sur searx-adsillh.melisse.org que si on a une adresse ipv6 sur son client ? Et encore : ne fonctionne pas depuis le VPS ovh de Cyril. Pourquoi?  (question pour Simon et Antonin) 
> curl http://searx-adsillh.melisse.org
curl: (7) Couldn't connect to server


## 3. Filtron

8. Créer le fichier `/etc/systemd/system/filtron.service`

```
[Unit]

Description=filtron
After=syslog.target
After=network.target

[Service]

Type=simple
User=filtron
Group=filtron
WorkingDirectory=/usr/local/filtron
ExecStart=/usr/local/filtron/go-apps/bin/filtron -api '127.0.0.1:4005' -listen '127.0.0.1:4004' -rules '/etc/filtron/rules.json' -target '127.0.0.1:8888'

Restart=always
Environment=USER=filtron HOME=/usr/local/filtron

# Some distributions may not support these hardening directives.  If you cannot
# start the service due to an unknown option, comment out the ones not supported
# by your version of systemd.

ProtectSystem=full
PrivateDevices=yes
PrivateTmp=yes
NoNewPrivileges=true

[Install]

WantedBy=multi-user.target
```

9. Activer le service filtron : `sudo systemctl enable filtron.service`
10. Démoniser le service filtron pour qu'il tourne en permanence :  `sudo systemctl start filtron.service`

11. Modifier le `/etc/apache2/sites-available/searx.conf` , puis le réactiver.

Une autre possibilité est de lancer le script d'installation avec filtron dès l'étape 2.1 : 
![](https://i.imgur.com/bqMynRa.png)

`cd <chemin-searx>/searx/`
`sudo -H ./utils/filtron.sh install all`

Cela fait toutes les installations nécessaires (apache, uwsgi) et crée directement le fichier `searx.conf` avec la configuration de filtron incluse.



```
# -*- coding: utf-8; mode: apache -*-

LoadModule headers_module       /usr/lib/apache2/modules/mod_headers.so
LoadModule proxy_module         /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module    /usr/lib/apache2/modules/mod_proxy_http.so
#LoadModule setenvif_module      /usr/lib/apache2/modules/mod_setenvif.so

# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog

# SecRuleRemoveById 981054
# SecRuleRemoveById 981059
# SecRuleRemoveById 981060
# SecRuleRemoveById 950907

<Location / >

    <IfModule mod_security2.c>
        SecRuleEngine Off
    </IfModule>

    Require all granted

    Order deny,allow
    Deny from all
    #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
    Allow from all

    ProxyPreserveHost On
    ProxyPass http://127.0.0.1:4004
    RequestHeader set X-Script-Name /searx

</Location>

```

13. Pour servir Searx, supprimer ou déplacer le **index.html** situé dans **/var/www/** vers lequel le serveur Apache pointe par défaut ( `mv /var/www/index.html /var/www/index.html.bak` )
    - Ainsi, dans le **searx.conf**, on peut remplacer `<Location /searx>` par `<Location />` pour avoir l'app servie sur `http://<servername>/` au lieu de `http://</servername>/searx` comme le propose [la doc de Searx officiel](https://searx.github.io/searx/admin/installation-apache.html#apache-reverse-proxy). 

14. Redémarrer le serveur apache pour que totues ces modifications soient prises en compte : `sudo systemctl restart apache2.service`




## 4. Https

1. Installation de Certbot (déployer des certificats Letsencrypt facilement. Développé par l'EFF : certbot.eff.org) : `sudo apt install python3-certbot-apache`
(Répondre à la question : accepter ou non de partager son adresse email avec l' EFF pour recevoir leur newsletter)

2.  Arrêter le service Apache qui empêche Certbot d'écouter sur le port 80 :
`sudo systemctl stop apache2.service`

3. Faire générer les certificats par Certbot
`sudo certbot certonly --standalone`

![](https://i.imgur.com/PPMgbaL.png)

Les certificats sont générés dans `/etc/letsencrypt/live/searx-adsillh.melisse.org` :

```
$ tree /etc/letsencrypt/live/searx-adsillh.melisse.org
/etc/letsencrypt/live/searx-adsillh.melisse.org
├── cert.pem -> ../../archive/searx-adsillh.melisse.org/cert1.pem
├── chain.pem -> ../../archive/searx-adsillh.melisse.org/chain1.pem
├── fullchain.pem -> ../../archive/searx-adsillh.melisse.org/fullchain1.pem
├── privkey.pem -> ../../archive/searx-adsillh.melisse.org/privkey1.pem
└── README
```

4. Relancer le service Apache : `sudo systemctl start apache2.service`

5. Modification du fichier de conf : `/etc/apache2/sites-available/searx.conf`
NB : On lui demande de faire une redirection inconditionnelle (RewriteEngine on .....) de http vers https.

![](https://i.imgur.com/CxdEe6I.png)



6. Activer les modules rewrite et ssl dans apache : `sudo a2enmode rewrite`  et `sudo a2enmode ssl` .

7. `systemctl status apache2` pour vérifier si le service apache tourne bien.
8. On redémarra le service Apache : `sudo systemctl restart apache2`

9. On regarde si tous les flux passent bien en https sur la console dans le navigateur à l'adresse `searx-adsillh.melisse.org` : 
![](https://i.imgur.com/0BNX8hW.png)

## 5. morty (problématique)

> Faire une PR sur le dépôt officiel de Morty.

- Dans **/etc/apache2/searx.conf**, on ajoute les lignes suivantes:

- Dans **/lib/systemd/system/morty.service**, modifier la variable ExecStart
`ExecStart=/usr/local/morty/go/bin/morty`

- Pour dé-tar-er l'archive go , enlever le dossier go en fin de path, car il se génère automatiquement (PR à proposer) : ` tar -C /usr/local/morty/local/ -xzf "go1.13.5.linux-amd64.tar.gz"`

- Fichier de conf Apache searx.conf avec Morty

```
# -*- coding: utf-8; mode: apache -*-

LoadModule headers_module       /usr/lib/apache2/modules/mod_headers.so
LoadModule proxy_module         /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module    /usr/lib/apache2/modules/mod_proxy_http.so
#LoadModule setenvif_module      /usr/lib/apache2/modules/mod_setenvif.so

# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog

# SecRuleRemoveById 981054
# SecRuleRemoveById 981059
# SecRuleRemoveById 981060
# SecRuleRemoveById 950907
<VirtualHost *:80>
ServerName searx.ox2.fr
<Location />
    Options FollowSymLinks Indexes
    SetHandler uwsgi-handler
    uWSGISocket /run/uwsgi/app/searx/socket
</Location>
<Location /morty >

    # SetEnvIf Request_URI "/morty" dontlog
    # CustomLog /dev/null combined env=dontlog

    Require all granted

    Order deny,allow
    Deny from all
    #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
    Allow from all

    ProxyPass http://127.0.0.1:3000
    RequestHeader set X-Script-Name /morty

</Location>
</VirtualHost>
```



## 6. Prochaines étapes :

* a. tous les flux ne passent pas, on ne sait pas pourquoi. à creuser
* b. après quelques bidouilles sur le searx.conf d'apache, l'app n'est plus servie. On ne sait plus pourquoi
* c. lorsque l'app a été servie (avant qu'on travaille sur servir l'app en https), elle n'était accessible que depuis la machine de Cyril, pas la mienne. Quelque chose à voir avec l'histoire d'IPv6?
* d. on veut retenter une installation complète de 0, mais en utilisant directement le script filtron qui semble condenser toutes ces étapes en 1 ligne de commande et quelques questions. Est-ce qu'on désinstalle tout et qu'on recommence de 0, ou bien est-ce qu'on tente sur une nouvelle VM? à voir