Step by step installation

Step by step installation with virtualenv. For Ubuntu, be sure to have enable universe repository.

Install packages

$ sudo -H apt-get install -y \
    python3-dev python3-babel python3-venv \
    uwsgi uwsgi-plugin-python3 \
    git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev \
    shellcheck
$ sudo -H pacman -S --noconfirm \
    python python-pip python-lxml python-babel \
    uwsgi uwsgi-plugin-python \
    git base-devel libxml2 \
    shellcheck
$ sudo -H dnf install -y \
    python python-pip python-lxml python-babel \
    uwsgi uwsgi-plugin-python3 \
    git @development-tools libxml2 \
    ShellCheck

Hint

This installs also the packages needed by uwsgi

Create user

$ sudo -H useradd --shell /bin/bash --system \
    --home-dir "/usr/local/searx" \
    --comment 'Privacy-respecting metasearch engine' searx

$ sudo -H mkdir "/usr/local/searx"
$ sudo -H chown -R "searx:searx" "/usr/local/searx"

install searx & dependencies

Start a interactive shell from new created user and clone searx:

$ sudo -H -u searx -i
(searx)$ git clone "https://github.com/searx/searx.git" "/usr/local/searx/searx-src"

In the same shell create virtualenv:

(searx)$ python3 -m venv "/usr/local/searx/searx-pyenv"
(searx)$ echo ". /usr/local/searx/searx-pyenv/bin/activate" >>  "/usr/local/searx/.profile"

To install searx’s dependencies, exit the searx bash session you opened above and restart a new. Before install, first check if your virtualenv was sourced from the login (~/.profile):

$ sudo -H -u searx -i

(searx)$ command -v python && python --version
/usr/local/searx/searx-pyenv/bin/python
Python 3.8.1

# update pip's boilerplate ..
pip install -U pip
pip install -U setuptools
pip install -U wheel

# jump to searx's working tree and install searx into virtualenv
(searx)$ cd "/usr/local/searx/searx-src"
(searx)$ pip install -e .

Tip

Open a second terminal for the configuration tasks and left the (searx)$ terminal open for the tasks below.

Configuration

To create a initial /etc/searx/settings.yml you can start with a copy of the file git://utils/templates/etc/searx/use_default_settings.yml. This setup use default settings from git://searx/settings.yml and is recommended since PR 2291 is merged.

For minimal Setup, configure like shown below – replace searx@\$(uname -n) with a name of your choice, set ultrasecretkeyand/or edit /etc/searx/settings.yml to your needs.

$ sudo -H mkdir -p "/etc/searx"
$ sudo -H cp "/usr/local/searx/searx-src/utils/templates/etc/searx/use_default_settings.yml" \
             "/etc/searx/settings.yml"
$ sudo -H mkdir -p "/etc/searx"
$ sudo -H cp "/usr/local/searx/searx-src/searx/settings.yml" \
             "/etc/searx/settings.yml"
$ sudo -H sed -i -e "s/ultrasecretkey/$(openssl rand -hex 16)/g" "/etc/searx/settings.yml"
$ sudo -H sed -i -e "s/{instance_name}/searx@$(uname -n)/g" "/etc/searx/settings.yml"
use_default_settings: True

general:
    debug : False # Debug mode, only for development
    instance_name : "searx" # displayed name

search:
    safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
    autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off by default
    default_lang : "" # Default search language - leave blank to detect from browser information or use codes from 'languages.py'

server:
    port : 8888
    bind_address : "127.0.0.1" # address to listen on
    secret_key : "ultrasecretkey" # change this!
    base_url : False # Set custom base_url. Possible values: False or "https://your.custom.host/location/"
    image_proxy : False # Proxying image results through searx

# uncomment below section if you have running morty proxy
#result_proxy:
#    url : http://127.0.0.1:3000/
#    key : !!binary "your_morty_proxy_key"
general:
    debug : False # Debug mode, only for development
    instance_name : "searx" # displayed name

search:
    safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
    autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off by default
    default_lang : "" # Default search language - leave blank to detect from browser information or use codes from 'languages.py'
    ban_time_on_fail : 5 # ban time in seconds after engine errors
    max_ban_time_on_fail : 120 # max ban time in seconds after engine errors

