Merge branch 'searxng:master' into master

This commit is contained in:
Fauli1221 2022-08-03 08:18:00 +02:00 committed by GitHub
commit f60e26cdbc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
220 changed files with 11217 additions and 4982 deletions

View file

@ -1,52 +0,0 @@
# -*- coding: utf-8; mode: sh -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
# shellcheck shell=bash disable=SC2034
#
# This file should be edited only ones just before the installation of any
# service is done. After the installation of the searx service a copy of this
# file is placed into the $SEARX_SRC of the instance, e.g.::
#
# /usr/local/searx/searx-src/.config.sh
#
# .. hint::
#
# Before you change a value here, You have to fully uninstall any previous
# installation of searx, morty and filtron services!
# utils/searx.sh
# --------------
# The setup of the SearXNG instance is done in the settings.yml
# (SEARXNG_SETTINGS_PATH). Read the remarks in [1] carefully and don't forget to
# rebuild instance's environment (make buildenv) if needed. The settings.yml
# file of an already installed instance is shown by::
#
# $ ./utils/searx.sh --help
# ---- SearXNG instance setup (already installed)
# SEARXNG_SETTINGS_PATH : /etc/searxng/settings.yml
# SEARX_SRC : /usr/local/searx/searx-src
#
# [1] https://docs.searxng.org/admin/engines/settings.html
# utils/filtron.sh
# ----------------
# FILTRON_API="127.0.0.1:4005"
# FILTRON_LISTEN="127.0.0.1:4004"
# utils/morty.sh
# --------------
# morty listen address
# MORTY_LISTEN="127.0.0.1:3000"
# PUBLIC_URL_PATH_MORTY="/morty/"
# system services
# ---------------
# Common $HOME folder of the service accounts
# SERVICE_HOME_BASE="/usr/local"
# **experimental**: Set SERVICE_USER to run all services by one account, but be
# aware that removing discrete components might conflict!
# SERVICE_USER=searx

View file

@ -26,7 +26,7 @@ jobs:
- name: Install Ubuntu packages - name: Install Ubuntu packages
run: | run: |
sudo ./utils/searx.sh install packages sudo ./utils/searxng.sh install packages
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2

View file

@ -19,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Install Ubuntu packages - name: Install Ubuntu packages
run: | run: |
sudo ./utils/searx.sh install packages sudo ./utils/searxng.sh install packages
sudo apt install firefox sudo apt install firefox
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
@ -55,7 +55,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Install Ubuntu packages - name: Install Ubuntu packages
run: sudo ./utils/searx.sh install buildhost run: sudo ./utils/searxng.sh install buildhost
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
@ -82,7 +82,7 @@ jobs:
fetch-depth: '0' fetch-depth: '0'
persist-credentials: false persist-credentials: false
- name: Install Ubuntu packages - name: Install Ubuntu packages
run: sudo ./utils/searx.sh install buildhost run: sudo ./utils/searxng.sh install buildhost
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:

View file

@ -59,17 +59,16 @@ test.shell:
utils/brand.env \ utils/brand.env \
$(MTOOLS) \ $(MTOOLS) \
utils/lib.sh \ utils/lib.sh \
utils/lib_install.sh \
utils/lib_nvm.sh \ utils/lib_nvm.sh \
utils/lib_static.sh \ utils/lib_static.sh \
utils/lib_go.sh \ utils/lib_go.sh \
utils/lib_redis.sh \ utils/lib_redis.sh \
utils/filtron.sh \ utils/filtron.sh \
utils/searx.sh \ utils/searx.sh \
utils/searxng.sh \
utils/morty.sh \ utils/morty.sh \
utils/lxc.sh \ utils/lxc.sh \
utils/lxc-searx.env \ utils/lxc-searxng.env
.config.sh
$(Q)$(MTOOLS) build_msg TEST "$@ OK" $(Q)$(MTOOLS) build_msg TEST "$@ OK"

View file

@ -1,33 +1,30 @@
digraph G { digraph G {
node [style=filled, shape=box, fillcolor="#ffffcc", fontname="Sans"]; node [style=filled, shape=box, fillcolor="#ffffcc", fontname=Sans];
edge [fontname="Sans"]; edge [fontname="Sans"];
browser [label="Browser", shape=Mdiamond]; browser [label="browser", shape=tab, fillcolor=aliceblue];
rp [label="Reverse Proxy", href="https://docs.searxng.org/utils/filtron.sh.html#public-reverse-proxy"]; rp [label="reverse proxy"];
filtron [label="Filtron", href="https://docs.searxng.org/utils/filtron.sh.html"]; static [label="static files", shape=folder, href="url to configure static files", fillcolor=lightgray];
morty [label="Morty", href="https://docs.searxng.org/utils/morty.sh.html"]; uwsgi [label="uwsgi", shape=parallelogram href="https://docs.searxng.org/utils/searx.sh.html"]
static [label="Static files", href="url to configure static files"]; redis [label="redis DB", shape=cylinder];
uwsgi [label="uwsgi", href="https://docs.searxng.org/utils/searx.sh.html"] searxng1 [label="SearXNG #1", fontcolor=blue3];
searx1 [label="Searx #1"]; searxng2 [label="SearXNG #2", fontcolor=blue3];
searx2 [label="Searx #2"]; searxng3 [label="SearXNG #3", fontcolor=blue3];
searx3 [label="Searx #3"]; searxng4 [label="SearXNG #4", fontcolor=blue3];
searx4 [label="Searx #4"];
browser -> rp [label="HTTPS"] browser -> rp [label="HTTPS"]
subgraph cluster_searx { subgraph cluster_searxng {
label = "Searx instance" fontname="Sans"; label = "SearXNG instance" fontname=Sans;
bgcolor="#fafafa"; bgcolor="#fafafa";
{ rank=same; static rp }; { rank=same; static rp };
rp -> morty [label="optional: images and HTML pages proxy"]; rp -> static [label="optional: reverse proxy serves static files", fillcolor=slategray, fontcolor=slategray];
rp -> static [label="optional: reverse proxy serves directly static files"]; rp -> uwsgi [label="http:// (tcp) or unix:// (socket)"];
rp -> filtron [label="HTTP"]; uwsgi -> searxng1 -> redis;
filtron -> uwsgi [label="HTTP"]; uwsgi -> searxng2 -> redis;
uwsgi -> searx1; uwsgi -> searxng3 -> redis;
uwsgi -> searx2; uwsgi -> searxng4 -> redis;
uwsgi -> searx3;
uwsgi -> searx4;
} }
} }

View file

@ -8,17 +8,19 @@ Architecture
- Reverse Proxy: :ref:`Apache <apache searxng site>` & :ref:`nginx <nginx - Reverse Proxy: :ref:`Apache <apache searxng site>` & :ref:`nginx <nginx
searxng site>` searxng site>`
- Filtron: :ref:`searxng filtron`
- Morty: :ref:`searxng morty`
- uWSGI: :ref:`searxng uwsgi` - uWSGI: :ref:`searxng uwsgi`
- SearXNG: :ref:`installation basic` - SearXNG: :ref:`installation basic`
Herein you will find some hints and suggestions about typical architectures of Herein you will find some hints and suggestions about typical architectures of
SearXNG infrastructures. SearXNG infrastructures.
We start with a contribution from :pull-searx:`@dalf <1776#issuecomment-567917320>`. .. _architecture uWSGI:
It shows a *reference* setup for public SearXNG instances which can build up and
maintained by the scripts from our :ref:`toolboxing`. uWSGI Setup
===========
We start with a *reference* setup for public SearXNG instances which can be build
up and maintained by the scripts from our :ref:`toolboxing`.
.. _arch public: .. _arch public:
@ -26,3 +28,11 @@ maintained by the scripts from our :ref:`toolboxing`.
:alt: arch_public.dot :alt: arch_public.dot
Reference architecture of a public SearXNG setup. Reference architecture of a public SearXNG setup.
The reference installation activates ``server.limiter``, ``server.image_proxy``
and ``ui.static_use_hash`` (:origin:`/etc/searxng/settings.yml
<utils/templates/etc/searxng/settings.yml>`)
.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
:language: yaml
:end-before: # preferences:

View file

@ -15,19 +15,19 @@ Buildhosts
:backlinks: entry :backlinks: entry
To get best results from build, its recommend to install additional packages To get best results from build, its recommend to install additional packages
on build hosts (see :ref:`searx.sh`).:: on build hosts (see :ref:`searxng.sh`).::
sudo -H ./utils/searx.sh install buildhost sudo -H ./utils/searxng.sh install buildhost
This will install packages needed by searx: This will install packages needed by searx:
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START distro-packages :start-after: START distro-packages
:end-before: END distro-packages :end-before: END distro-packages
and packages needed to build docuemtation and run tests: and packages needed to build docuemtation and run tests:
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START build-packages :start-after: START build-packages
:end-before: END build-packages :end-before: END build-packages

View file

@ -42,11 +42,11 @@ Extra Dependencies
For using :ref:`engine redis_server` or :ref:`engine mongodb` you need to For using :ref:`engine redis_server` or :ref:`engine mongodb` you need to
install additional packages in Python's Virtual Environment of your SearXNG install additional packages in Python's Virtual Environment of your SearXNG
instance. To switch into the environment (:ref:`searx-src`) you can use instance. To switch into the environment (:ref:`searxng-src`) you can use
:ref:`searx.sh`:: :ref:`searxng.sh`::
$ sudo utils/searx.sh shell $ sudo utils/searxng.sh instance cmd bash
(searx-pyenv)$ pip install ... (searxng-pyenv)$ pip install ...
.. _engine redis_server: .. _engine redis_server:

View file

@ -207,10 +207,14 @@ Global Settings
``secret_key`` : ``$SEARXNG_SECRET`` ``secret_key`` : ``$SEARXNG_SECRET``
Used for cryptography purpose. Used for cryptography purpose.
.. _limiter:
``limiter`` : ``limiter`` :
Rate limit the number of request on the instance, block some bots. The Rate limit the number of request on the instance, block some bots. The
:ref:`limiter plugin` requires a :ref:`settings redis` database. :ref:`limiter plugin` requires a :ref:`settings redis` database.
.. _image_proxy:
``image_proxy`` : ``image_proxy`` :
Allow your instance of SearXNG of being able to proxy images. Uses memory space. Allow your instance of SearXNG of being able to proxy images. Uses memory space.
@ -225,9 +229,13 @@ Global Settings
``ui:`` ``ui:``
------- -------
.. _cache busting:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#caching_static_assets_with_cache_busting
.. code:: yaml .. code:: yaml
ui: ui:
static_use_hash: false
default_locale: "" default_locale: ""
query_in_title: false query_in_title: false
infinite_scroll: false infinite_scroll: false
@ -236,6 +244,11 @@ Global Settings
theme_args: theme_args:
simple_style: auto simple_style: auto
.. _static_use_hash:
``static_use_hash`` :
Enables `cache busting`_ of static files.
``default_locale`` : ``default_locale`` :
SearXNG interface language. If blank, the locale is detected by using the SearXNG interface language. If blank, the locale is detected by using the
browser language. If it doesn't work, or you are deploying a language browser language. If it doesn't work, or you are deploying a language
@ -427,6 +440,7 @@ engine is shown. Most of the options have a default value or even are optional.
engine: example engine: example
shortcut: demo shortcut: demo
base_url: 'https://{language}.example.com/' base_url: 'https://{language}.example.com/'
send_accept_language_header: false
categories: general categories: general
timeout: 3.0 timeout: 3.0
api_key: 'apikey' api_key: 'apikey'
@ -475,6 +489,13 @@ engine is shown. Most of the options have a default value or even are optional.
use multiple sites using only one engine, or updating the site URL without use multiple sites using only one engine, or updating the site URL without
touching at the code. touching at the code.
``send_accept_language_header`` :
Several engines that support languages (or regions) deal with the HTTP header
``Accept-Language`` to build a response that fits to the locale. When this
option is activated, the language (locale) that is selected by the user is used
to build and send a ``Accept-Language`` header in the request to the origin
search engine.
``categories`` : optional ``categories`` : optional
Define in which categories this engine will be active. Most of the time, it is Define in which categories this engine will be active. Most of the time, it is
defined in the code of the engine, but in a few cases it is useful, like when defined in the code of the engine, but in a few cases it is useful, like when

View file

@ -98,11 +98,11 @@ Extra Dependencies
For using :ref:`engine postgresql` or :ref:`engine mysql_server` you need to For using :ref:`engine postgresql` or :ref:`engine mysql_server` you need to
install additional packages in Python's Virtual Environment of your SearXNG install additional packages in Python's Virtual Environment of your SearXNG
instance. To switch into the environment (:ref:`searx-src`) you can use instance. To switch into the environment (:ref:`searxng-src`) you can use
:ref:`searx.sh`:: :ref:`searxng.sh`::
$ sudo utils/searx.sh shell $ sudo utils/searxng.sh instance cmd bash
(searx-pyenv)$ pip install ... (searxng-pyenv)$ pip install ...
.. _engine postgresql: .. _engine postgresql:

View file

@ -1,193 +0,0 @@
.. _searxng filtron:
==========================
How to protect an instance
==========================
.. tip::
To protect your instance a installation of filtron (as described here) is no
longer needed, alternatively activate the :ref:`limiter plugin` in your
``settings.yml``. Note that the :ref:`limiter plugin` requires a :ref:`Redis
<settings redis>` database.
.. sidebar:: further reading
- :ref:`filtron.sh`
- :ref:`nginx searxng site`
.. _filtron: https://github.com/searxng/filtron
SearXNG depends on external search services. To avoid the abuse of these services
it is advised to limit the number of requests processed by SearXNG.
An application firewall, filtron_ solves exactly this problem. Filtron is just
a middleware between your web server (nginx, apache, ...) and searx, we describe
such infrastructures in chapter: :ref:`architecture`.
filtron & go
============
.. _Go: https://golang.org/
.. _filtron README: https://github.com/searxng/filtron/blob/master/README.md
Filtron needs Go_ installed. If Go_ is preinstalled, filtron_ is simply
installed by ``go get`` package management (see `filtron README`_). If you use
filtron as middleware, a more isolated setup is recommended. To simplify such
an installation and the maintenance of, use our script :ref:`filtron.sh`.
.. _Sample configuration of filtron:
Sample configuration of filtron
===============================
.. sidebar:: Tooling box
- :origin:`/etc/filtron/rules.json <utils/templates/etc/filtron/rules.json>`
An example configuration can be find below. This configuration limits the access
of:
- scripts or applications (roboagent limit)
- webcrawlers (botlimit)
- IPs which send too many requests (IP limit)
- too many json, csv, etc. requests (rss/json limit)
- the same UserAgent of if too many requests (useragent limit)
.. code:: json
[
{
"name": "search request",
"filters": [
"Param:q",
"Path=^(/|/search)$"
],
"interval": "<time-interval-in-sec (int)>",
"limit": "<max-request-number-in-interval (int)>",
"subrules": [
{
"name": "missing Accept-Language",
"filters": ["!Header:Accept-Language"],
"limit": "<max-request-number-in-interval (int)>",
"stop": true,
"actions": [
{"name":"log"},
{"name": "block",
"params": {"message": "Rate limit exceeded"}}
]
},
{
"name": "suspiciously Connection=close header",
"filters": ["Header:Connection=close"],
"limit": "<max-request-number-in-interval (int)>",
"stop": true,
"actions": [
{"name":"log"},
{"name": "block",
"params": {"message": "Rate limit exceeded"}}
]
},
{
"name": "IP limit",
"interval": "<time-interval-in-sec (int)>",
"limit": "<max-request-number-in-interval (int)>",
"stop": true,
"aggregations": [
"Header:X-Forwarded-For"
],
"actions": [
{ "name": "log"},
{ "name": "block",
"params": {
"message": "Rate limit exceeded"
}
}
]
},
{
"name": "rss/json limit",
"filters": [
"Param:format=(csv|json|rss)"
],
"interval": "<time-interval-in-sec (int)>",
"limit": "<max-request-number-in-interval (int)>",
"stop": true,
"actions": [
{ "name": "log"},
{ "name": "block",
"params": {
"message": "Rate limit exceeded"
}
}
]
},
{
"name": "useragent limit",
"interval": "<time-interval-in-sec (int)>",
"limit": "<max-request-number-in-interval (int)>",
"aggregations": [
"Header:User-Agent"
],
"actions": [
{ "name": "log"},
{ "name": "block",
"params": {
"message": "Rate limit exceeded"
}
}
]
}
]
}
]
.. _filtron route request:
Route request through filtron
=============================
.. sidebar:: further reading
- :ref:`filtron.sh overview`
- :ref:`installation nginx`
- :ref:`installation apache`
Filtron can be started using the following command:
.. code:: sh
$ filtron -rules rules.json
It listens on ``127.0.0.1:4004`` and forwards filtered requests to
``127.0.0.1:8888`` by default.
Use it along with ``nginx`` with the following example configuration.
.. code:: nginx
# https://example.org/searx
location /searx {
proxy_pass http://127.0.0.1:4004/;
proxy_set_header Host $host;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Script-Name /searx;
}
location /searx/static {
/usr/local/searx/searx-src/searx/static;
}
Requests are coming from port 4004 going through filtron and then forwarded to
port 8888 where a SearXNG is being run. For a complete setup see: :ref:`nginx
searxng site`.

View file

@ -7,17 +7,15 @@ Administrator documentation
:caption: Contents :caption: Contents
installation installation
installation-docker
installation-scripts
installation-searxng installation-searxng
installation-uwsgi installation-uwsgi
installation-nginx installation-nginx
installation-apache installation-apache
installation-docker
installation-switch2ng
update-searxng update-searxng
engines/index engines/index
api api
architecture architecture
filtron
morty
plugins plugins
buildhosts buildhosts

View file

