Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

SearXNG

De Le Wiki de Lug

Prérequis

  • si Alpine LXC : avec Nesting et keyctl activé (Docker).
  • CPU :
    • minimum : 1 vCPU
    • recommandé : 2 vCPU (meilleure gestion des requêtes simultanées)
  • RAM :
    • minimum : 512 Mo
    • recommandé : 1 Go
    • confortable : 2 Go si forte utilisation ou nombreux moteurs activés
  • Stockage :
    • minimum : 1–2 Go
    • recommandé : 5 Go (logs + cache)

Installation

On installe docker :

# apk update && apk upgrade
# apk add docker docker-cli-compose curl
# rc-update add docker default
# rc-service docker start

On installe SearXNG :

# mkdir -p /opt/searxng/core-config/
# cd /opt/searxng/
# curl -fsSL \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
# cp -i .env.example .env

On peux éditer le docker-compose :

# vi /opt/searxng/docker-compose.yml

On édite le fichier de l'environnement :

# vi /opt/searxng/.env

Pour une utilisation privé (non accessible depuis Internet) :

...
SEARXNG_VALKEY_URL=valkey://valkey:6379/0

Pour une configuration publique (derrière un reverse-proxy) :

...
SEARXNG_VALKEY_URL=valkey://valkey:6379/0
SEARXNG_HOST=0.0.0.0
SEARXNG_PORT=8080
SEARXNG_BASE_URL=https://searxng.exemple.net/
SEARXNG_LIMITER=true
SEARXNG_PUBLIC_INSTANCE=true

Et pour la configuration publique uniquement on configure la détection de bots en créant le fichier limiter.toml :

# vi /opt/searxng/core-config/limiter.toml
[botdetection]
trusted_proxies = [
  'IP_REVERSEPROXY/32',
]

[botdetection.ip_limit]
filter_link_local = true
link_token = true

On lance SearXNG :

# docker compose up -d

Vérification :

# docker ps

vhost reverse proxy nginx

server {
    listen 80;
    listen [::]:80;
    server_name searxng.exemple.net;
    return 301 https://$host$request_uri;
}

server {
    server_name searxng.exemple.net;

    # protection
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
    add_header Strict-Transport-Security "max-age=31536000" always;

    location / {
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header X-Forwarded-Port  $server_port;

        proxy_pass http://IP_SEARXNG:8080;
    }

    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/letsencrypt/live/searxng.exemple.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/searxng.exemple.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
}

Configuration

Pour configurer manuellement l'instance (après le premier démarrage), éditer le fichier :

# vi /opt/searxng/core-config/settings.yml

Appliquer les modifications :

# docker restart searxng

Autoriser les requêtes via json pour les IA

# remove format to deny access, use lower case.
  # formats: [html, csv, json, rss]    
  formats:                                         
    - html                                            
    - json
# docker restart searxng

Personnalisation

Logo personnalisé

  • (Optionnel) Copier le logo dans le LXC depuis ProxMox :
proxmox# pct push 100 /chemin/du/ficher/logo_perso.png /opt/searxng-custom.png
  • On passe par un montage dans le conteneur pour ne pas perdre le logo à chaque recréation :
# vi /opt/searxng/docker-compose.yml

Et on ajoute le nouveau volume :

...
volumes:
      - ./core-config/:/etc/searxng/:Z
      - core-data:/var/cache/searxng/
      - /opt/searxng-custom.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png
...

On recréé le conteneur :

# cd /opt/searxng/
# docker compose up -d
  • On installe les dépendances pour les versions compressées :
# apk add brotli gzip
  • On récupère le fichier d'origine dans le conteneur :
# docker exec searxng-core cat /usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css > /opt/sxng-ltr.min.css
  • On remplace les paramètres du logo avec sed :
# sed -i 's|\.index \.title{background:url(\./img/searxng\.png) 50%/contain no-repeat;min-height:4rem;margin:4rem auto}|.index .title{background:url(./img/searxng.png) 50% no-repeat;background-size:600px;min-height:12rem;margin:4rem auto}|' /opt/sxng-ltr.min.css
  • On crée les versions compressées :
# gzip -kf -9 /opt/sxng-ltr.min.css
# brotli -kf -q 11 /opt/sxng-ltr.min.css
  • On passe par un montage dans le conteneur pour ne pas perdre le logo à chaque recréation :
# vi /opt/searxng/docker-compose.yml

Et on ajoute les nouveaux volumes :

...
volumes:
      - ./core-config/:/etc/searxng/:Z
      - core-data:/var/cache/searxng/
      - /opt/searxng-custom.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png
      - /opt/sxng-ltr.min.css:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css
      - /opt/sxng-ltr.min.css.br:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css.br
      - /opt/sxng-ltr.min.css.gz:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css.gz
...
  • On recrée le conteneur :
# cd /opt/searxng/
# docker compose up -d

Open Graph

  • On récupère le fichier :
# docker exec searxng-core cat /usr/local/searxng/searx/templates/simple/base.html > /opt/searxng-base.html
  • On édite le fichier :
# vi /opt/searxng-base.html

On remplace :

...
<meta name="description" content="SearXNG ... a privacy-respecting, open metasearch engine">
<meta name="keywords" content="SearXNG, search, search engine, metasearch, meta search">
...

Par :

...
<meta name="description" content="Mon texte">
<meta name="keywords" content="Mon texte">
<meta property="og:title" content="{{ instance_name }}">
<meta property="og:description" content="Mon moteur de recherche privé">
<meta property="og:image" content="https://searxng.exemple.net/static/themes/simple/img/searxng.png">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ url_for('index', _external=True) }}">
...
  • On passe par un montage dans le conteneur pour ne pas perdre le logo à chaque recréation :
# vi /opt/searxng/docker-compose.yml

Et on ajoute le nouveau volume :

...
volumes:
      - ./core-config/:/etc/searxng/:Z
      - core-data:/var/cache/searxng/
      - /opt/searxng-custom.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png
      - /opt/sxng-ltr.min.css:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css
      - /opt/sxng-ltr.min.css.br:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css.br
      - /opt/sxng-ltr.min.css.gz:/usr/local/searxng/searx/static/themes/simple/sxng-ltr.min.css.gz
      - /opt/searxng-base.html:/usr/local/searxng/searx/templates/simple/base.html
...
  • On recrée le conteneur :
# cd /opt/searxng/
# docker compose up -d