server:
    port : 8888
    bind_address : "127.0.0.1" # address to listen on
    secret_key : "ultrasecretkey" # change this!
    base_url : False # Set custom base_url. Possible values: False or "https://your.custom.host/location/"
    image_proxy : False # Proxying image results through searx
    http_protocol_version : "1.0"  # 1.0 and 1.1 are supported
    method: "POST" # POST queries are more secure as they don't show up in history but may cause problems when using Firefox containers
    default_http_headers:
        X-Content-Type-Options : nosniff
        X-XSS-Protection : 1; mode=block
        X-Download-Options : noopen
        X-Robots-Tag : noindex, nofollow
        Referrer-Policy : no-referrer

ui:
    static_path : "" # Custom static path - leave it blank if you didn't change
    templates_path : "" # Custom templates path - leave it blank if you didn't change
    default_theme : oscar # ui theme
    default_locale : "" # Default interface locale - leave blank to detect from browser information or use codes from the 'locales' config section
    theme_args :
        oscar_style : logicodev # default style of oscar
#   results_on_new_tab: False  # Open result links in a new tab by default
#   categories_order :
#     - general
#     - files
#     - map
#     - it
#     - science

# Lock arbitrary settings on the preferences page.
# To find the ID of the user setting you want to lock, check
# the ID of the form on the page "preferences".
#preferences:
#    lock:
#      - language
#      - autocomplete
#      - method

# searx supports result proxification using an external service: https://github.com/asciimoo/morty
# uncomment below section if you have running morty proxy
# the key is base64 encoded (keep the !!binary notation)
# Note: since commit af77ec3, morty accepts a base64 encoded key.
#result_proxy:
#    url : http://127.0.0.1:3000/
#    key : !!binary "your_morty_proxy_key"

outgoing: # communication with search engines
    request_timeout : 2.0 # default timeout in seconds, can be override by engine
    # max_request_timeout: 10.0 # the maximum timeout in seconds
    useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator
    pool_connections : 100 # Number of different hosts
    pool_maxsize : 10 # Number of simultaneous requests by host
# uncomment below section if you want to use a proxy
# see https://2.python-requests.org/en/latest/user/advanced/#proxies
# SOCKS proxies are also supported: see https://2.python-requests.org/en/latest/user/advanced/#socks
#    proxies:
#        http:
#            - http://proxy1:8080
#            - http://proxy2:8080
#        https:
#            - http://proxy1:8080
#            - http://proxy2:8080
# uncomment below section only if you have more than one network interface
# which can be the source of outgoing search requests
#    source_ips:
#        - 1.1.1.1
#        - 1.1.1.2

# External plugin configuration
# See http://searx.github.io/searx/dev/plugins.html for more details
#
# plugins:
#   - plugin1
#   - plugin2
#   - ...

# uncomment below section if you want to configure which plugin is enabled by default
#
# enabled_plugins:
#   - "HTTPS rewrite"
#   - ...

engines:
  - name: apk mirror
    engine: apkmirror
    timeout: 4.0
    shortcut: apkm
    disabled: True

