Instalacja oraz zarządzanie metawyszukiwarką SearXNG
SearXNG jest silnikiem wyszukiwania, agregującym wyniki ze wszytkich dostępnych w internecie wyszukiwarek przy czym obdziera je ze różnych elementów śledzących, dlatego jest dobre rozwiązanie dla osób chcących uchronić się przed targetowaniem przez takie firmy jako Google czy Microsoft. SearXNG nie wydaje się być same w sobie wyszukiwarką to tylko agregat (zawierający kilka przydatnych funkcji) - dlatego w tym materiale będę używać bardziej nomenklatury silnik wyszukiwania, a niżeli wyszukiwarka. Do jej skuteczności działania trzeba się przyzwyczaić - to nie Google, który stara się odgadnąć na podstawie naszego profilowania, jakich wyników będziemy od niego oczekiwać. Tutaj mamy raczej doczynienia z prawdziwym wyszukiwaniem, zatem jaką frazę podamy taki wynik otrzymamy. Jeśli ktoś mam doświadczenie w korzystaniu z takich wyszukiwarek jak DuckDuckGo to myślę, że nie będzie mieć problemów wynikami prezentowanymi przez SearXNG. Instalacja instancji SearXNG nie jest trudna, a sam silnik w pewnym stopniu możemy ją dostosować do własnych preferencji. W tym materiale opiszę proces instalacji instancji oraz dostosowywania jej w przypadku, gdzie trzeba ingerować pliki projektu (zmiana ta będzie wyłącznie kosmetyczna i nie wpłynie na jej działanie). Jako serwer hostujący wykorzystamy Debiana 12. Zatem rozpocznijmy instalację.
1. Instalacja
Przed uruchomieniem właściwej instalacji, musimy wykonać jedną bardzo ważną zmianę w naszym systemie. Mianowicie musimy dodać do systemu, repozytoria z backports. Dlaczego? Otóż od pewnego commitu, SearXNG (tak, commitu. SearXNG to rolling-release - nie ma klasycznego wersjonowania, a każda kolejna wersja to każda kolejna zmiana. Będzie to mieć poźniej kluczowe znaczenie.) przestał korzystać z bazy danych Redis i przeszedł na Valkey, który nie jest dostępny w klasycznym repozytorium. To może jednak ulec zmianie, ze względu na to, że jest on obecny w repozytoriach przyszłej wersji stablnej, a na czas pisania tego materiału jeszcze wersji testowej. Jeśli więc mamy zamiar instalować SearXNG już na Debianie 13, możemy pominąć ten krok.
Aby włączyć repozytoria backports, w pliku /etc/apt/sources.list dopisujemy poniższą linię.
deb http://deb.debian.org/debian bookworm-backports main contrib
Następnie musimy odświeżyć listę pakietów oprogramowania APT, za pomocą poniższego polecenia.
$ sudo apt update
SearXNG wykorzystuje do działania WSGI co powoduje, że aplikacja nie działa ciągle oraz nie oczkuje na połączenia. Zapytania do aplikacji są przekazywane do WSGI, a ono uruchamia kod Pythona. Przeglądarki internetowe nie są wstanie obsłużyć WSGI, ponieważ posługują się one ściśle określonym schematem jakim jest protokoł HTTP lub HTTPS. Dlatego też potrzebujemy klasycznego serwera WWW w postaci proxy, który przekaże zapytanie HTTP/S do WSGI a ono uruchomi aplikację SearXNG. Tutaj panuje pełna dowolności, oczywiście o ile ktoś potrafi skonfigurować swój ulubiony serwer WWW do postaci przekaźnika (konfiguracja innych serwerów WWW, znajduje się w dokumentacji admina na stronie projektu). Dla osób początkujących polecam klasycznego Apache w wersji 2 i tutaj też on zostanie wykorzystany. Przy czym poza instalacją pakietów, nie będziemy musieli nic robić. Skrypt instalacyjny SearXNG przygotuje za nas odpowiedni plik hostingu, który nie tylko odpowiednio przekieruje, ale również włączy odpowiednie moduły serwera WWW.
$ sudo apt install apache2 -y
Po instalacji serwera WWW, możemy sklonować ze strony projektu na serwisie github.com pliki projektu. Następnie przechodzimy do pobranego katalogu i wydajeny następujące polecenie:
searxng$ sudo -H ./utils/searxng.sh install all
Po wydaniu tego polecenia instalacja może się nie rozpocząć, a my uzyskamy następującą informację zwrotną od skryptu.
xf0r3m@searx:~/searxng$ sudo -H ./utils/searxng.sh install all /home/xf0r3m/searxng/utils/brand.sh: line 19: python: command not found /home/xf0r3m/searxng/utils/brand.sh: line 20: python: command not found /home/xf0r3m/searxng/utils/brand.sh: line 21: python: command not found ERROR: missing command curl
Pierwszy znich możemy rowiązać poprzez utworzenie dowiązania
symbolicznego o nazwię python
wskazującego na plik /usr/bin/python3 (który również jest
dowiązaniem symbolicznym).
xf0r3m@searx:~/searxng$ sudo ln -s /usr/bin/python3 /usr/bin/python
Drugim problemem jest poprostu brak pakietu
curl
w systemie i należy go doinstalować,
chcąc kontynuować instalację.
xf0r3m@searx:~/searxng$ sudo apt install curl -y.
Po zainstalowaniu pakietu możemy ponowić polecenie odpowiedzialne za uruchomienie instalacji. Poszczególne etapy instalacji są opisane przez skrypt, cały proces jest w dużym stopniu zautomatyzowany, ponieważ mimo pytań o potwierdzenie użytkownika, to na nie nałożony jest czas oczekiwania, jeśli nie podejmiemy decyzji w odpowiednim czasie zostanie ona podjęta za nas. Na wszyskie pytania należy odpowiedzieć twierdząco, chcąc zainstalować poprawnie SearXNG. Podczas nie których czynności mogą pojawić się błędy. Jeśli skrypt się nie zatrzyma, nie należy się nimi przejmować (tak ma być) - skrypt próbuje wykonać zapytania do nieistniejącej bazy oraz skomunikować się z serwerem Valkey, który jeszcze nie został zainstalowany. Wszystko ma na celu sprawdzenie naszego środowiska i podjęcia odpowiednich kroków. Brakujące pakiety takie jak uwsgi oraz serwer Valkey zostaną doinstalowane w kolejnych etapach instalacji. W ostatnim etapie skrypt przeprowadza kilka testów, jeśli tutaj nie pojąwią się żadne błędy tudzież ostrzeżenia, to możemy uznać naszą instancję za poprawnie zainstalowaną.
Finalize installation ===================== Do you want to run some checks? [YES/no] y INFO: wrapper: utils/searxng.sh instance _call searxng.check SearXNG checks -------------- INFO searx : max_request_timeout=None INFO searx.valkeydb : connecting to Valkey host='localhost' port=6379 db=0 INFO searx.valkeydb : connected to Valkey
Po instalacji chcąc uzyskać do naszego silnika wyszukiwania za pomocą
przeglądarki musimy uruchomić przekierowanie, które prześle zapytania
wysłane przez klienta bezpośrednio do hosta (gdy w przeglądarce wpiszemy
pełną nazwę domenową hosta), tak jakby do folderu
/searxng/
(zaznaczyłem tutaj
końcowy
slash, ponieważ od pewnego commitu pełni on bardzo
ważną rolę, o której opowiem podczas rozwiązywania problemów z
instancjami SearXNG). Jednak do nie jest folder, a jedynie część URL,
które spowoduje, że serwer WWW (Apache) uruchomi konfigurację
przygotowaną przez skrypt instalacyjny uruchamiający proxy,
które przekaże nasze żądanie do usługi UWSGI, które jak sama nazwa
wskazuje jest odpowiedzialne z WSGI w tym projekcie. Zatem w pliku
/etc/apache/sites-available/000-default.conf dopisujemy poniższą
linię.
Redirect / /searxng/
Teraz przy pomocy przeglądarki możemy już połączyć się z naszą instancją. Jeśli chcemy możemy przed pierwszym slashem podać pełną nazwę jednak nie jest to wymagane. Tak zainstalowana instancja silnika wyszukiwania jest w pełni sprawna i gotowa do działania.
2. Podstawowa customizcja
W zależności od potrzeb, możemy dostosować naszą instancję w mniejszym lub wiekszym stopniu. Ja swojej instancji używam jako strony startowej domyślnych profili przeglądarek internetowych zainstalowanych w dystrybucji immudex i zmieniłem w niej logo wyświetlane na stronie startowej, faviconę, tytuł karty/okna wyświelane przez przeglądarkę oraz domyślną wyszukiwarkę, z której mają zostać pobrane podpowiedzi dla wpisywanej frazy. Pierwsze dwie rzeczy zmieniamy ingerując w pliki projektu zainstalowane w naszym systemie. Dwie ostatnie zaś wymagają zmiany pliku ustawień /etc/searxng/settings.yml. Zmiany w plikach projektu będą dostarczać dodatkowych problemów, o których będzie szerzej w rozdziale odnośnie zarządzania. Zmiana konfiguracji jest prostsza, ale wymaga restartu usługi uwsgi. Od tych zmian zaczniemy. W wyżej wymienionym pliku edytujemy dwie wartości:
instance_name:
Ta wartość znajduje się w sekcji general:
i odpowiada ona za ustawienie tytułu strony naszej instancji. Drugą
wartością jest:
autocomplete:
Ona z kolei odpowiada, za ustawienie wyszukiwarki, z której mają być
pobierana podpowiedzi dla wpisywanych słów kluczowych. Jako wartość
wpisujemy google
lub
duckduckgo
albo nazwę inne wyszukiwarki.
Jeśli przyjrzymy
się komentarzom w pliku to dostrzeżemy sposób na wykluczenie
wyszukiwarek, z których nasz silnik ma pobierać wyniki wyszukiwania.
Po każdej zmianie w pliku settings.yml, należy zrestartować
usługę uwsgi.service.
$ sudo systemctl restart uwsgi.service
Kolejne zmiany tyczą się już ingerencji w pliki projektu i będą one polegać na podstawieniu w odpowiednie miejsca odpowiednich plików. Zatem żeby zmienić logo na głównej stronie silnika wyszukiwania należy wstawić swoje logo - plik graficzny o nazwię searxng.png do katalogu:
/usr/local/searxng/searxng-src/searx/static/themes/simple/img/
Obraz możebyć dowolnych rozmiarów, wówczas zostanie dostosowany wymiarów narzuconych przez styl strony. Drugim elementem jest favicona, czyli malutki obrazek wyświetlany w rogu karty/okna. Tutaj jest nieco więcej czynności, ponieważ strona bardziej preferuje format SVG niż PNG. Jeśli mamy naszą ikonę w tym formacie to wystarczy tak jak w przypadku logo podmienić plik. Z kolei jeśli nasze logo jest np. w PNG to wówczas musimy wykonać poniższe czynności:
sudo cp -vv favicon.png /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.png sudo rm -v /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.svg sudo ln -s /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.png \ /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.svg
Ważne jest w tych wyżej wymienionych przypadkach jest przestrzeganie odpowiednich nazw plików. Nasze zmiany powinny być już widoczne, jeśli nie są to na początek warto jest wczytać jeszcze raz stronę silnika wyszukiwania z pominięciem pamięci podręcznej przeglądarki lub w trybie prywatnym.
3. Zarządzanie
W podstawowym stopniu zarządzanie instancją sprowadza się do dwóch czynności: usunięcia instancji oraz jej aktualizacji. Usunięcie instancji może być przydatne podczas rozwiązywania problemów. Jest to natyle prosta usługa, którą możemy bez problemu reinstalować bez ryzyka utraty danych, jedyne co warto zachować to plik settings.yml - chociaż zmiany w nim poczynione są na tyle małe (oczywiście te opisane tutaj), że wczasie odzyskiwania pliku z kopii, zdążylibyśmy ją skonfigurować na nowo. Innymi plikami wartymi ochrony jest nasze logo oraz favicona.
Aby usunąć instancję SearXNG, należy wydać poniższe polecenie:
/usr/local/searxng/searxng-src$ sudo -H ./utils/searxng.sh remove all
Przed wydaniem polecenia, należy zwrócić uwagę, że nie jest klasyczne polecenie, tylko co spotrzegawczy zauważą, że jest skrypt instalacji i należy na początek przejść do folderu nadrzędnego dla jego lokalizacji podobnie do instalacji instancji. Jeśli faktycznie chcemy pozbyć się instancji SearXNG z naszego systemu, serwer Valkey będziemy musieli usunąć samodzielnie. Jeśli tylko ją reinstalujemy może on pozostać w systemie. Tak samo w przypadku uwsgi. W systemie pozostaje również konfiguracja proxy serwera WWW i ją również należy wyłączyć - oczywiście jeśli pozbywamy się instancji na dobre z systemu.
Drugą czynnością są aktualizacje. Jak często należy je robić? To ciężko
okreslić. Moja instancja próbuje aktualizować się codziennie. Dlaczego?
Otóż nie które wyszukiwarki wymagają od zewnętrznych systemów kluczy
API (taką wyszukiwarką jest np. DuckDuckGo) i te klucze są wydawane
na jakiś okres czasu - jaki? Tego nie wiem, dlatego też aby uniknąć
sytuacji w której pozbawiam się z silnika jednego ze źródeł aktualizuje
się codziennie. Oczywiście proces jest automatyzowany przy użyciu
usługi cron oraz skryptu powłoki BASH. Sam proces aktualizacji
jest bardzo podobny do procesu instalacji. Klonuje pliki projektu z
Githuba, a następnie zamiast poleceń skryptu
install all
wydajemy
instance update
. Jednym pytaniem skryptu
będzie - czy zastąpić plik settings.yml nowszą wersją pochodząc
z pobranego kodu źródłowego. Jeśli dokonywaliśmy tam zmian, to należy
pozostawić dotyczasową wersję i jest opcja domyślna. Poniżej znajduje się
polecenie służące do przeprowadzenia aktualizacji.
Downloads/searxng$ sudo -H ./utils/searxng.sh instance update
Jeśli nasza instancja ma być dostępna publicznie w internecie, to warto wykonywać regularnie te aktualizacje. Poniżej zamieszczam mój skrypt. Co to regularności jego uruchamiania to już pozostawiam w waszej gestii.
#!/bin/bash if [ ! -d ~/Downloads ]; then mkdir ~/Downloads; fi cd ~/Downloads; if [ -d searxng ]; then rm -rf searxng; fi git clone https://github.com/searxng/searxng.git searxng; cd searxng; sed -i '358a _t="-t 1"' ~/Downloads/searxng/utils/lib.sh; sudo -H ./utils/searxng.sh instance update sudo cp -vv ${HOME}/searxng.png /usr/local/searxng/searxng-src/searx/static/themes/simple/img sudo cp -vv ${HOME}/favicon.png /usr/local/searxng/searxng-src/searx/static/themes/simple/img sudo rm -v /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.svg sudo ln -v -s /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.png /usr/local/searxng/searxng-src/searx/static/themes/simple/img/favicon.svg
Skrypt zmieniejsza czas oczekiwana na odpowiedź na pytanie do jednej sekundy przez co plik settings.yml pozostaje bez zmian. Jeśli nie zmienialiśmy favicony oraz loga to możemy pozbyć 4 ostatnich linii. Jeśli dokonywaliśmy taki zmian to należy pozostawić je luzem w katalogu domowym lub wskazać inną ścieżkę w tychże poleceniach. Skrypt SearXNG podczas aktualizacji nadpisze nowymi plikami nasze pliki. Nie sprawdza ich w żaden sposób, dlatego też te modyfikacje należy wprowadzać ponownie po każdej aktualizacji.
4. Rozwiązywanie problemów
Instancję SearXNG hostuje od ok. 3 lat i w sumie nie napotkałem żadnych poważnych problemów. Chociaż w przypadku oprogramowania wydawanego jako rolling-release oraz automatycznych aktualizacji to jest to pewnego rodzaju loteria - czy po kolejnej aktualizacji instancja będzie zdatna w ogóle do użytku. Jednym z takich powszechniejszych problemów jaki możemy napotkać to, że zamiast strony wyszukiwarki wyświetla się:
Internal Server Error
To warto na początek sprawdzić czy takie usługi jak uwsgi oraz Valkey działają i ewentualnie rozwiązać problem z ich działaniem, jeśli coś jest nie tak. Chociaż to się rzadko zdarza. Innym rozwiązaniem, które może się sprawdzić jest reinstalacja instancji. W moim przypadku - dwóch takich problemów na przestrzeni 3 lat reinstalacja pomogła w 100% lub częściowo.
Ponieważ w drugim przypadku zmiana między poszczególnymi wersjami była dość duża. Poprzedni silniki bazodanowy Redis zastąpiono właśnie wymienionym tutaj Valkey oraz zmieniono sposób dystrybucji plików statycznych (m.in. arkuszy styli CSS czy kodu JavaScript) przez co mimo uruchomienia instancji po jej reinstalacji wyglądała źle - nie wczytało arkuszy styli. Dlaczego się to stało? Otóż winna była moja konfiguracja przekierowania żądań HTTP na konfigurację proxy. Mój serwer WWW przekierowywał zapytania na /searxng wówczas nazwy plików statycznych pozbawione już poprzedzającego je slasha doklejały się do ciągu searxng a takich plików nie ma. Więc ten ostatni slash w konfiguracji jest taki ważny - od pewnej wersji.
Często podczas troubleshootu pomocna może być dokumentacja admina. Dokumencja projektu SearXNG, dzieli się na trzy kategorie: dokumentacje usera, admina oraz dewelopera. Przydatna jest sekcja zgłoszeń na stronie projektu w serwisie Github.
Tym własnie akcentem zakończe tworzenie tego materiału. Dowiedzieliśmy sie w jaki sposób zainstalować, dostosować do własnego upodobania - w stopniu podstawowym, zarzadzać oraz rozwiązać problemy, które na pierwszy rzut oka nie wydają się błache, ale mają takie rozwiązanie. Rozdział z rozwiązywaniem problemów pozostawiam otwarty, jeśli coś jeszcze mi się przydarzy z SearXNG i uda mi się to naprawić to opiszę to tam o aktualizacji dowiecie się z listy zmian na stronie głównej.
Źródła:
~xf0r3m