@ -1,13 +1,13 @@
.. _installation apache: .. _installation apache:
=================== ======
Install with apache Apache
=================== ======
.. _Apache: https://httpd.apache.org/ .. _Apache: https://httpd.apache.org/
.. _Apache Debian: .. _Apache Debian:
https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x): https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):
.. _README.Debian: .. _apache2.README.Debian:
https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian
.. _Apache Arch Linux: .. _Apache Arch Linux:
https://wiki.archlinux.org/index.php/Apache_HTTP_Server https://wiki.archlinux.org/index.php/Apache_HTTP_Server
@ -23,7 +23,9 @@ Install with apache
https://httpd.apache.org/docs/current/en/configuring.html https://httpd.apache.org/docs/current/en/configuring.html
.. _ProxyPreserveHost: https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost .. _ProxyPreserveHost: https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost
.. _LoadModule: .. _LoadModule:
https://httpd.apache.org/docs/2.4/mod/mod_so.html#loadmodule https://httpd.apache.org/docs/mod/mod_so.html#loadmodule
.. _IncludeOptional:
https://httpd.apache.org/docs/mod/core.html#includeoptional
.. _DocumentRoot: .. _DocumentRoot:
https://httpd.apache.org/docs/trunk/mod/core.html#documentroot https://httpd.apache.org/docs/trunk/mod/core.html#documentroot
.. _Location: .. _Location:
@ -32,11 +34,30 @@ Install with apache
https://uwsgi-docs.readthedocs.io/en/latest/Apache.html https://uwsgi-docs.readthedocs.io/en/latest/Apache.html
.. _mod_proxy_uwsgi: .. _mod_proxy_uwsgi:
https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi
.. _mod_proxy_http:
https://httpd.apache.org/docs/current/mod/mod_proxy_http.html
.. _mod_proxy:
https://httpd.apache.org/docs/current/mod/mod_proxy.html
This section explains how to set up a SearXNG instance using the HTTP server Apache_.
If you did use the :ref:`installation scripts` and do not have any special preferences
you can install the :ref:`SearXNG site <apache searxng site>` using
:ref:`searxng.sh <searxng.sh overview>`:
.. code:: bash
$ sudo -H ./utils/searxng.sh install apache
If you have special interests or problems with setting up Apache, the following
section might give you some guidance.
.. sidebar:: further read .. sidebar:: further read
- `Apache Arch Linux`_ - `Apache Arch Linux`_
- `Apache Debian`_ and `README.Debian`_ - `Apache Debian`_
- `apache2.README.Debian`_
- `Apache Fedora`_ - `Apache Fedora`_
- `Apache directives`_ - `Apache directives`_
@ -45,23 +66,8 @@ Install with apache
:local: :local:
:backlinks: entry :backlinks: entry
----
**Install** :ref:`apache searxng site` using :ref:`filtron.sh <filtron.sh overview>` The Apache HTTP server
.. code:: bash
$ sudo -H ./utils/filtron.sh apache install
**Install** :ref:`apache searxng site` using :ref:`morty.sh <morty.sh overview>`
.. code:: bash
$ sudo -H ./utils/morty.sh apache install
----
The apache HTTP server
====================== ======================
If Apache_ is not installed, install it now. If apache_ is new to you, the If Apache_ is not installed, install it now. If apache_ is new to you, the
@ -73,13 +79,13 @@ Directives`_ documentation gives first orientation. There is also a list of
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
sudo -H apt-get install apache2 sudo -H apt-get install apache2
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. code:: sh .. code:: bash
sudo -H pacman -S apache sudo -H pacman -S apache
sudo -H systemctl enable httpd sudo -H systemctl enable httpd
@ -87,21 +93,21 @@ Directives`_ documentation gives first orientation. There is also a list of
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
.. code:: sh .. code:: bash
sudo -H dnf install httpd sudo -H dnf install httpd
sudo -H systemctl enable httpd sudo -H systemctl enable httpd
sudo -H systemctl start httpd sudo -H systemctl start httpd
Now at http://localhost you should see any kind of *Welcome* or *Test* page. Now at http://localhost you should see some kind of *Welcome* or *Test* page.
How this default intro site is configured, depends on the linux distribution How this default site is configured, depends on the linux distribution
(compare `Apache directives`_). (compare `Apache directives`_).
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
less /etc/apache2/sites-enabled/000-default.conf less /etc/apache2/sites-enabled/000-default.conf
@ -115,7 +121,7 @@ How this default intro site is configured, depends on the linux distribution
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. code:: sh .. code:: bash
less /etc/httpd/conf/httpd.conf less /etc/httpd/conf/httpd.conf
@ -130,8 +136,8 @@ How this default intro site is configured, depends on the linux distribution
Require all granted Require all granted
</Directory> </Directory>
The *welcome* page of Arch Linux is a page showing directory located at The *welcome* page of Arch Linux is a page showing the directory located
``DocumentRoot``. This is *directory* page is generated by the Module at ``DocumentRoot``. This *directory* page is generated by the Module
`mod_autoindex <https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html>`_: `mod_autoindex <https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html>`_:
.. code:: apache .. code:: apache
@ -142,7 +148,7 @@ How this default intro site is configured, depends on the linux distribution
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
.. code:: sh .. code:: bash
less /etc/httpd/conf/httpd.conf less /etc/httpd/conf/httpd.conf
@ -163,323 +169,204 @@ How this default intro site is configured, depends on the linux distribution
less /etc/httpd/conf.d/welcome.conf less /etc/httpd/conf.d/welcome.conf
.. _apache searxng site:
Apache Reverse Proxy .. _Debian's Apache layout:
====================
.. sidebar:: public to the internet? Debian's Apache layout
----------------------
If your SearXNG instance is public, stop here and first install :ref:`filtron Be aware, Debian's Apache layout is quite different from the standard Apache
reverse proxy <filtron.sh>` and :ref:`result proxy morty <morty.sh>`, see configuration. For details look at the apache2.README.Debian_
:ref:`installation scripts`. If already done, follow setup: *SearXNG via (``/usr/share/doc/apache2/README.Debian.gz``). Some commands you should know on
filtron plus morty*. Debian:
To setup a Apache revers proxy you have to enable the *headers* and *proxy* * :man:`apache2ctl`: Apache HTTP server control interface
modules and create a `Location`_ configuration for the SearXNG site. In most * :man:`a2enmod`, :man:`a2dismod`: switch on/off modules
distributions you have to un-comment the lines in the main configuration file, * :man:`a2enconf`, :man:`a2disconf`: switch on/off configurations
except in :ref:`The Debian Layout`. * :man:`a2ensite`, :man:`a2dissite`: switch on/off sites
.. _apache modules:
Apache modules
--------------
To load additional modules, in most distributions you have to un-comment the
lines with the corresponding LoadModule_ directive, except in :ref:`Debian's
Apache layout`.
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
In the Apache setup, enable headers and proxy modules: :ref:`Debian's Apache layout` uses :man:`a2enmod` and :man:`a2dismod` to
activate or disable modules:
.. code:: sh .. code:: bash
sudo -H a2enmod ssl
sudo -H a2enmod headers sudo -H a2enmod headers
sudo -H a2enmod proxy sudo -H a2enmod proxy
sudo -H a2enmod proxy_http sudo -H a2enmod proxy_http
sudo -H a2enmod proxy_uwsgi
In :ref:`The Debian Layout` you create a ``searxng.conf`` with the .. group-tab:: Arch Linux
``<Location /searx >`` directive and save this file in the *sites
In the ``/etc/httpd/conf/httpd.conf`` file, activate LoadModule_
directives:
.. code:: apache
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
.. group-tab:: Fedora / RHEL
In the ``/etc/httpd/conf/httpd.conf`` file, activate LoadModule_
directives:
.. code:: apache
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
.. _apache sites:
Apache sites
------------
.. tabs::
.. group-tab:: Ubuntu / debian
In :ref:`Debian's Apache layout` you create a ``searxng.conf`` with the
``<Location /searxng >`` directive and save this file in the *sites
available* folder at ``/etc/apache2/sites-available``. To enable the available* folder at ``/etc/apache2/sites-available``. To enable the
``searxng.conf`` use :man:`a2ensite`: ``searxng.conf`` use :man:`a2ensite`:
.. code:: sh .. code:: bash
sudo -H a2ensite searxng.conf sudo -H a2ensite searxng.conf
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
In the ``/etc/httpd/conf/httpd.conf`` file, activate headers and proxy In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
modules (LoadModule_): directive:
.. code:: apache .. code:: apache
FIXME needs test IncludeOptional sites-enabled/*.conf
LoadModule headers_module modules/mod_headers.so Create two folders, one for the *available sites* and one for the *enabled sites*:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so .. code:: bash
mkdir -p /etc/httpd/sites-available
mkdir -p /etc/httpd/sites-enabled
Create configuration at ``/etc/httpd/sites-available`` and place a
symlink to ``sites-enabled``:
.. code:: bash
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
/etc/httpd/sites-enabled/searxng.conf
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
In the ``/etc/httpd/conf/httpd.conf`` file, activate headers and proxy In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
modules (LoadModule_): directive:
.. code:: apache .. code:: apache
FIXME needs test IncludeOptional sites-enabled/*.conf
LoadModule headers_module modules/mod_headers.so Create two folders, one for the *available sites* and one for the *enabled sites*:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the .. code:: bash
proxied host.
.. _apache searxng via filtron plus morty: mkdir -p /etc/httpd/sites-available
mkdir -p /etc/httpd/sites-enabled
Create configuration at ``/etc/httpd/sites-available`` and place a
symlink to ``sites-enabled``:
.. code:: bash
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
/etc/httpd/sites-enabled/searxng.conf
.. _apache searxng site:
Apache's SearXNG site
=====================
.. _mod_uwsgi: https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi
.. sidebar:: uWSGI
Use mod_proxy_uwsgi_ / don't use the old mod_uwsgi_ anymore.
To proxy the incoming requests to the SearXNG instance Apache needs the
mod_proxy_ module (:ref:`apache modules`).
.. sidebar:: HTTP headers
With ProxyPreserveHost_ the incoming ``Host`` header is passed to the proxied
host.
Depending on what your SearXNG installation is listening on, you need a http
mod_proxy_http_) or socket (mod_proxy_uwsgi_) communication to upstream.
The :ref:`installation scripts` installs the :ref:`reference setup
<use_default_settings.yml>` and a :ref:`uwsgi setup` that listens on a socket by default.
You can install and activate your own ``searxng.conf`` like shown in
:ref:`apache sites`.
.. tabs:: .. tabs::
.. group-tab:: SearXNG via filtron plus morty .. group-tab:: socket
Use this setup, if your instance is public to the internet, compare .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
figure: :ref:`architecture <arch public>` and :ref:`installation scripts`. :start-after: START apache socket
:end-before: END apache socket
1. Configure a reverse proxy for :ref:`filtron <filtron.sh>`, listening on .. group-tab:: http
*localhost 4004* (:ref:`filtron route request`):
.. code:: apache .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START apache http
<Location /searx > :end-before: END apache http
# SetEnvIf Request_URI "/searx" 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
ProxyPreserveHost On
ProxyPass http://127.0.0.1:4004
RequestHeader set X-Script-Name /searx
</Location>
2. Configure reverse proxy for :ref:`morty <searxng morty>`, listening on
*localhost 3000*
.. code:: apache
ProxyPreserveHost On
<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>
For a fully result proxification add :ref:`morty's <searxng morty>` **public
URL** to your :origin:`searx/settings.yml`:
.. code:: yaml
result_proxy:
# replace example.org with your server's public name
url : https://example.org/morty
key : !!binary "insert_your_morty_proxy_key_here"
server:
image_proxy : True
uWSGI support
=============
Be warned, with this setup, your instance isn't :ref:`protected <searxng
filtron>`, nevertheless it is good enough for intranet usage. In modern Linux
distributions, the `mod_proxy_uwsgi`_ is compiled into the *normal* apache
package and you need to install only the :ref:`uWSGI <searxng uwsgi>` package:
.. tabs::
.. group-tab:: Ubuntu / debian
.. code:: sh
sudo -H apt-get install uwsgi
# Ubuntu =< 18.04
sudo -H apt-get install libapache2-mod-proxy-uwsgi
.. group-tab:: Arch Linux
.. code:: sh
sudo -H pacman -S uwsgi
.. group-tab:: Fedora / RHEL
.. code:: sh
sudo -H dnf install uwsgi
The next example shows a configuration using the `uWSGI Apache support`_ via
unix sockets and `mod_proxy_uwsgi`_.
For socket communication, you have to activate ``socket =
/run/uwsgi/app/searx/socket`` and comment out the ``http = 127.0.0.1:8888``
configuration in your :ref:`uwsgi ini file <uwsgi configuration>`. If not
already exists, create a folder for the unix sockets, which can be used by the
SearXNG account (see :ref:`create searxng user`):
.. code:: bash
sudo -H mkdir -p /run/uwsgi/app/searx/
sudo -H chown -R searx:searx /run/uwsgi/app/searx/
If the server is public; to limit access to your intranet replace ``Allow from
all`` directive and replace ``192.168.0.0/16`` with your subnet IP/class.
.. tabs::
.. group-tab:: Ubuntu / debian
.. code:: apache
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
# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog
<Location /searx>
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>
.. group-tab:: Arch Linux
.. code:: apache
FIXME needs test
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog
<Location /searx>
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>
.. group-tab:: Fedora / RHEL
.. code:: apache
FIXME needs test
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
<IfModule proxy_uwsgi_module>
# SetEnvIf Request_URI /searx dontlog
# CustomLog /dev/null combined env=dontlog
<Location /searx>
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>
</IfModule>
.. group-tab:: old mod_wsgi
We show this only for historical reasons, DON'T USE `mod_uwsgi
<https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi>`_.
ANYMORE!
.. code:: apache
<IfModule mod_uwsgi.c>
# SetEnvIf Request_URI "/searx" dontlog
# CustomLog /dev/null combined env=dontlog
<Location /searx >
Require all granted
Options FollowSymLinks Indexes
SetHandler uwsgi-handler
uWSGISocket /run/uwsgi/app/searx/socket
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
</Location>
</IfModule>
.. _restart apache: .. _restart apache:
Restart service Restart service:
===============
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
sudo -H systemctl restart apache2 sudo -H systemctl restart apache2
sudo -H service uwsgi restart searx sudo -H service uwsgi restart searxng
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. code:: sh .. code:: bash
sudo -H systemctl restart httpd sudo -H systemctl restart httpd
sudo -H systemctl restart uwsgi@searx sudo -H systemctl restart uwsgi@searxng
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
.. code:: sh .. code:: bash
sudo -H systemctl restart httpd sudo -H systemctl restart httpd
sudo -H touch /etc/uwsgi.d/searxng.ini sudo -H touch /etc/uwsgi.d/searxng.ini
@ -489,27 +376,13 @@ disable logs
============ ============
For better privacy you can disable Apache logs. In the examples above activate For better privacy you can disable Apache logs. In the examples above activate
one of the lines and `restart apache`_:: one of the lines and `restart apache`_:
.. code:: apache
# SetEnvIf Request_URI "/searx" dontlog SetEnvIf Request_URI "/searxng" dontlog
# CustomLog /dev/null combined env=dontlog # CustomLog /dev/null combined env=dontlog
The ``CustomLog`` directive disable logs for the whole (virtual) server, use it The ``CustomLog`` directive disables logs for the entire (virtual) server, use it
when the URL of the service does not have a path component (``/searx``) / is when the URL of the service does not have a path component (``/searxng``), so when
located at root (``/``). SearXNG is located at root (``/``).
.. _The Debian Layout:
The Debian Layout
=================
Be aware that the Debian layout is quite different from the standard Apache
configuration. For details look at the README.Debian_
(``/usr/share/doc/apache2/README.Debian.gz``). Some commands you should know on
Debian:
* :man:`apache2ctl`: Apache HTTP server control interface
* :man:`a2enmod`, :man:`a2dismod`: switch on/off modules
* :man:`a2enconf`, :man:`a2disconf`: switch on/off configurations
* :man:`a2ensite`, :man:`a2dissite`: switch on/off sites

View file

@ -1,37 +1,60 @@
.. _installation docker: .. _installation docker:
=================== ================
Docker installation Docker Container
=================== ================
.. _ENTRYPOINT: https://docs.docker.com/engine/reference/builder/#entrypoint .. _ENTRYPOINT: https://docs.docker.com/engine/reference/builder/#entrypoint
.. _searxng/searxng @dockerhub: https://hub.docker.com/r/searxng/searxng
.. _searxng-docker: https://github.com/searxng/searxng-docker .. _searxng-docker: https://github.com/searxng/searxng-docker
.. _[filtron]: https://hub.docker.com/r/dalf/filtron
.. _[morty]: https://hub.docker.com/r/dalf/morty
.. _[caddy]: https://hub.docker.com/_/caddy .. _[caddy]: https://hub.docker.com/_/caddy
.. _Redis: https://redis.io/
----
.. sidebar:: info .. sidebar:: info
- `searxng/searxng @dockerhub`_
- :origin:`Dockerfile` - :origin:`Dockerfile`
- `searxng/searxng @dockerhub <https://hub.docker.com/r/searxng/searxng>`_
- `Docker overview <https://docs.docker.com/get-started/overview>`_ - `Docker overview <https://docs.docker.com/get-started/overview>`_
- `Docker Cheat Sheet <https://www.docker.com/sites/default/files/d8/2019-09/docker-cheat-sheet.pdf>`_ - `Docker Cheat Sheet <https://docs.docker.com/get-started/docker_cheatsheet.pdf>`_
- `Alpine Linux <https://alpinelinux.org>`_ `(wiki) <https://en.wikipedia.org/wiki/Alpine_Linux>`__ `apt packages <https://pkgs.alpinelinux.org/packages>`_ - `Alpine Linux <https://alpinelinux.org>`_
`(wiki) <https://en.wikipedia.org/wiki/Alpine_Linux>`__
`apt packages <https://pkgs.alpinelinux.org/packages>`_
- Alpine's ``/bin/sh`` is :man:`dash` - Alpine's ``/bin/sh`` is :man:`dash`
.. tip:: **If you intend to create a public instance using Docker, use our well maintained
docker container**
If you intend to create a public instance using Docker, use our well - `searxng/searxng @dockerhub`_.
maintained searxng-docker_ image which includes
- :ref:`protection <searxng filtron>` `[filtron]`_, .. sidebar:: hint
- a :ref:`result proxy <searxng morty>` `[morty]`_ and
- a HTTPS reverse proxy `[caddy]`_.
Make sure you have `installed Docker <https://docs.docker.com/get-docker/>`_ and The rest of this article is of interest only to those who want to create and
on Linux, don't forget to add your user to the docker group (log out and log maintain their own Docker images.
back in so that your group membership is re-evaluated):
The sources are hosted at searxng-docker_ and the container includes:
- a HTTPS reverse proxy `[caddy]`_ and
- a Redis_ DB
The `default SearXNG setup <https://github.com/searxng/searxng-docker/blob/master/searxng/settings.yml>`_
of this container:
- enables :ref:`limiter <limiter>` to protect against bots
- enables :ref:`image proxy <image_proxy>` for better privacy
- enables :ref:`cache busting <static_use_hash>` to save bandwith
----
Get Docker
==========
If you plan to build and maintain a docker image by yourself, make sure you have
`Docker installed <https://docs.docker.com/get-docker/>`_. On Linux don't
forget to add your user to the docker group (log out and log back in so that
your group membership is re-evaluated):
.. code:: sh .. code:: sh

View file

@ -1,8 +1,8 @@
.. _installation nginx: .. _installation nginx:
================== =====
Install with nginx NGINX
================== =====
.. _nginx: .. _nginx:
https://docs.nginx.com/nginx/admin-guide/ https://docs.nginx.com/nginx/admin-guide/
@ -19,6 +19,19 @@ Install with nginx
.. _SCRIPT_NAME: .. _SCRIPT_NAME:
https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/#werkzeug.wsgi.get_script_name https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/#werkzeug.wsgi.get_script_name
This section explains how to set up a SearXNG instance using the HTTP server nginx_.
If you have used the :ref:`installation scripts` and do not have any special preferences
you can install the :ref:`SearXNG site <nginx searxng site>` using
:ref:`searxng.sh <searxng.sh overview>`:
.. code:: bash
$ sudo -H ./utils/searxng.sh install nginx
If you have special interests or problems with setting up nginx, the following
section might give you some guidance.
.. sidebar:: further reading .. sidebar:: further reading
- nginx_ - nginx_
@ -27,39 +40,23 @@ Install with nginx
- `Getting Started wiki`_ - `Getting Started wiki`_
- `uWSGI support from nginx`_ - `uWSGI support from nginx`_
.. contents:: Contents .. contents:: Contents
:depth: 2 :depth: 2
:local: :local:
:backlinks: entry :backlinks: entry
----
**Install** :ref:`nginx searxng site` using :ref:`filtron.sh <filtron.sh overview>`
.. code:: bash
$ sudo -H ./utils/filtron.sh nginx install
**Install** :ref:`nginx searxng site` using :ref:`morty.sh <morty.sh overview>`
.. code:: bash
$ sudo -H ./utils/morty.sh nginx install
----
The nginx HTTP server The nginx HTTP server
===================== =====================
If nginx_ is not installed (uwsgi will not work with the package nginx-light), If nginx_ is not installed, install it now.
install it now.
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
sudo -H apt-get install nginx sudo -H apt-get install nginx
@ -81,18 +78,18 @@ install it now.
Now at http://localhost you should see a *Welcome to nginx!* page, on Fedora you Now at http://localhost you should see a *Welcome to nginx!* page, on Fedora you
see a *Fedora Webserver - Test Page*. The test page comes from the default see a *Fedora Webserver - Test Page*. The test page comes from the default
`nginx server configuration`_. How this default intro site is configured, `nginx server configuration`_. How this default site is configured,
depends on the linux distribution: depends on the linux distribution:
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
less /etc/nginx/nginx.conf less /etc/nginx/nginx.conf
there is a line including site configurations from: There is one line that includes site configurations from:
.. code:: nginx .. code:: nginx
@ -104,7 +101,7 @@ depends on the linux distribution:
less /etc/nginx/nginx.conf less /etc/nginx/nginx.conf
in there is a configuration section named ``server``: There is a configuration section named ``server``:
.. code-block:: nginx .. code-block:: nginx
@ -120,249 +117,121 @@ depends on the linux distribution:
less /etc/nginx/nginx.conf less /etc/nginx/nginx.conf
there is a line including site configurations from: There is one line that includes site configurations from:
.. code:: nginx .. code:: nginx
include /etc/nginx/conf.d/*.conf; include /etc/nginx/conf.d/*.conf;
.. _nginx searxng site: .. _nginx searxng site:
A nginx SearXNG site NGINX's SearXNG site
==================== ====================
.. sidebar:: public to the internet? Now you have to create a configuration file (``searxng.conf``) for the SearXNG
site. If nginx_ is new to you, the `nginx beginners guide`_ is a good starting
point and the `Getting Started wiki`_ is always a good resource *to keep in the
pocket*.
If your SearXNG instance is public, stop here and first install :ref:`filtron Depending on what your SearXNG installation is listening on, you need a http or socket
reverse proxy <filtron.sh>` and :ref:`result proxy morty <morty.sh>`, see communication to upstream.
:ref:`installation scripts`. If already done, follow setup: *SearXNG via
filtron plus morty*.
Now you have to create a configuration for the SearXNG site. If nginx_ is new to .. tabs::
you, the `nginx beginners guide`_ is a good starting point and the `Getting
Started wiki`_ is always a good resource *to keep in the pocket*. .. group-tab:: socket
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START nginx socket
:end-before: END nginx socket
.. group-tab:: http
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START nginx http
:end-before: END nginx http
The :ref:`installation scripts` installs the :ref:`reference setup
<use_default_settings.yml>` and a :ref:`uwsgi setup` that listens on a socket by default.
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
Create configuration at ``/etc/nginx/sites-available/searxng`` and place a Create configuration at ``/etc/nginx/sites-available/`` and place a
symlink to sites-enabled: symlink to ``sites-enabled``:
.. code:: sh .. code:: bash
sudo -H ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/searxng sudo -H ln -s /etc/nginx/sites-available/searxng.conf \
/etc/nginx/sites-enabled/searxng.conf
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
In the ``/etc/nginx/nginx.conf`` file, replace the configuration section In the ``/etc/nginx/nginx.conf`` file, in the ``server`` section add a
named ``server``. `include <https://nginx.org/en/docs/ngx_core_module.html#include>`_
directive:
.. group-tab:: Fedora / RHEL
Create configuration at ``/etc/nginx/conf.d/searxng`` and place a
symlink to sites-enabled:
.. _nginx searxng via filtron plus morty:
.. tabs::
.. group-tab:: SearXNG via filtron plus morty
Use this setup, if your instance is public to the internet, compare
figure: :ref:`architecture <arch public>` and :ref:`installation scripts`.
1. Configure a reverse proxy for :ref:`filtron <filtron.sh>`, listening on
*localhost 4004* (:ref:`filtron route request`):
.. code:: nginx
# https://example.org/searx
location /searx {
proxy_pass http://127.0.0.1:4004/;
proxy_set_header Host $host;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Script-Name /searx;
}
location /searx/static/ {
alias /usr/local/searx/searx-src/searx/static/;
}
2. Configure reverse proxy for :ref:`morty <searxng morty>`, listening on
*localhost 3000*:
.. code:: nginx
# https://example.org/morty
location /morty {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
For a fully result proxification add :ref:`morty's <searxng morty>` **public
URL** to your :origin:`searx/settings.yml`:
.. code:: yaml
result_proxy:
# replace example.org with your server's public name
url : https://example.org/morty
key : !!binary "insert_your_morty_proxy_key_here"
server:
image_proxy : True
.. group-tab:: proxy or uWSGI
Be warned, with this setup, your instance isn't :ref:`protected <searxng
filtron>`. Nevertheless it is good enough for intranet usage and it is a
excellent example of; *how different services can be set up*. The next
example shows a reverse proxy configuration wrapping the :ref:`searx-uWSGI
application <uwsgi configuration>`, listening on ``http =
127.0.0.1:8888``.
.. code:: nginx
# https://hostname.local/
location / {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header Connection $http_connection;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_buffering off;
}
Alternatively you can use the `uWSGI support from nginx`_ via unix
sockets. For socket communication, you have to activate ``socket =
/run/uwsgi/app/searx/socket`` and comment out the ``http =
127.0.0.1:8888`` configuration in your :ref:`uwsgi ini file <uwsgi
configuration>`.
The example shows a nginx virtual ``server`` configuration, listening on
port 80 (IPv4 and IPv6 http://[::]:80). The uWSGI app is configured at
location ``/`` by importing the `uwsgi_params`_ and passing requests to
the uWSGI socket (``uwsgi_pass``). The ``server``\'s root points to the
:ref:`searx-src clone <searx-src>` and wraps directly the
:origin:`searx/static/` content at ``location /static``.
.. code:: nginx .. code:: nginx
server { server {
# replace hostname.local with your server's name # ...
server_name hostname.local; include /etc/nginx/default.d/*.conf;
# ...
listen 80;
listen [::]:80;
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/app/searx/socket;
}
root /usr/local/searx/searx-src/searx;
location /static { }
} }
If not already exists, create a folder for the unix sockets, which can be Create two folders, one for the *available sites* and one for the *enabled sites*:
used by the SearXNG account:
.. code:: bash .. code:: bash
mkdir -p /run/uwsgi/app/searx/ mkdir -p /etc/nginx/default.d
sudo -H chown -R searx:searx /run/uwsgi/app/searx/ mkdir -p /etc/nginx/default.apps-available
.. group-tab:: \.\. at subdir URL Create configuration at ``/etc/nginx/default.apps-available`` and place a
symlink to ``default.d``:
Be warned, with these setups, your instance isn't :ref:`protected <searxng .. code:: bash
filtron>`. The examples are just here to demonstrate how to export the
SearXNG application from a subdirectory URL ``https://example.org/searx/``.
.. code:: nginx sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
/etc/nginx/default.d/searxng.conf
# https://hostname.local/searx .. group-tab:: Fedora / RHEL
location /searx { Create a folder for the *available sites*:
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host; .. code:: bash
proxy_set_header Connection $http_connection;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Script-Name /searx;
proxy_buffering off;
}
location /searx/static/ { mkdir -p /etc/nginx/default.apps-available
alias /usr/local/searx/searx-src/searx/static/;
}
The ``X-Script-Name /searx`` is needed by the SearXNG implementation to Create configuration at ``/etc/nginx/default.apps-available`` and place a
calculate relative URLs correct. The next example shows a uWSGI symlink to ``conf.d``:
configuration. Since there are no HTTP headers in a (u)WSGI protocol, the
value is shipped via the SCRIPT_NAME_ in the WSGI environment.
.. code:: nginx .. code:: bash
# https://hostname.local/searx sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
/etc/nginx/conf.d/searxng.conf
location /searx { Restart services:
uwsgi_param SCRIPT_NAME /searx;
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/app/searx/socket;
}
location /searx/static/ {
alias /usr/local/searx/searx-src/searx/;
}
For SearXNG to work correctly the ``base_url`` must be set in the
:origin:`searx/settings.yml`.
.. code:: yaml
server:
# replace example.org with your server's public name
base_url : https://example.org/searx/
Restart service:
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. code:: sh .. code:: bash
sudo -H systemctl restart nginx sudo -H systemctl restart nginx
sudo -H service uwsgi restart searx sudo -H service uwsgi restart searxng
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. code:: sh .. code:: bash
sudo -H systemctl restart nginx sudo -H systemctl restart nginx
sudo -H systemctl restart uwsgi@searx sudo -H systemctl restart uwsgi@searxng
.. group-tab:: Fedora .. group-tab:: Fedora / RHEL
.. code:: sh .. code:: bash
sudo -H systemctl restart nginx sudo -H systemctl restart nginx
sudo -H touch /etc/uwsgi.d/searxng.ini sudo -H touch /etc/uwsgi.d/searxng.ini

View file

@ -0,0 +1,62 @@
.. _installation scripts:
===================
Installation Script
===================
.. sidebar:: Update the OS first!
To avoid unwanted side effects, update your OS before installing SearXNG.
The following will install a setup as shown in :ref:`the reference architecture
<arch public>`. First you need to get a clone of the repository. The clone is only needed for
the installation procedure and some maintenance tasks.
.. sidebar:: further read
- :ref:`toolboxing`
Jump to a folder that is readable by *others* and start to clone SearXNG,
alternatively you can create your own fork and clone from there.
.. code:: bash
$ cd ~/Downloads
$ git clone https://github.com/searxng/searxng.git searxng
$ cd searxng
.. sidebar:: further read
- :ref:`inspect searxng`
To install a SearXNG :ref:`reference setup <use_default_settings.yml>`
including a :ref:`uWSGI setup <architecture uWSGI>` as described in the
:ref:`installation basic` and in the :ref:`searxng uwsgi` section type:
.. code:: bash
$ sudo -H ./utils/searxng.sh install all
.. attention::
For the installation procedure, use a *sudoer* login to run the scripts. If
you install from ``root``, take into account that the scripts are creating a
``searxng`` user. In the installation procedure this new created user does
need read access to the cloned SearXNG repository, which is not the case if you clone
it into a folder below ``/root``!
.. sidebar:: further read
- :ref:`update searxng`
.. _caddy: https://hub.docker.com/_/caddy
When all services are installed and running fine, you can add SearXNG to your
HTTP server. We do not have any preferences for the HTTP server, you can use
whatever you prefer.
We use caddy in our :ref:`docker image <installation docker>` and we have
implemented installation procedures for:
- :ref:`installation nginx`
- :ref:`installation apache`

View file

@ -9,15 +9,16 @@ Step by step installation
:local: :local:
:backlinks: entry :backlinks: entry
Step by step installation with virtualenv. For Ubuntu, be sure to have enable
universe repository. In this section we show the setup of a SearXNG instance that will be installed
by the :ref:`installation scripts`.
.. _install packages: .. _install packages:
Install packages Install packages
================ ================
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START distro-packages :start-after: START distro-packages
:end-before: END distro-packages :end-before: END distro-packages
@ -30,32 +31,32 @@ Install packages
Create user Create user
=========== ===========
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START create user :start-after: START create user
:end-before: END create user :end-before: END create user
.. _searx-src: .. _searxng-src:
Install SearXNG & dependencies Install SearXNG & dependencies
============================== ==============================
Start a interactive shell from new created user and clone searx: Start a interactive shell from new created user and clone SearXNG:
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START clone searxng :start-after: START clone searxng
:end-before: END clone searxng :end-before: END clone searxng
In the same shell create *virtualenv*: In the same shell create *virtualenv*:
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START create virtualenv :start-after: START create virtualenv
:end-before: END create virtualenv :end-before: END create virtualenv
To install searx's dependencies, exit the SearXNG *bash* session you opened above To install SearXNG's dependencies, exit the SearXNG *bash* session you opened above
and restart a new. Before install, first check if your *virtualenv* was sourced and start a new one. Before installing, check if your *virtualenv* was sourced
from the login (*~/.profile*): from the login (*~/.profile*):
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START manage.sh update_packages :start-after: START manage.sh update_packages
:end-before: END manage.sh update_packages :end-before: END manage.sh update_packages
@ -77,30 +78,41 @@ Configuration
- :ref:`settings use_default_settings` - :ref:`settings use_default_settings`
- :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>` - :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>`
To create a initial ``/etc/searxng/settings.yml`` you can start with a copy of To create a initial ``/etc/searxng/settings.yml`` we recommend to start with a
the file :origin:`utils/templates/etc/searxng/settings.yml`. This setup copy of the file :origin:`utils/templates/etc/searxng/settings.yml`. This setup
:ref:`use default settings <settings use_default_settings>` from :ref:`use default settings <settings use_default_settings>` from
:origin:`searx/settings.yml`. :origin:`searx/settings.yml` and is shown in the tab *"Use default settings"*
below. This setup:
For a *minimal setup*, configure like shown below replace ``searx@$(uname - enables :ref:`limiter <limiter>` to protect against bots
-n)`` with a name of your choice, set ``ultrasecretkey`` -- *and/or* edit - enables :ref:`image proxy <image_proxy>` for better privacy
``/etc/searxng/settings.yml`` to your needs. - enables :ref:`cache busting <static_use_hash>` to save bandwith
.. kernel-include:: $DOCS_BUILD/includes/searx.rst Modify the ``/etc/searxng/settings.yml`` to your needs:
:start-after: START searxng config
:end-before: END searxng config
.. tabs:: .. tabs::
.. group-tab:: Use default settings .. group-tab:: Use default settings
.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml .. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
:language: yaml :language: yaml
:end-before: # hostname_replace:
To see the entire file jump to :origin:`utils/templates/etc/searxng/settings.yml`
.. group-tab:: searx/settings.yml .. group-tab:: searx/settings.yml
.. literalinclude:: ../../searx/settings.yml .. literalinclude:: ../../searx/settings.yml
:language: yaml :language: yaml
:end-before: # hostname_replace:
To see the entire file jump to :origin:`searx/settings.yml`
For a *minimal setup* you need to set ``server:secret_key``.
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng config
:end-before: END searxng config
Check Check
@ -110,11 +122,11 @@ To check your SearXNG setup, optional enable debugging and start the *webapp*.
SearXNG looks at the exported environment ``$SEARXNG_SETTINGS_PATH`` for a SearXNG looks at the exported environment ``$SEARXNG_SETTINGS_PATH`` for a
configuration file. configuration file.
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START check searxng installation :start-after: START check searxng installation
:end-before: END check searxng installation :end-before: END check searxng installation
If everything works fine, hit ``[CTRL-C]`` to stop the *webapp* and disable the If everything works fine, hit ``[CTRL-C]`` to stop the *webapp* and disable the
debug option in ``settings.yml``. You can now exit SearXNG user bash (enter exit debug option in ``settings.yml``. You can now exit SearXNG user bash session (enter exit
command twice). At this point SearXNG is not demonized; uwsgi allows this. command twice). At this point SearXNG is not demonized; uwsgi allows this.

View file

@ -1,75 +0,0 @@
.. _installation switch2ng:
============================
Switch from searx to SearXNG
============================
.. sidebar:: info
- :pull:`456`
- :pull:`A comment about rolling release <446#issuecomment-954730358>`
.. contents:: Contents
:depth: 2
:local:
:backlinks: entry
If you have a searx installation on your sever and want to switch to SearXNG,
you need to uninstall searx first. If you have an old searx docker installation
replace your docker image / see :ref:`installation docker`.
If your searx instance was installed *"Step by step"* or by the *"Installation
scripts"*, you need to undo the installation procedure completely. If you have
morty & filtron installed, it is recommended to uninstall these services also.
In case of scripts, to uninstall use the scripts from the origin you installed
searx from.
If you have removed the old searx installation, clone from SearXNG and and start
with your installation procedure (e.g. :ref:`installation scripts`):
.. code:: bash
$ cd ~/Downloads
$ git clone https://github.com/searxng/searxng.git searxng
$ cd searxng
$ ...
``.config.sh``
==============
Please take into account; SearXNG has normalized ``.config.sh`` with
``settings.yml`` and some of the environment settings has been removed from or
renamed in the ``.config.sh``:
- :patch:`[mod] normalize .config.sh with settings.yml <f61c918d>`
- :patch:`[fix] ./utils/filtron.sh - FILTRON_TARGET from YAML settings <7196a9b5>`
- :patch:`SearXNG: SEARXNG_SETTINGS_PATH <253b8503>`
Check after Installation
========================
Once you have done your installation, you can run a SearXNG *check* procedure,
to see if there are some left overs. In this example there exists a *old*
``/etc/searx/settings.yml``::
$ sudo -H ./utils/searx.sh install check
============================
SearXNG (check installation)
============================
ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/
INFO: SearXNG instance already installed at: /usr/local/searx/searx-src
...
INFO: Service account searx exists.
INFO: ~searx: python environment is available.
INFO: ~searx: SearXNG software is installed.
INFO: uWSGI app searxng.ini is enabled.
INFO searx : merge the default settings ( /usr/local/searx/searx-src/searx/settings.yml ) and the user setttings ( /etc/searxng/settings.yml )
INFO searx : max_request_timeout=None
To *check* the filtron & morty installations, use similar commands::
$ sudo -H /utils/filtron.sh install check
$ sudo -H /utils/morty.sh install check

View file

@ -1,7 +1,7 @@
.. _searxng uwsgi: .. _searxng uwsgi:
===== =====
uwsgi uWSGI
===== =====
.. sidebar:: further reading .. sidebar:: further reading
@ -29,51 +29,77 @@ uwsgi
Origin uWSGI Origin uWSGI
============ ============
How uWSGI is implemented by distributors is different. uWSGI itself .. _Tyrant mode:
recommend two methods https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting
`systemd.unit`_ template files as described here `One service per app in systemd`_. How uWSGI is implemented by distributors varies. The uWSGI project itself
recommends two methods:
There is one `systemd unit template`_ and one `uwsgi ini file`_ per uWSGI-app 1. `systemd.unit`_ template file as described here `One service per app in systemd`_:
placed at dedicated locations. Take archlinux and a searxng.ini as example::
unit template --> /usr/lib/systemd/system/uwsgi@.service There is one `systemd unit template`_ on the system installed and one `uwsgi
uwsgi ini files --> /etc/uwsgi/searxng.ini ini file`_ per uWSGI-app placed at dedicated locations. Take archlinux and a
``searxng.ini`` as example::
The SearXNG app can be maintained as know from common systemd units:: systemd template unit: /usr/lib/systemd/system/uwsgi@.service
contains: [Service]
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/%I.ini
systemctl enable uwsgi@searx SearXNG application: /etc/uwsgi/searxng.ini
systemctl start uwsgi@searx links to: /etc/uwsgi/apps-available/searxng.ini
systemctl restart uwsgi@searx
systemctl stop uwsgi@searx
The `uWSGI Emperor`_ mode which fits for maintaining a large range of uwsgi apps. The SearXNG app (template ``/etc/uwsgi/%I.ini``) can be maintained as known
from common systemd units:
.. code:: sh
$ systemctl enable uwsgi@searxng
$ systemctl start uwsgi@searxng
$ systemctl restart uwsgi@searxng
$ systemctl stop uwsgi@searxng
2. The `uWSGI Emperor`_ which fits for maintaining a large range of uwsgi
apps and there is a `Tyrant mode`_ to secure multi-user hosting.
The Emperor mode is a special uWSGI instance that will monitor specific The Emperor mode is a special uWSGI instance that will monitor specific
events. The Emperor mode (service) is started by a (common, not template) events. The Emperor mode (the service) is started by a (common, not template)
systemd unit. The Emperor service will scan specific directories for `uwsgi systemd unit.
ini file`_\s (also know as *vassals*). If a *vassal* is added, removed or the
timestamp is modified, a corresponding action takes place: a new uWSGI The Emperor service will scan specific directories for `uwsgi ini file`_\s
instance is started, reload or stopped. Take Fedora and a searxng.ini as (also know as *vassals*). If a *vassal* is added, removed or the timestamp is
example:: modified, a corresponding action takes place: a new uWSGI instance is started,
reload or stopped. Take Fedora and a ``searxng.ini`` as example::
to install & start SearXNG instance create --> /etc/uwsgi.d/searxng.ini
to reload the instance edit timestamp --> touch /etc/uwsgi.d/searxng.ini
to stop instance remove ini --> rm /etc/uwsgi.d/searxng.ini
to start a new SearXNG instance create --> /etc/uwsgi.d/searxng.ini
to reload the instance edit timestamp --> touch /etc/uwsgi.d/searxng.ini
to stop instance remove ini --> rm /etc/uwsgi.d/searxng.ini
Distributors Distributors
============ ============
The `uWSGI Emperor`_ mode and `systemd unit template`_ is what the distributors The `uWSGI Emperor`_ mode and `systemd unit template`_ is what the distributors
mostly offer their users, even if they differ in the way they implement both mostly offer their users, even if they differ in the way they implement both
modes and their defaults. Another point they might differ is the packaging of modes and their defaults. Another point they might differ in is the packaging of
plugins (if so, compare :ref:`install packages`) and what the default python plugins (if so, compare :ref:`install packages`) and what the default python
interpreter is (python2 vs. python3). interpreter is (python2 vs. python3).
Fedora starts a Emperor by default, while archlinux does not start any uwsgi While archlinux does not start a uWSGI service by default, Fedora (RHEL) starts
service by default. Worth to know; debian (ubuntu) follow a complete different a Emperor in `Tyrant mode`_ by default (you should have read :ref:`uWSGI Tyrant
approach. *debian*: your are familiar with the apache infrastructure? .. they mode pitfalls`). Worth to know; debian (ubuntu) follow a complete different
do similar for the uWSGI infrastructure (with less comfort), the folders are:: approach, read see :ref:`Debian's uWSGI layout`.
.. _Debian's uWSGI layout:
Debian's uWSGI layout
---------------------
.. _uwsgi.README.Debian:
https://salsa.debian.org/uwsgi-team/uwsgi/-/raw/debian/latest/debian/uwsgi.README.Debian
Be aware, Debian's uWSGI layout is quite different from the standard uWSGI
configuration. Your are familiar with :ref:`Debian's Apache layout`? .. they do a
similar thing for the uWSGI infrastructure. The folders are::
/etc/uwsgi/apps-available/ /etc/uwsgi/apps-available/
/etc/uwsgi/apps-enabled/ /etc/uwsgi/apps-enabled/
@ -82,29 +108,52 @@ The `uwsgi ini file`_ is enabled by a symbolic link::
ln -s /etc/uwsgi/apps-available/searxng.ini /etc/uwsgi/apps-enabled/ ln -s /etc/uwsgi/apps-available/searxng.ini /etc/uwsgi/apps-enabled/
From debian's documentation (``/usr/share/doc/uwsgi/README.Debian.gz``): You More details can be found in the uwsgi.README.Debian_
could control specific instance(s) by issuing:: (``/usr/share/doc/uwsgi/README.Debian.gz``). Some commands you should know on
Debian:
service uwsgi <command> <confname> <confname> ... .. code:: none
sudo -H service uwsgi start searx Commands recognized by init.d script
sudo -H service uwsgi stop searx ====================================
My experience is, that this command is a bit buggy. You can issue to init.d script following commands:
* start | starts daemon
* stop | stops daemon
* reload | sends to daemon SIGHUP signal
* force-reload | sends to daemon SIGTERM signal
* restart | issues 'stop', then 'start' commands
* status | shows status of daemon instance (running/not running)
.. _uwsgi configuration: 'status' command must be issued with exactly one argument: '<confname>'.
Alltogether Controlling specific instances of uWSGI
=========== =======================================
Create the configuration ini-file according to your distribution (see below) and You could control specific instance(s) by issuing:
restart the uwsgi application.
SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi <command> <confname> <confname>...
where:
* <command> is one of 'start', 'stop' etc.
* <confname> is the name of configuration file (without extension)
For example, this is how instance for /etc/uwsgi/apps-enabled/hello.xml is
started:
SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi start hello
.. _uWSGI maintenance:
uWSGI maintenance
=================
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-description ubuntu-20.04 :start-after: START searxng uwsgi-description ubuntu-20.04
:end-before: END searxng uwsgi-description ubuntu-20.04 :end-before: END searxng uwsgi-description ubuntu-20.04
@ -112,7 +161,7 @@ restart the uwsgi application.
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-description arch :start-after: START searxng uwsgi-description arch
:end-before: END searxng uwsgi-description arch :end-before: END searxng uwsgi-description arch
@ -120,16 +169,28 @@ restart the uwsgi application.
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-description fedora :start-after: START searxng uwsgi-description fedora
:end-before: END searxng uwsgi-description fedora :end-before: END searxng uwsgi-description fedora
.. _uwsgi setup:
uWSGI setup
===========
Create the configuration ini-file according to your distribution and restart the
uwsgi application. As shown below, the :ref:`installation scripts` installs by
default:
- a uWSGI setup that listens on a socket and
- enables :ref:`cache busting <static_use_hash>`.
.. tabs:: .. tabs::
.. group-tab:: Ubuntu / debian .. group-tab:: Ubuntu / debian
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-appini ubuntu-20.04 :start-after: START searxng uwsgi-appini ubuntu-20.04
:end-before: END searxng uwsgi-appini ubuntu-20.04 :end-before: END searxng uwsgi-appini ubuntu-20.04
@ -137,7 +198,7 @@ restart the uwsgi application.
.. group-tab:: Arch Linux .. group-tab:: Arch Linux
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-appini arch :start-after: START searxng uwsgi-appini arch
:end-before: END searxng uwsgi-appini arch :end-before: END searxng uwsgi-appini arch
@ -145,6 +206,63 @@ restart the uwsgi application.
.. group-tab:: Fedora / RHEL .. group-tab:: Fedora / RHEL
.. kernel-include:: $DOCS_BUILD/includes/searx.rst .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
:start-after: START searxng uwsgi-appini fedora :start-after: START searxng uwsgi-appini fedora
:end-before: END searxng uwsgi-appini fedora :end-before: END searxng uwsgi-appini fedora
.. _uWSGI Tyrant mode pitfalls:
Pitfalls of the Tyrant mode
===========================
The implementation of the process owners and groups in the `Tyrant mode`_ is
somewhat unusual and requires special consideration. In `Tyrant mode`_ mode the
Emperor will run the vassal using the UID/GID of the vassal configuration file
(user and group of the app ``.ini`` file).
.. _#2099@uWSGI: https://github.com/unbit/uwsgi/issues/2099
.. _#752@uWSGI: https://github.com/unbit/uwsgi/pull/752
.. _#2425uWSGI: https://github.com/unbit/uwsgi/issues/2425
Without option ``emperor-tyrant-initgroups=true`` in ``/etc/uwsgi.ini`` the
process won't get the additional groups, but this option is not available in
2.0.x branch (see `#2099@uWSGI`_) the feature `#752@uWSGI`_ has been merged (on
Oct. 2014) to the master branch of uWSGI but had never been released; the last
major release is from Dec. 2013, since the there had been only bugfix releases
(see `#2425uWSGI`_). To shorten up:
**In Tyrant mode, there is no way to get additional groups, and the uWSGI
process misses additional permissions that may be needed.**
For example on Fedora (RHEL): If you try to install a redis DB with socket
communication and you want to connect to it from the SearXNG uWSGI, you will see a
*Permission denied* in the log of your instance::
ERROR:searx.shared.redis: [searxng (993)] can't connect redis DB ...
ERROR:searx.shared.redis: Error 13 connecting to unix socket: /usr/local/searxng-redis/run/redis.sock. Permission denied.
ERROR:searx.plugins.limiter: init limiter DB failed!!!
Even if your *searxng* user of the uWSGI process is added to additional groups
to give access to the socket from the redis DB::
$ groups searxng
searxng : searxng searxng-redis
To see the effective groups of the uwsgi process, you have to look at the status
of the process, by example::
$ ps -aef | grep '/usr/sbin/uwsgi --ini searxng.ini'
searxng 93 92 0 12:43 ? 00:00:00 /usr/sbin/uwsgi --ini searxng.ini
searxng 186 93 0 12:44 ? 00:00:01 /usr/sbin/uwsgi --ini searxng.ini
Here you can see that the additional "Groups" of PID 186 are unset (missing gid
of ``searxng-redis``)::
$ cat /proc/186/task/186/status
...
Uid: 993 993 993 993
Gid: 993 993 993 993
FDSize: 128
Groups:
...

View file

@ -4,109 +4,19 @@
Installation Installation
============ ============
.. sidebar:: info
:ref:`installation switch2ng`
*You're spoilt for choice*, choose your preferred method of installation. *You're spoilt for choice*, choose your preferred method of installation.
- :ref:`installation docker` - :ref:`installation docker`
- :ref:`installation scripts` - :ref:`installation scripts`
- :ref:`installation basic` - :ref:`installation basic`
The :ref:`installation basic` is good enough for intranet usage and it is a The :ref:`installation basic` is an excellent illustration of *how a SearXNG
excellent illustration of *how a SearXNG instance is build up*. If you place your instance is build up* (see :ref:`architecture uWSGI`). If you do not have any
instance public to the internet you should really consider to install a special preferences, its recommend to use the :ref:`installation docker` or the
:ref:`filtron reverse proxy <filtron.sh>` and for privacy a :ref:`result proxy :ref:`installation scripts`.
<morty.sh>` is mandatory.
Therefore, if you do not have any special preferences, its recommend to use the .. attention::
:ref:`installation docker` or the `Installation scripts`_ from our :ref:`tooling
box <toolboxing>` as described below.
.. _installation scripts: SearXNG is growing rapidly, you should regularly read our :ref:`migrate and
stay tuned` section. If you want to upgrade an existing instance or migrate
Installation scripts from searx to SearXNG, you should read this section first!
====================
.. sidebar:: Update OS first!
To avoid unwanted side effects, update your OS before installing SearXNG.
The following will install a setup as shown in :ref:`architecture`. First you
need to get a clone. The clone is only needed for the installation procedure
and some maintenance tasks (alternatively you can create your own fork).
For the installation procedure, use a *sudoer* login to run the scripts. If you
install from ``root``, take into account that the scripts are creating a
``searx``, a ``filtron`` and a ``morty`` user. In the installation procedure
these new created users do need read access to the clone of searx, which is not
the case if you clone into a folder below ``/root``.
.. code:: bash
$ cd ~/Downloads
$ git clone https://github.com/searxng/searxng.git searxng
$ cd searxng
.. sidebar:: further read
- :ref:`toolboxing`
- :ref:`update searxng`
- :ref:`inspect searxng`
**Install** :ref:`SearXNG service <searx.sh>`
This installs SearXNG as described in :ref:`installation basic`.
.. code:: bash
$ sudo -H ./utils/searx.sh install all
**Install** :ref:`filtron reverse proxy <filtron.sh>`
.. code:: bash
$ sudo -H ./utils/filtron.sh install all
**Install** :ref:`result proxy <morty.sh>`
.. code:: bash
$ sudo -H ./utils/morty.sh install all
If all services are running fine, you can add it to your HTTP server:
**Install** HTTP
- :ref:`installation apache`
- :ref:`installation nginx`
**Install** :ref:`external plugins <dev plugin>`
Use SearXNG's ``shell`` to install external plugins. In the example below we
install the SearXNG plugins from **The Green Web Foundation** `[ref]
<https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/>`__:
.. code:: bash
$ sudo -H ./utils/searx.sh shell
// exit with [CTRL-D]
(searx-pyenv) searx@ryzen:~$ pip install git+https://github.com/return42/tgwf-searx-plugins
In the :ref:`settings.yml` activate the ``plugins:`` section and add module
``only_show_green_results`` from tgwf-searx-plugins.
.. code:: yaml
plugins:
- only_show_green_results
.. _git stash: https://git-scm.com/docs/git-stash
.. tip::
About script's installation options have a look at chapter :ref:`toolboxing
setup`. How to brand your instance see chapter :ref:`settings global`. To
*stash* your instance's setup, `git stash`_ your clone's :origin:`.config.sh`
file .

View file

@ -1,40 +0,0 @@
.. _searxng morty:
=========================
How to setup result proxy
=========================
.. sidebar:: further reading
- :ref:`morty.sh`
.. _morty: https://github.com/asciimoo/morty
.. _morty's README: https://github.com/asciimoo/morty
By default SearXNG can only act as an image proxy for result images, but it is
possible to proxify all the result URLs with an external service, morty_.
To use this feature, morty has to be installed and activated in SearXNG's
``settings.yml``. Add the following snippet to your ``settings.yml`` and
restart searx:
.. code:: yaml
result_proxy:
url : http://127.0.0.1:3000/
key : !!binary "insert_your_morty_proxy_key_here"
Note that the example above (``http://127.0.0.1:3000``) is only for single-user
instances without a HTTP proxy. If your morty service is public, the url is the
address of the reverse proxy (e.g ``https://example.org/morty``).
For more information about *result proxy* have a look at *"SearXNG via filtron
plus morty"* in the :ref:`nginx <nginx searxng via filtron plus morty>` and
:ref:`apache <apache searxng via filtron plus morty>` sections.
``url``
Is the address of the running morty service.
``key``
Is an optional argument, see `morty's README`_ for more information.

View file

@ -1,59 +1,136 @@
.. _update searxng: ===================
SearXNG maintenance
============= ===================
How to update
=============
How to update depends on the :ref:`installation` method. If you have used the
:ref:`installation scripts`, use ``update`` command from the scripts.
**Update** :ref:`SearXNG service <searx.sh>`
.. code:: sh
sudo -H ./utils/searx.sh update searx
**Update** :ref:`filtron reverse proxy <filtron.sh>`
.. code:: sh
sudo -H ./utils/filtron.sh update filtron
**Update** :ref:`result proxy <morty.sh>`
.. code:: bash
$ sudo -H ./utils/morty.sh update morty
.. _inspect searxng:
======================
How to inspect & debug
======================
.. sidebar:: further read .. sidebar:: further read
- :ref:`toolboxing` - :ref:`toolboxing`
- :ref:`Makefile` - :ref:`uWSGI maintenance`
.. contents:: Contents
:depth: 2
:local:
:backlinks: entry
.. _update searxng:
How to update
=============
How to update depends on the :ref:`installation` method. If you have used the
:ref:`installation scripts`, use the ``update`` command from the :ref:`searxng.sh`
script.
.. code:: sh
sudo -H ./utils/searxng.sh instance update
.. _inspect searxng:
How to inspect & debug
======================
How to debug depends on the :ref:`installation` method. If you have used the How to debug depends on the :ref:`installation` method. If you have used the
:ref:`installation scripts`, use ``inspect`` command from the scripts. :ref:`installation scripts`, use the ``inspect`` command from the :ref:`searxng.sh`
script.
**Inspect** :ref:`SearXNG service <searx.sh>`
.. code:: sh .. code:: sh
sudo -H ./utils/searx.sh inspect service sudo -H ./utils/searxng.sh instance inspect
**Inspect** :ref:`filtron reverse proxy <filtron.sh>` .. _migrate and stay tuned:
.. code:: sh Migrate and stay tuned!
=======================
sudo -H ./utils/filtron.sh inspect service .. sidebar:: info
**Inspect** :ref:`result proxy <morty.sh>` - :pull:`1332`
- :pull:`456`
- :pull:`A comment about rolling release <446#issuecomment-954730358>`
.. code:: bash SearXNG is a *rolling release*; each commit to the master branch is a release.
SearXNG is growing rapidly, the services and opportunities are change every now
and then, to name just a few:
$ sudo -H ./utils/morty.sh inspect service - Bot protection has been switched from filtron to SearXNG's :ref:`limiter
<limiter>`, this requires a :ref:`Redis <settings redis>` database.
- The image proxy morty is no longer needed, it has been replaced by the
:ref:`image proxy <image_proxy>` from SearXNG.
- To save bandwith :ref:`cache busting <static_use_hash>` has been implemented.
To get in use, the ``static-expires`` needs to be set in the :ref:`uwsgi
setup`.
To stay tuned and get in use of the new features, instance maintainers have to
update the SearXNG code regularly (see :ref:`update searxng`). As the above
examples show, this is not always enough, sometimes services have to be set up
or reconfigured and sometimes services that are no longer needed should be
uninstalled.
.. hint::
First of all: SearXNG is installed by the script :ref:`searxng.sh`. If you
have old filtron, morty or searx setup you should consider complete
uninstall/reinstall.
Here you will find a list of changes that affect the infrastructure. Please
check to what extent it is necessary to update your installations:
:pull:`1595`: ``[fix] uWSGI: increase buffer-size``
Re-install uWSGI (:ref:`searxng.sh`) or fix your uWSGI ``searxng.ini``
file manually.
remove obsolete services
------------------------
If your searx instance was installed *"Step by step"* or by the *"Installation
scripts"*, you need to undo the installation procedure completely. If you have
morty & filtron installed, it is recommended to uninstall these services also.
In case of scripts, to uninstall use the scripts from the origin you installed
searx from or try::
$ sudo -H ./utils/filtron.sh remove all
$ sudo -H ./utils/morty.sh remove all
$ sudo -H ./utils/searx.sh remove all
.. hint::
If you are migrate from searx take into account that the ``.config.sh`` is no
longer used.
If you upgrade from searx or from before :pull:`1332` has been merged and you
have filtron and/or morty installed, don't forget to remove HTTP sites.
Apache::
$ sudo -H ./utils/filtron.sh apache remove
$ sudo -H ./utils/morty.sh apache remove
nginx::
$ sudo -H ./utils/filtron.sh nginx remove
$ sudo -H ./utils/morty.sh nginx remove
Check after Installation
------------------------
Once you have done your installation, you can run a SearXNG *check* procedure,
to see if there are some left overs. In this example there exists a *old*
``/etc/searx/settings.yml``::
$ sudo -H ./utils/searxng.sh instance check
SearXNG checks
--------------
ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/
INFO: [OK] (old) account 'searx' does not exists
INFO: [OK] (old) account 'filtron' does not exists
INFO: [OK] (old) account 'morty' does not exists
...
INFO searx.shared : Use shared_simple implementation
INFO searx.shared.redis : connected redis DB --> default

View file

@ -1,4 +1,4 @@
.. template evaluated by: ./utils/searx.sh docs .. template evaluated by: ./utils/searxng.sh searxng.doc.rst
.. hint: all dollar-names are variables, dollar sign itself is quoted by: \\$ .. hint: all dollar-names are variables, dollar sign itself is quoted by: \\$
.. START distro-packages .. START distro-packages
@ -65,7 +65,8 @@ ${fedora_build}
$ sudo -H useradd --shell /bin/bash --system \\ $ sudo -H useradd --shell /bin/bash --system \\
--home-dir \"$SERVICE_HOME\" \\ --home-dir \"$SERVICE_HOME\" \\
--comment 'Privacy-respecting metasearch engine' $SERVICE_USER --comment 'Privacy-respecting metasearch engine' \\
$SERVICE_USER
$ sudo -H mkdir \"$SERVICE_HOME\" $ sudo -H mkdir \"$SERVICE_HOME\"
$ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\" $ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\"
@ -81,7 +82,8 @@ ${fedora_build}
.. code-block:: sh .. code-block:: sh
$ sudo -H -u ${SERVICE_USER} -i $ sudo -H -u ${SERVICE_USER} -i
(${SERVICE_USER})$ git clone \"$GIT_URL\" \"$SEARX_SRC\" (${SERVICE_USER})$ git clone \"$GIT_URL\" \\
\"$SEARXNG_SRC\"
.. END clone searxng .. END clone searxng
@ -93,8 +95,9 @@ ${fedora_build}
.. code-block:: sh .. code-block:: sh
(${SERVICE_USER})$ python3 -m venv \"${SEARX_PYENV}\" (${SERVICE_USER})$ python3 -m venv \"${SEARXNG_PYENV}\"
(${SERVICE_USER})$ echo \". ${SEARX_PYENV}/bin/activate\" >> \"$SERVICE_HOME/.profile\" (${SERVICE_USER})$ echo \". ${SEARXNG_PYENV}/bin/activate\" \\
>> \"$SERVICE_HOME/.profile\"
.. END create virtualenv .. END create virtualenv
@ -109,7 +112,7 @@ ${fedora_build}
$ sudo -H -u ${SERVICE_USER} -i $ sudo -H -u ${SERVICE_USER} -i
(${SERVICE_USER})$ command -v python && python --version (${SERVICE_USER})$ command -v python && python --version
$SEARX_PYENV/bin/python $SEARXNG_PYENV/bin/python
Python 3.8.1 Python 3.8.1
# update pip's boilerplate .. # update pip's boilerplate ..
@ -119,7 +122,7 @@ ${fedora_build}
pip install -U pyyaml pip install -U pyyaml
# jump to SearXNG's working tree and install SearXNG into virtualenv # jump to SearXNG's working tree and install SearXNG into virtualenv
(${SERVICE_USER})$ cd \"$SEARX_SRC\" (${SERVICE_USER})$ cd \"$SEARXNG_SRC\"
(${SERVICE_USER})$ pip install -e . (${SERVICE_USER})$ pip install -e .
@ -134,24 +137,15 @@ ${fedora_build}
.. code-block:: sh .. code-block:: sh
$ sudo -H mkdir -p \"$(dirname ${SEARXNG_SETTINGS_PATH})\" $ sudo -H mkdir -p \"$(dirname ${SEARXNG_SETTINGS_PATH})\"
$ sudo -H cp \"$SEARX_SRC/utils/templates/etc/searxng/settings.yml\" \\ $ sudo -H cp \"$SEARXNG_SRC/utils/templates/etc/searxng/settings.yml\" \\
\"${SEARXNG_SETTINGS_PATH}\" \"${SEARXNG_SETTINGS_PATH}\"
.. group-tab:: searx/settings.yml
.. code-block:: sh
$ sudo -H mkdir -p \"$(dirname ${SEARXNG_SETTINGS_PATH})\"
$ sudo -H cp \"$SEARX_SRC/searx/settings.yml\" \\
\"${SEARXNG_SETTINGS_PATH}\"
.. tabs::
.. group-tab:: minimal setup .. group-tab:: minimal setup
.. code-block:: sh .. code-block:: sh
$ sudo -H sed -i -e \"s/ultrasecretkey/\$(openssl rand -hex 16)/g\" \"$SEARXNG_SETTINGS_PATH\" $ sudo -H sed -i -e \"s/ultrasecretkey/\$(openssl rand -hex 16)/g\" \\
\"$SEARXNG_SETTINGS_PATH\"
.. END searxng config .. END searxng config
@ -168,14 +162,14 @@ ${fedora_build}
# start webapp # start webapp
$ sudo -H -u ${SERVICE_USER} -i $ sudo -H -u ${SERVICE_USER} -i
(${SERVICE_USER})$ cd ${SEARX_SRC} (${SERVICE_USER})$ cd ${SEARXNG_SRC}
(${SERVICE_USER})$ export SEARXNG_SETTINGS_PATH=\"${SEARXNG_SETTINGS_PATH}\" (${SERVICE_USER})$ export SEARXNG_SETTINGS_PATH=\"${SEARXNG_SETTINGS_PATH}\"
(${SERVICE_USER})$ python searx/webapp.py (${SERVICE_USER})$ python searx/webapp.py
# disable debug # disable debug
$ sudo -H sed -i -e \"s/debug : True/debug : False/g\" \"$SEARXNG_SETTINGS_PATH\" $ sudo -H sed -i -e \"s/debug : True/debug : False/g\" \"$SEARXNG_SETTINGS_PATH\"
Open WEB browser and visit http://$SEARX_INTERNAL_HTTP . If you are inside a Open WEB browser and visit http://$SEARXNG_INTERNAL_HTTP . If you are inside a
container or in a script, test with curl: container or in a script, test with curl:
.. tabs:: .. tabs::
@ -184,13 +178,13 @@ container or in a script, test with curl:
.. code-block:: sh .. code-block:: sh
$ xdg-open http://$SEARX_INTERNAL_HTTP $ xdg-open http://$SEARXNG_INTERNAL_HTTP
.. group-tab:: curl .. group-tab:: curl
.. code-block:: none .. code-block:: none
$ curl --location --verbose --head --insecure $SEARX_INTERNAL_HTTP $ curl --location --verbose --head --insecure $SEARXNG_INTERNAL_HTTP
* Trying 127.0.0.1:8888... * Trying 127.0.0.1:8888...
* TCP_NODELAY set * TCP_NODELAY set

View file

@ -195,5 +195,5 @@ html_show_sourcelink = True
# LaTeX ---------------------------------------------------------------- # LaTeX ----------------------------------------------------------------
latex_documents = [ latex_documents = [
(master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual") (master_doc, "searxng-{}.tex".format(VERSION_STRING), html_title, author, "manual")
] ]

View file

@ -66,11 +66,11 @@ For a more detailed description, see :ref:`settings engine` in the :ref:`settin
.. table:: Common options in the engine setup (``settings.yml``) .. table:: Common options in the engine setup (``settings.yml``)
:width: 100% :width: 100%
======================= =========== =============================================== ======================= =========== ==================================================
argument type information argument type information
======================= =========== =============================================== ======================= =========== ==================================================
name string name of search-engine name string name of search-engine
engine string name of searx-engine (filename without ``.py``) engine string name of searxng-engine (file name without ``.py``)
enable_http bool enable HTTP (by default only HTTPS is enabled). enable_http bool enable HTTP (by default only HTTPS is enabled).
shortcut string shortcut of search-engine shortcut string shortcut of search-engine
timeout string specific timeout for search-engine timeout string specific timeout for search-engine
@ -78,7 +78,7 @@ For a more detailed description, see :ref:`settings engine` in the :ref:`settin
proxies dict set proxies for a specific engine proxies dict set proxies for a specific engine
(e.g. ``proxies : {http: socks5://proxy:port, (e.g. ``proxies : {http: socks5://proxy:port,
https: socks5://proxy:port}``) https: socks5://proxy:port}``)
======================= =========== =============================================== ======================= =========== ==================================================
.. _engine overrides: .. _engine overrides:

View file

@ -45,9 +45,7 @@ be set on a *production* system.
The scripts from :ref:`searx_utils` can divide in those to install and maintain The scripts from :ref:`searx_utils` can divide in those to install and maintain
software: software:
- :ref:`searx.sh` - :ref:`searxng.sh`
- :ref:`filtron.sh`
- :ref:`morty.sh`
and the script :ref:`lxc.sh`, with we can scale our installation, maintenance or and the script :ref:`lxc.sh`, with we can scale our installation, maintenance or
even development tasks over a stack of isolated containers / what we call the: even development tasks over a stack of isolated containers / what we call the:
@ -73,7 +71,7 @@ once:
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ snap install lxd $ snap install lxd
$ lxd init --auto $ lxd init --auto
@ -85,28 +83,28 @@ fork:
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ cd ~/Downloads $ cd ~/Downloads
$ git clone https://github.com/searxng/searxng.git searxng $ git clone https://github.com/searxng/searxng.git searxng
$ cd searxng $ cd searxng
The :ref:`lxc-searx.env` consists of several images, see ``export The :ref:`lxc-searxng.env` consists of several images, see ``export
LXC_SUITE=(...`` near by :origin:`utils/lxc-searx.env#L19`. For this blog post LXC_SUITE=(...`` near by :origin:`utils/lxc-searxng.env#L19`. For this blog post
we exercise on a archlinux_ image. The container of this image is named we exercise on a archlinux_ image. The container of this image is named
``searx-archlinux``. Lets build the container, but be sure that this container ``searxng-archlinux``. Lets build the container, but be sure that this container
does not already exists, so first lets remove possible old one: does not already exists, so first lets remove possible old one:
.. tabs:: .. tabs::
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh remove searx-archlinux $ sudo -H ./utils/lxc.sh remove searxng-archlinux
$ sudo -H ./utils/lxc.sh build searx-archlinux $ sudo -H ./utils/lxc.sh build searxng-archlinux
.. sidebar:: The ``searx-archlinux`` container .. sidebar:: The ``searxng-archlinux`` container
is the base of all our exercises here. is the base of all our exercises here.
@ -117,9 +115,9 @@ In this container we install all services :ref:`including searx, morty & filtron
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh install suite searx-archlinux $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
To proxy HTTP from filtron and morty in the container to the outside of the To proxy HTTP from filtron and morty in the container to the outside of the
container, install nginx into the container. Once for the bot blocker filtron: container, install nginx into the container. Once for the bot blocker filtron:
@ -128,9 +126,9 @@ container, install nginx into the container. Once for the bot blocker filtron:
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
./utils/filtron.sh nginx install ./utils/filtron.sh nginx install
... ...
INFO: got 429 from http://10.174.184.156/searx INFO: got 429 from http://10.174.184.156/searx
@ -141,9 +139,9 @@ and once for the content sanitizer (content proxy morty):
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
./utils/morty.sh nginx install ./utils/morty.sh nginx install
... ...
INFO: got 200 from http://10.174.184.156/morty/ INFO: got 200 from http://10.174.184.156/morty/
@ -154,7 +152,7 @@ and once for the content sanitizer (content proxy morty):
blocker (filtron) and WEB content sanitizer (content proxy morty), both are blocker (filtron) and WEB content sanitizer (content proxy morty), both are
needed for a *privacy protecting* search engine. needed for a *privacy protecting* search engine.
On your system, the IP of your ``searx-archlinux`` container differs from On your system, the IP of your ``searxng-archlinux`` container differs from
http://10.174.184.156/searx, just open the URL reported in your installation http://10.174.184.156/searx, just open the URL reported in your installation
protocol in your WEB browser from the desktop to test the instance from outside protocol in your WEB browser from the desktop to test the instance from outside
of the container. of the container.
@ -169,27 +167,27 @@ In containers, work as usual
Usually you open a root-bash using ``sudo -H bash``. In case of LXC containers Usually you open a root-bash using ``sudo -H bash``. In case of LXC containers
open the root-bash in the container using ``./utils/lxc.sh cmd open the root-bash in the container using ``./utils/lxc.sh cmd
searx-archlinux``: searxng-archlinux``:
.. tabs:: .. tabs::
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux bash $ sudo -H ./utils/lxc.sh cmd searxng-archlinux bash
INFO: [searx-archlinux] bash INFO: [searxng-archlinux] bash
[root@searx-archlinux searx]# pwd [root@searxng-archlinux searx]# pwd
/share/searxng /share/searxng
The prompt ``[root@searx-archlinux ...]`` signals, that you are the root user in The prompt ``[root@searxng-archlinux ...]`` signals, that you are the root user in
the searx-container. To debug the running SearXNG instance use: the searxng-container. To debug the running SearXNG instance use:
.. tabs:: .. tabs::
.. group-tab:: root@searx-archlinux .. group-tab:: root@searxng-archlinux
.. code:: sh .. code:: bash
$ ./utils/searx.sh inspect service $ ./utils/searx.sh inspect service
... ...
@ -202,56 +200,42 @@ above. You can stop monitoring using ``CTRL-C``, this also disables the *"debug
option"* in SearXNG's settings file and restarts the SearXNG uwsgi application. option"* in SearXNG's settings file and restarts the SearXNG uwsgi application.
To debug services from filtron and morty analogous use: To debug services from filtron and morty analogous use:
.. tabs:: Another point we have to notice is that the service (:ref:`SearXNG <searxng.sh>`
runs under dedicated system user account with the same name (compare
.. group-tab:: root@searx-archlinux :ref:`create searxng user`). To get a shell from theses accounts, simply call:
.. code:: sh
$ ./utils/filtron.sh inspect service
$ ./utils/morty.sh inspect service
Another point we have to notice is that each service (:ref:`SearXNG <searx.sh>`,
:ref:`filtron <filtron.sh>` and :ref:`morty <morty.sh>`) runs under dedicated
system user account with the same name (compare :ref:`create searxng user`). To
get a shell from theses accounts, simply call one of the scripts:
.. tabs:: .. tabs::
.. group-tab:: root@searx-archlinux .. group-tab:: root@searxng-archlinux
.. code:: sh .. code:: bash
$ ./utils/searx.sh shell $ ./utils/searxng.sh instance cmd bash
$ ./utils/filtron.sh shell
$ ./utils/morty.sh shell
To get in touch, open a shell from the service user (searx@searx-archlinux): To get in touch, open a shell from the service user (searxng@searxng-archlinux):
.. tabs:: .. tabs::
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh instance cmd bash
./utils/searx.sh shell INFO: [searxng-archlinux] ./utils/searxng.sh instance cmd bash
// exit with [CTRL-D] [searxng@searxng-archlinux ~]$
(searx-pyenv) [searx@searx-archlinux ~]$ ...
The prompt ``[searx@searx-archlinux]`` signals that you are logged in as system The prompt ``[searxng@searxng-archlinux]`` signals that you are logged in as system
user ``searx`` in the ``searx-archlinux`` container and the python *virtualenv* user ``searx`` in the ``searxng-archlinux`` container and the python *virtualenv*
``(searx-pyenv)`` environment is activated. ``(searxng-pyenv)`` environment is activated.
.. tabs:: .. tabs::
.. group-tab:: searx@searx-archlinux .. group-tab:: searxng@searxng-archlinux
.. code:: sh .. code:: bash
(searx-pyenv) [searx@searx-archlinux ~]$ pwd
/usr/local/searx
(searxng-pyenv) [searxng@searxng-archlinux ~]$ pwd
/usr/local/searxng
Wrap production into developer suite Wrap production into developer suite
@ -262,23 +246,22 @@ from a LXC container (which is quite ready for production) into a developer
suite. For this, we have to keep an eye on the :ref:`installation basic`: suite. For this, we have to keep an eye on the :ref:`installation basic`:
- SearXNG setup in: ``/etc/searxng/settings.yml`` - SearXNG setup in: ``/etc/searxng/settings.yml``
- SearXNG user's home: ``/usr/local/searx`` - SearXNG user's home: ``/usr/local/searxng``
- virtualenv in: ``/usr/local/searx/searx-pyenv`` - virtualenv in: ``/usr/local/searxng/searxng-pyenv``
- SearXNG software in: ``/usr/local/searx/searx-src`` - SearXNG software in: ``/usr/local/searxng/searxng-src``
With the use of the :ref:`searx.sh` the SearXNG service was installed as With the use of the :ref:`searxng.sh` the SearXNG service was installed as
:ref:`uWSGI application <searxng uwsgi>`. To maintain this service, we can use :ref:`uWSGI application <searxng uwsgi>`. To maintain this service, we can use
``systemctl`` (compare :ref:`service architectures on distributions <uwsgi ``systemctl`` (compare :ref:`uWSGI maintenance`).
configuration>`).
.. tabs:: .. tabs::
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
systemctl stop uwsgi@searx systemctl stop uwsgi@searxng
With the command above, we stopped the SearXNG uWSGI-App in the archlinux With the command above, we stopped the SearXNG uWSGI-App in the archlinux
container. container.
@ -291,29 +274,29 @@ least you should attend the settings of ``uid``, ``chdir``, ``env`` and
env = SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml env = SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml
http = 127.0.0.1:8888 http = 127.0.0.1:8888
chdir = /usr/local/searx/searx-src/searx chdir = /usr/local/searxng/searxng-src/searx
virtualenv = /usr/local/searx/searx-pyenv virtualenv = /usr/local/searxng/searxng-pyenv
pythonpath = /usr/local/searx/searx-src pythonpath = /usr/local/searxng/searxng-src
If you have read the :ref:`"Good to know section" <lxc.sh>` you remember, that If you have read the :ref:`"Good to know section" <lxc.sh>` you remember, that
each container shares the root folder of the repository and the command each container shares the root folder of the repository and the command
``utils/lxc.sh cmd`` handles relative path names **transparent**. To wrap the ``utils/lxc.sh cmd`` handles relative path names **transparent**. To wrap the
SearXNG installation into a developer one, we simple have to create a smylink to SearXNG installation into a developer one, we simple have to create a smylink to
the **transparent** reposetory from the desktop. Now lets replace the the **transparent** reposetory from the desktop. Now lets replace the
repository at ``searx-src`` in the container with the working tree from outside repository at ``searxng-src`` in the container with the working tree from outside
of the container: of the container:
.. tabs:: .. tabs::
.. group-tab:: container becomes a developer suite .. group-tab:: container becomes a developer suite
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
mv /usr/local/searx/searx-src /usr/local/searx/searx-src.old mv /usr/local/searxng/searxng-src /usr/local/searxng/searxng-src.old
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
ln -s /share/searx/ /usr/local/searx/searx-src ln -s /share/searx/ /usr/local/searxng/searxng-src
Now we can develop as usual in the working tree of our desktop system. Every Now we can develop as usual in the working tree of our desktop system. Every
time the software was changed, you have to restart the SearXNG service (in the time the software was changed, you have to restart the SearXNG service (in the
@ -323,9 +306,9 @@ conatiner):
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
systemctl restart uwsgi@searx systemctl restart uwsgi@searx
@ -338,30 +321,30 @@ daily usage:
To *inspect* the SearXNG instance (already described above): To *inspect* the SearXNG instance (already described above):
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
./utils/searx.sh inspect service ./utils/searx.sh inspect service
Run :ref:`makefile`, e.g. to test inside the container: Run :ref:`makefile`, e.g. to test inside the container:
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
make test make test
To install all prerequisites needed for a :ref:`buildhosts`: To install all prerequisites needed for a :ref:`buildhosts`:
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
./utils/searx.sh install buildhost ./utils/searxng.sh install buildhost
To build the docs on a buildhost :ref:`buildhosts`: To build the docs on a buildhost :ref:`buildhosts`:
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh cmd searx-archlinux \ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
make docs.html make docs.html
.. _lxcdev summary: .. _lxcdev summary:
@ -371,18 +354,18 @@ Summary
We build up a fully functional SearXNG suite in a archlinux container: We build up a fully functional SearXNG suite in a archlinux container:
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh install suite searx-archlinux $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
To access HTTP from the desktop we installed nginx for the services inside the To access HTTP from the desktop we installed nginx for the services inside the
conatiner: conatiner:
.. tabs:: .. tabs::
.. group-tab:: [root@searx-archlinux] .. group-tab:: [root@searxng-archlinux]
.. code:: sh .. code:: bash
$ ./utils/filtron.sh nginx install $ ./utils/filtron.sh nginx install
$ ./utils/morty.sh nginx install $ ./utils/morty.sh nginx install
@ -393,12 +376,12 @@ the container :
.. tabs:: .. tabs::
.. group-tab:: [root@searx-archlinux] .. group-tab:: [root@searxng-archlinux]
.. code:: sh .. code:: bash
$ mv /usr/local/searx/searx-src /usr/local/searx/searx-src.old $ mv /usr/local/searxng/searxng-src /usr/local/searxng/searxng-src.old
$ ln -s /share/searx/ /usr/local/searx/searx-src $ ln -s /share/searx/ /usr/local/searxng/searxng-src
$ systemctl restart uwsgi@searx $ systemctl restart uwsgi@searx
To get information about the searxNG suite in the archlinux container we can To get information about the searxNG suite in the archlinux container we can
@ -408,13 +391,13 @@ use:
.. group-tab:: desktop .. group-tab:: desktop
.. code:: sh .. code:: bash
$ sudo -H ./utils/lxc.sh show suite searx-archlinux $ sudo -H ./utils/lxc.sh show suite searxng-archlinux
... ...
[searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx [searxng-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
[searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/ [searxng-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
[searx-archlinux] INFO: (eth0) docs.live: http://10.174.184.156:8080/ [searxng-archlinux] INFO: (eth0) docs.live: http://10.174.184.156:8080/
[searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65] [searxng-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
... ...

View file

@ -40,7 +40,7 @@ We do no longer need to build up the virtualenv manually. Jump into your git
working tree and release a ``make install`` to get a virtualenv with a working tree and release a ``make install`` to get a virtualenv with a
*developer install* of SearXNG (:origin:`setup.py`). :: *developer install* of SearXNG (:origin:`setup.py`). ::
$ cd ~/searx-clone $ cd ~/searxng-clone
$ make install $ make install
PYENV [virtualenv] installing ./requirements*.txt into local/py3 PYENV [virtualenv] installing ./requirements*.txt into local/py3
... ...
@ -288,27 +288,3 @@ To filter out HTTP redirects (3xx_)::
https://news.google.com:443 "GET /search?q=computer&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0 https://news.google.com:443 "GET /search?q=computer&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
https://news.google.com:443 "GET /search?q=computer&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None https://news.google.com:443 "GET /search?q=computer&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
-- --
``make pybuild``
================
.. _PyPi: https://pypi.org/
.. _twine: https://twine.readthedocs.io/en/latest/
Build Python packages in ``./dist/py``::
$ make pybuild
...
BUILD pybuild
running sdist
running egg_info
...
running bdist_wheel
$ ls ./dist
searx-0.18.0-py3-none-any.whl searx-0.18.0.tar.gz
To upload packages to PyPi_, there is also a ``pypi.upload`` target (to test use
``pypi.upload.test``). Since you are not the owner of :pypi:`searx` you will
never need to upload.

View file

@ -55,10 +55,10 @@ admins can install packages in advance.
If there is a need to install additional packages in *Python's Virtual If there is a need to install additional packages in *Python's Virtual
Environment* of your SearXNG instance you need to switch into the environment Environment* of your SearXNG instance you need to switch into the environment
(:ref:`searx-src`) first, for this you can use :ref:`searx.sh`:: (:ref:`searxng-src`) first, for this you can use :ref:`searxng.sh`::
$ sudo utils/searx.sh shell $ sudo utils/searxng.sh instance cmd bash
(searx-pyenv)$ pip install ... (searxng-pyenv)$ pip install ...
Private engines (Security) Private engines (Security)

View file

@ -33,17 +33,26 @@ Example plugin
External plugins External plugins
================ ================
External plugins are standard python modules implementing all the requirements of the standard plugins. SearXNG supports *external plugins* / there is no need to install one, SearXNG
Plugins can be enabled by adding them to :ref:`settings.yml`'s ``plugins`` section. runs out of the box. But to demonstrate; in the example below we install the
Example external plugin can be found `here <https://github.com/asciimoo/searx_external_plugin_example>`_. SearXNG plugins from *The Green Web Foundation* `[ref]
<https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/>`__:
Register your plugin .. code:: bash
====================
$ sudo utils/searxng.sh instance cmd bash
(searxng-pyenv)$ pip install git+https://github.com/return42/tgwf-searx-plugins
In the :ref:`settings.yml` activate the ``plugins:`` section and add module
``only_show_green_results`` from ``tgwf-searx-plugins``.
.. code:: yaml
plugins:
...
- only_show_green_results
...
To enable your plugin register your plugin in
searx > plugin > __init__.py.
And at the bottom of the file add your plugin like.
``plugins.register(name_of_python_file)``
Plugin entry points Plugin entry points
=================== ===================

View file

@ -10,7 +10,7 @@ Development Quickstart
SearXNG loves developers, just clone and start hacking. All the rest is done for SearXNG loves developers, just clone and start hacking. All the rest is done for
you simply by using :ref:`make <makefile>`. you simply by using :ref:`make <makefile>`.
.. code:: sh .. code:: bash
git clone https://github.com/searxng/searxng.git searxng git clone https://github.com/searxng/searxng.git searxng
@ -27,21 +27,21 @@ to our ":ref:`how to contribute`" guideline.
If you implement themes, you will need to setup a :ref:`make node.env` once: If you implement themes, you will need to setup a :ref:`make node.env` once:
.. code:: sh .. code:: bash
make node.env make node.env
Before you call *make run* (2.), you need to compile the modified styles and Before you call *make run* (2.), you need to compile the modified styles and
JavaScript: JavaScript:
.. code:: sh .. code:: bash
make themes.all make themes.all
Alternatively you can also compile selective the theme you have modified, Alternatively you can also compile selective the theme you have modified,
e.g. the *simple* theme. e.g. the *simple* theme.
.. code:: sh .. code:: bash
make themes.simple make themes.simple
@ -52,7 +52,7 @@ e.g. the *simple* theme.
If you finished your *tests* you can start to commit your changes. To separate If you finished your *tests* you can start to commit your changes. To separate
the modified source code from the build products first run: the modified source code from the build products first run:
.. code:: sh .. code:: bash
make static.build.restore make static.build.restore
@ -60,13 +60,13 @@ This will restore the old build products and only your changes of the code
remain in the working tree which can now be added & commited. When all sources remain in the working tree which can now be added & commited. When all sources
are commited, you can commit the build products simply by: are commited, you can commit the build products simply by:
.. code:: sh .. code:: bash
make static.build.commit make static.build.commit
Commiting the build products should be the last step, just before you send us Commiting the build products should be the last step, just before you send us
your PR. There is also a make target to rewind this last build commit: your PR. There is also a make target to rewind this last build commit:
.. code:: sh .. code:: bash
make static.build.drop make static.build.drop

View file

@ -32,12 +32,14 @@ Parameters
See more at :ref:`search-syntax` See more at :ref:`search-syntax`
``categories`` : optional ``categories`` : optional
Comma separated list, specifies the active search categories Comma separated list, specifies the active search categories (see
:ref:`configured engines`)
``engines`` : optional ``engines`` : optional
Comma separated list, specifies the active search engines. Comma separated list, specifies the active search engines (see
:ref:`configured engines`).
``lang`` : default ``all`` ``language`` : default from :ref:`settings search`
Code of the language. Code of the language.
``pageno`` : default ``1`` ``pageno`` : default ``1``
@ -52,25 +54,27 @@ Parameters
``format`` : optional ``format`` : optional
[ ``json``, ``csv``, ``rss`` ] [ ``json``, ``csv``, ``rss`` ]
Output format of results. Output format of results. Format needs to be activated in :ref:`settings
search`.
``results_on_new_tab`` : default ``0`` ``results_on_new_tab`` : default ``0``
[ ``0``, ``1`` ] [ ``0``, ``1`` ]
Open search results on new tab. Open search results on new tab.
``image_proxy`` : default ``False`` ``image_proxy`` : default from :ref:`settings server`
[ ``True``, ``False`` ] [ ``True``, ``False`` ]
Proxy image results through SearXNG. Proxy image results through SearXNG.
``autocomplete`` : default *empty* ``autocomplete`` : default from :ref:`settings search`
[ ``google``, ``dbpedia``, ``duckduckgo``, ``startpage``, ``wikipedia`` ] [ ``google``, ``dbpedia``, ``duckduckgo``, ``startpage``, ``wikipedia``,
``swisscows``, ``qwant`` ]
Service which completes words as you type. Service which completes words as you type.
``safesearch`` : default ``None`` ``safesearch`` : default from :ref:`settings search`
[ ``0``, ``1``, ``None`` ] [ ``0``, ``1``, ``2`` ]
Filter search results of engines which support safe search. See if an engine Filter search results of engines which support safe search. See if an engine
supports safe search in the preferences page of an instance. supports safe search in the preferences page of an instance.
@ -87,20 +91,32 @@ Parameters
``enabled_plugins`` : optional ``enabled_plugins`` : optional
List of enabled plugins. List of enabled plugins.
:default: ``HTTPS_rewrite``, ``Self_Informations``, :default:
``Search_on_category_select``, ``Tracker_URL_remover`` ``Hash_plugin``, ``Search_on_category_select``,
``Self_Informations``, ``Tracker_URL_remover``,
``Ahmia_blacklist``
:values: ``DOAI_rewrite``, ``HTTPS_rewrite``, ``Infinite_scroll``, :values:
``Vim-like_hotkeys``, ``Self_Informations``, ``Tracker_URL_remover``, .. enabled by default
``Search_on_category_select``, ``Hostname_replace``
``Hash_plugin``, ``Search_on_category_select``,
``Self_Informations``, ``Tracker_URL_remover``,
``Ahmia_blacklist``,
.. disabled by default
``Hostname_replace``, ``Open_Access_DOI_rewrite``,
``Vim-like_hotkeys``, ``Tor_check_plugin``
``disabled_plugins``: optional ``disabled_plugins``: optional
List of disabled plugins. List of disabled plugins.
:default: ``DOAI_rewrite``, ``Infinite_scroll``, ``Vim-like_hotkeys``, ``Hostname_replace`` :default:
:values: ``DOAI_rewrite``, ``HTTPS_rewrite``, ``Infinite_scroll``, ``Hostname_replace``, ``Open_Access_DOI_rewrite``,
``Vim-like_hotkeys``, ``Self_Informations``, ``Tracker_URL_remover``, ``Vim-like_hotkeys``, ``Tor_check_plugin``
``Search_on_category_select``, ``Hostname_replace``
:values:
see values from ``enabled_plugins``
``enabled_engines`` : optional : *all* :origin:`engines <searx/engines>` ``enabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
List of enabled engines. List of enabled engines.

View file

@ -0,0 +1,9 @@
.. _tor check plugin:
================
Tor check plugin
================
.. automodule:: searx.plugins.tor_check
:members:

View file

@ -1,80 +0,0 @@
.. _filtron.sh:
====================
``utils/filtron.sh``
====================
.. sidebar:: further reading
- :ref:`searxng filtron`
- :ref:`architecture`
- :ref:`installation` (:ref:`nginx <installation nginx>` & :ref:`apache
<installation apache>`)
.. _Go: https://golang.org/
.. _filtron: https://github.com/searxng/filtron
.. _filtron README: https://github.com/searxng/filtron/blob/master/README.md
To simplify installation and maintenance of a filtron instance you can use the
script :origin:`utils/filtron.sh`. In most cases you will install filtron_
simply by running the command:
.. code:: bash
sudo -H ./utils/filtron.sh install all
The script adds a ``${SERVICE_USER}`` (default:``filtron``) and installs filtron_
into this user account:
#. Create a separated user account (``filtron``).
#. Download and install Go_ binary in user's $HOME (``~filtron``).
#. Install filtron with the package management from Go_ (``go get -v -u
github.com/searxng/filtron``)
#. Setup a proper rule configuration :origin:`[ref]
<utils/templates/etc/filtron/rules.json>` (``/etc/filtron/rules.json``).
#. Setup a systemd service unit :origin:`[ref]
<utils/templates/lib/systemd/system/filtron.service>`
(``/lib/systemd/system/filtron.service``).
Create user
===========
.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
:start-after: START create user
:end-before: END create user
Install go
==========
.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
:start-after: START install go
:end-before: END install go
Install filtron
===============
Install :origin:`rules.json <utils/templates/etc/filtron/rules.json>` at
``/etc/filtron/rules.json`` (see :ref:`Sample configuration of filtron`) and
install filtron software and systemd unit:
.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
:start-after: START install filtron
:end-before: END install filtron
.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
:start-after: START install systemd unit
:end-before: END install systemd unit
.. _filtron.sh overview:
Overview
========
The ``--help`` output of the script is largely self-explanatory
(:ref:`toolboxing common`):
.. program-output:: ../utils/filtron.sh --help

View file

@ -1,52 +1,30 @@
.. _searx_utils: .. _searx_utils:
.. _toolboxing: .. _toolboxing:
=================== ==================
Admin's tooling box DevOps tooling box
=================== ==================
In the folder :origin:`utils/` we maintain some tools useful for administrators. In the folder :origin:`utils/` we maintain some tools useful for administrators
and developers.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:caption: Contents :caption: Contents
searx.sh searxng.sh
filtron.sh
morty.sh
lxc.sh lxc.sh
.. _toolboxing common: Common command environments
===========================
Common commands & environment The scripts in our tooling box often dispose of common environments:
=============================
Scripts to maintain services often dispose of common commands and environments.
``shell`` : command
Opens a shell from the service user ``${SERVICE_USSR}``, very helpful for
troubleshooting.
``inspect service`` : command
Shows status and log of the service, most often you have a option to enable
more verbose debug logs. Very helpful for debugging, but be careful not to
enable debugging in a production environment!
``FORCE_TIMEOUT`` : environment ``FORCE_TIMEOUT`` : environment
Sets timeout for interactive prompts. If you want to run a script in batch Sets timeout for interactive prompts. If you want to run a script in batch
job, with defaults choices, set ``FORCE_TIMEOUT=0``. By example; to install a job, with defaults choices, set ``FORCE_TIMEOUT=0``. By example; to install a
reverse proxy for filtron on all containers of the :ref:`SearXNG suite SearXNG server and nginx proxy on all containers of the :ref:`SearXNG suite
<lxc-searx.env>` use :: <lxc-searxng.env>` use::
sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install all
sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
.. _toolboxing setup:
Tooling box setup
=================
The main setup is done in the :origin:`.config.sh` (read also :ref:`settings
global`).
.. literalinclude:: ../../.config.sh
:language: bash

View file

@ -23,7 +23,7 @@
With the use of *Linux Containers* (LXC_) we can scale our tasks over a stack of With the use of *Linux Containers* (LXC_) we can scale our tasks over a stack of
containers, what we call the: *lxc suite*. The *SearXNG suite* containers, what we call the: *lxc suite*. The *SearXNG suite*
(:origin:`lxc-searx.env <utils/lxc-searx.env>`) is loaded by default, every time (:origin:`lxc-searxng.env <utils/lxc-searxng.env>`) is loaded by default, every time
you start the ``lxc.sh`` script (*you do not need to care about*). you start the ``lxc.sh`` script (*you do not need to care about*).
Before you can start with containers, you need to install and initiate LXD_ Before you can start with containers, you need to install and initiate LXD_
@ -49,7 +49,7 @@ help>`.
If you do not want to build all containers, **you can build just one**:: If you do not want to build all containers, **you can build just one**::
$ sudo -H ./utils/lxc.sh build searx-ubu1804 $ sudo -H ./utils/lxc.sh build searxng-archlinux
*Good to know ...* *Good to know ...*
@ -62,9 +62,9 @@ of::
In the containers, you can run what ever you want, e.g. to start a bash use:: In the containers, you can run what ever you want, e.g. to start a bash use::
$ sudo -H ./utils/lxc.sh cmd searx-ubu1804 bash $ sudo -H ./utils/lxc.sh cmd searxng-archlinux bash
INFO: [searx-ubu1804] bash INFO: [searxng-archlinux] bash
root@searx-ubu1804:/share/searx# [root@searxng-archlinux SearXNG]#
If there comes the time you want to **get rid off all** the containers and If there comes the time you want to **get rid off all** the containers and
**clean up local images** just type:: **clean up local images** just type::
@ -121,28 +121,26 @@ Install suite
============= =============
To install the complete :ref:`SearXNG suite (includes searx, morty & filtron) To install the complete :ref:`SearXNG suite (includes searx, morty & filtron)
<lxc-searx.env>` into all LXC_ use:: <lxc-searxng.env>` into all LXC_ use::
$ sudo -H ./utils/lxc.sh install suite $ sudo -H ./utils/lxc.sh install suite
The command above installs a SearXNG suite (see :ref:`installation scripts`). To The command above installs a SearXNG suite (see :ref:`installation scripts`).
get the IP (URL) of the filtron service in the containers use ``show suite`` To :ref:`install a nginx <installation nginx>` reverse proxy (or alternatively
use :ref:`apache <installation apache>`)::
sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
To get the IP (URL) of the SearXNG service in the containers use ``show suite``
command. To test instances from containers just open the URLs in your command. To test instances from containers just open the URLs in your
WEB-Browser:: WEB-Browser::
$ sudo ./utils/lxc.sh show suite | grep filtron $ sudo ./utils/lxc.sh show suite | grep SEARXNG_URL
[searx-ubu1604] INFO: (eth0) filtron: http://n.n.n.246:4004/ http://n.n.n.246/searx
[searx-ubu1804] INFO: (eth0) filtron: http://n.n.n.147:4004/ http://n.n.n.147/searx
[searx-ubu1910] INFO: (eth0) filtron: http://n.n.n.140:4004/ http://n.n.n.140/searx
[searx-ubu2004] INFO: (eth0) filtron: http://n.n.n.18:4004/ http://n.n.n.18/searx
[searx-fedora31] INFO: (eth0) filtron: http://n.n.n.46:4004/ http://n.n.n.46/searx
[searx-archlinux] INFO: (eth0) filtron: http://n.n.n.32:4004/ http://n.n.n.32/searx
To :ref:`install a nginx <installation nginx>` reverse proxy for filtron and [searxng-ubu2110] SEARXNG_URL : http://n.n.n.147/searxng
morty use (or alternatively use :ref:`apache <installation apache>`):: [searxng-ubu2004] SEARXNG_URL : http://n.n.n.246/searxng
[searxnggfedora35] SEARXNG_URL : http://n.n.n.140/searxng
sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh nginx install [searxng-archlinux] SEARXNG_URL : http://n.n.n.165/searxng
sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/morty.sh nginx install
Running commands Running commands
@ -152,8 +150,8 @@ Running commands
:ref:`toolboxing`. By example: to setup a :ref:`buildhosts` and run the :ref:`toolboxing`. By example: to setup a :ref:`buildhosts` and run the
Makefile target ``test`` in the archlinux_ container:: Makefile target ``test`` in the archlinux_ container::
sudo -H ./utils/lxc.sh cmd searx-archlinux ./utils/searx.sh install buildhost sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh install buildhost
sudo -H ./utils/lxc.sh cmd searx-archlinux make test sudo -H ./utils/lxc.sh cmd searxng-archlinux make test
Setup SearXNG buildhost Setup SearXNG buildhost
@ -164,11 +162,11 @@ The installation procedure to set up a :ref:`build host<buildhosts>` takes its
time. Installation in all containers will take more time (time for another cup time. Installation in all containers will take more time (time for another cup
of coffee).:: of coffee).::
sudo -H ./utils/lxc.sh cmd -- ./utils/searx.sh install buildhost sudo -H ./utils/lxc.sh cmd -- ./utils/searxng.sh install buildhost
To build (live) documentation inside a archlinux_ container:: To build (live) documentation inside a archlinux_ container::
sudo -H ./utils/lxc.sh cmd searx-archlinux make docs.clean docs.live sudo -H ./utils/lxc.sh cmd searxng-archlinux make docs.clean docs.live
... ...
[I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
@ -176,7 +174,7 @@ To get IP of the container and the port number *live docs* is listening::
$ sudo ./utils/lxc.sh show suite | grep docs.live $ sudo ./utils/lxc.sh show suite | grep docs.live
... ...
[searx-archlinux] INFO: (eth0) docs.live: http://n.n.n.12:8080/ [searxng-archlinux] INFO: (eth0) docs.live: http://n.n.n.12:8080/
.. _lxc.sh help: .. _lxc.sh help:
@ -189,10 +187,10 @@ The ``--help`` output of the script is largely self-explanatory:
.. program-output:: ../utils/lxc.sh --help .. program-output:: ../utils/lxc.sh --help
.. _lxc-searx.env: .. _lxc-searxng.env:
SearXNG suite SearXNG suite
============= =============
.. literalinclude:: ../../utils/lxc-searx.env .. literalinclude:: ../../utils/lxc-searxng.env
:language: bash :language: bash

View file

@ -1,80 +0,0 @@
.. _morty: https://github.com/asciimoo/morty
.. _morty's README: https://github.com/asciimoo/morty
.. _Go: https://golang.org/
.. _morty.sh:
==================
``utils/morty.sh``
==================
.. sidebar:: further reading
- :ref:`architecture`
- :ref:`installation` (:ref:`nginx <installation nginx>` & :ref:`apache
<installation apache>`)
- :ref:`searxng morty`
To simplify installation and maintenance of a morty_ instance you can use the
script :origin:`utils/morty.sh`. In most cases you will install morty_ simply by
running the command:
.. code:: bash
sudo -H ./utils/morty.sh install all
The script adds a ``${SERVICE_USER}`` (default:``morty``) and installs morty_
into this user account:
#. Create a separated user account (``morty``).
#. Download and install Go_ binary in user's $HOME (``~morty``).
#. Install morty_ with the package management from Go_ (``go get -v -u
github.com/asciimoo/morty``)
#. Setup a systemd service unit :origin:`[ref]
<utils/templates/lib/systemd/system/morty.service>`
(``/lib/systemd/system/morty.service``).
.. hint::
To add morty to your SearXNG instance read chapter :ref:`searxng morty`.
Create user
===========
.. kernel-include:: $DOCS_BUILD/includes/morty.rst
:start-after: START create user
:end-before: END create user
Install go
==========
.. kernel-include:: $DOCS_BUILD/includes/morty.rst
:start-after: START install go
:end-before: END install go
Install morty
=============
Install morty software and systemd unit:
.. kernel-include:: $DOCS_BUILD/includes/morty.rst
:start-after: START install morty
:end-before: END install morty
.. kernel-include:: $DOCS_BUILD/includes/morty.rst
:start-after: START install systemd unit
:end-before: END install systemd unit
.. _morty.sh overview:
Overview
========
The ``--help`` output of the script is largely self-explanatory
(:ref:`toolboxing common`):
.. program-output:: ../utils/morty.sh --help

View file

@ -1,39 +0,0 @@
.. _searx.sh:
==================
``utils/searx.sh``
==================
.. sidebar:: further reading
- :ref:`architecture`
- :ref:`installation`
- :ref:`installation nginx`
- :ref:`installation apache`
To simplify installation and maintenance of a SearXNG instance you can use the
script :origin:`utils/searx.sh`.
Install
=======
In most cases you will install SearXNG simply by running the command:
.. code:: bash
sudo -H ./utils/searx.sh install all
The script adds a ``${SERVICE_USER}`` (default:``searx``) and installs SearXNG
into this user account. The installation is described in chapter
:ref:`installation basic`.
.. _intranet reverse proxy:
Overview
========
The ``--help`` output of the script is largely self-explanatory
(:ref:`toolboxing common`):
.. program-output:: ../utils/searx.sh --help

36
docs/utils/searxng.sh.rst Normal file
View file

@ -0,0 +1,36 @@
.. _searxng.sh:
====================
``utils/searxng.sh``
====================
.. sidebar:: further reading
- :ref:`architecture`
- :ref:`installation`
- :ref:`installation nginx`
- :ref:`installation apache`
To simplify the installation and maintenance of a SearXNG instance you can use the
script :origin:`utils/searxng.sh`.
Install
=======
In most cases you will install SearXNG simply by running the command:
.. code:: bash
sudo -H ./utils/searx.sh install all
The installation is described in chapter :ref:`installation basic`.
.. _searxng.sh overview:
Overview
========
The ``--help`` output of the script is largely self-explanatory:
.. program-output:: ../utils/searxng.sh --help

7
manage
View file

@ -416,9 +416,7 @@ docs.prebuild() {
set -e set -e
[ "$VERBOSE" = "1" ] && set -x [ "$VERBOSE" = "1" ] && set -x
mkdir -p "${DOCS_BUILD}/includes" mkdir -p "${DOCS_BUILD}/includes"
./utils/searx.sh doc | cat > "${DOCS_BUILD}/includes/searx.rst" ./utils/searxng.sh searxng.doc.rst > "${DOCS_BUILD}/includes/searxng.rst"
./utils/filtron.sh doc | cat > "${DOCS_BUILD}/includes/filtron.rst"
./utils/morty.sh doc | cat > "${DOCS_BUILD}/includes/morty.rst"
pyenv.cmd searxng_extra/docs_prebuild pyenv.cmd searxng_extra/docs_prebuild
) )
dump_return $? dump_return $?
@ -700,7 +698,8 @@ test.pyright() {
| grep -v '/engines/.*.py.* - warning: "logger" is not defined'\ | grep -v '/engines/.*.py.* - warning: "logger" is not defined'\
| grep -v '/plugins/.*.py.* - error: "logger" is not defined'\ | grep -v '/plugins/.*.py.* - error: "logger" is not defined'\
| grep -v '/engines/.*.py.* - warning: "supported_languages" is not defined' \ | grep -v '/engines/.*.py.* - warning: "supported_languages" is not defined' \
| grep -v '/engines/.*.py.* - warning: "language_aliases" is not defined' | grep -v '/engines/.*.py.* - warning: "language_aliases" is not defined' \
| grep -v '/engines/.*.py.* - warning: "categories" is not defined'
dump_return $? dump_return $?
} }

View file

@ -1,14 +1,14 @@
mock==4.0.3 mock==4.0.3
nose2[coverage_plugin]==0.11.0 nose2[coverage_plugin]==0.12.0
cov-core==1.15.0 cov-core==1.15.0
black==22.6.0 black==22.6.0
pycodestyle==2.8.0 pycodestyle==2.8.0
pylint==2.14.4 pylint==2.14.5
splinter==0.18.1 splinter==0.18.1
selenium==4.3.0 selenium==4.3.0
twine==4.0.1 twine==4.0.1
Pallets-Sphinx-Themes==2.0.2 Pallets-Sphinx-Themes==2.0.2
Sphinx==5.0.2 Sphinx==5.1.1
sphinx-issues==3.0.1 sphinx-issues==3.0.1
sphinx-jinja==2.0.2 sphinx-jinja==2.0.2
sphinx-tabs==3.4.1 sphinx-tabs==3.4.1

View file

@ -1,7 +1,7 @@
certifi==2022.6.15 certifi==2022.6.15
babel==2.10.3 babel==2.10.3
flask-babel==2.0.0 flask-babel==2.0.0
flask==2.1.2 flask==2.1.3
jinja2==3.1.2 jinja2==3.1.2
lxml==4.9.1 lxml==4.9.1
pygments==2.12.0 pygments==2.12.0
@ -12,7 +12,7 @@ Brotli==1.0.9
uvloop==0.16.0 uvloop==0.16.0
httpx-socks[asyncio]==0.7.2 httpx-socks[asyncio]==0.7.2
langdetect==1.0.9 langdetect==1.0.9
setproctitle==1.2.3 setproctitle==1.3.0
redis==4.3.4 redis==4.3.4
markdown-it-py==2.1.0 markdown-it-py==2.1.0
typing_extensions==4.3.0 typing_extensions==4.3.0

View file

@ -7,8 +7,11 @@
# pylint: disable=C,R # pylint: disable=C,R
__all__ = ('cached_property',)
try: try:
from functools import cached_property # pylint: disable=unused-import from functools import cached_property # type: ignore
except ImportError: except ImportError:

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1952,6 +1952,10 @@
"english_name": "Banjar", "english_name": "Banjar",
"name": "Bahasa Banjar" "name": "Bahasa Banjar"
}, },
"blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f",
"name": "Pa'O"
},
"bm": { "bm": {
"english_name": "Bambara", "english_name": "Bambara",
"name": "Bamanankan" "name": "Bamanankan"
@ -3218,6 +3222,10 @@
"english_name": "Banjar", "english_name": "Banjar",
"name": "Bahasa Banjar" "name": "Bahasa Banjar"
}, },
"blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f",
"name": "Pa'O"
},
"bm": { "bm": {
"english_name": "Bambara", "english_name": "Bambara",
"name": "Bamanankan" "name": "Bamanankan"

View file

@ -1,8 +1,8 @@
{ {
"versions": [ "versions": [
"102.0", "103.0",
"101.0.1", "102.0.1",
"101.0" "102.0"
], ],
"os": [ "os": [
"Windows NT 10.0; Win64; x64", "Windows NT 10.0; Win64; x64",

View file

@ -44,6 +44,7 @@ ENGINE_DEFAULT_ARGS = {
"enable_http": False, "enable_http": False,
"using_tor_proxy": False, "using_tor_proxy": False,
"display_error_messages": True, "display_error_messages": True,
"send_accept_language_header": False,
"tokens": [], "tokens": [],
"about": {}, "about": {},
} }

View file

@ -25,6 +25,7 @@ categories = ['general', 'web']
paging = True paging = True
time_range_support = False time_range_support = False
safesearch = False safesearch = False
send_accept_language_header = True
supported_languages_url = 'https://www.bing.com/account/general' supported_languages_url = 'https://www.bing.com/account/general'
language_aliases = {} language_aliases = {}
@ -68,7 +69,6 @@ def request(query, params):
logger.debug("headers.Referer --> %s", referer) logger.debug("headers.Referer --> %s", referer)
params['url'] = base_url + search_path params['url'] = base_url + search_path
params['headers']['Accept-Language'] = "en-US,en;q=0.5"
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
return params return params

View file

@ -31,6 +31,7 @@ categories = ['images', 'web']
paging = True paging = True
safesearch = True safesearch = True
time_range_support = True time_range_support = True
send_accept_language_header = True
supported_languages_url = 'https://www.bing.com/account/general' supported_languages_url = 'https://www.bing.com/account/general'
number_of_results = 28 number_of_results = 28

View file

@ -34,6 +34,7 @@ about = {
categories = ['news'] categories = ['news']
paging = True paging = True
time_range_support = True time_range_support = True
send_accept_language_header = True
# search-url # search-url
base_url = 'https://www.bing.com/' base_url = 'https://www.bing.com/'

View file

@ -30,6 +30,7 @@ categories = ['videos', 'web']
paging = True paging = True
safesearch = True safesearch = True
time_range_support = True time_range_support = True
send_accept_language_header = True
number_of_results = 28 number_of_results = 28
base_url = 'https://www.bing.com/' base_url = 'https://www.bing.com/'
@ -70,10 +71,6 @@ def request(query, params):
if params['time_range'] in time_range_dict: if params['time_range'] in time_range_dict:
params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']]) params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']])
# bing videos did not like "older" versions < 70.0.1 when selectin other
# languages then 'en' .. very strange ?!?!
params['headers']['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:73.0.1) Gecko/20100101 Firefox/73.0.1'
return params return params

View file

@ -19,7 +19,8 @@ list in ``settings.yml``:
from json import loads from json import loads
from urllib.parse import urlencode from urllib.parse import urlencode
engine_type = 'offline' engine_type = 'online'
send_accept_language_header = True
categories = ['general'] categories = ['general']
disabled = True disabled = True
timeout = 2.0 timeout = 2.0

View file

@ -31,6 +31,7 @@ categories = ['general', 'web']
paging = True paging = True
supported_languages_url = 'https://duckduckgo.com/util/u588.js' supported_languages_url = 'https://duckduckgo.com/util/u588.js'
time_range_support = True time_range_support = True
send_accept_language_header = True
language_aliases = { language_aliases = {
'ar-SA': 'ar-XA', 'ar-SA': 'ar-XA',

View file

@ -27,6 +27,8 @@ about = {
"results": 'JSON', "results": 'JSON',
} }
send_accept_language_header = True
URL = 'https://api.duckduckgo.com/' + '?{query}&format=json&pretty=0&no_redirect=1&d=1' URL = 'https://api.duckduckgo.com/' + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
WIKIDATA_PREFIX = ['http://www.wikidata.org/entity/', 'https://www.wikidata.org/entity/'] WIKIDATA_PREFIX = ['http://www.wikidata.org/entity/', 'https://www.wikidata.org/entity/']
@ -62,7 +64,6 @@ def request(query, params):
params['url'] = URL.format(query=urlencode({'q': query})) params['url'] = URL.format(query=urlencode({'q': query}))
language = match_language(params['language'], supported_languages, language_aliases) language = match_language(params['language'], supported_languages, language_aliases)
language = language.split('-')[0] language = language.split('-')[0]
params['headers']['Accept-Language'] = language
return params return params

View file

@ -30,6 +30,7 @@ about = {
categories = ['images', 'web'] categories = ['images', 'web']
paging = True paging = True
safesearch = True safesearch = True
send_accept_language_header = True
# search-url # search-url
images_url = 'https://duckduckgo.com/i.js?{query}&s={offset}&p={safesearch}&o=json&vqd={vqd}' images_url = 'https://duckduckgo.com/i.js?{query}&s={offset}&p={safesearch}&o=json&vqd={vqd}'

View file

@ -47,7 +47,7 @@ def response(resp):
dom = html.fromstring(resp.text) dom = html.fromstring(resp.text)
for result in eval_xpath_list(dom, "/html/body/div[2]/div[1]/ol/li"): for result in eval_xpath_list(dom, "//ol[@class='search-results']/li"):
extracted_desc = extract_text(eval_xpath_getindex(result, './/p', 0)) extracted_desc = extract_text(eval_xpath_getindex(result, './/p', 0))

View file

@ -45,6 +45,7 @@ categories = ['general', 'web']
paging = True paging = True
time_range_support = True time_range_support = True
safesearch = True safesearch = True
send_accept_language_header = True
use_mobile_ui = False use_mobile_ui = False
supported_languages_url = 'https://www.google.com/preferences?#languages' supported_languages_url = 'https://www.google.com/preferences?#languages'
@ -112,7 +113,7 @@ filter_mapping = {0: 'off', 1: 'medium', 2: 'high'}
# ------------------------ # ------------------------
# google results are grouped into <div class="jtfYYd ..." ../> # google results are grouped into <div class="jtfYYd ..." ../>
results_xpath = '//div[@class="jtfYYd"]' results_xpath = '//div[contains(@class, "jtfYYd")]'
# google *sections* are no usual *results*, we ignore them # google *sections* are no usual *results*, we ignore them
g_section_with_header = './g-section-with-header' g_section_with_header = './g-section-with-header'
@ -241,16 +242,6 @@ def get_lang_info(params, lang_list, custom_aliases, supported_any_language):
# language. # language.
ret_val['params']['lr'] = "lang_" + lang_list.get(lang_country, language) ret_val['params']['lr'] = "lang_" + lang_list.get(lang_country, language)
# Accept-Language: fr-CH, fr;q=0.8, en;q=0.6, *;q=0.5
ret_val['headers']['Accept-Language'] = ','.join(
[
lang_country,
language + ';q=0.8,',
'en;q=0.6',
'*;q=0.5',
]
)
return ret_val return ret_val
@ -287,7 +278,6 @@ def request(query, params):
'oe': "utf8", 'oe': "utf8",
'start': offset, 'start': offset,
'filter': '0', 'filter': '0',
'ucbcb': 1,
**additional_parameters, **additional_parameters,
} }
) )
@ -299,6 +289,7 @@ def request(query, params):
query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]}) query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]})
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) params['headers'].update(lang_info['headers'])
if use_mobile_ui: if use_mobile_ui:
params['headers']['Accept'] = '*/*' params['headers']['Accept'] = '*/*'

View file

@ -51,6 +51,7 @@ paging = False
use_locale_domain = True use_locale_domain = True
time_range_support = True time_range_support = True
safesearch = True safesearch = True
send_accept_language_header = True
filter_mapping = {0: 'images', 1: 'active', 2: 'active'} filter_mapping = {0: 'images', 1: 'active', 2: 'active'}
@ -125,16 +126,13 @@ def request(query, params):
"""Google-Video search request""" """Google-Video search request"""
lang_info = get_lang_info(params, supported_languages, language_aliases, False) lang_info = get_lang_info(params, supported_languages, language_aliases, False)
logger.debug("HTTP header Accept-Language --> %s", lang_info['headers']['Accept-Language'])
query_url = ( query_url = (
'https://' 'https://'
+ lang_info['subdomain'] + lang_info['subdomain']
+ '/search' + '/search'
+ "?" + "?"
+ urlencode( + urlencode({'q': query, 'tbm': "isch", **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'num': 30})
{'q': query, 'tbm': "isch", **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'num': 30, 'ucbcb': 1}
)
) )
if params['time_range'] in time_range_dict: if params['time_range'] in time_range_dict:
@ -143,6 +141,7 @@ def request(query, params):
query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]}) query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]})
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) params['headers'].update(lang_info['headers'])
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
return params return params

View file

@ -70,13 +70,13 @@ time_range_support = True
# #
# safesearch : results are identitical for safesearch=0 and safesearch=2 # safesearch : results are identitical for safesearch=0 and safesearch=2
safesearch = False safesearch = False
send_accept_language_header = True
def request(query, params): def request(query, params):
"""Google-News search request""" """Google-News search request"""
lang_info = get_lang_info(params, supported_languages, language_aliases, False) lang_info = get_lang_info(params, supported_languages, language_aliases, False)
logger.debug("HTTP header Accept-Language --> %s", lang_info['headers']['Accept-Language'])
# google news has only one domain # google news has only one domain
lang_info['subdomain'] = 'news.google.com' lang_info['subdomain'] = 'news.google.com'
@ -97,13 +97,12 @@ def request(query, params):
+ lang_info['subdomain'] + lang_info['subdomain']
+ '/search' + '/search'
+ "?" + "?"
+ urlencode( + urlencode({'q': query, **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'gl': lang_info['country']})
{'q': query, **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'gl': lang_info['country'], 'ucbcb': 1}
)
+ ('&ceid=%s' % ceid) + ('&ceid=%s' % ceid)
) # ceid includes a ':' character which must not be urlencoded ) # ceid includes a ':' character which must not be urlencoded
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) params['headers'].update(lang_info['headers'])
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'

View file

@ -22,11 +22,14 @@ about = {
} }
categories = ["files", "apps"] categories = ["files", "apps"]
search_url = "https://play.google.com/store/search?{query}&c=apps&ucbcb=1" send_accept_language_header = True
search_url = "https://play.google.com/store/search?{query}&c=apps"
def request(query, params): def request(query, params):
params["url"] = search_url.format(query=urlencode({"q": query})) params["url"] = search_url.format(query=urlencode({"q": query}))
params['cookies']['CONSENT'] = "YES+"
return params return params

View file

@ -52,6 +52,7 @@ language_support = True
use_locale_domain = True use_locale_domain = True
time_range_support = True time_range_support = True
safesearch = False safesearch = False
send_accept_language_header = True
def time_range_url(params): def time_range_url(params):
@ -75,7 +76,6 @@ def request(query, params):
offset = (params['pageno'] - 1) * 10 offset = (params['pageno'] - 1) * 10
lang_info = get_lang_info(params, supported_languages, language_aliases, False) lang_info = get_lang_info(params, supported_languages, language_aliases, False)
logger.debug("HTTP header Accept-Language --> %s", lang_info['headers']['Accept-Language'])
# subdomain is: scholar.google.xy # subdomain is: scholar.google.xy
lang_info['subdomain'] = lang_info['subdomain'].replace("www.", "scholar.") lang_info['subdomain'] = lang_info['subdomain'].replace("www.", "scholar.")
@ -85,12 +85,13 @@ def request(query, params):
+ lang_info['subdomain'] + lang_info['subdomain']
+ '/scholar' + '/scholar'
+ "?" + "?"
+ urlencode({'q': query, **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'start': offset, 'ucbcb': 1}) + urlencode({'q': query, **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'start': offset})
) )
query_url += time_range_url(params) query_url += time_range_url(params)
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) params['headers'].update(lang_info['headers'])
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'

View file

@ -60,6 +60,7 @@ language_support = True
use_locale_domain = True use_locale_domain = True
time_range_support = True time_range_support = True
safesearch = True safesearch = True
send_accept_language_header = True
RE_CACHE = {} RE_CACHE = {}
@ -111,14 +112,13 @@ def request(query, params):
"""Google-Video search request""" """Google-Video search request"""
lang_info = get_lang_info(params, supported_languages, language_aliases, False) lang_info = get_lang_info(params, supported_languages, language_aliases, False)
logger.debug("HTTP header Accept-Language --> %s", lang_info['headers']['Accept-Language'])
query_url = ( query_url = (
'https://' 'https://'
+ lang_info['subdomain'] + lang_info['subdomain']
+ '/search' + '/search'
+ "?" + "?"
+ urlencode({'q': query, 'tbm': "vid", **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'ucbcb': 1}) + urlencode({'q': query, 'tbm': "vid", **lang_info['params'], 'ie': "utf8", 'oe': "utf8"})
) )
if params['time_range'] in time_range_dict: if params['time_range'] in time_range_dict:
@ -127,6 +127,7 @@ def request(query, params):
query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]}) query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]})
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) params['headers'].update(lang_info['headers'])
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
return params return params

View file

@ -5,7 +5,7 @@
""" """
import re import re
from pymongo import MongoClient # pylint: disable=import-error from pymongo import MongoClient # pyright: ignore # pylint: disable=import-error
engine_type = 'offline' engine_type = 'offline'

View file

@ -6,7 +6,7 @@
# import error is ignored because the admin has to install mysql manually to use # import error is ignored because the admin has to install mysql manually to use
# the engine # the engine
import mysql.connector # pylint: disable=import-error import mysql.connector # pyright: ignore # pylint: disable=import-error
engine_type = 'offline' engine_type = 'offline'
auth_plugin = 'caching_sha2_password' auth_plugin = 'caching_sha2_password'

View file

@ -30,6 +30,7 @@ about = {
categories = ['map'] categories = ['map']
paging = False paging = False
language_support = True language_support = True
send_accept_language_header = True
# search-url # search-url
base_url = 'https://nominatim.openstreetmap.org/' base_url = 'https://nominatim.openstreetmap.org/'
@ -142,9 +143,8 @@ def request(query, params):
params['url'] = base_url + search_string.format(query=urlencode({'q': query})) params['url'] = base_url + search_string.format(query=urlencode({'q': query}))
params['route'] = route_re.match(query) params['route'] = route_re.match(query)
params['headers']['User-Agent'] = searx_useragent() params['headers']['User-Agent'] = searx_useragent()
if 'Accept-Language' not in params['headers']:
accept_language = 'en' if params['language'] == 'all' else params['language'] params['headers']['Accept-Language'] = 'en'
params['headers']['Accept-Language'] = accept_language
return params return params

View file

@ -6,7 +6,7 @@
# import error is ignored because the admin has to install mysql manually to use # import error is ignored because the admin has to install mysql manually to use
# the engine # the engine
import psycopg2 # pylint: disable=import-error import psycopg2 # pyright: ignore # pylint: disable=import-error
engine_type = 'offline' engine_type = 'offline'
host = "127.0.0.1" host = "127.0.0.1"

View file

@ -1,6 +1,8 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
"""Słownik Języka Polskiego (general) # lint: pylint
"""Słownik Języka Polskiego
Dictionary of the polish language from PWN (sjp.pwn)
""" """
from lxml.html import fromstring from lxml.html import fromstring

View file

@ -17,6 +17,7 @@ billion images `[tineye.com] <https://tineye.com/how>`_.
from urllib.parse import urlencode from urllib.parse import urlencode
from datetime import datetime from datetime import datetime
from flask_babel import gettext
about = { about = {
"website": 'https://tineye.com', "website": 'https://tineye.com',
@ -28,20 +29,41 @@ about = {
} }
engine_type = 'online_url_search' engine_type = 'online_url_search'
""":py:obj:`searx.search.processors.online_url_search`"""
categories = ['general'] categories = ['general']
paging = True paging = True
safesearch = False safesearch = False
base_url = 'https://tineye.com' base_url = 'https://tineye.com'
search_string = '/result_json/?page={page}&{query}' search_string = '/result_json/?page={page}&{query}'
FORMAT_NOT_SUPPORTED = gettext(
"Could not read that image url. This may be due to an unsupported file"
" format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or WebP."
)
"""TinEye error message"""
NO_SIGNATURE_ERROR = gettext(
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
)
"""TinEye error message"""
DOWNLOAD_ERROR = gettext("The image could not be downloaded.")
"""TinEye error message"""
def request(query, params): def request(query, params):
"""Build TinEye HTTP request using ``search_urls`` of a :py:obj:`engine_type`."""
params['raise_for_httperror'] = False
if params['search_urls']['data:image']: if params['search_urls']['data:image']:
query = params['search_urls']['data:image'] query = params['search_urls']['data:image']
elif params['search_urls']['http']: elif params['search_urls']['http']:
query = params['search_urls']['http'] query = params['search_urls']['http']
logger.debug("query URL: %s", query)
query = urlencode({'url': query}) query = urlencode({'url': query})
# see https://github.com/TinEye/pytineye/blob/main/pytineye/api.py # see https://github.com/TinEye/pytineye/blob/main/pytineye/api.py
@ -59,45 +81,145 @@ def request(query, params):
return params return params
def parse_tineye_match(match_json):
"""Takes parsed JSON from the API server and turns it into a :py:obj:`dict`
object.
Attributes `(class Match) <https://github.com/TinEye/pytineye/blob/main/pytineye/api.py>`__
- `image_url`, link to the result image.
- `domain`, domain this result was found on.
- `score`, a number (0 to 100) that indicates how closely the images match.
- `width`, image width in pixels.
- `height`, image height in pixels.
- `size`, image area in pixels.
- `format`, image format.
- `filesize`, image size in bytes.
- `overlay`, overlay URL.
- `tags`, whether this match belongs to a collection or stock domain.
- `backlinks`, a list of Backlink objects pointing to the original websites
and image URLs. List items are instances of :py:obj:`dict`, (`Backlink
<https://github.com/TinEye/pytineye/blob/main/pytineye/api.py>`__):
- `url`, the image URL to the image.
- `backlink`, the original website URL.
- `crawl_date`, the date the image was crawled.
"""
# HINT: there exists an alternative backlink dict in the domains list / e.g.::
#
# match_json['domains'][0]['backlinks']
backlinks = []
if "backlinks" in match_json:
for backlink_json in match_json["backlinks"]:
if not isinstance(backlink_json, dict):
continue
crawl_date = backlink_json.get("crawl_date")
if crawl_date:
crawl_date = datetime.fromisoformat(crawl_date[:-3])
else:
crawl_date = datetime.min
backlinks.append(
{
'url': backlink_json.get("url"),
'backlink': backlink_json.get("backlink"),
'crawl_date': crawl_date,
'image_name': backlink_json.get("image_name"),
}
)
return {
'image_url': match_json.get("image_url"),
'domain': match_json.get("domain"),
'score': match_json.get("score"),
'width': match_json.get("width"),
'height': match_json.get("height"),
'size': match_json.get("size"),
'image_format': match_json.get("format"),
'filesize': match_json.get("filesize"),
'overlay': match_json.get("overlay"),
'tags': match_json.get("tags"),
'backlinks': backlinks,
}
def response(resp): def response(resp):
"""Parse HTTP response from TinEye."""
results = [] results = []
# Define wanted results try:
json_data = resp.json() json_data = resp.json()
number_of_results = json_data['num_matches'] except Exception as exc: # pylint: disable=broad-except
msg = "can't parse JSON response // %s" % exc
logger.error(msg)
json_data = {'error': msg}
for i in json_data['matches']: # handle error codes from Tineye
image_format = i['format']
width = i['width']
height = i['height']
thumbnail_src = i['image_url']
backlink = i['domains'][0]['backlinks'][0]
url = backlink['backlink']
source = backlink['url']
title = backlink['image_name']
img_src = backlink['url']
# Get and convert published date if resp.is_error:
api_date = backlink['crawl_date'][:-3] if resp.status_code in (400, 422):
publishedDate = datetime.fromisoformat(api_date)
# Append results message = 'HTTP status: %s' % resp.status_code
error = json_data.get('error')
s_key = json_data.get('suggestions', {}).get('key', '')
if error and s_key:
message = "%s (%s)" % (error, s_key)
elif error:
message = error
if s_key == "Invalid image URL":
# test https://docs.searxng.org/_static/searxng-wordmark.svg
message = FORMAT_NOT_SUPPORTED
elif s_key == 'NO_SIGNATURE_ERROR':
# test https://pngimg.com/uploads/dot/dot_PNG4.png
message = NO_SIGNATURE_ERROR
elif s_key == 'Download Error':
# test https://notexists
message = DOWNLOAD_ERROR
# see https://github.com/searxng/searxng/pull/1456#issuecomment-1193105023
# results.append({'answer': message})
logger.error(message)
return results
resp.raise_for_status()
# append results from matches
for match_json in json_data['matches']:
tineye_match = parse_tineye_match(match_json)
if not tineye_match['backlinks']:
continue
backlink = tineye_match['backlinks'][0]
results.append( results.append(
{ {
'template': 'images.html', 'template': 'images.html',
'url': url, 'url': backlink['backlink'],
'thumbnail_src': thumbnail_src, 'thumbnail_src': tineye_match['image_url'],
'source': source, 'source': backlink['url'],
'title': title, 'title': backlink['image_name'],
'img_src': img_src, 'img_src': backlink['url'],
'format': image_format, 'format': tineye_match['image_format'],
'widht': width, 'widht': tineye_match['width'],
'height': height, 'height': tineye_match['height'],
'publishedDate': publishedDate, 'publishedDate': backlink['crawl_date'],
} }
) )
# Append number of results # append number of results
results.append({'number_of_results': number_of_results})
number_of_results = json_data.get('num_matches')
if number_of_results:
results.append({'number_of_results': number_of_results})
return results return results

View file

@ -19,6 +19,9 @@ about = {
"results": 'JSON', "results": 'JSON',
} }
send_accept_language_header = True
# search-url # search-url
search_url = 'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}' search_url = 'https://{language}.wikipedia.org/api/rest_v1/page/summary/{title}'
supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias' supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
@ -41,9 +44,6 @@ def request(query, params):
language = url_lang(params['language']) language = url_lang(params['language'])
params['url'] = search_url.format(title=quote(query), language=language) params['url'] = search_url.format(title=quote(query), language=language)
if params['language'].lower() in language_variants.get(language, []):
params['headers']['Accept-Language'] = params['language'].lower()
params['headers']['User-Agent'] = searx_useragent() params['headers']['User-Agent'] = searx_useragent()
params['raise_for_httperror'] = False params['raise_for_httperror'] = False
params['soft_max_redirects'] = 2 params['soft_max_redirects'] = 2

View file

@ -25,7 +25,7 @@ time_range_support = True
# search-url # search-url
base_url = 'https://www.youtube.com/results' base_url = 'https://www.youtube.com/results'
search_url = base_url + '?search_query={query}&page={page}&ucbcb=1' search_url = base_url + '?search_query={query}&page={page}'
time_range_url = '&sp=EgII{time_range}%253D%253D' time_range_url = '&sp=EgII{time_range}%253D%253D'
# the key seems to be constant # the key seems to be constant
next_page_url = 'https://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8' next_page_url = 'https://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
@ -36,6 +36,7 @@ base_youtube_url = 'https://www.youtube.com/watch?v='
# do search-request # do search-request
def request(query, params): def request(query, params):
params['cookies']['CONSENT'] = "YES+"
if not params['engine_data'].get('next_page_token'): if not params['engine_data'].get('next_page_token'):
params['url'] = search_url.format(query=quote_plus(query), page=params['pageno']) params['url'] = search_url.format(query=quote_plus(query), page=params['pageno'])
if params['time_range'] in time_range_dict: if params['time_range'] in time_range_dict:

View file

@ -0,0 +1,88 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""A plugin to check if the ip address of the request is a TOR exit node if the
user searches for ``tor-check``. It fetches the tor exit node list from
https://check.torproject.org/exit-addresses and parses all the IPs into a list,
then checks if the user's IP address is in it.
Enable in ``settings.yml``:
.. code:: yaml
enabled_plugins:
..
- 'Tor check plugin'
"""
import re
from flask_babel import gettext
from httpx import HTTPError
from searx.network import get
default_on = False
name = gettext("Tor check plugin")
'''Translated name of the plugin'''
description = gettext(
"This plugin checks if the address of the request is a TOR exit node, and"
" informs the user if it is, like check.torproject.org but from searxng."
)
'''Translated description of the plugin.'''
preference_section = 'query'
'''The preference section where the plugin is shown.'''
query_keywords = ['tor-check']
'''Query keywords shown in the preferences.'''
query_examples = ''
'''Query examples shown in the preferences.'''
# Regex for exit node addresses in the list.
reg = re.compile(r"(?<=ExitAddress )\S+")
def post_search(request, search):
if search.search_query.pageno > 1:
return True
if search.search_query.query.lower() == "tor-check":
# Request the list of tor exit nodes.
try:
resp = get("https://check.torproject.org/exit-addresses")
node_list = re.findall(reg, resp.text)
except HTTPError:
# No answer, return error
search.result_container.answers["tor"] = {
"answer": gettext(
"The TOR exit node list (https://check.torproject.org/exit-addresses) is unreachable."
)
}
return True
x_forwarded_for = request.headers.getlist("X-Forwarded-For")
if x_forwarded_for:
ip_address = x_forwarded_for[0]
else:
ip_address = request.remote_addr
if ip_address in node_list:
search.result_container.answers["tor"] = {
"answer": gettext(
"You are using TOR. Your IP address seems to be: {ip_address}.".format(ip_address=ip_address)
)
}
else:
search.result_container.answers["tor"] = {
"answer": gettext(
"You are not using TOR. Your IP address seems to be: {ip_address}.".format(ip_address=ip_address)
)
}
return True

View file

@ -2,11 +2,12 @@
# lint: pylint # lint: pylint
# pylint: disable=missing-module-docstring, too-few-public-methods # pylint: disable=missing-module-docstring, too-few-public-methods
import typing
import threading import threading
from timeit import default_timer from timeit import default_timer
from uuid import uuid4 from uuid import uuid4
import flask
from searx import settings from searx import settings
from searx.answerers import ask from searx.answerers import ask
from searx.external_bang import get_bang_url from searx.external_bang import get_bang_url
@ -181,7 +182,7 @@ class SearchWithPlugins(Search):
__slots__ = 'ordered_plugin_list', 'request' __slots__ = 'ordered_plugin_list', 'request'
def __init__(self, search_query: SearchQuery, ordered_plugin_list, request: "flask.Request"): def __init__(self, search_query: SearchQuery, ordered_plugin_list, request: flask.Request):
super().__init__(search_query) super().__init__(search_query)
self.ordered_plugin_list = ordered_plugin_list self.ordered_plugin_list = ordered_plugin_list
self.result_container.on_result = self._on_result self.result_container.on_result = self._on_result

View file

@ -16,7 +16,7 @@ from searx import logger, settings, searx_debug
from searx.exceptions import SearxSettingsException from searx.exceptions import SearxSettingsException
from searx.search.processors import PROCESSORS from searx.search.processors import PROCESSORS
from searx.search.checker import Checker from searx.search.checker import Checker
from searx.shared import schedule, storage from searx.shared import schedule, storage # pyright: ignore
CHECKER_RESULT = 'CHECKER_RESULT' CHECKER_RESULT = 'CHECKER_RESULT'

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import typing import typing
import babel
class EngineRef: class EngineRef:
@ -29,6 +30,7 @@ class SearchQuery:
'query', 'query',
'engineref_list', 'engineref_list',
'lang', 'lang',
'locale',
'safesearch', 'safesearch',
'pageno', 'pageno',
'time_range', 'time_range',
@ -59,6 +61,13 @@ class SearchQuery:
self.external_bang = external_bang self.external_bang = external_bang
self.engine_data = engine_data or {} self.engine_data = engine_data or {}
self.locale = None
if self.lang:
try:
self.locale = babel.Locale.parse(self.lang, sep='-')
except babel.core.UnknownLocaleError:
pass
@property @property
def categories(self): def categories(self):
return list(set(map(lambda engineref: engineref.category, self.engineref_list))) return list(set(map(lambda engineref: engineref.category, self.engineref_list)))

View file

@ -138,6 +138,13 @@ class EngineProcessor(ABC):
return False return False
def get_params(self, search_query, engine_category): def get_params(self, search_query, engine_category):
"""Returns a set of *request params* or ``None`` if request is not supported.
Not supported conditions (``None`` is returned):
- A page-number > 1 when engine does not support paging.
- A time range when the engine does not support time range.
"""
# if paging is not supported, skip # if paging is not supported, skip
if search_query.pageno > 1 and not self.engine.paging: if search_query.pageno > 1 and not self.engine.paging:
return None return None

View file

@ -60,6 +60,17 @@ class OnlineProcessor(EngineProcessor):
# add an user agent # add an user agent
params['headers']['User-Agent'] = gen_useragent() params['headers']['User-Agent'] = gen_useragent()
# add Accept-Language header
if self.engine.send_accept_language_header and search_query.locale:
ac_lang = search_query.locale.language
if search_query.locale.territory:
ac_lang = "%s-%s,%s;q=0.9,*;q=0.5" % (
search_query.locale.language,
search_query.locale.territory,
search_query.locale.language,
)
params['headers']['Accept-Language'] = ac_lang
return params return params
def _send_http_request(self, params): def _send_http_request(self, params):

View file

@ -38,6 +38,9 @@ class OnlineCurrencyProcessor(OnlineProcessor):
engine_type = 'online_currency' engine_type = 'online_currency'
def get_params(self, search_query, engine_category): def get_params(self, search_query, engine_category):
"""Returns a set of *request params* or ``None`` if search query does not match
to :py:obj:`parser_re`."""
params = super().get_params(search_query, engine_category) params = super().get_params(search_query, engine_category)
if params is None: if params is None:
return None return None

View file

@ -18,6 +18,8 @@ class OnlineDictionaryProcessor(OnlineProcessor):
engine_type = 'online_dictionary' engine_type = 'online_dictionary'
def get_params(self, search_query, engine_category): def get_params(self, search_query, engine_category):
"""Returns a set of *request params* or ``None`` if search query does not match
to :py:obj:`parser_re`."""
params = super().get_params(search_query, engine_category) params = super().get_params(search_query, engine_category)
if params is None: if params is None:
return None return None

View file

@ -20,6 +20,9 @@ class OnlineUrlSearchProcessor(OnlineProcessor):
engine_type = 'online_url_search' engine_type = 'online_url_search'
def get_params(self, search_query, engine_category): def get_params(self, search_query, engine_category):
"""Returns a set of *request params* or ``None`` if search query does not match
to at least one of :py:obj:`re_search_urls`.
"""
params = super().get_params(search_query, engine_category) params = super().get_params(search_query, engine_category)
if params is None: if params is None:
return None return None

View file

@ -187,6 +187,7 @@ outgoing:
# - 'Hostname replace' # see hostname_replace configuration below # - 'Hostname replace' # see hostname_replace configuration below
# - 'Open Access DOI rewrite' # - 'Open Access DOI rewrite'
# - 'Vim-like hotkeys' # - 'Vim-like hotkeys'
# - 'Tor check plugin'
# Configuration of the "Hostname replace" plugin: # Configuration of the "Hostname replace" plugin:
# #
@ -747,6 +748,7 @@ engines:
- name: google play movies - name: google play movies
engine: xpath engine: xpath
send_accept_language_header: true
search_url: https://play.google.com/store/search?q={query}&c=movies search_url: https://play.google.com/store/search?q={query}&c=movies
results_xpath: '//div[@class="ImZGtf mpg5gc"]' results_xpath: '//div[@class="ImZGtf mpg5gc"]'
title_xpath: './/div[@class="RZEgze"]//div[@class="kCSSQe"]//a' title_xpath: './/div[@class="RZEgze"]//div[@class="kCSSQe"]//a'
@ -1735,7 +1737,7 @@ engines:
results: HTML results: HTML
language: de language: de
- name: słownik języka polskiego - name: sjp.pwn
engine: sjp engine: sjp
shortcut: sjp shortcut: sjp
base_url: https://sjp.pwn.pl/ base_url: https://sjp.pwn.pl/

View file

@ -1,11 +1,14 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import logging import logging
import importlib
logger = logging.getLogger('searx.shared') logger = logging.getLogger('searx.shared')
__all__ = ['SharedDict', 'schedule']
try: try:
import uwsgi uwsgi = importlib.import_module('uwsgi')
except: except:
# no uwsgi # no uwsgi
from .shared_simple import SimpleSharedDict as SharedDict, schedule from .shared_simple import SimpleSharedDict as SharedDict, schedule

View file

@ -19,10 +19,13 @@ A redis DB connect can be tested by::
""" """
import os
import pwd
import logging import logging
import redis import redis
from searx import get_setting from searx import get_setting
logger = logging.getLogger('searx.shared.redis') logger = logging.getLogger('searx.shared.redis')
_client = None _client = None
@ -42,6 +45,7 @@ def init():
logger.info("connected redis DB --> %s", c.acl_whoami()) logger.info("connected redis DB --> %s", c.acl_whoami())
return True return True
except redis.exceptions.ConnectionError as exc: except redis.exceptions.ConnectionError as exc:
logger.error("can't connet redis DB ...") _pw = pwd.getpwuid(os.getuid())
logger.error("[%s (%s)] can't connect redis DB ...", _pw.pw_name, _pw.pw_uid)
logger.error(" %s", exc) logger.error(" %s", exc)
return False return False

View file

@ -2,7 +2,7 @@
import time import time
from typing import Optional from typing import Optional
import uwsgi # pylint: disable=E0401 import uwsgi # pyright: ignore # pylint: disable=E0401
from . import shared_abstract from . import shared_abstract

View file

@ -7,22 +7,22 @@
# ButterflyOfFire, 2018 # ButterflyOfFire, 2018
# d506c013dc1b502e7a53f91ebcbf8f29_985b4b3, 2017-2018 # d506c013dc1b502e7a53f91ebcbf8f29_985b4b3, 2017-2018
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# ken kailer <kenkailer@yahoo.com>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-13 15:40+0000\n" "PO-Revision-Date: 2022-07-19 05:45+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Arabic <https://weblate.bubu1.eu/projects/searxng/searxng/ar/>"
"\n"
"Language: ar\n" "Language: ar\n"
"Language-Team: Arabic "
"<https://weblate.bubu1.eu/projects/searxng/searxng/ar/>\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : "
"n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -43,7 +43,7 @@ msgstr "ملفات"
#. CATEGORY_NAMES['GENERAL'] #. CATEGORY_NAMES['GENERAL']
#: searx/searxng.msg #: searx/searxng.msg
msgid "general" msgid "general"
msgstr "الرئيسية" msgstr "عامة"
#. CATEGORY_NAMES['MUSIC'] #. CATEGORY_NAMES['MUSIC']
#: searx/searxng.msg #: searx/searxng.msg
@ -53,7 +53,7 @@ msgstr "موسيقى"
#. CATEGORY_NAMES['SOCIAL_MEDIA'] #. CATEGORY_NAMES['SOCIAL_MEDIA']
#: searx/searxng.msg #: searx/searxng.msg
msgid "social media" msgid "social media"
msgstr "الشبكات الإجتماعية" msgstr "الشبكات التواصل الإجتماعية"
#. CATEGORY_NAMES['IMAGES'] #. CATEGORY_NAMES['IMAGES']
#: searx/searxng.msg #: searx/searxng.msg
@ -68,7 +68,7 @@ msgstr "فيديوهات"
#. CATEGORY_NAMES['IT'] #. CATEGORY_NAMES['IT']
#: searx/searxng.msg #: searx/searxng.msg
msgid "it" msgid "it"
msgstr "علوم و تكنولوجيا" msgstr "علوم التكنولوجيا"
#. CATEGORY_NAMES['NEWS'] #. CATEGORY_NAMES['NEWS']
#: searx/searxng.msg #: searx/searxng.msg
@ -78,7 +78,7 @@ msgstr "أخبار"
#. CATEGORY_NAMES['MAP'] #. CATEGORY_NAMES['MAP']
#: searx/searxng.msg #: searx/searxng.msg
msgid "map" msgid "map"
msgstr "خرائط" msgstr "خريطة"
#. CATEGORY_NAMES['ONIONS'] #. CATEGORY_NAMES['ONIONS']
#: searx/searxng.msg #: searx/searxng.msg
@ -244,7 +244,7 @@ msgstr "الدالات الإحصائية"
#: searx/answerers/statistics/answerer.py:48 #: searx/answerers/statistics/answerer.py:48
msgid "Compute {functions} of the arguments" msgid "Compute {functions} of the arguments"
msgstr "" msgstr "حوسبة معطيات ال{العملية}"
#: searx/engines/openstreetmap.py:160 #: searx/engines/openstreetmap.py:160
msgid "Get directions" msgid "Get directions"
@ -266,13 +266,30 @@ msgstr "لا يوجد ملخص لهذا المنشور"
msgid "Channel" msgid "Channel"
msgstr "القناة" msgstr "القناة"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr "يحول السلسلة إلى ملخص التجزئة"
#: searx/plugins/hash_plugin.py:52 #: searx/plugins/hash_plugin.py:52
msgid "hash digest" msgid "hash digest"
msgstr "" msgstr "ملخص التجزئة"
#: searx/plugins/hostname_replace.py:9 #: searx/plugins/hostname_replace.py:9
msgid "Hostname replace" msgid "Hostname replace"
@ -284,13 +301,15 @@ msgstr "أعد كتابة أسماء مضيفي النتائج أو أزل ال
#: searx/plugins/oa_doi_rewrite.py:9 #: searx/plugins/oa_doi_rewrite.py:9
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
msgstr "" msgstr "فتح الوصول معرف الكائن الرقمي إعادة كتابة"
#: searx/plugins/oa_doi_rewrite.py:10 #: searx/plugins/oa_doi_rewrite.py:10
msgid "" msgid ""
"Avoid paywalls by redirecting to open-access versions of publications " "Avoid paywalls by redirecting to open-access versions of publications "
"when available" "when available"
msgstr "" msgstr ""
"تجنب جدران الدفع عن طريق إعادة التوجيه إلى إصدارات الوصول المفتوح من "
"المنشورات عند توفرها"
#: searx/plugins/search_on_category_select.py:19 #: searx/plugins/search_on_category_select.py:19
msgid "Search on category select" msgid "Search on category select"
@ -301,6 +320,8 @@ msgid ""
"Perform search immediately if a category selected. Disable to select " "Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)" "multiple categories. (JavaScript required)"
msgstr "" msgstr ""
"اقامت بحث فوري اذا تم اختيار مجموعة, توقيف تعدد الخيارات (java script "
"ضروريه)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Informations"
@ -311,6 +332,32 @@ msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query " "Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
"يعرض IP إذا كان الاستعلام \"ip\" و وكيل المستخدم الخاص بك إذا كان "
"الاستعلام يحتوي على\"user agent\""
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
@ -319,6 +366,8 @@ msgstr "مزيل روابط التعقّب"
#: searx/plugins/tracker_url_remover.py:30 #: searx/plugins/tracker_url_remover.py:30
msgid "Remove trackers arguments from the returned URL" msgid "Remove trackers arguments from the returned URL"
msgstr "" msgstr ""
"إزالة وسيطات التتبع من \"URL\" الذي تم إرجاعه , إزالة وسيطات التتبع من "
"محدد موقع الموارد الموحد الذي تم إرجاعه"
#: searx/plugins/vim_hotkeys.py:3 #: searx/plugins/vim_hotkeys.py:3
msgid "Vim-like hotkeys" msgid "Vim-like hotkeys"
@ -329,6 +378,9 @@ msgid ""
"Navigate search results with Vim-like hotkeys (JavaScript required). " "Navigate search results with Vim-like hotkeys (JavaScript required). "
"Press \"h\" key on main or result page to get help." "Press \"h\" key on main or result page to get help."
msgstr "" msgstr ""
"تصفح نتائج البحث باستخدام مفاتيح الاختصار التي تشبه Vim (مطلوب "
"JavaScript). اضغط على مفتاح \"h\" في الصفحة الرئيسية أو صفحة النتائج "
"للحصول على المساعدة."
#: searx/templates/simple/404.html:4 #: searx/templates/simple/404.html:4
msgid "Page not found" msgid "Page not found"
@ -345,11 +397,11 @@ msgstr "صفحة البحث"
#: searx/templates/simple/base.html:46 #: searx/templates/simple/base.html:46
msgid "About" msgid "About"
msgstr "" msgstr "حَول"
#: searx/templates/simple/base.html:50 #: searx/templates/simple/base.html:50
msgid "Donate" msgid "Donate"
msgstr "" msgstr "تبرُّع"
#: searx/templates/simple/base.html:54 #: searx/templates/simple/base.html:54
#: searx/templates/simple/preferences.html:99 #: searx/templates/simple/preferences.html:99
@ -366,11 +418,11 @@ msgstr "محرك بحث يحمي الخصوصية و قابل للتهكير"
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
msgstr "الشفرة المصدرية" msgstr "الكود المصدري"
#: searx/templates/simple/base.html:66 #: searx/templates/simple/base.html:66
msgid "Issue tracker" msgid "Issue tracker"
msgstr "" msgstr "متتبع القضايا"
#: searx/templates/simple/base.html:67 searx/templates/simple/stats.html:18 #: searx/templates/simple/base.html:67 searx/templates/simple/stats.html:18
msgid "Engine stats" msgid "Engine stats"
@ -383,7 +435,7 @@ msgstr "مثيلات الخوادم العمومية"
#: searx/templates/simple/base.html:72 #: searx/templates/simple/base.html:72
msgid "Privacy policy" msgid "Privacy policy"
msgstr "" msgstr "سياسة الخصوصية"
#: searx/templates/simple/base.html:75 #: searx/templates/simple/base.html:75
msgid "Contact instance maintainer" msgid "Contact instance maintainer"
@ -391,7 +443,7 @@ msgstr "الإتصال بالمشرف على مثيل الخادم"
#: searx/templates/simple/categories.html:24 #: searx/templates/simple/categories.html:24
msgid "Click on the magnifier to perform search" msgid "Click on the magnifier to perform search"
msgstr "" msgstr "انقر على المكبرة للقيام بالبحث"
#: searx/templates/simple/macros.html:36 #: searx/templates/simple/macros.html:36
msgid "Length" msgid "Length"
@ -412,53 +464,53 @@ msgstr "النفاذ عبر البروكسي"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "ابدأ بتقديم قضية جديدة على GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "الرجاء التحقق من الأخطاء الموجودة حول هذا المحرك على GitHub"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
msgstr "" msgstr "أؤكد عدم وجود أخطاء حول المشكلة التي أواجهها"
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr "إذا كان هذا مثيلًا عامًا ، فيرجى تحديد عنوان URL في تقرير الخطأ"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
msgstr "" msgstr "قم بتقديم مشكلة جديدة على GitHub بالمعلومات الواردة أعلاه"
#: searx/templates/simple/preferences.html:29 #: searx/templates/simple/preferences.html:29
msgid "No HTTPS" msgid "No HTTPS"
msgstr "" msgstr "دون HTTPS"
#: searx/templates/simple/messages/no_results.html:10 #: searx/templates/simple/messages/no_results.html:10
#: searx/templates/simple/preferences.html:31 #: searx/templates/simple/preferences.html:31
#: searx/templates/simple/preferences.html:32 #: searx/templates/simple/preferences.html:32
#: searx/templates/simple/results.html:49 #: searx/templates/simple/results.html:49
msgid "View error logs and submit a bug report" msgid "View error logs and submit a bug report"
msgstr "" msgstr "عرض سجلات الأخطاء وتقديم تقرير خطأ"
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:67
msgid "Median" msgid "Median"
msgstr "" msgstr "وسطي"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:73
msgid "P80" msgid "P80"
msgstr "" msgstr "صفحة 80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:79
msgid "P95" msgid "P95"
msgstr "" msgstr "صفحة 95"
#: searx/templates/simple/preferences.html:83 #: searx/templates/simple/preferences.html:83
msgid "Failed checker test(s): " msgid "Failed checker test(s): "
msgstr "" msgstr "فشل اختبار المدقق: "
#: searx/templates/simple/preferences.html:85 #: searx/templates/simple/preferences.html:85
msgid "Errors:" msgid "Errors:"
@ -524,21 +576,23 @@ msgstr "فلترة المحتوى"
#: searx/templates/simple/preferences.html:157 #: searx/templates/simple/preferences.html:157
msgid "Open Access DOI resolver" msgid "Open Access DOI resolver"
msgstr "" msgstr "فتح الوصول إلى محلل DOI"
#: searx/templates/simple/preferences.html:167 #: searx/templates/simple/preferences.html:167
msgid "" msgid ""
"Redirect to open-access versions of publications when available (plugin " "Redirect to open-access versions of publications when available (plugin "
"required)" "required)"
msgstr "" msgstr ""
"إعادة التوجيه إلى إصدارات مفتوحة الوصول من المنشورات حيثما أمكن ذلك (يلزم"
" وجود مكون إضافي)"
#: searx/templates/simple/preferences.html:171 #: searx/templates/simple/preferences.html:171
msgid "Engine tokens" msgid "Engine tokens"
msgstr "" msgstr "الرمز المميز للمحرك"
#: searx/templates/simple/preferences.html:175 #: searx/templates/simple/preferences.html:175
msgid "Access tokens for private engines" msgid "Access tokens for private engines"
msgstr "" msgstr "رمز الوصول إلى المحرك الخاص"
#: searx/templates/simple/preferences.html:179 #: searx/templates/simple/preferences.html:179
msgid "User interface" msgid "User interface"
@ -562,15 +616,15 @@ msgstr "تغيير مظهر سيركس"
#: searx/templates/simple/preferences.html:206 #: searx/templates/simple/preferences.html:206
msgid "Theme style" msgid "Theme style"
msgstr "" msgstr "نمط"
#: searx/templates/simple/preferences.html:214 #: searx/templates/simple/preferences.html:214
msgid "Choose auto to follow your browser settings" msgid "Choose auto to follow your browser settings"
msgstr "" msgstr "اختر تلقائي لاحترام إعدادات متصفحك"
#: searx/templates/simple/preferences.html:217 #: searx/templates/simple/preferences.html:217
msgid "Center Alignment" msgid "Center Alignment"
msgstr "" msgstr "محاذاة المركز"
#: searx/templates/simple/preferences.html:220 #: searx/templates/simple/preferences.html:220
#: searx/templates/simple/preferences.html:232 #: searx/templates/simple/preferences.html:232
@ -586,7 +640,7 @@ msgstr "مُعطَّل"
#: searx/templates/simple/preferences.html:224 #: searx/templates/simple/preferences.html:224
msgid "Displays results in the center of the page (Oscar layout)." msgid "Displays results in the center of the page (Oscar layout)."
msgstr "" msgstr "اعرض النتائج في منتصف الصفحة (تخطيط Oscar)."
#: searx/templates/simple/preferences.html:229 #: searx/templates/simple/preferences.html:229
msgid "Results on new tabs" msgid "Results on new tabs"
@ -610,7 +664,7 @@ msgstr "الخصوصية"
#: searx/templates/simple/preferences.html:257 #: searx/templates/simple/preferences.html:257
msgid "HTTP Method" msgid "HTTP Method"
msgstr "" msgstr "أسلوب HTTP"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
@ -618,6 +672,9 @@ msgid ""
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
"تغيير طريقة إرسال النماذج ، <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\"> تعرف على المزيد حول طرق الطلب </a>"
#: searx/templates/simple/preferences.html:269 #: searx/templates/simple/preferences.html:269
msgid "Image proxy" msgid "Image proxy"
@ -639,13 +696,15 @@ msgstr "تمرير نتائج البحث عن الصور عبر بروكسي Sea
#: searx/templates/simple/preferences.html:281 #: searx/templates/simple/preferences.html:281
msgid "Query in the page's title" msgid "Query in the page's title"
msgstr "" msgstr "طلب بحث في عنوان الصفحة"
#: searx/templates/simple/preferences.html:288 #: searx/templates/simple/preferences.html:288
msgid "" msgid ""
"When enabled, the result page's title contains your query. Your browser " "When enabled, the result page's title contains your query. Your browser "
"can record this title" "can record this title"
msgstr "" msgstr ""
"عند التمكين ، يحتوي عنوان صفحة النتائج على كلمات البحث الرئيسية الخاصة "
"بك. يمكن لمتصفحك تسجيل هذا العنوان"
#: searx/templates/simple/preferences.html:294 #: searx/templates/simple/preferences.html:294
msgid "Engines" msgid "Engines"
@ -918,11 +977,11 @@ msgstr ""
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:124
msgid "Code" msgid "Code"
msgstr "" msgstr "كود"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:131
msgid "Checker" msgid "Checker"
msgstr "" msgstr "مدقّق"
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:134
msgid "Failed test" msgid "Failed test"
@ -997,7 +1056,7 @@ msgstr "هذا الموقع لا يتوفر على أي وصف."
#: searx/templates/simple/result_templates/images.html:19 #: searx/templates/simple/result_templates/images.html:19
msgid "Format" msgid "Format"
msgstr "" msgstr "صيغة"
#: searx/templates/simple/result_templates/images.html:21 #: searx/templates/simple/result_templates/images.html:21
msgid "Engine" msgid "Engine"
@ -1312,3 +1371,4 @@ msgstr "إخفاء الفيديو"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "التفضيلات" #~ msgstr "التفضيلات"

View file

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-06 00:21+0000\n" "PO-Revision-Date: 2022-07-06 00:21+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bg\n" "Language: bg\n"
@ -263,6 +263,23 @@ msgstr "Няма резюме за тази публикация."
msgid "Channel" msgid "Channel"
msgstr "Канал" msgstr "Канал"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Преобразува низове в различни хаш-извлечение." msgstr "Преобразува низове в различни хаш-извлечение."
@ -315,6 +332,30 @@ msgid ""
"contains \"user agent\"." "contains \"user agent\"."
msgstr "Показва IP-то ви и др. инфо, ако търсенето е \"ip\" или \"user agent\"." msgstr "Показва IP-то ви и др. инфо, ако търсенето е \"ip\" или \"user agent\"."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "Премахвач на URL тракери" msgstr "Премахвач на URL тракери"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-06 00:21+0000\n" "PO-Revision-Date: 2022-07-19 05:46+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bn\n" "Language: bn\n"
"Language-Team: Bengali " "Language-Team: Bengali "
@ -180,83 +180,67 @@ msgid "too many requests"
msgstr "অনেক বেশি অনুরোধ" msgstr "অনেক বেশি অনুরোধ"
#: searx/webapp.py:187 #: searx/webapp.py:187
#, fuzzy
msgid "access denied" msgid "access denied"
msgstr "অ্যাক্সেস অস্বীকৃত" msgstr "অ্যাক্সেস অস্বীকৃত"
#: searx/webapp.py:188 #: searx/webapp.py:188
#, fuzzy
msgid "server API error" msgid "server API error"
msgstr "সার্ভার এপিআই ত্রুটি" msgstr "সার্ভার এপিআই ত্রুটি"
#: searx/webapp.py:363 #: searx/webapp.py:363
#, fuzzy
msgid "No item found" msgid "No item found"
msgstr "কোন আইটেম পাওয়া যায়নি" msgstr "কোন আইটেম পাওয়া যায়নি"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#, fuzzy
msgid "Source" msgid "Source"
msgstr "উৎস" msgstr "উৎস"
#: searx/webapp.py:367 #: searx/webapp.py:367
#, fuzzy
msgid "Error loading the next page" msgid "Error loading the next page"
msgstr "পরবর্তী পৃষ্ঠাটি লোড করার সময় ত্রুটি৷" msgstr "পরবর্তী পৃষ্ঠাটি লোড করার সময় ত্রুটি৷"
#: searx/webapp.py:516 searx/webapp.py:960 #: searx/webapp.py:516 searx/webapp.py:960
#, fuzzy
msgid "Invalid settings, please edit your preferences" msgid "Invalid settings, please edit your preferences"
msgstr "অবৈধ সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন৷" msgstr "অবৈধ সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন৷"
#: searx/webapp.py:532 #: searx/webapp.py:532
#, fuzzy
msgid "Invalid settings" msgid "Invalid settings"
msgstr "অবৈধ সেটিংস" msgstr "অবৈধ সেটিংস"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:609 searx/webapp.py:685
#, fuzzy
msgid "search error" msgid "search error"
msgstr "অনুসন্ধানের ত্রুটি" msgstr "অনুসন্ধানের ত্রুটি"
#: searx/webapp.py:731 #: searx/webapp.py:731
#, fuzzy
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "{minutes} মিনিট আগে" msgstr "{minutes} মিনিট আগে"
#: searx/webapp.py:733 #: searx/webapp.py:733
#, fuzzy
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ঘণ্টা, {minutes} মিনিট আগে" msgstr "{hours} ঘণ্টা, {minutes} মিনিট আগে"
#: searx/webapp.py:859 #: searx/webapp.py:859
#, fuzzy
msgid "Suspended" msgid "Suspended"
msgstr "স্থগিত" msgstr "স্থগিত"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
#, fuzzy
msgid "Random value generator" msgid "Random value generator"
msgstr "এলোমেলো মান জেনারেটর" msgstr "এলোমেলো মান জেনারেটর"
#: searx/answerers/random/answerer.py:68 #: searx/answerers/random/answerer.py:68
#, fuzzy
msgid "Generate different random values" msgid "Generate different random values"
msgstr "বিভিন্ন এলোমেলো মান তৈরি করুন" msgstr "বিভিন্ন এলোমেলো মান তৈরি করুন"
#: searx/answerers/statistics/answerer.py:47 #: searx/answerers/statistics/answerer.py:47
#, fuzzy
msgid "Statistics functions" msgid "Statistics functions"
msgstr "পরিসংখ্যান কার্যাবলী" msgstr "পরিসংখ্যান কার্যাবলী"
#: searx/answerers/statistics/answerer.py:48 #: searx/answerers/statistics/answerer.py:48
#, fuzzy
msgid "Compute {functions} of the arguments" msgid "Compute {functions} of the arguments"
msgstr "আর্গুমেন্টগুলির {functions গণনা করুন৷" msgstr "আর্গুমেন্টগুলির {functions} গণনা করুন৷"
#: searx/engines/openstreetmap.py:160 #: searx/engines/openstreetmap.py:160
#, fuzzy
msgid "Get directions" msgid "Get directions"
msgstr "দিকনির্দেশ পান" msgstr "দিকনির্দেশ পান"
@ -265,37 +249,47 @@ msgid "{title} (OBSOLETE)"
msgstr "{title} (অচল)" msgstr "{title} (অচল)"
#: searx/engines/pdbe.py:103 #: searx/engines/pdbe.py:103
#, fuzzy
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "এই এন্ট্রিটি দ্বারা বাতিল করা হয়েছে৷" msgstr "এই এন্ট্রিটি দ্বারা বাতিল করা হয়েছে৷"
#: searx/engines/pubmed.py:78 #: searx/engines/pubmed.py:78
#, fuzzy
msgid "No abstract is available for this publication." msgid "No abstract is available for this publication."
msgstr "এই প্রকাশনার জন্য কোন বিমূর্ত উপলব্ধ নেই." msgstr "এই প্রকাশনার জন্য কোন বিমূর্ত উপলব্ধ নেই."
#: searx/engines/qwant.py:214 #: searx/engines/qwant.py:214
#, fuzzy
msgid "Channel" msgid "Channel"
msgstr "চ্যানেল" msgstr "চ্যানেল"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
#, fuzzy
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।" msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।"
#: searx/plugins/hash_plugin.py:52 #: searx/plugins/hash_plugin.py:52
#, fuzzy
msgid "hash digest" msgid "hash digest"
msgstr "হ্যাশ ডাইজেস্ট" msgstr "হ্যাশ ডাইজেস্ট"
#: searx/plugins/hostname_replace.py:9 #: searx/plugins/hostname_replace.py:9
#, fuzzy
msgid "Hostname replace" msgid "Hostname replace"
msgstr "হোস্টনাম প্রতিস্থাপন" msgstr "হোস্টনাম প্রতিস্থাপন"
#: searx/plugins/hostname_replace.py:10 #: searx/plugins/hostname_replace.py:10
#, fuzzy
msgid "Rewrite result hostnames or remove results based on the hostname" msgid "Rewrite result hostnames or remove results based on the hostname"
msgstr "ফলাফল হোস্টনাম পুনরায় লিখুন বা হোস্টনামের উপর ভিত্তি করে ফলাফল মুছে ফেলুন" msgstr "ফলাফল হোস্টনাম পুনরায় লিখুন বা হোস্টনামের উপর ভিত্তি করে ফলাফল মুছে ফেলুন"
@ -329,6 +323,30 @@ msgid ""
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "" msgstr ""

View file

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2021-12-17 07:17+0000\n" "PO-Revision-Date: 2021-12-17 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bo\n" "Language: bo\n"
@ -262,6 +262,23 @@ msgstr ""
msgid "Channel" msgid "Channel"
msgstr "" msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr ""
@ -312,6 +329,30 @@ msgid ""
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "དྲ་གནས་རྗེས་འདེད་སྤོ་འབུད།" msgstr "དྲ་གནས་རྗེས་འདེད་སྤོ་འབུད།"

View file

@ -8,20 +8,22 @@
# jmontane, 2018 # jmontane, 2018
# Gerard Oliva Viñas <oliva3032001@gmail.com>, 2022. # Gerard Oliva Viñas <oliva3032001@gmail.com>, 2022.
# adriadam10 <adriadam10@gmail.com>, 2022. # adriadam10 <adriadam10@gmail.com>, 2022.
# alexfs2015 <alex04fs@gmail.com>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-06 00:21+0000\n" "PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: adriadam10 <adriadam10@gmail.com>\n" "Last-Translator: alexfs2015 <alex04fs@gmail.com>\n"
"Language-Team: Catalan <https://weblate.bubu1.eu/projects/searxng/searxng/ca/"
">\n"
"Language: ca\n" "Language: ca\n"
"Language-Team: Catalan "
"<https://weblate.bubu1.eu/projects/searxng/searxng/ca/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -265,6 +267,28 @@ msgstr "No hi ha resum disponible per a aquesta publicació."
msgid "Channel" msgid "Channel"
msgstr "Canal" msgstr "Canal"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"No s'ha pogut llegir l'URL de la imatge. Això pot ser degut a un format de "
"fitxer no compatible. TinEye només admet imatges en format JPEG, PNG, GIF, "
"BMP, TIFF o WebP."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"La imatge és massa senzilla per trobar coincidències. TinEye requereix un "
"nivell bàsic de detall visual per identificar amb èxit les coincidències."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "No s'ha pogut baixar la imatge."
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Converteix cadenes a diferent formats de resum." msgstr "Converteix cadenes a diferent formats de resum."
@ -319,6 +343,35 @@ msgstr ""
"Mostra la vostra IP si la consulta és «ip» i el valor «user agent» del " "Mostra la vostra IP si la consulta és «ip» i el valor «user agent» del "
"navegador si la consulta conté «user agent»." "navegador si la consulta conté «user agent»."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr "Plugin de comprovació de Tor"
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"Aquest plugin comprova si l'adreça de la sol·licitud és un node de sortida "
"TOR i informa a l'usuari si ho és, com check.torproject.org però des de "
"searxng."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"No es pot accedir a la llista de nodes de sortida TOR (https://check."
"torproject.org/exit-addresses)."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr "Esteu utilitzant TOR. La vostra adreça IP sembla ser: {ip_address}."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr "No esteu utilitzant TOR. La vostra adreça IP sembla ser: {ip_address}."
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "Suprimeix l'URL de rastreig" msgstr "Suprimeix l'URL de rastreig"
@ -422,19 +475,21 @@ msgstr "en servidor intermediari"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "Enviar un nou problema a GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "Si us plau revisa si ja hi ha un problema amb aquest motor a GitHub"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
msgstr "" msgstr "Confirmo que no hi ha un bug relacionat amb el problema que he trobat"
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr ""
"Si aquesta és una instància pública, si us plau especifica la URL al report "
"del bug"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
@ -1352,4 +1407,3 @@ msgstr "amaga el vídeo"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "preferències" #~ msgstr "preferències"

View file

@ -8,12 +8,14 @@
# Venca24 <Vaclav.Zouzalik@seznam.cz>, 2020 # Venca24 <Vaclav.Zouzalik@seznam.cz>, 2020
# Venca24 <Vaclav.Zouzalik@seznam.cz>, 2018 # Venca24 <Vaclav.Zouzalik@seznam.cz>, 2018
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# Masterix <masterix@duck.com>, 2022.
# LagManCZ <lagmen@post.cz>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-13 15:40+0000\n" "PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Czech <https://weblate.bubu1.eu/projects/searxng/searxng/cs/>" "Language-Team: Czech <https://weblate.bubu1.eu/projects/searxng/searxng/cs/>"
"\n" "\n"
@ -267,6 +269,28 @@ msgstr "Pro tuto publikaci neexistuje žádný abstrakt."
msgid "Channel" msgid "Channel"
msgstr "Kanál" msgstr "Kanál"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"Nelze načíst url adresu obrázku. Příčinou může být nepodporovaný formát "
"souboru. TinEye podporuje pouze obrázky ve formátu JPEG, PNG, GIF, BMP, TIFF "
"nebo WebP."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"Obrázek je příliš jednoduchý na to, aby bylo možné najít shody. TinEye "
"vyžaduje základní úroveň vizuálních detailů pro úspěšnou identifikaci."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "Obrázek se nepodařilo stáhnout."
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Převádí řetězce na různé hash hodnoty." msgstr "Převádí řetězce na různé hash hodnoty."
@ -319,6 +343,36 @@ msgstr ""
"Umožňuje hledat informace o sobě: \"ip\" zobrazí vaši IP adresu a \"user " "Umožňuje hledat informace o sobě: \"ip\" zobrazí vaši IP adresu a \"user "
"agent\" zobrazí identifikátor prohlížeče." "agent\" zobrazí identifikátor prohlížeče."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr "Plugin kontroly TORu"
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"Tento plugin kontroluje, jestli adresa požadavku je výstupní uzel TORu, a"
" infromuje uživatele pokud je, jako check.torproject.org ale od searxng."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"Seznam výstupních uzlů TOR (https://check.torproject.org/exit-addresses) "
"je nedostupný."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
"List výstupního uzlu TORu (https://check.torproject.org/exit-addresses) "
"je nedosažitelný."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr "Nepoužíváte TOR. Zdá se, že vaše IP adresa je: {ip_address}."
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "Odstraňovač sledovacích URL" msgstr "Odstraňovač sledovacích URL"
@ -355,7 +409,7 @@ msgstr "stránka vyhledávání"
#: searx/templates/simple/base.html:46 #: searx/templates/simple/base.html:46
msgid "About" msgid "About"
msgstr "O něčem" msgstr "O SearXNG"
#: searx/templates/simple/base.html:50 #: searx/templates/simple/base.html:50
msgid "Donate" msgid "Donate"
@ -422,23 +476,25 @@ msgstr "přes proxy"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "Začněte přidávat novou chybu na Githubu"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "Zkontrolujte prosím existující chyby tohoto enginu na GitHubu"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
msgstr "" msgstr ""
"Potvrzuji, že neexistuje žádná chyba týkající se problému, se kterým se "
"setkávám"
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr "Pokud je tohle veřejná instance, prosím specifikujte URL v náhlášení chyby"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
msgstr "" msgstr "Odeslání nového problému na Github včetně výše uvedených informací"
#: searx/templates/simple/preferences.html:29 #: searx/templates/simple/preferences.html:29
msgid "No HTTPS" msgid "No HTTPS"
@ -582,7 +638,7 @@ msgstr "Zvolte automaticky pro sledování nastavení vašeho prohlížeče"
#: searx/templates/simple/preferences.html:217 #: searx/templates/simple/preferences.html:217
msgid "Center Alignment" msgid "Center Alignment"
msgstr "" msgstr "Zarovnání na střed"
#: searx/templates/simple/preferences.html:220 #: searx/templates/simple/preferences.html:220
#: searx/templates/simple/preferences.html:232 #: searx/templates/simple/preferences.html:232
@ -598,7 +654,7 @@ msgstr "Vypnuto"
#: searx/templates/simple/preferences.html:224 #: searx/templates/simple/preferences.html:224
msgid "Displays results in the center of the page (Oscar layout)." msgid "Displays results in the center of the page (Oscar layout)."
msgstr "" msgstr "Zobrazí výsledky uprostřed stránky (rozložení Oscar)."
#: searx/templates/simple/preferences.html:229 #: searx/templates/simple/preferences.html:229
msgid "Results on new tabs" msgid "Results on new tabs"
@ -783,13 +839,15 @@ msgstr ""
#: searx/templates/simple/preferences.html:419 #: searx/templates/simple/preferences.html:419
msgid "URL to restore your preferences in another browser" msgid "URL to restore your preferences in another browser"
msgstr "" msgstr "URL k obnovení vašich preferencí v jiném prohlížeči"
#: searx/templates/simple/preferences.html:423 #: searx/templates/simple/preferences.html:423
msgid "" msgid ""
"Specifying custom settings in the preferences URL can be used to sync " "Specifying custom settings in the preferences URL can be used to sync "
"preferences across devices." "preferences across devices."
msgstr "" msgstr ""
"Zadání vlastních nastavení v URL předvoleb lze použít k synchronizaci "
"předvoleb mezi zařízeními."
#: searx/templates/simple/preferences.html:428 #: searx/templates/simple/preferences.html:428
msgid "" msgid ""

View file

@ -4,32 +4,34 @@
# #
# Translators: # Translators:
# Cymrodor <aled@aledpowell.cymru>, 2019 # Cymrodor <aled@aledpowell.cymru>, 2019
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-01-19 22:16+0000\n" "PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Welsh <https://weblate.bubu1.eu/projects/searxng/searxng/cy/>"
"\n"
"Language: cy\n" "Language: cy\n"
"Language-Team: Welsh "
"<https://weblate.bubu1.eu/projects/searxng/searxng/cy/>\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n "
"!= 11) ? 2 : 3;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
"11) ? 2 : 3;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
#: searx/searxng.msg #: searx/searxng.msg
msgid "others" msgid "others"
msgstr "" msgstr "eraill"
#. CONSTANT_NAMES['OTHER_CATEGORY'] #. CONSTANT_NAMES['OTHER_CATEGORY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "other" msgid "other"
msgstr "" msgstr "arall"
#. CATEGORY_NAMES['FILES'] #. CATEGORY_NAMES['FILES']
#: searx/searxng.msg #: searx/searxng.msg
@ -89,17 +91,17 @@ msgstr "gwyddoniaeth"
#. CATEGORY_GROUPS['APPS'] #. CATEGORY_GROUPS['APPS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "apps" msgid "apps"
msgstr "" msgstr "apps"
#. CATEGORY_GROUPS['DICTIONARIES'] #. CATEGORY_GROUPS['DICTIONARIES']
#: searx/searxng.msg #: searx/searxng.msg
msgid "dictionaries" msgid "dictionaries"
msgstr "" msgstr "geiriaduron"
#. CATEGORY_GROUPS['LYRICS'] #. CATEGORY_GROUPS['LYRICS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "lyrics" msgid "lyrics"
msgstr "" msgstr "geiriau"
#. CATEGORY_GROUPS['PACKAGES'] #. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg #: searx/searxng.msg
@ -151,35 +153,35 @@ msgstr "gwall dosrannu"
#: searx/webapp.py:167 #: searx/webapp.py:167
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "" msgstr "Gwall protocol HTTP"
#: searx/webapp.py:168 #: searx/webapp.py:168
msgid "network error" msgid "network error"
msgstr "" msgstr "gwall rhwydwaith"
#: searx/webapp.py:170 #: searx/webapp.py:170
msgid "unexpected crash" msgid "unexpected crash"
msgstr "" msgstr "damwain annisgwyl"
#: searx/webapp.py:177 #: searx/webapp.py:177
msgid "HTTP error" msgid "HTTP error"
msgstr "" msgstr "gwall http"
#: searx/webapp.py:178 #: searx/webapp.py:178
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "" msgstr "gwall cysylltiad http"
#: searx/webapp.py:184 #: searx/webapp.py:184
msgid "proxy error" msgid "proxy error"
msgstr "" msgstr "gwall dirprwy"
#: searx/webapp.py:185 #: searx/webapp.py:185
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "" msgstr "CAPTCHA"
#: searx/webapp.py:186 #: searx/webapp.py:186
msgid "too many requests" msgid "too many requests"
msgstr "" msgstr "gormod o geisiadau"
#: searx/webapp.py:187 #: searx/webapp.py:187
msgid "access denied" msgid "access denied"
@ -262,6 +264,23 @@ msgstr ""
msgid "Channel" msgid "Channel"
msgstr "" msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr ""
@ -308,6 +327,30 @@ msgid ""
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "" msgstr ""
@ -1311,4 +1354,3 @@ msgstr "cuddio fideo"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "dewisiadau" #~ msgstr "dewisiadau"

View file

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-08 18:28+0000\n" "POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-13 15:40+0000\n" "PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Danish <https://weblate.bubu1.eu/projects/searxng/searxng/da/>" "Language-Team: Danish <https://weblate.bubu1.eu/projects/searxng/searxng/da/>"
"\n" "\n"
@ -264,6 +264,29 @@ msgstr "Intet sammendrag er tilgængelig for denne publikation."
msgid "Channel" msgid "Channel"
msgstr "Kanal" msgstr "Kanal"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"Kunne ikke læse den specificerede billed-url. Dette kan skyldes et ikke-"
"understøttet filformat. TinEye understøtter kun billeder, der er i JPEG, "
"PNG, GIF, BMP, TIFF eller WebP format."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"Billedet er for simpel til at finde matchene billeder. TinEye kræver et "
"grundlæggende niveau af visuelle detaljer for at kunne identificere matchene "
"billeder."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "Dette billede kunne ikke downloades."
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Konverterer strenge til forskellige hash-digests." msgstr "Konverterer strenge til forskellige hash-digests."
@ -318,6 +341,35 @@ msgstr ""
"Viser din IP adresse hvis søgningen er \"ip\" og din user-agent i " "Viser din IP adresse hvis søgningen er \"ip\" og din user-agent i "
"søgningen indeholder \"user agent\"." "søgningen indeholder \"user agent\"."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr "Tor undersøg plugin"
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"Dette plugin tjekker, om adressen på anmodningen er en TOR-exit-node, og "
"informerer brugeren, hvis den er, som check.torproject.org, men fra searxng "
"i stedet."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"TOR exit node listen (https://check.torproject.org/exit-addresses) er ikke "
"tilgængelig."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr "Du bruger TOR. Din IP-adresse ser ud til at være: {ip_address}."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr "Du bruger ikke TOR. Din IP-adresse ser ud til at være: {ip_address}."
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "Fjernelse af tracker URL" msgstr "Fjernelse af tracker URL"
@ -424,8 +476,7 @@ msgstr "Opret ny sag på GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "Venligst tjek for eksisterende, relateret til denne søgemaskine, på GitHub"
"Venligst tjek for eksisterende, relateret til denne søgemaskine, på GitHub"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
@ -436,6 +487,8 @@ msgstr ""
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr ""
"Hvis det er en offentligt tilgængelige udgave, venligst tilføj URL'en i "
"fejl rapporten"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
@ -583,7 +636,7 @@ msgstr "Vælg auto for at følge dine browserindstillinger"
#: searx/templates/simple/preferences.html:217 #: searx/templates/simple/preferences.html:217
msgid "Center Alignment" msgid "Center Alignment"
msgstr "" msgstr "Centeret"
#: searx/templates/simple/preferences.html:220 #: searx/templates/simple/preferences.html:220
#: searx/templates/simple/preferences.html:232 #: searx/templates/simple/preferences.html:232

Some files were not shown because too many files have changed in this diff Show more