# Requires Tor
  - name : ahmia
    engine : ahmia
    categories : onions
    shortcut : ah

  - name : arch linux wiki
    engine : archlinux
    shortcut : al

  - name : archive is
    engine : xpath
    search_url : https://archive.is/{query}
    url_xpath : (//div[@class="TEXT-BLOCK"]/a)/@href
    title_xpath : (//div[@class="TEXT-BLOCK"]/a)
    content_xpath : //div[@class="TEXT-BLOCK"]/ul/li
    categories : general
    timeout : 7.0
    disabled : True
    shortcut : ai

  - name : arxiv
    engine : arxiv
    shortcut : arx
    categories : science
    timeout : 4.0

#  tmp suspended:  dh key too small
#  - name : base
#    engine : base
#    shortcut : bs

  - name : wikipedia
    engine : wikipedia
    shortcut : wp
    base_url : 'https://{language}.wikipedia.org/'

  - name : bing
    engine : bing
    shortcut : bi

  - name : bing images
    engine : bing_images
    shortcut : bii

  - name : bing news
    engine : bing_news
    shortcut : bin

  - name : bing videos
    engine : bing_videos
    shortcut : biv

  - name : bitbucket
    engine : xpath
    paging : True
    search_url : https://bitbucket.org/repo/all/{pageno}?name={query}
    url_xpath : //article[@class="repo-summary"]//a[@class="repo-link"]/@href
    title_xpath : //article[@class="repo-summary"]//a[@class="repo-link"]
    content_xpath : //article[@class="repo-summary"]/p
    categories : it
    timeout : 4.0
    disabled : True
    shortcut : bb

  - name : btdigg
    engine : btdigg
    shortcut : bt

  - name : ccc-tv
    engine : xpath
    paging : False
    search_url : https://media.ccc.de/search/?q={query}
    url_xpath : //div[@class="caption"]/h3/a/@href
    title_xpath : //div[@class="caption"]/h3/a/text()
    content_xpath : //div[@class="caption"]/h4/@title
    categories : videos
    disabled : True
    shortcut : c3tv

  - name : crossref
    engine : json_engine
    paging : True
    search_url : https://search.crossref.org/dois?q={query}&page={pageno}
    url_query : doi
    title_query : title
    content_query : fullCitation
    categories : science
    shortcut : cr

  - name : currency
    engine : currency_convert
    categories : general
    shortcut : cc

  - name : deezer
    engine : deezer
    shortcut : dz

  - name : deviantart
    engine : deviantart
    shortcut : da
    timeout : 3.0

  - name : ddg definitions
    engine : duckduckgo_definitions
    shortcut : ddd
    weight : 2
    disabled : True

# cloudflare protected
#  - name : digbt
#    engine : digbt
#    shortcut : dbt
#    timeout : 6.0
#    disabled : True

  - name : digg
    engine : digg
    shortcut : dg

  - name : erowid
    engine : xpath
    paging : True
    first_page_num : 0
    page_size : 30
    search_url : https://www.erowid.org/search.php?q={query}&s={pageno}
    url_xpath : //dl[@class="results-list"]/dt[@class="result-title"]/a/@href
    title_xpath : //dl[@class="results-list"]/dt[@class="result-title"]/a/text()
    content_xpath : //dl[@class="results-list"]/dd[@class="result-details"]
    categories : general
    shortcut : ew
    disabled : True

#  - name : elasticsearch
#    shortcut : es
#    engine : elasticsearch
#    base_url : http://localhost:9200
#    username : elastic
#    password : changeme
#    index : my-index
#    # available options: match, simple_query_string, term, terms, custom
#    query_type : match
#    # if query_type is set to custom, provide your query here
#    #custom_query_json: {"query":{"match_all": {}}}
#    #show_metadata: False
#    disabled : True

  - name : wikidata
    engine : wikidata
    shortcut : wd
    timeout : 3.0
    weight : 2

  - name : duckduckgo
    engine : duckduckgo
    shortcut : ddg
    disabled : True

  - name : duckduckgo images
    engine : duckduckgo_images
    shortcut : ddi
    timeout: 3.0
    disabled : True

  - name : etools
    engine : etools
    shortcut : eto
    disabled : True

  - name : etymonline
    engine : xpath
    paging : True
    search_url : https://etymonline.com/search?page={pageno}&q={query}
    url_xpath : //a[contains(@class, "word__name--")]/@href
    title_xpath : //a[contains(@class, "word__name--")]
    content_xpath : //section[contains(@class, "word__defination")]
    first_page_num : 1
    shortcut : et
    disabled : True

#  - name : ebay
#    engine : ebay
#    shortcut : eb
#    disabled : True
#    timeout: 5

  - name : 1x
    engine : www1x
    shortcut : 1x
    timeout : 3.0
    disabled : True

  - name : fdroid
    engine : fdroid
    shortcut : fd
    disabled : True

  - name : flickr
    categories : images
    shortcut : fl
# You can use the engine using the official stable API, but you need an API key
# See : https://www.flickr.com/services/apps/create/
#    engine : flickr
#    api_key: 'apikey' # required!
# Or you can use the html non-stable engine, activated by default
    engine : flickr_noapi

  - name : free software directory
    engine : mediawiki
    shortcut : fsd
    categories : it
    base_url : https://directory.fsf.org/
    number_of_results : 5
# what part of a page matches the query string: title, text, nearmatch
# title - query matches title, text - query matches the text of page, nearmatch - nearmatch in title
    search_type : title
    timeout : 5.0
    disabled : True

  - name : frinkiac
    engine : frinkiac
    shortcut : frk
    disabled : True

  - name : genius
    engine : genius
    shortcut : gen

  - name : gigablast
    engine : gigablast
    shortcut : gb
    timeout : 3.0
    disabled: True

  - name : gentoo
    engine : gentoo
    shortcut : ge

  - name : gitlab
    engine : json_engine
    paging : True
    search_url : https://gitlab.com/api/v4/projects?search={query}&page={pageno}
    url_query : web_url
    title_query : name_with_namespace
    content_query : description
    page_size : 20
    categories : it
    shortcut : gl
    timeout : 10.0
    disabled : True

  - name : github
    engine : github
    shortcut : gh

    # This a Gitea service. If you would like to use a different instance,
    # change codeberg.org to URL of the desired Gitea host. Or you can create
    # a new engine by copying this and changing the name, shortcut and search_url.
  - name : codeberg
    engine : json_engine
    search_url : https://codeberg.org/api/v1/repos/search?q={query}&limit=10
    url_query : html_url
    title_query : name
    content_query : description
    categories : it
    shortcut : cb
    disabled : True

  - name : google
    engine : google
    shortcut : go

  - name : google images
    engine : google_images
    shortcut : goi

  - name : google news
    engine : google_news
    shortcut : gon

  - name : google videos
    engine : google_videos
    shortcut : gov

  - name : google scholar
    engine : xpath
    paging : True
    search_url : https://scholar.google.com/scholar?start={pageno}&q={query}&hl=en&as_sdt=0,5&as_vis=1
    results_xpath : //div[contains(@class, "gs_r")]/div[@class="gs_ri"]
    url_xpath : .//h3/a/@href
    title_xpath : .//h3/a
    content_xpath : .//div[@class="gs_rs"]
    suggestion_xpath : //div[@id="gs_res_ccl_top"]//a/b
    page_size : 10
    first_page_num : 0
    categories : science
    shortcut : gos

  - name : google play apps
    engine : xpath
    search_url : https://play.google.com/store/search?q={query}&c=apps
    results_xpath : '//div[@class="WHE7ib mpg5gc"]'
    title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
    url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
    content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
    thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
    categories : files
    shortcut : gpa
    disabled : True

  - name : google play movies
    engine : xpath
    search_url : https://play.google.com/store/search?q={query}&c=movies
    results_xpath : '//div[@class="WHE7ib mpg5gc"]'
    title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
    url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
    content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
    thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
    categories : videos
    shortcut : gpm
    disabled : True

  - name : google play music
    engine : xpath
    search_url : https://play.google.com/store/search?q={query}&c=music
    results_xpath : '//div[@class="WHE7ib mpg5gc"]'
    title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
    url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
    content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
    thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
    categories : music
    shortcut : gps
    disabled : True

  - name : geektimes
    engine : xpath
    paging : True
    search_url : https://geektimes.ru/search/page{pageno}/?q={query}
    url_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]/@href
    title_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]
    content_xpath : //article[contains(@class, "post")]//div[contains(@class, "post__text")]
    categories : it
    timeout : 4.0
    disabled : True
    shortcut : gt

  - name : habrahabr
    engine : xpath
    paging : True
    search_url : https://habrahabr.ru/search/page{pageno}/?q={query}
    url_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]/@href
    title_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]
    content_xpath : //article[contains(@class, "post")]//div[contains(@class, "post__text")]
    categories : it
    timeout : 4.0
    disabled : True
    shortcut : habr

  - name : hoogle
    engine : json_engine
    paging : True
    search_url : https://www.haskell.org/hoogle/?mode=json&hoogle={query}&start={pageno}
    results_query : results
    url_query : location
    title_query : self
    content_query : docs
    page_size : 20
    categories : it
    shortcut : ho

  - name : ina
    engine : ina
    shortcut : in
    timeout : 6.0
    disabled : True

  - name : invidious
    engine : invidious
    base_url : 'https://invidio.us/'
    shortcut: iv
    timeout : 5.0
    disabled : True

  - name: kickass
    engine : kickass
    shortcut : kc
    timeout : 4.0
    disabled : True

  - name : library genesis
    engine : xpath
    search_url : http://libgen.rs/search.php?req={query}
    url_xpath : //a[contains(@href,"bookfi.net/md5")]/@href
    title_xpath : //a[contains(@href,"book/")]/text()[1]
    content_xpath : //td/a[1][contains(@href,"=author")]/text()
    categories : general
    timeout : 7.0
    disabled : True
    shortcut : lg

  - name : lobste.rs
    engine : xpath
    search_url : https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance
    results_xpath : //li[contains(@class, "story")]
    url_xpath : .//a[@class="u-url"]/@href
    title_xpath : .//a[@class="u-url"]
    content_xpath : .//a[@class="domain"]
    categories : it
    shortcut : lo
    timeout : 3.0
    disabled: True

  - name : metager
    engine : xpath
    paging : False
    search_url : https://metager.org/meta/meta.ger3?eingabe={query}
    url_xpath : //div[@class="result-subheadline"]/a/@href
    title_xpath : //div[@class="result-headline"]/h2/@title
    content_xpath : //div[@class="result-description"]/text()
    categories : general
    shortcut : mg
    disabled : True

  - name : microsoft academic
    engine : microsoft_academic
    categories : science
    shortcut : ma

  - name : mixcloud
    engine : mixcloud
    shortcut : mc

  - name : npm
    engine : json_engine
    paging : True
    search_url : https://api.npms.io/v2/search?q={query}&size=25&from={pageno}
    results_query : results
    url_query : package/links/npm
    title_query : package/name
    content_query : package/description
    page_size : 25
    categories : it
    disabled: True
    timeout: 5.0
    shortcut : npm

