SearXNG où comment avoir son propre metamoteur souverain, sans résultats pollués par l’IA

l’Almanet doLys Gnu/Linux – Open Source – Entreprises Forums L’almanet doLys Open Source SearXNG où comment avoir son propre metamoteur souverain, sans résultats pollués par l’IA

Mots-clés : 

  • This topic is empty.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Articles
  • #12536
    nam1962nam1962
    Keymaster

      SearXNG, c’est le retour à une vraie recherche web : des résultats nombreux et exploitables, sans extrait IA imposé, sans profilage publicitaire, sans annonces sponsorisées ni mise en avant commerciale.

      Déployé sous Docker : outil isolé, mise à jour simple, portable sur serveur si besoin.

      Ce tutoriel explique comment installer SearXNG avec Docker sur Linux, avec Valkey comme cache et un settings.yml court basé sur use_default_settings.

      Les moteurs de recherche limitent de plus en plus les requêtes automatisées : CAPTCHA, erreur 403, 429 ou changement brutal de leur page de résultats. Une petite sélection de moteurs devient vite fragile. La configuration ci-dessous en utilise donc plusieurs en parallèle, avec des index différents et des moteurs spécialisés selon le type de recherche.

      Attention : c’est précis et un peu fastidieux : plus pour curieux motivé ou avancé que pour quelqu’un qui veut du clef en main. Dans ce cas, utilisez une instance publique sur searx.space.

      Résultat attendu

      À la fin, vous avez une instance SearXNG locale accessible sur localhost:8888, avec Docker, Valkey, une configuration maintenable, une bonne profondeur de résultats et plusieurs moteurs capables de prendre le relais lorsqu’un autre ne répond plus.

      Au programme :

      • installation de Docker sur Debian/Ubuntu et Arch ;
      • déploiement de SearXNG avec Docker Compose ;
      • configuration de Valkey comme cache ;
      • création d’un settings.yml maintenable avec use_default_settings ;
      • moteurs généralistes et index indépendants ;
      • recherche d’images, vidéos, actualités, code et publications scientifiques ;
      • Marginalia et WolframAlpha avec leurs API ;
      • tests, statistiques et mise à jour.

      Installer Docker

      Debian et dérivées :

      sudo apt update
      sudo apt install ca-certificates curl gnupg
      sudo install -m 0755 -d /etc/apt/keyrings
      curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      sudo chmod a+r /etc/apt/keyrings/docker.gpg
      
      echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
        https://download.docker.com/linux/debian \
        $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      
      sudo apt update
      sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

      Pour Ubuntu, utiliser le dépôt Docker Ubuntu à la place du dépôt Debian.

      Arch, EndeavourOS, Manjaro et dérivées :

      sudo pacman -S docker docker-compose

      Dans les deux cas, activer Docker et rejoindre le groupe :

      sudo systemctl enable --now docker
      sudo usermod -a -G docker $USER
      newgrp docker

      Le newgrp prend effet immédiatement sans déconnexion. Pour que ce soit permanent dans toutes les sessions, se reconnecter ou redémarrer.

      Philosophie de l’installation

      J’organise mes services Docker dans ~/docker, avec un sous-dossier par service.

      Chaque service est autonome : son Compose, sa configuration et ses données. On peut tout arrêter, sauvegarder ou migrer service par service.

      ~/docker/
      ├── searxng/
      │   ├── docker-compose.yml
      │   └── config/
      │       └── settings.yml
      │
      ├── pihole/
      │   ├── docker-compose.yml
      │   └── config/
      │
      └── dnscrypt-proxy/
          ├── docker-compose.yml
          └── config/

      Pourquoi Valkey au lieu de Redis

      SearXNG utilise une base rapide pour certaines fonctions qui nécessitent un état partagé.

      Redis a changé de licence en 2024. Valkey est son fork communautaire compatible, maintenu sous gouvernance de la Linux Foundation.

      Installer SearXNG avec Docker Compose

      Créer l’arborescence :

      mkdir -p ~/docker/searxng/config
      cd ~/docker/searxng

      Créer docker-compose.yml :

      cat << 'EOF' > docker-compose.yml
      services:
        searxng:
          image: searxng/searxng:latest
          container_name: searxng
          ports:
            - "127.0.0.1:8888:8080"
          volumes:
            - "./config:/etc/searxng"
            - searxng_data:/var/cache/searxng
          environment:
            - SEARXNG_BASE_URL=http://localhost:8888/
            - SEARXNG_INSTANCE_NAME=doLys
            - SEARXNG_VALKEY_URL=valkey://valkey:6379/0
          restart: unless-stopped
          cap_drop:
            - ALL
          cap_add:
            - CHOWN
            - SETGID
            - SETUID
          deploy:
            resources:
              limits:
                cpus: '1.5'
                memory: 2G
              reservations:
                cpus: '0.5'
                memory: 1G
      
        valkey:
          image: valkey/valkey:9-alpine
          command: valkey-server --save 30 1 --loglevel warning
          restart: unless-stopped
          healthcheck:
            test: ["CMD", "valkey-cli", "ping"]
            interval: 30s
            timeout: 5s
            retries: 3
          volumes:
            - valkey_data:/data
      
      volumes:
        searxng_data:
        valkey_data:
      
      networks:
        default:
          name: searxng_network
      EOF

      Le port 8888 est publié uniquement sur 127.0.0.1 : SearXNG n’est donc pas accessible depuis les autres machines du réseau.

      Le volume searxng_data conserve le cache de SearXNG et valkey_data les données de Valkey.

      Les blocs deploy.resources limitent la consommation CPU et RAM. À adapter selon votre matériel.

      Valkey peut signaler au démarrage que vm.overcommit_memory n’est pas activé. Le réglage s’applique une seule fois :

      echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf
      sudo sysctl vm.overcommit_memory=1

      Clés API

      Deux moteurs de cette configuration utilisent une clé.

      Marginalia possède son propre index et fait notamment remonter des blogs, sites personnels et petits sites peu visibles dans les gros moteurs.

      Une clé personnelle non commerciale peut être demandée gratuitement à :

      contact@marginalia-search.com

      Indiquez simplement qu’il s’agit d’une instance SearXNG personnelle.

      WolframAlpha sert au calcul et aux données structurées : mathématiques, physique, conversions, constantes, etc.

      Créer un compte sur developer.wolframalpha.com, puis créer un App ID.

      Dans le fichier ci-dessous, les vraies clés remplaceront :

      VOTRE_CLE_MARGINALIA
      VOTRE_CLE_WOLFRAMALPHA

      Ne publiez ensuite jamais votre settings.yml avec ces valeurs réelles.

      Quels moteurs utiliser

      SearXNG interroge plusieurs moteurs puis fusionne leurs réponses.

      Tous les moteurs web généralistes partent ici avec un poids de 1.0. Un poids supérieur influence le classement mais ne rend pas un moteur plus fiable et ne contourne ni CAPTCHA ni limitation de requêtes.

      Recherche générale

      Google CSE, Bing, Brave, Mojeek, Yandex, Yep, Seznam et Naver apportent les gros index et classements généralistes.

      Marginalia, Mwmbl, Wiby et SearchMySite permettent de retrouver davantage de petits sites, blogs et pages indépendantes.

      PrivacyWall, ResultHunter, SearchToday, Vuhuv et YaCy complètent les résultats tant qu’ils répondent correctement.

      Qwant reste chargé comme dépendance technique de ses moteurs Vidéos et Actualités, mais n’est pas activé dans la recherche générale.

      Wikipedia n’est pas utilisé comme moteur. Une page Wikipedia peut naturellement apparaître si Google, Bing ou un autre moteur la considère pertinente.

      Images

      Bing Images, Google CSE Images, PrivacyWall Images, Yandex Images, Mojeek Images, Naver Images, ResultHunter Images, Brave Images, Openverse, Wikimedia Commons et Flickr.

      Vidéos

      Bing Videos, Qwant Videos, PrivacyWall Videos, Naver Videos, Vuhuv Videos, Wikimedia Commons Videos, YouTube, Dailymotion, Brave Videos, PeerTube et SepiaSearch.

      Actualités

      Bing News, Qwant News, Mojeek News, Naver News, Brave News, Reuters et Wikinews.

      IT / Linux / code

      Arch Linux Wiki, GitHub, GitLab, Codeberg, Sourcehut, StackOverflow, AskUbuntu, SuperUser, Docker Hub, PyPI, npm, MDN, Mankier et discuss.python.

      Science

      arXiv, Crossref, PubMed, Semantic Scholar, OpenAIRE Publications, OpenAIRE Datasets et OpenAlex.

      Cartographie, météo et outils

      OpenStreetMap et Photon pour la cartographie, OpenMeteo et wttr.in pour la météo, Currency pour les conversions et WolframAlpha pour les calculs et données structurées.

      Créer un settings.yml court avec use_default_settings

      use_default_settings permet de conserver les définitions internes de SearXNG au lieu de les recopier dans votre fichier.

      Avec keep_only, seuls les moteurs choisis sont chargés. Le bloc engines: sert à activer ceux qui sont désactivés par défaut, fournir les clés API ou modifier un réglage particulier.

      Créer settings.yml :

      cat > ~/docker/searxng/config/settings.yml << 'EOF'
      use_default_settings:
        engines:
          keep_only:
      
            # Généralistes et index concurrents
            - "google cse"
            - bing
            - brave
      
            # Qwant reste chargé pour qwant videos / qwant news
            # mais n'est pas activé en recherche générale.
            - qwant
      
            - mojeek
            - yandex
            - yep
            - seznam
            - naver
            - marginalia
            - mwmbl
            - wiby
            - searchmysite
            - privacywall
            - resulthunter
            - searchtoday
            - vuhuv
            - yacy
      
            # Images
            - "bing images"
            - "google cse images"
            - "privacywall images"
            - "yandex images"
            - "mojeek images"
            - "naver images"
            - "resulthunter images"
            - brave.images
            - openverse
            - wikicommons.images
            - flickr
      
            # Vidéos
            - "bing videos"
            - "qwant videos"
            - "privacywall videos"
            - "naver videos"
            - "vuhuv videos"
            - wikicommons.videos
            - youtube
            - dailymotion
            - brave.videos
            - peertube
            - sepiasearch
      
            # Actualités
            - "bing news"
            - "qwant news"
            - "mojeek news"
            - "naver news"
            - brave.news
            - reuters
            - wikinews
      
            # Technique / développement
            - "arch linux wiki"
            - github
            - gitlab
            - codeberg
            - sourcehut
            - stackoverflow
            - askubuntu
            - superuser
            - "docker hub"
            - pypi
            - npm
            - mdn
            - mankier
            - discuss.python
      
            # Science
            - arxiv
            - crossref
            - pubmed
            - "semantic scholar"
            - openairepublications
            - openairedatasets
            - openalex
      
            # Cartographie / météo / outils
            - openstreetmap
            - photon
            - openmeteo
            - wttr.in
            - currency
            - wolframalpha
      
      plugins:
        searx.plugins.calculator.SXNGPlugin:
          active: true
        searx.plugins.hash_plugin.SXNGPlugin:
          active: true
        searx.plugins.tracker_url_remover.SXNGPlugin:
          active: true
        searx.plugins.unit_converter.SXNGPlugin:
          active: true
        searx.plugins.oa_doi_rewrite.SXNGPlugin:
          active: true
        searx.plugins.self_info.SXNGPlugin:
          active: false
      
      general:
        debug: false
        instance_name: "doLys"
        privacypolicy_url: false
        donation_url: false
        contact_url: false
        enable_metrics: true
      
      search:
        safe_search: 0
        autocomplete: ""
        autocomplete_min: 4
        default_lang: "all"
        ban_time_on_fail: 5
        max_ban_time_on_fail: 120
        formats:
          - html
      
      server:
        port: 8888
        bind_address: "127.0.0.1"
        base_url: http://localhost:8888/
        limiter: false
        public_instance: false
        secret_key: "REMPLACER_PAR_OPENSSL_RAND_HEX_32"
        image_proxy: true
        http_protocol_version: "1.0"
        method: "POST"
        default_http_headers:
          X-Content-Type-Options: nosniff
          X-Download-Options: noopen
          X-Robots-Tag: noindex, nofollow
          Referrer-Policy: no-referrer
      
      valkey:
        url: valkey://valkey:6379/0
      
      ui:
        static_path: ""
        templates_path: ""
        query_in_title: false
        default_theme: simple
        center_alignment: false
        default_locale: "fr"
        theme_args:
          simple_style: auto
        search_on_category_select: true
        hotkeys: default
      
      outgoing:
        request_timeout: 5.0
        max_request_timeout: 12.0
        useragent_suffix: ""
        pool_connections: 100
        pool_maxsize: 20
        enable_http2: true
      
      categories_as_tabs:
        general:
        images:
        videos:
        news:
        map:
        music:
        it:
        science:
      
      engines:
      
        # Généralistes : même poids
        - name: "google cse"
          disabled: false
          weight: 1.0
      
        - name: bing
          disabled: false
          weight: 1.0
      
        - name: brave
          disabled: false
          weight: 1.0
      
        - name: mojeek
          disabled: false
          weight: 1.0
      
        - name: yandex
          disabled: false
          weight: 1.0
      
        - name: yep
          disabled: false
          weight: 1.0
      
        - name: seznam
          disabled: false
          weight: 1.0
      
        - name: naver
          disabled: false
          weight: 1.0
      
        - name: mwmbl
          disabled: false
          weight: 1.0
      
        - name: wiby
          disabled: false
          weight: 1.0
      
        - name: searchmysite
          disabled: false
          weight: 1.0
      
        - name: privacywall
          disabled: false
          weight: 1.0
      
        - name: resulthunter
          disabled: false
          weight: 1.0
      
        - name: searchtoday
          disabled: false
          weight: 1.0
      
        - name: vuhuv
          disabled: false
          weight: 1.0
      
        - name: yacy
          disabled: false
          weight: 1.0
      
        # Marginalia
        - name: marginalia
          api_key: "VOTRE_CLE_MARGINALIA"
          filter_name: ""
          disabled: false
          inactive: false
          weight: 1.0
      
        # WolframAlpha
        - name: wolframalpha
          engine: wolframalpha_api
          api_key: "VOTRE_CLE_WOLFRAMALPHA"
          disabled: false
          inactive: false
      
        # Science
        - name: crossref
          disabled: false
          timeout: 30.0
      
        - name: openalex
          disabled: false
      
        - name: arxiv
          disabled: false
      
        - name: pubmed
          disabled: false
      
        - name: "semantic scholar"
          disabled: false
      
        - name: openairepublications
          disabled: false
      
        - name: openairedatasets
          disabled: false
      
        # Images
        - name: "privacywall images"
          disabled: false
      
        - name: "yandex images"
          disabled: false
      
        - name: "mojeek images"
          disabled: false
      
        - name: "naver images"
          disabled: false
      
        - name: "resulthunter images"
          disabled: false
      
        - name: openverse
          disabled: false
      
        # Vidéos
        - name: "qwant videos"
          disabled: false
      
        - name: "privacywall videos"
          disabled: false
      
        - name: "naver videos"
          disabled: false
      
        - name: "vuhuv videos"
          disabled: false
      
        - name: peertube
          disabled: false
      
        - name: youtube
          disabled: false
      
        - name: sepiasearch
          disabled: false
      
        # Actualités
        - name: "qwant news"
          disabled: false
      
        - name: "mojeek news"
          disabled: false
      
        - name: "naver news"
          disabled: false
      
        - name: wikinews
          disabled: false
      
        # IT / Linux / code
        - name: codeberg
          disabled: false
      
        - name: gitlab
          disabled: false
      
        - name: sourcehut
          disabled: false
      
        - name: discuss.python
          disabled: false
      
        - name: stackoverflow
          disabled: false
      
        - name: askubuntu
          disabled: false
      
        - name: superuser
          disabled: false
      
        - name: github
          disabled: false
      
        - name: npm
          disabled: false
      
        - name: pypi
          disabled: false
      
        - name: mdn
          disabled: false
      
        - name: mankier
          disabled: false
      
        - name: "docker hub"
          disabled: false
      
        - name: "arch linux wiki"
          disabled: false
      
        # Cartographie / météo / outils
        - name: openstreetmap
          disabled: false
      
        - name: photon
          disabled: false
      
        - name: openmeteo
          disabled: false
      
        - name: wttr.in
          disabled: false
      
        - name: currency
          disabled: false
      EOF

      Le filter_name: "" de Marginalia doit rester vide.

      La configuration ne surcharge volontairement pas suspended_times. SearXNG utilise ainsi les valeurs prévues par la version installée et profite de leurs évolutions lors des mises à jour.

      Pour créer la clé secrète :

      openssl rand -hex 32

      Copier le résultat à la place de :

      REMPLACER_PAR_OPENSSL_RAND_HEX_32

      Puis remplacer également :

      VOTRE_CLE_MARGINALIA
      VOTRE_CLE_WOLFRAMALPHA

      Démarrer SearXNG

      cd ~/docker/searxng
      docker compose up -d
      
      sleep 5
      
      docker compose ps
      docker logs --tail=150 searxng

      SearXNG doit être accessible sur :

      http://localhost:8888

      Docker doit afficher une publication de port de cette forme :

      127.0.0.1:8888->8080/tcp

      Valkey peut rester quelques secondes en health: starting avant de passer à healthy.

      Tester les résultats

      La langue de recherche est réglée par défaut sur all.

      C’est préférable pour les recherches techniques, scientifiques ou portant sur des noms propres : un terme comme CachyOS ne doit pas limiter les résultats aux seules pages françaises.

      Quelques recherches permettent déjà de vérifier le comportement :

      CachyOS
      notaire rouvez
      docker compose searxng

      Tester aussi les pages 2 et 3.

      SearXNG permet d’isoler un moteur avec son raccourci :

      !mar CachyOS
      !goc CachyOS
      !br CachyOS
      !mjk CachyOS

      Les deux pages suivantes sont très utiles :

      http://localhost:8888/stats
      http://localhost:8888/stats/errors

      La première montre notamment les temps de réponse.

      La seconde signale les CAPTCHA, erreurs HTTP, timeouts et erreurs d’analyse rencontrés par les moteurs.

      Quelques erreurs ponctuelles sont normales. Les moteurs web modifient leurs protections et leur HTML sans prévenir ; l’intérêt de SearXNG est justement de ne pas dépendre d’un seul d’entre eux.

      Pas d’extrait IA imposé

      SearXNG n’ajoute pas de résumé génératif au-dessus de vos résultats.

      Les pages restent des pages de recherche : titre, URL, extrait, provenance des moteurs et résultats suivants.

      Cette configuration n’active pas Wikipedia comme moteur dédié. Wikipedia peut néanmoins apparaître comme résultat normal lorsqu’un moteur le renvoie.

      SearXNG n’ajoute pas non plus de bloc publicitaire ou de résultat sponsorisé à l’interface. Un site commercial peut évidemment apparaître lorsqu’il correspond réellement à la requête.

      Définir SearXNG comme moteur de recherche

      Dans Firefox, ouvrir l’instance SearXNG puis l’ajouter aux moteurs disponibles depuis les paramètres de recherche du navigateur.

      Vous pouvez ensuite le définir comme moteur par défaut pour que les recherches saisies dans la barre d’adresse passent directement par votre instance.

      Mettre à jour SearXNG

      Télécharger une nouvelle image Docker ne suffit pas : le conteneur en cours continue à utiliser l’ancienne tant qu’il n’est pas recréé.

      Utiliser :

      cd ~/docker/searxng
      
      docker compose pull
      docker compose up -d --force-recreate
      
      docker compose ps
      docker logs --tail=100 searxng

      Pour vérifier que le conteneur utilise bien l’image latest locale :

      RUNNING=$(docker inspect -f '{{.Image}}' searxng)
      LOCAL=$(docker image inspect searxng/searxng:latest -f '{{.Id}}')
      
      echo "Image utilisée : $RUNNING"
      echo "Image latest   : $LOCAL"
      
      [ "$RUNNING" = "$LOCAL" ] \
        && echo "OK : conteneur à jour" \
        || echo "Le conteneur utilise encore une ancienne image"

      Remplacer le logo

      Créer searxng-custom.png et searxng-custom.svg dans ~/docker/searxng, puis :

      CONTAINER=$(docker ps --filter 'name=searxng' --format '{{.ID}}')
      DEST=/usr/local/searxng/searx/static/themes/simple/img/
      
      docker cp ./searxng-custom.png $CONTAINER:${DEST}searxng.png
      docker cp ./searxng-custom.svg $CONTAINER:${DEST}searxng.svg
      
      docker compose restart searxng

      Le logo placé directement dans le conteneur est écrasé lors de sa recréation.

      Script de mise à jour avec recopie automatique, à placer dans ~/docker/searxng/searxng-maj.sh :

      #!/usr/bin/env python3
      import subprocess
      import os
      
      os.chdir(os.path.expanduser("~/docker/searxng"))
      
      def run(cmd, check=True):
          result = subprocess.run(
              cmd,
              shell=True,
              capture_output=True,
              text=True
          )
          if check and result.returncode != 0:
              print(f"Erreur : {cmd}\n{result.stderr}")
              raise SystemExit(1)
          return result
      
      run("docker compose pull")
      run("docker compose up -d --force-recreate")
      
      result = run(
          "docker ps --filter 'name=searxng' --format '{{.ID}}'",
          check=False
      )
      
      container_id = result.stdout.strip().split("\n")[0]
      
      if container_id:
          dest = "/usr/local/searxng/searx/static/themes/simple/img/"
          run(
              f"docker cp ./searxng-custom.png "
              f"{container_id}:{dest}searxng.png"
          )
          run(
              f"docker cp ./searxng-custom.svg "
              f"{container_id}:{dest}searxng.svg"
          )
          run("docker compose restart searxng")
      else:
          print("Conteneur SearXNG non trouvé.")
      chmod +x searxng-maj.sh
      ./searxng-maj.sh

      En amont, j’utilise Pi-hole pour le DNS et le filtrage des publicités :

      tuto Pi-hole + Unbound

      Pour aller plus loin sur les moteurs disposant de leurs propres index :

      https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/

      Carte des relations entre moteurs :

      https://www.searchenginemap.com/

      Questions fréquentes

      SearXNG remplace-t-il Google ?

      SearXNG interroge ici Google CSE avec de nombreux autres moteurs puis fusionne leurs résultats. Google devient l’une des sources de la recherche.

      SearXNG génère-t-il des réponses avec une IA ?

      Cette configuration n’utilise aucun moteur génératif pour résumer les résultats. SearXNG affiche les résultats transmis par les moteurs interrogés et ses propres réponses fonctionnelles, par exemple pour les conversions ou le calcul.

      SearXNG rend-il les recherches anonymes ?

      Le moteur interrogé reçoit la requête depuis l’instance SearXNG sans recevoir directement les cookies de votre navigateur ni son contexte habituel de navigation.

      Il voit toutefois l’adresse IP de sortie de l’instance. Un moteur utilisé avec une clé API peut également associer les requêtes à cette clé.

      Pourquoi désactiver l’autocomplétion ?

      L’autocomplétion génère des requêtes supplémentaires pendant la frappe. Sur une instance personnelle, cela augmente inutilement le trafic vers les moteurs et peut accélérer leurs limitations.

      Pourquoi la langue par défaut est-elle « all » ?

      Les recherches techniques, scientifiques et les noms propres donnent souvent de meilleurs résultats sans filtre linguistique systématique.

      L’interface reste en français et la langue peut toujours être choisie ponctuellement.

      Faut-il un nom de domaine et HTTPS ?

      Non pour un usage local.

      Avec :

      127.0.0.1:8888:8080

      Docker publie SearXNG uniquement sur la machine locale.

      Pour exposer l’instance sur Internet, utilisez un reverse proxy comme Caddy ou Nginx Proxy Manager, activez HTTPS et adaptez les mécanismes de limitation à une instance publique.

      Comment accéder depuis plusieurs machines du réseau local ?

      Dans docker-compose.yml, remplacer :

      - "127.0.0.1:8888:8080"

      par :

      - "8888:8080"

      Puis recréer le conteneur :

      docker compose up -d --force-recreate

      L’instance devient accessible via :

      http://IP_DU_SERVEUR:8888

      Vérifiez le pare-feu de la machine avant d’ouvrir le port à d’autres appareils.

      Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc

    Affichage de 1 message (sur 1 au total)
    • Vous devez être connecté pour répondre à ce sujet.