forked from Ponysearch/Ponysearch
Merge branch 'searxng:master' into master
This commit is contained in:
commit
f60e26cdbc
220 changed files with 11217 additions and 4982 deletions
52
.config.sh
52
.config.sh
|
@ -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
|
|
2
.github/workflows/data-update.yml
vendored
2
.github/workflows/data-update.yml
vendored
|
@ -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
|
||||||
|
|
6
.github/workflows/integration.yml
vendored
6
.github/workflows/integration.yml
vendored
|
@ -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:
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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`.
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
||||||
.. group-tab:: Fedora / RHEL
|
|
||||||
|
|
||||||
In the ``/etc/httpd/conf/httpd.conf`` file, activate headers and proxy
|
|
||||||
modules (LoadModule_):
|
|
||||||
|
|
||||||
.. code:: apache
|
|
||||||
|
|
||||||
FIXME needs test
|
|
||||||
|
|
||||||
LoadModule headers_module modules/mod_headers.so
|
|
||||||
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
|
|
||||||
proxied host.
|
|
||||||
|
|
||||||
.. _apache 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:: apache
|
|
||||||
|
|
||||||
<Location /searx >
|
|
||||||
|
|
||||||
# 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
|
.. code:: bash
|
||||||
|
|
||||||
sudo -H mkdir -p /run/uwsgi/app/searx/
|
mkdir -p /etc/httpd/sites-available
|
||||||
sudo -H chown -R searx:searx /run/uwsgi/app/searx/
|
mkdir -p /etc/httpd/sites-enabled
|
||||||
|
|
||||||
If the server is public; to limit access to your intranet replace ``Allow from
|
Create configuration at ``/etc/httpd/sites-available`` and place a
|
||||||
all`` directive and replace ``192.168.0.0/16`` with your subnet IP/class.
|
symlink to ``sites-enabled``:
|
||||||
|
|
||||||
.. tabs::
|
.. code:: bash
|
||||||
|
|
||||||
.. group-tab:: Ubuntu / debian
|
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
|
||||||
|
/etc/httpd/sites-enabled/searxng.conf
|
||||||
.. 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
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
.. code:: apache
|
In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
|
||||||
|
directive:
|
||||||
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
|
.. code:: apache
|
||||||
|
|
||||||
<IfModule mod_uwsgi.c>
|
IncludeOptional sites-enabled/*.conf
|
||||||
|
|
||||||
# SetEnvIf Request_URI "/searx" dontlog
|
Create two folders, one for the *available sites* and one for the *enabled sites*:
|
||||||
# CustomLog /dev/null combined env=dontlog
|
|
||||||
|
|
||||||
<Location /searx >
|
.. code:: bash
|
||||||
|
|
||||||
Require all granted
|
mkdir -p /etc/httpd/sites-available
|
||||||
|
mkdir -p /etc/httpd/sites-enabled
|
||||||
|
|
||||||
Options FollowSymLinks Indexes
|
Create configuration at ``/etc/httpd/sites-available`` and place a
|
||||||
SetHandler uwsgi-handler
|
symlink to ``sites-enabled``:
|
||||||
uWSGISocket /run/uwsgi/app/searx/socket
|
|
||||||
|
|
||||||
Order deny,allow
|
.. code:: bash
|
||||||
Deny from all
|
|
||||||
# Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
|
|
||||||
Allow from all
|
|
||||||
|
|
||||||
</Location>
|
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
|
||||||
|
/etc/httpd/sites-enabled/searxng.conf
|
||||||
|
|
||||||
</IfModule>
|
|
||||||
|
.. _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::
|
||||||
|
|
||||||
|
.. group-tab:: socket
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START apache socket
|
||||||
|
:end-before: END apache socket
|
||||||
|
|
||||||
|
.. group-tab:: http
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START apache http
|
||||||
|
:end-before: END apache http
|
||||||
|
|
||||||
.. _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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
Create two folders, one for the *available sites* and one for the *enabled sites*:
|
||||||
location /static { }
|
|
||||||
}
|
|
||||||
|
|
||||||
If not already exists, create a folder for the unix sockets, which can be
|
|
||||||
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
|
||||||
|
|
62
docs/admin/installation-scripts.rst
Normal file
62
docs/admin/installation-scripts.rst
Normal 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`
|
|
@ -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,18 +78,17 @@ 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::
|
||||||
|
|
||||||
|
@ -96,11 +96,23 @@ For a *minimal setup*, configure like shown below – replace ``searx@$(uname
|
||||||
|
|
||||||
.. 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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
instance is started, reload or stopped. Take Fedora and a searxng.ini as
|
|
||||||
example::
|
|
||||||
|
|
||||||
to start a new SearXNG instance create --> /etc/uwsgi.d/searxng.ini
|
The Emperor service will scan specific directories for `uwsgi 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 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 reload the instance edit timestamp --> touch /etc/uwsgi.d/searxng.ini
|
||||||
to stop instance remove ini --> rm /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:
|
||||||
|
...
|
||||||
|
|
|
@ -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 .
|
|
||||||
|
|
|
@ -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.
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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")
|
||||||
]
|
]
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
|
@ -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.
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
===================
|
===================
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
9
docs/src/searx.plugins.tor_check.rst
Normal file
9
docs/src/searx.plugins.tor_check.rst
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.. _tor check plugin:
|
||||||
|
|
||||||
|
================
|
||||||
|
Tor check plugin
|
||||||
|
================
|
||||||
|
|
||||||
|
.. automodule:: searx.plugins.tor_check
|
||||||
|
:members:
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
36
docs/utils/searxng.sh.rst
Normal 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
7
manage
|
@ -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 $?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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"
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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": {},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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/'
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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}'
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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'] = '*/*'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 response(resp):
|
def parse_tineye_match(match_json):
|
||||||
results = []
|
"""Takes parsed JSON from the API server and turns it into a :py:obj:`dict`
|
||||||
|
object.
|
||||||
|
|
||||||
# Define wanted results
|
Attributes `(class Match) <https://github.com/TinEye/pytineye/blob/main/pytineye/api.py>`__
|
||||||
json_data = resp.json()
|
|
||||||
number_of_results = json_data['num_matches']
|
|
||||||
|
|
||||||
for i in json_data['matches']:
|
- `image_url`, link to the result image.
|
||||||
image_format = i['format']
|
- `domain`, domain this result was found on.
|
||||||
width = i['width']
|
- `score`, a number (0 to 100) that indicates how closely the images match.
|
||||||
height = i['height']
|
- `width`, image width in pixels.
|
||||||
thumbnail_src = i['image_url']
|
- `height`, image height in pixels.
|
||||||
backlink = i['domains'][0]['backlinks'][0]
|
- `size`, image area in pixels.
|
||||||
url = backlink['backlink']
|
- `format`, image format.
|
||||||
source = backlink['url']
|
- `filesize`, image size in bytes.
|
||||||
title = backlink['image_name']
|
- `overlay`, overlay URL.
|
||||||
img_src = backlink['url']
|
- `tags`, whether this match belongs to a collection or stock domain.
|
||||||
|
|
||||||
# Get and convert published date
|
- `backlinks`, a list of Backlink objects pointing to the original websites
|
||||||
api_date = backlink['crawl_date'][:-3]
|
and image URLs. List items are instances of :py:obj:`dict`, (`Backlink
|
||||||
publishedDate = datetime.fromisoformat(api_date)
|
<https://github.com/TinEye/pytineye/blob/main/pytineye/api.py>`__):
|
||||||
|
|
||||||
# Append results
|
- `url`, the image URL to the image.
|
||||||
results.append(
|
- `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(
|
||||||
{
|
{
|
||||||
'template': 'images.html',
|
'url': backlink_json.get("url"),
|
||||||
'url': url,
|
'backlink': backlink_json.get("backlink"),
|
||||||
'thumbnail_src': thumbnail_src,
|
'crawl_date': crawl_date,
|
||||||
'source': source,
|
'image_name': backlink_json.get("image_name"),
|
||||||
'title': title,
|
|
||||||
'img_src': img_src,
|
|
||||||
'format': image_format,
|
|
||||||
'widht': width,
|
|
||||||
'height': height,
|
|
||||||
'publishedDate': publishedDate,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Append number of results
|
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):
|
||||||
|
"""Parse HTTP response from TinEye."""
|
||||||
|
results = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
json_data = resp.json()
|
||||||
|
except Exception as exc: # pylint: disable=broad-except
|
||||||
|
msg = "can't parse JSON response // %s" % exc
|
||||||
|
logger.error(msg)
|
||||||
|
json_data = {'error': msg}
|
||||||
|
|
||||||
|
# handle error codes from Tineye
|
||||||
|
|
||||||
|
if resp.is_error:
|
||||||
|
if resp.status_code in (400, 422):
|
||||||
|
|
||||||
|
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(
|
||||||
|
{
|
||||||
|
'template': 'images.html',
|
||||||
|
'url': backlink['backlink'],
|
||||||
|
'thumbnail_src': tineye_match['image_url'],
|
||||||
|
'source': backlink['url'],
|
||||||
|
'title': backlink['image_name'],
|
||||||
|
'img_src': backlink['url'],
|
||||||
|
'format': tineye_match['image_format'],
|
||||||
|
'widht': tineye_match['width'],
|
||||||
|
'height': tineye_match['height'],
|
||||||
|
'publishedDate': backlink['crawl_date'],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# append number of results
|
||||||
|
|
||||||
|
number_of_results = json_data.get('num_matches')
|
||||||
|
if number_of_results:
|
||||||
results.append({'number_of_results': number_of_results})
|
results.append({'number_of_results': number_of_results})
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
88
searx/plugins/tor_check.py
Normal file
88
searx/plugins/tor_check.py
Normal 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
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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/
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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 "التفضيلات"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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 тракери"
|
||||||
|
|
Binary file not shown.
|
@ -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 ""
|
||||||
|
|
Binary file not shown.
|
@ -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 "དྲ་གནས་རྗེས་འདེད་སྤོ་འབུད།"
|
||||||
|
|
Binary file not shown.
|
@ -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"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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 ""
|
||||||
|
|
Binary file not shown.
|
@ -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"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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
Loading…
Reference in a new issue