# Requires Tor
  - name : not evil
    engine : not_evil
    shortcut : ne

  - name : nyaa
    engine : nyaa
    shortcut : nt
    disabled : True

  - name : acgsou
    engine : acgsou
    shortcut : acg
    disabled : True
    timeout: 5.0

  - name : openairedatasets
    engine : json_engine
    paging : True
    search_url : https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query}
    results_query : response/results/result
    url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
    title_query : metadata/oaf:entity/oaf:result/title/$
    content_query : metadata/oaf:entity/oaf:result/description/$
    categories : science
    shortcut : oad
    timeout: 5.0

  - name : openairepublications
    engine : json_engine
    paging : True
    search_url : https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query}
    results_query : response/results/result
    url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
    title_query : metadata/oaf:entity/oaf:result/title/$
    content_query : metadata/oaf:entity/oaf:result/description/$
    categories : science
    shortcut : oap
    timeout: 5.0

#  - name : opensemanticsearch
#    engine : opensemantic
#    shortcut : oss
#    base_url : 'http://localhost:8983/solr/opensemanticsearch/'

  - name : openstreetmap
    engine : openstreetmap
    shortcut : osm

  - name : openrepos
    engine : xpath
    paging : True
    search_url : https://openrepos.net/search/node/{query}?page={pageno}
    url_xpath : //li[@class="search-result"]//h3[@class="title"]/a/@href
    title_xpath : //li[@class="search-result"]//h3[@class="title"]/a
    content_xpath : //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"]
    categories : files
    timeout : 4.0
    disabled : True
    shortcut : or

  - name : pdbe
    engine : pdbe
    shortcut : pdb
# Hide obsolete PDB entries.
# Default is not to hide obsolete structures
#    hide_obsolete : False

  - name : photon
    engine : photon
    shortcut : ph

  - name : piratebay
    engine : piratebay
    shortcut : tpb
    # You may need to change this URL to a proxy if piratebay is blocked in your country
    url: https://thepiratebay.org/
    timeout : 3.0

  - name : pubmed
    engine : pubmed
    shortcut : pub
    categories: science
    timeout : 3.0

  - name : qwant
    engine : qwant
    shortcut : qw
    categories : general
    disabled : True

  - name : qwant images
    engine : qwant
    shortcut : qwi
    categories : images

  - name : qwant news
    engine : qwant
    shortcut : qwn
    categories : news

#  - name: library
#    engine: recoll
#    shortcut: lib
#    base_url: 'https://recoll.example.org/'
#    search_dir: ''
#    mount_prefix: /export
#    dl_prefix: 'https://download.example.org'
#    timeout: 30.0
#    categories: files
#    disabled: True

#  - name: recoll library reference
#    engine: recoll
#    base_url: 'https://recoll.example.org/'
#    search_dir: reference
#    mount_prefix: /export
#    dl_prefix: 'https://download.example.org'
#    shortcut: libr
#    timeout: 30.0
#    categories: files
#    disabled: True

  - name : reddit
    engine : reddit
    shortcut : re
    page_size : 25
    timeout : 10.0
    disabled : True

# tmp suspended: bad certificate
#  - name : scanr structures
#    shortcut: scs
#    engine : scanr_structures
#    disabled : True

  - name: sepiasearch
    engine: sepiasearch
    shortcut: sep

  - name : soundcloud
    engine : soundcloud
    shortcut : sc

  - name : stackoverflow
    engine : stackoverflow
    shortcut : st

  - name : searchcode code
    engine : searchcode_code
    shortcut : scc
    disabled : True

  - name : framalibre
    engine : framalibre
    shortcut : frl
    disabled : True

#  - name : searx
#    engine : searx_engine
#    shortcut : se
#    instance_urls :
#        - http://127.0.0.1:8888/
#        - ...
#    disabled : True

  - name : semantic scholar
    engine : xpath
    paging : True
    search_url : https://www.semanticscholar.org/search?q={query}&sort=relevance&page={pageno}&ae=false
    results_xpath : //article
    url_xpath : .//div[@class="search-result-title"]/a/@href
    title_xpath : .//div[@class="search-result-title"]/a
    content_xpath : .//div[@class="search-result-abstract"]
    shortcut : se
    categories : science

# Spotify needs API credentials
#  - name : spotify
#    engine : spotify
#    shortcut : stf
#    api_client_id : *******
#    api_client_secret : *******

  - name : startpage
    engine : startpage
    shortcut : sp
    timeout : 6.0
    disabled : True

  - name : tokyotoshokan
    engine : tokyotoshokan
    shortcut : tt
    timeout : 6.0
    disabled : True

  - name : torrentz
    engine : torrentz
    shortcut : tor
    url: https://torrentz2.eu/
    timeout : 3.0

# Requires Tor
  - name : torch
    engine : xpath
    paging : True
    search_url : http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and
    results_xpath : //table//tr
    url_xpath : ./td[2]/a
    title_xpath : ./td[2]/b
    content_xpath : ./td[2]/small
    categories : onions
    shortcut : tch

# maybe in a fun category
#  - name : uncyclopedia
#    engine : mediawiki
#    shortcut : unc
#    base_url : https://uncyclopedia.wikia.com/
#    number_of_results : 5

# tmp suspended - too slow, too many errors
#  - name : urbandictionary
#    engine        : xpath
#    search_url    : http://www.urbandictionary.com/define.php?term={query}
#    url_xpath     : //*[@class="word"]/@href
#    title_xpath   : //*[@class="def-header"]
#    content_xpath : //*[@class="meaning"]
#    shortcut : ud

  - name : unsplash
    engine : unsplash
    disabled: True
    shortcut : us

  - name : yahoo
    engine : yahoo
    shortcut : yh
    disabled : True

  - name : yandex
    engine : yandex
    shortcut : yn
    disabled : True

  - name : yahoo news
    engine : yahoo_news
    shortcut : yhn

  - name : youtube
    shortcut : yt
    # You can use the engine using the official stable API, but you need an API key
    # See : https://console.developers.google.com/project
    #    engine : youtube_api
    #    api_key: 'apikey' # required!
    # Or you can use the html non-stable engine, activated by default
    engine : youtube_noapi

  # tmp suspended: Cloudflare CAPTCHA
  #- name : yggtorrent
  #  engine : yggtorrent
  #  shortcut : ygg
  #  url: https://www2.yggtorrent.si/
  #  disabled : True
  #  timeout : 4.0

  - name : dailymotion
    engine : dailymotion
    shortcut : dm

  - name : vimeo
    engine : vimeo
    shortcut : vm

  - name : wikibooks
    engine : mediawiki
    shortcut : wb
    categories : general
    base_url : "https://{language}.wikibooks.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wikinews
    engine : mediawiki
    shortcut : wn
    categories : news
    base_url : "https://{language}.wikinews.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wikiquote
    engine : mediawiki
    shortcut : wq
    categories : general
    base_url : "https://{language}.wikiquote.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wikisource
    engine : mediawiki
    shortcut : ws
    categories : general
    base_url : "https://{language}.wikisource.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wiktionary
    engine : mediawiki
    shortcut : wt
    categories : general
    base_url : "https://{language}.wiktionary.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wikiversity
    engine : mediawiki
    shortcut : wv
    categories : general
    base_url : "https://{language}.wikiversity.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wikivoyage
    engine : mediawiki
    shortcut : wy
    categories : general
    base_url : "https://{language}.wikivoyage.org/"
    number_of_results : 5
    search_type : text
    disabled : True

  - name : wolframalpha
    shortcut : wa
    # You can use the engine using the official stable API, but you need an API key
    # See : http://products.wolframalpha.com/api/
    # engine : wolframalpha_api
    # api_key: '' # required!
    engine : wolframalpha_noapi
    timeout: 6.0
    categories : science

  - name : dictzone
    engine : dictzone
    shortcut : dc

  - name : mymemory translated
    engine : translated
    shortcut : tl
    timeout : 5.0
    disabled : True
    # You can use without an API key, but you are limited to 1000 words/day
    # See : http://mymemory.translated.net/doc/usagelimits.php
    # api_key : ''

  - name : 1337x
    engine : 1337x
    shortcut : 1337x
    disabled : True

  - name : duden
    engine : duden
    shortcut : du
    disabled : True

  - name : seznam
    shortcut: szn
    engine: xpath
    paging : True
    search_url : https://search.seznam.cz/?q={query}&count=10&from={pageno}
    results_xpath: //div[@class="Page-content"]//div[contains(@class, "Result ")]
    url_xpath : ./h3/a/@href
    title_xpath : ./h3
    content_xpath : .//p[@class="Result-description"]
    suggestion_xpath: //div[@class="Related-container"]//div[@class="RelatedItem"]/div/span/a
    first_page_num : 0
    page_size : 10
    disabled : True

  - name : mojeek
    shortcut: mjk
    engine: xpath
    paging : True
    search_url : https://www.mojeek.com/search?q={query}&s={pageno}
    results_xpath: /html/body//div[@class="results"]/ul[@class="results-standard"]/li
    url_xpath : ./h2/a/@href
    title_xpath : ./h2
    content_xpath : ./p[@class="s"]
    suggestion_xpath : /html/body//div[@class="top-info"]/p[@class="top-info spell"]/a
    first_page_num : 0
    page_size : 10
    disabled : True

  - name : naver
    shortcut: nvr
    engine: xpath
    paging : True
    search_url : https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno}
    results_xpath: /html/body//ul[@id="elThumbnailResultArea"]/li
    url_xpath : ./dl/dt/a[@class="title_link"]/@href
    title_xpath : ./dl/dt/a[@class="title_link"]
    content_xpath : ./dl/dd[@class="sh_web_passage"]
    suggestion_xpath : /html/body//div[@class="sp_keyword section"]//a
    first_page_num : 1
    page_size : 10
    disabled : True

  - name : rubygems
    shortcut: rbg
    engine: xpath
    paging : True
    search_url : https://rubygems.org/search?page={pageno}&query={query}
    results_xpath: /html/body/main/div/a[@class="gems__gem"]
    url_xpath : ./@href
    title_xpath : ./span/h2
    content_xpath : ./span/p
    suggestion_xpath : /html/body/main/div/div[@class="search__suggestions"]/p/a
    first_page_num : 1
    categories: it
    disabled : True

  - name : peertube
    engine: peertube
    shortcut: ptb
    paging : True
    base_url : https://peer.tube/
    categories: videos
    disabled : True

#  - name : yacy
#    engine : yacy
#    shortcut : ya
#    base_url : 'http://localhost:8090'
#    number_of_results : 5
#    timeout : 3.0

# Doku engine lets you access to any Doku wiki instance:
# A public one or a privete/corporate one.
#  - name : ubuntuwiki
#    engine : doku
#    shortcut : uw
#    base_url : 'http://doc.ubuntu-fr.org'

# Be careful when enabling this engine if you are
# running a public instance. Do not expose any sensitive
# information. You can restrict access by configuring a list
# of access tokens under tokens.
#  - name: git grep
#    engine: command
#    command: ['git', 'grep', '{{QUERY}}']
#    shortcut: gg
#    tokens: []
#    disabled: True
#    delimiter:
#        chars: ':'
#        keys: ['filepath', 'code']

# Be careful when enabling this engine if you are
# running a public instance. Do not expose any sensitive
# information. You can restrict access by configuring a list
# of access tokens under tokens.
#  - name: locate
#    engine: command
#    command: ['locate', '{{QUERY}}']
#    shortcut: loc
#    tokens: []
#    disabled: True
#    delimiter:
#        chars: ' '
#        keys: ['line']

# Be careful when enabling this engine if you are
# running a public instance. Do not expose any sensitive
# information. You can restrict access by configuring a list
# of access tokens under tokens.
#  - name: find
#    engine: command
#    command: ['find', '.', '-name', '{{QUERY}}']
#    query_type: path
#    shortcut: fnd
#    tokens: []
#    disabled: True
#    delimiter:
#        chars: ' '
#        keys: ['line']

# Be careful when enabling this engine if you are
# running a public instance. Do not expose any sensitive
# information. You can restrict access by configuring a list
# of access tokens under tokens.
#  - name: pattern search in files
#    engine: command
#    command: ['fgrep', '{{QUERY}}']
#    shortcut: fgr
#    tokens: []
#    disabled: True
#    delimiter:
#        chars: ' '
#        keys: ['line']

# Be careful when enabling this engine if you are
# running a public instance. Do not expose any sensitive
# information. You can restrict access by configuring a list
# of access tokens under tokens.
#  - name: regex search in files
#    engine: command
#    command: ['grep', '{{QUERY}}']
#    shortcut: gr
#    tokens: []
#    disabled: True
#    delimiter:
#        chars: ' '
#        keys: ['line']

locales:
    en : English
    ar : العَرَبِيَّة (Arabic)
    bg : Български (Bulgarian)
    bo : བོད་སྐད་ (Tibetian)
    ca : Català (Catalan)
    cs : Čeština (Czech)
    cy : Cymraeg (Welsh)
    da : Dansk (Danish)
    de : Deutsch (German)
    el_GR : Ελληνικά (Greek_Greece)
    eo : Esperanto (Esperanto)
    es : Español (Spanish)
    et : Eesti (Estonian)
    eu : Euskara (Basque)
    fa_IR : (fārsī) فارسى (Persian)
    fi : Suomi (Finnish)
    fil : Wikang Filipino (Filipino)
    fr : Français (French)
    gl : Galego (Galician)
    he : עברית (Hebrew)
    hr : Hrvatski (Croatian)
    hu : Magyar (Hungarian)
    ia : Interlingua (Interlingua)
    it : Italiano (Italian)
    ja : 日本語 (Japanese)
    lt : Lietuvių (Lithuanian)
    nl : Nederlands (Dutch)
    nl_BE : Vlaams (Dutch_Belgium)
    oc : Lenga D'òc (Occitan)
    pl : Polski (Polish)
    pt : Português (Portuguese)
    pt_BR : Português (Portuguese_Brazil)
    ro : Română (Romanian)
    ru : Русский (Russian)
    sk : Slovenčina (Slovak)
    sl : Slovenski (Slovene)
    sr : српски (Serbian)
    sv : Svenska (Swedish)
    te : తెలుగు (telugu)
    ta : தமிழ் (Tamil)
    tr : Türkçe (Turkish)
    uk : українська мова (Ukrainian)
    vi : tiếng việt (Vietnamese)
    zh : 中文 (Chinese)
    zh_TW : 國語 (Taiwanese Mandarin)

doi_resolvers :
  oadoi.org : 'https://oadoi.org/'
  doi.org : 'https://doi.org/'
  doai.io  : 'https://dissem.in/'
  sci-hub.tw : 'https://sci-hub.tw/'

default_doi_resolver : 'sci-hub.tw'

Check

To check your searx setup, optional enable debugging and start the webapp. Searx looks at the exported environment $SEARX_SETTINGS_PATH for a configuration file.

# enable debug ..
$ sudo -H sed -i -e "s/debug : False/debug : True/g" "/etc/searx/settings.yml"

# start webapp
$ sudo -H -u searx -i
(searx)$ cd /usr/local/searx/searx-src
(searx)$ export SEARX_SETTINGS_PATH="/etc/searx/settings.yml"
(searx)$ python searx/webapp.py

# disable debug
$ sudo -H sed -i -e "s/debug : True/debug : False/g" "/etc/searx/settings.yml"

Open WEB browser and visit http:// . If you are inside a container or in a script, test with curl:

$ xdg-open http://
$ curl --location --verbose --head --insecure

*   Trying 127.0.0.1:8888...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#0)
> HEAD / HTTP/1.1
> Host: 127.0.0.1:8888
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
HTTP/1.0 200 OK
...

If everything works fine, hit [CTRL-C] to stop the webapp and disable the debug option in settings.yml. You can now exit searx user bash (enter exit command twice). At this point searx is not demonized; uwsgi allows this.