forked from zaclys/searxng
Compare commits
No commits in common. "translations" and "master" have entirely different histories.
translatio
...
master
11
.coveragerc
Normal file
11
.coveragerc
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[run]
|
||||||
|
branch = True
|
||||||
|
source = searx
|
||||||
|
|
||||||
|
[report]
|
||||||
|
show_missing = True
|
||||||
|
exclude_lines =
|
||||||
|
if __name__ == .__main__.:
|
||||||
|
|
||||||
|
[html]
|
||||||
|
directory = coverage
|
4
.devcontainer/Dockerfile
Normal file
4
.devcontainer/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM mcr.microsoft.com/devcontainers/base:debian
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get -y install python3 python3-venv redis firefox-esr graphviz imagemagick librsvg2-bin fonts-dejavu shellcheck
|
31
.devcontainer/devcontainer.json
Normal file
31
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/github-cli": {}
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": [
|
||||||
|
"ms-python.python",
|
||||||
|
"ms-azuretools.vscode-docker"
|
||||||
|
],
|
||||||
|
"remote.otherPortsAttributes": {
|
||||||
|
"protocol": "https"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"files.autoSave": "off",
|
||||||
|
"python.defaultInterpreterPath": "/workspaces/searxng/local/py3/bin/python3",
|
||||||
|
"python.formatting.blackPath": "/workspaces/searxng/local/py3/bin/black",
|
||||||
|
"python.linting.pylintPath": "/workspaces/searxng/local/py3/bin/pylint"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"forwardPorts": [8000, 8888],
|
||||||
|
"portsAttributes": {
|
||||||
|
"8000": {"label": "Sphinx documentation"},
|
||||||
|
"8888": {"label": "SearXNG"}
|
||||||
|
},
|
||||||
|
"postCreateCommand": "git pull && make install"
|
||||||
|
}
|
163
.dir-locals.el
Normal file
163
.dir-locals.el
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
;;; .dir-locals.el
|
||||||
|
;;
|
||||||
|
;; Per-Directory Local Variables:
|
||||||
|
;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html
|
||||||
|
;;
|
||||||
|
;; For full fledge developer tools install emacs packages:
|
||||||
|
;;
|
||||||
|
;; M-x package-install ...
|
||||||
|
;;
|
||||||
|
;; magit gitconfig
|
||||||
|
;; nvm lsp-mode lsp-pyright lsp-eslint
|
||||||
|
;; pyvenv pylint pip-requirements
|
||||||
|
;; jinja2-mode
|
||||||
|
;; json-mode
|
||||||
|
;; company company-jedi company-quickhelp company-shell
|
||||||
|
;; realgud
|
||||||
|
;; sphinx-doc markdown-mode graphviz-dot-mode
|
||||||
|
;; apache-mode nginx-mode
|
||||||
|
;;
|
||||||
|
;; To setup a developer environment, build target::
|
||||||
|
;;
|
||||||
|
;; $ make node.env.dev pyenv.install
|
||||||
|
;;
|
||||||
|
;; Some buffer locals are referencing the project environment:
|
||||||
|
;;
|
||||||
|
;; - prj-root --> <repo>/
|
||||||
|
;; - nvm-dir --> <repo>/.nvm
|
||||||
|
;; - python-environment-directory --> <repo>/local
|
||||||
|
;; - python-environment-default-root-name --> py3
|
||||||
|
;; - python-shell-virtualenv-root --> <repo>/local/py3
|
||||||
|
;; When this variable is set with the path of the virtualenv to use,
|
||||||
|
;; `process-environment' and `exec-path' get proper values in order to run
|
||||||
|
;; shells inside the specified virtualenv, example::
|
||||||
|
;; (setq python-shell-virtualenv-root "/path/to/env/")
|
||||||
|
;; - python-shell-interpreter --> <repo>/local/py3/bin/python
|
||||||
|
;;
|
||||||
|
;; Python development:
|
||||||
|
;;
|
||||||
|
;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter'
|
||||||
|
;; from the local py3 environment.
|
||||||
|
;;
|
||||||
|
|
||||||
|
((nil
|
||||||
|
. ((fill-column . 80)
|
||||||
|
(indent-tabs-mode . nil)
|
||||||
|
(eval . (progn
|
||||||
|
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.html\\'" . jinja2-mode))
|
||||||
|
|
||||||
|
;; project root folder is where the `.dir-locals.el' is located
|
||||||
|
(setq-local prj-root
|
||||||
|
(locate-dominating-file default-directory ".dir-locals.el"))
|
||||||
|
|
||||||
|
(setq-local python-environment-directory
|
||||||
|
(expand-file-name "./local" prj-root))
|
||||||
|
|
||||||
|
;; to get in use of NVM environment, install https://github.com/rejeep/nvm.el
|
||||||
|
(setq-local nvm-dir (expand-file-name "./.nvm" prj-root))
|
||||||
|
|
||||||
|
;; use nodejs from the (local) NVM environment (see nvm-dir)
|
||||||
|
(nvm-use-for-buffer)
|
||||||
|
(ignore-errors (require 'lsp))
|
||||||
|
(setq-local lsp-server-install-dir (car (cdr nvm-current-version)))
|
||||||
|
(setq-local lsp-enable-file-watchers nil)
|
||||||
|
|
||||||
|
;; use 'py3' environment as default
|
||||||
|
(setq-local python-environment-default-root-name
|
||||||
|
"py3")
|
||||||
|
|
||||||
|
(setq-local python-shell-virtualenv-root
|
||||||
|
(expand-file-name
|
||||||
|
python-environment-default-root-name python-environment-directory))
|
||||||
|
|
||||||
|
(setq-local python-shell-interpreter
|
||||||
|
(expand-file-name
|
||||||
|
"bin/python" python-shell-virtualenv-root))))))
|
||||||
|
(makefile-gmake-mode
|
||||||
|
. ((indent-tabs-mode . t)))
|
||||||
|
|
||||||
|
(yaml-mode
|
||||||
|
. ((eval . (progn
|
||||||
|
|
||||||
|
;; flycheck should use the local py3 environment
|
||||||
|
(setq-local flycheck-yaml-yamllint-executable
|
||||||
|
(expand-file-name "bin/yamllint" python-shell-virtualenv-root))
|
||||||
|
|
||||||
|
(setq-local flycheck-yamllintrc
|
||||||
|
(expand-file-name ".yamllint.yml" prj-root))
|
||||||
|
|
||||||
|
(flycheck-checker . yaml-yamllint)))))
|
||||||
|
|
||||||
|
(json-mode
|
||||||
|
. ((eval . (progn
|
||||||
|
(setq-local js-indent-level 4)
|
||||||
|
(flycheck-checker . json-python-json)))))
|
||||||
|
|
||||||
|
(js-mode
|
||||||
|
. ((eval . (progn
|
||||||
|
(ignore-errors (require 'lsp-eslint))
|
||||||
|
(setq-local js-indent-level 2)
|
||||||
|
;; flycheck should use the eslint checker from developer tools
|
||||||
|
(setq-local flycheck-javascript-eslint-executable
|
||||||
|
(expand-file-name "node_modules/.bin/eslint" prj-root))
|
||||||
|
;; (flycheck-mode)
|
||||||
|
|
||||||
|
(if (featurep 'lsp-eslint)
|
||||||
|
(lsp))
|
||||||
|
))))
|
||||||
|
|
||||||
|
(python-mode
|
||||||
|
. ((eval . (progn
|
||||||
|
(ignore-errors (require 'jedi-core))
|
||||||
|
(ignore-errors (require 'lsp-pyright))
|
||||||
|
(ignore-errors (sphinx-doc-mode))
|
||||||
|
(setq-local python-environment-virtualenv
|
||||||
|
(list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
|
||||||
|
;;"--system-site-packages"
|
||||||
|
"--quiet"))
|
||||||
|
|
||||||
|
(setq-local pylint-command
|
||||||
|
(expand-file-name "bin/pylint" python-shell-virtualenv-root))
|
||||||
|
|
||||||
|
(if (featurep 'lsp-pyright)
|
||||||
|
(lsp))
|
||||||
|
|
||||||
|
;; pylint will find the '.pylintrc' file next to the CWD
|
||||||
|
;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options
|
||||||
|
(setq-local flycheck-pylintrc
|
||||||
|
".pylintrc")
|
||||||
|
|
||||||
|
;; flycheck & other python stuff should use the local py3 environment
|
||||||
|
(setq-local flycheck-python-pylint-executable
|
||||||
|
python-shell-interpreter)
|
||||||
|
|
||||||
|
;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server
|
||||||
|
;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You
|
||||||
|
;; can specify a full path instead of a name (relative path). In that case,
|
||||||
|
;; python-environment-directory is ignored and Python virtual environment
|
||||||
|
;; is created at the specified path.
|
||||||
|
(setq-local jedi:environment-root
|
||||||
|
python-shell-virtualenv-root)
|
||||||
|
|
||||||
|
;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command
|
||||||
|
(setq-local jedi:server-command
|
||||||
|
(list python-shell-interpreter
|
||||||
|
jedi:server-script))
|
||||||
|
|
||||||
|
;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv'
|
||||||
|
;; is set buffer local! No need to setup jedi:environment-virtualenv:
|
||||||
|
;;
|
||||||
|
;; Virtualenv command to use. A list of string. If it is nil,
|
||||||
|
;; python-environment-virtualenv is used instead. You must set non-nil
|
||||||
|
;; value to jedi:environment-root in order to make this setting work.
|
||||||
|
;;
|
||||||
|
;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv
|
||||||
|
;;
|
||||||
|
;; (setq-local jedi:environment-virtualenv
|
||||||
|
;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
|
||||||
|
;; "--python"
|
||||||
|
;; "/usr/bin/python3.4"
|
||||||
|
;; ))
|
||||||
|
))))
|
||||||
|
)
|
44
.dockerignore
Normal file
44
.dockerignore
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
*~
|
||||||
|
*/*~
|
||||||
|
*/*/*~
|
||||||
|
*/*/*/*~
|
||||||
|
*/*/*/*/*~
|
||||||
|
|
||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# CI
|
||||||
|
.codeclimate.yml
|
||||||
|
.travis.yml
|
||||||
|
.taskcluster.yml
|
||||||
|
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*/__pycache__/
|
||||||
|
*/*/__pycache__/
|
||||||
|
*/*/*/__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*/*.py[cod]
|
||||||
|
*/*/*.py[cod]
|
||||||
|
*/*/*/*.py[cod]
|
||||||
|
|
||||||
|
# node_modules
|
||||||
|
node_modules/
|
||||||
|
*/node_modules/
|
||||||
|
*/*/node_modules/
|
||||||
|
*/*/*/node_modules/
|
||||||
|
*/*/*/*/node_modules/
|
||||||
|
|
||||||
|
.tx/
|
||||||
|
|
||||||
|
# to sync with .gitignore
|
||||||
|
geckodriver.log
|
||||||
|
.coverage
|
||||||
|
coverage/
|
||||||
|
cache/
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
local/
|
||||||
|
gh-pages/
|
||||||
|
*.egg-info/
|
40
.editorconfig
Normal file
40
.editorconfig
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# https://editorconfig.org/
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
[*.py]
|
||||||
|
max_line_length = 119
|
||||||
|
|
||||||
|
[*.html]
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.json]
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = ignore
|
||||||
|
|
||||||
|
# Minified JavaScript files shouldn't be changed
|
||||||
|
[**.min.js]
|
||||||
|
indent_style = ignore
|
||||||
|
insert_final_newline = ignore
|
||||||
|
|
||||||
|
# Makefiles always use tabs for indentation
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
# Batch files use tabs for indentation
|
||||||
|
[*.bat]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[docs/**.rst]
|
||||||
|
max_line_length = 79
|
||||||
|
|
||||||
|
[*.yml]
|
||||||
|
indent_size = 2
|
11
.gitattributes
vendored
11
.gitattributes
vendored
@ -1 +1,12 @@
|
|||||||
|
*.gif -diff
|
||||||
|
*.png -diff
|
||||||
|
*.min.css -diff
|
||||||
|
*.min.js -diff
|
||||||
|
*.css.map -diff
|
||||||
|
*.js.map -diff
|
||||||
|
*.eot -diff
|
||||||
|
*.svg -diff
|
||||||
|
*.ttf -diff
|
||||||
|
*.woff -diff
|
||||||
|
*.woff2 -diff
|
||||||
messages.mo -diff
|
messages.mo -diff
|
||||||
|
39
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
39
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report a bug in SearXNG
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
|
||||||
|
|
||||||
|
**Version of SearXNG, commit number if you are using on master branch and stipulate if you forked SearXNG**
|
||||||
|
<!-- If you are running on master branch using git execute this command
|
||||||
|
in order to fetch the latest commit ID:
|
||||||
|
```
|
||||||
|
git log -1
|
||||||
|
```
|
||||||
|
If you are using searxng-docker then look at the bottom of the SearXNG page
|
||||||
|
and check for the version after "Powered by SearXNG"
|
||||||
|
|
||||||
|
Please also stipulate if you are using a forked version of SearXNG and
|
||||||
|
include a link to the fork source code.
|
||||||
|
-->
|
||||||
|
**How did you install SearXNG?**
|
||||||
|
<!-- Did you install SearXNG using the official wiki or using searxng-docker
|
||||||
|
or manually by executing the searx/webapp.py file? -->
|
||||||
|
**What happened?**
|
||||||
|
<!-- A clear and concise description of what the bug is. -->
|
||||||
|
|
||||||
|
**How To Reproduce**
|
||||||
|
<!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
<!-- A clear and concise description of what you expected to happen. -->
|
||||||
|
|
||||||
|
**Screenshots & Logs**
|
||||||
|
<!-- If applicable, add screenshots, logs to help explain your problem. -->
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
<!-- Add any other context about the problem here. -->
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Questions & Answers (Q&A)
|
||||||
|
url: https://github.com/searxng/searxng/discussions/categories/q-a
|
||||||
|
about: Ask questions and find answers
|
31
.github/ISSUE_TEMPLATE/engine-request.md
vendored
Normal file
31
.github/ISSUE_TEMPLATE/engine-request.md
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: Engine request
|
||||||
|
about: Request a new engine in SearXNG
|
||||||
|
title: ''
|
||||||
|
labels: enhancement, engine request
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
|
||||||
|
|
||||||
|
**Working URL to the engine**
|
||||||
|
<!-- Please check if the engine is responding correctly before submitting it. -->
|
||||||
|
|
||||||
|
**Why do you want to add this engine?**
|
||||||
|
<!-- What's special about this engine? Is it open source or libre? -->
|
||||||
|
|
||||||
|
**Features of this engine**
|
||||||
|
<!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
|
||||||
|
|
||||||
|
**How can SearXNG fetch the information from this engine?**
|
||||||
|
<!-- List API URL, example code (using the correct markdown) and more
|
||||||
|
that could be useful for the developers in order to implement this engine.
|
||||||
|
If you don't know what to write, let this part blank. -->
|
||||||
|
|
||||||
|
**Applicable category of this engine**
|
||||||
|
<!-- Where should this new engine fit in SearXNG? Current categories in SearXNG:
|
||||||
|
general, files, images, it, map, music, news, science, social media and videos.
|
||||||
|
You can add multiple categories at the same time. -->
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
<!-- Add any other context about this engine here. -->
|
21
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
21
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Request a new feature in SearXNG
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
<!-- A clear and concise description of what you want to happen. -->
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
<!-- Add any other context or screenshots about the feature request here. -->
|
17
.github/dependabot.yml
vendored
Normal file
17
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "pip"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
day: "friday"
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
target-branch: "master"
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/searx/static/themes/simple"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
day: "friday"
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
target-branch: "master"
|
67
.github/workflows/data-update.yml
vendored
Normal file
67
.github/workflows/data-update.yml
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
name: "Update searx.data"
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "59 23 28 * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
updateData:
|
||||||
|
name: Update data - ${{ matrix.fetch }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
if: ${{ github.repository_owner == 'searxng'}}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
fetch:
|
||||||
|
- update_ahmia_blacklist.py
|
||||||
|
- update_currencies.py
|
||||||
|
- update_external_bangs.py
|
||||||
|
- update_firefox_version.py
|
||||||
|
- update_engine_traits.py
|
||||||
|
- update_wikidata_units.py
|
||||||
|
- update_engine_descriptions.py
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Ubuntu packages
|
||||||
|
run: |
|
||||||
|
sudo ./utils/searxng.sh install packages
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
|
||||||
|
- name: Install Python dependencies
|
||||||
|
run: |
|
||||||
|
make V=1 install
|
||||||
|
|
||||||
|
- name: Fetch data
|
||||||
|
env:
|
||||||
|
FETCH_SCRIPT: ./searxng_extra/update/${{ matrix.fetch }}
|
||||||
|
run: |
|
||||||
|
V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
id: cpr
|
||||||
|
uses: peter-evans/create-pull-request@v3
|
||||||
|
with:
|
||||||
|
commit-message: Update searx.data - ${{ matrix.fetch }}
|
||||||
|
committer: searxng-bot <noreply@github.com>
|
||||||
|
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||||
|
signoff: false
|
||||||
|
branch: update_data_${{ matrix.fetch }}
|
||||||
|
delete-branch: true
|
||||||
|
draft: false
|
||||||
|
title: 'Update searx.data - ${{ matrix.fetch }}'
|
||||||
|
body: |
|
||||||
|
Update searx.data - ${{ matrix.fetch }}
|
||||||
|
labels: |
|
||||||
|
data
|
||||||
|
|
||||||
|
- name: Check outputs
|
||||||
|
run: |
|
||||||
|
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
|
||||||
|
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
|
214
.github/workflows/integration.yml
vendored
Normal file
214
.github/workflows/integration.yml
vendored
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
name: Integration
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["master"]
|
||||||
|
pull_request:
|
||||||
|
branches: ["master"]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
python:
|
||||||
|
name: Python ${{ matrix.python-version }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-20.04]
|
||||||
|
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install Ubuntu packages
|
||||||
|
run: |
|
||||||
|
sudo ./utils/searxng.sh install packages
|
||||||
|
sudo apt install firefox
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
|
||||||
|
- name: Install Python dependencies
|
||||||
|
if: steps.cache-python.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make V=1 install
|
||||||
|
make V=1 gecko.driver
|
||||||
|
- name: Run tests
|
||||||
|
run: make V=1 ci.test
|
||||||
|
- name: Test coverage
|
||||||
|
run: make V=1 test.coverage
|
||||||
|
- name: Store coverage result
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: coverage-${{ matrix.python-version }}
|
||||||
|
path: coverage/
|
||||||
|
retention-days: 60
|
||||||
|
|
||||||
|
themes:
|
||||||
|
name: Themes
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install Ubuntu packages
|
||||||
|
run: sudo ./utils/searxng.sh install buildhost
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
|
- name: Install node dependencies
|
||||||
|
run: make V=1 node.env
|
||||||
|
- name: Build themes
|
||||||
|
run: make V=1 themes.all
|
||||||
|
|
||||||
|
documentation:
|
||||||
|
name: Documentation
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
permissions:
|
||||||
|
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Install Ubuntu packages
|
||||||
|
run: sudo ./utils/searxng.sh install buildhost
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
|
- name: Build documentation
|
||||||
|
run: |
|
||||||
|
make V=1 docs.clean docs.html
|
||||||
|
- name: Deploy
|
||||||
|
if: github.ref == 'refs/heads/master'
|
||||||
|
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||||
|
with:
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
BRANCH: gh-pages
|
||||||
|
FOLDER: dist/docs
|
||||||
|
CLEAN: true # Automatically remove deleted files from the deploy branch
|
||||||
|
SINGLE_COMMIT: True
|
||||||
|
COMMIT_MESSAGE: build from commit ${{ github.sha }}
|
||||||
|
|
||||||
|
babel:
|
||||||
|
name: Update translations branch
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
||||||
|
needs:
|
||||||
|
- python
|
||||||
|
- themes
|
||||||
|
- documentation
|
||||||
|
permissions:
|
||||||
|
contents: write # for make V=1 weblate.push.translations
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
|
- name: weblate & git setup
|
||||||
|
env:
|
||||||
|
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.config
|
||||||
|
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||||
|
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||||
|
git config --global user.name "searxng-bot"
|
||||||
|
- name: Update transations
|
||||||
|
id: update
|
||||||
|
run: |
|
||||||
|
git restore utils/brand.env
|
||||||
|
make V=1 weblate.push.translations
|
||||||
|
|
||||||
|
dockers:
|
||||||
|
name: Docker
|
||||||
|
if: github.ref == 'refs/heads/master'
|
||||||
|
needs:
|
||||||
|
- python
|
||||||
|
- themes
|
||||||
|
- documentation
|
||||||
|
env:
|
||||||
|
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
# make sure "make docker.push" can get the git history
|
||||||
|
fetch-depth: '0'
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
|
- name: Set up QEMU
|
||||||
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
- name: Login to DockerHub
|
||||||
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and push
|
||||||
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
|
run: make -e GIT_URL=$(git remote get-url origin) docker.buildx
|
28
.github/workflows/security.yml
vendored
Normal file
28
.github/workflows/security.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
name: "Security checks"
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "42 05 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dockers:
|
||||||
|
name: Trivy ${{ matrix.image }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run Trivy vulnerability scanner
|
||||||
|
uses: aquasecurity/trivy-action@master
|
||||||
|
with:
|
||||||
|
image-ref: 'searxng/searxng:latest'
|
||||||
|
ignore-unfixed: false
|
||||||
|
vuln-type: 'os,library'
|
||||||
|
severity: 'UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL'
|
||||||
|
format: 'sarif'
|
||||||
|
output: 'trivy-results.sarif'
|
||||||
|
|
||||||
|
- name: Upload Trivy scan results to GitHub Security tab
|
||||||
|
uses: github/codeql-action/upload-sarif@v2
|
||||||
|
with:
|
||||||
|
sarif_file: 'trivy-results.sarif'
|
59
.github/workflows/translations-update.yml
vendored
Normal file
59
.github/workflows/translations-update.yml
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
name: "Update translations"
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "05 07 * * 5"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
babel:
|
||||||
|
name: "create PR for additions from weblate"
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: '0'
|
||||||
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
architecture: 'x64'
|
||||||
|
- name: Cache Python dependencies
|
||||||
|
id: cache-python
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./local
|
||||||
|
./.nvm
|
||||||
|
./node_modules
|
||||||
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
|
- name: weblate & git setup
|
||||||
|
env:
|
||||||
|
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.config
|
||||||
|
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||||
|
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||||
|
git config --global user.name "searxng-bot"
|
||||||
|
- name: Merge and push transation updates
|
||||||
|
run: |
|
||||||
|
make V=1 weblate.translations.commit
|
||||||
|
- name: Create Pull Request
|
||||||
|
id: cpr
|
||||||
|
uses: peter-evans/create-pull-request@v3
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
|
commit-message: Update translations
|
||||||
|
committer: searxng-bot <searxng-bot@users.noreply.github.com>
|
||||||
|
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||||
|
signoff: false
|
||||||
|
branch: translations_update
|
||||||
|
delete-branch: true
|
||||||
|
draft: false
|
||||||
|
title: 'Update translations'
|
||||||
|
body: |
|
||||||
|
Update translations
|
||||||
|
labels: |
|
||||||
|
translation
|
26
.gitignore
vendored
26
.gitignore
vendored
@ -1 +1,25 @@
|
|||||||
messages.mo
|
# to sync with .dockerignore & pyrightconfig.json
|
||||||
|
|
||||||
|
*.pyc
|
||||||
|
*/*.pyc
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
geckodriver.log
|
||||||
|
|
||||||
|
.coverage
|
||||||
|
coverage/
|
||||||
|
|
||||||
|
.nvm/
|
||||||
|
cache/
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
local/
|
||||||
|
gh-pages/
|
||||||
|
*.egg-info/
|
||||||
|
|
||||||
|
/package-lock.json
|
||||||
|
/node_modules/
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
searx/version_frozen.py
|
||||||
|
407
.pylintrc
Normal file
407
.pylintrc
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
# -*- coding: utf-8; mode: conf -*-
|
||||||
|
# lint Python modules using external checkers.
|
||||||
|
#
|
||||||
|
# This is the main checker controlling the other ones and the reports
|
||||||
|
# generation. It is itself both a raw checker and an astng checker in order
|
||||||
|
# to:
|
||||||
|
# * handle message activation / deactivation at the module level
|
||||||
|
# * handle some basic but necessary stats'data (number of classes, methods...)
|
||||||
|
#
|
||||||
|
[MASTER]
|
||||||
|
|
||||||
|
# A comma-separated list of package or module names from where C extensions may
|
||||||
|
# be loaded. Extensions are loading into the active Python interpreter and may
|
||||||
|
# run arbitrary code
|
||||||
|
extension-pkg-whitelist=lxml.etree
|
||||||
|
|
||||||
|
# Add files or directories to the blacklist. They should be base names, not
|
||||||
|
# paths.
|
||||||
|
ignore=CVS, .git, .svn
|
||||||
|
|
||||||
|
# Add files or directories matching the regex patterns to the blacklist. The
|
||||||
|
# regex matches against base names, not paths.
|
||||||
|
ignore-patterns=
|
||||||
|
|
||||||
|
# Python code to execute, usually for sys.path manipulation such as
|
||||||
|
# pygtk.require().
|
||||||
|
#init-hook=
|
||||||
|
|
||||||
|
# Use multiple processes to speed up Pylint.
|
||||||
|
jobs=1
|
||||||
|
|
||||||
|
# List of plugins (as comma separated values of python modules names) to load,
|
||||||
|
# usually to register additional checkers.
|
||||||
|
load-plugins=
|
||||||
|
|
||||||
|
# Pickle collected data for later comparisons.
|
||||||
|
persistent=yes
|
||||||
|
|
||||||
|
# Specify a configuration file.
|
||||||
|
#rcfile=
|
||||||
|
|
||||||
|
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||||
|
# active Python interpreter and may run arbitrary code.
|
||||||
|
unsafe-load-any-extension=no
|
||||||
|
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
|
||||||
|
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||||
|
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||||
|
confidence=
|
||||||
|
|
||||||
|
# Disable the message, report, category or checker with the given id(s). You
|
||||||
|
# can either give multiple identifiers separated by comma (,) or put this
|
||||||
|
# option multiple times (only on the command line, not in the configuration
|
||||||
|
# file where it should appear only once).You can also use "--disable=all" to
|
||||||
|
# disable everything first and then reenable specific checks. For example, if
|
||||||
|
# you want to run only the similarities checker, you can use "--disable=all
|
||||||
|
# --enable=similarities". If you want to run only the classes checker, but have
|
||||||
|
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||||
|
# --disable=W"
|
||||||
|
disable=duplicate-code,
|
||||||
|
missing-function-docstring,
|
||||||
|
consider-using-f-string,
|
||||||
|
|
||||||
|
# Enable the message, report, category or checker with the given id(s). You can
|
||||||
|
# either give multiple identifier separated by comma (,) or put this option
|
||||||
|
# multiple time (only on the command line, not in the configuration file where
|
||||||
|
# it should appear only once). See also the "--disable" option for examples.
|
||||||
|
enable=
|
||||||
|
|
||||||
|
|
||||||
|
[REPORTS]
|
||||||
|
|
||||||
|
# Python expression which should return a note less than 10 (10 is the highest
|
||||||
|
# note). You have access to the variables errors warning, statement which
|
||||||
|
# respectively contain the number of errors / warnings messages and the total
|
||||||
|
# number of statements analyzed. This is used by the global evaluation report
|
||||||
|
# (RP0004).
|
||||||
|
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||||
|
|
||||||
|
# Template used to display messages. This is a python new-style format string
|
||||||
|
# used to format the message information. See doc for all details
|
||||||
|
|
||||||
|
# HINT: do not set this here, use argument --msg-template=...
|
||||||
|
#msg-template={path}:{line}: [{msg_id}({symbol}),{obj}] {msg}
|
||||||
|
|
||||||
|
# Set the output format. Available formats are text, parseable, colorized, json
|
||||||
|
# and msvs (visual studio).You can also give a reporter class, eg
|
||||||
|
# mypackage.mymodule.MyReporterClass.
|
||||||
|
|
||||||
|
# HINT: do not set this here, use argument --output-format=...
|
||||||
|
#output-format=text
|
||||||
|
|
||||||
|
# Tells whether to display a full report or only the messages
|
||||||
|
reports=no
|
||||||
|
|
||||||
|
# Activate the evaluation score.
|
||||||
|
score=yes
|
||||||
|
|
||||||
|
|
||||||
|
[REFACTORING]
|
||||||
|
|
||||||
|
# Maximum number of nested blocks for function / method body
|
||||||
|
max-nested-blocks=5
|
||||||
|
|
||||||
|
|
||||||
|
[BASIC]
|
||||||
|
|
||||||
|
# Regular expression matching correct argument names
|
||||||
|
argument-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
|
||||||
|
|
||||||
|
# Regular expression matching correct attribute names
|
||||||
|
attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*)|([A-Z0-9_]*))$
|
||||||
|
|
||||||
|
# Bad variable names which should always be refused, separated by a comma
|
||||||
|
bad-names=foo,bar,baz,toto,tutu,tata
|
||||||
|
|
||||||
|
# Regular expression matching correct class attribute names
|
||||||
|
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
|
||||||
|
|
||||||
|
# Regular expression matching correct class names
|
||||||
|
class-rgx=[A-Z_][a-zA-Z0-9]+$
|
||||||
|
|
||||||
|
# Regular expression matching correct constant names
|
||||||
|
const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$
|
||||||
|
#const-rgx=[f]?[A-Z_][a-zA-Z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Minimum line length for functions/classes that require docstrings, shorter
|
||||||
|
# ones are exempt.
|
||||||
|
docstring-min-length=-1
|
||||||
|
|
||||||
|
# Regular expression matching correct function names
|
||||||
|
function-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
|
||||||
|
|
||||||
|
# Good variable names which should always be accepted, separated by a comma
|
||||||
|
good-names=i,j,k,ex,Run,_,log,cfg,id
|
||||||
|
|
||||||
|
# Include a hint for the correct naming format with invalid-name
|
||||||
|
include-naming-hint=no
|
||||||
|
|
||||||
|
# Regular expression matching correct inline iteration names
|
||||||
|
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct method names
|
||||||
|
method-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
|
||||||
|
|
||||||
|
# Regular expression matching correct module names
|
||||||
|
#module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
|
||||||
|
module-rgx=([a-z_][a-z0-9_]*)$
|
||||||
|
|
||||||
|
# Colon-delimited sets of names that determine each other's naming style when
|
||||||
|
# the name regexes allow several styles.
|
||||||
|
name-group=
|
||||||
|
|
||||||
|
# Regular expression which should only match function or class names that do
|
||||||
|
# not require a docstring.
|
||||||
|
no-docstring-rgx=^_
|
||||||
|
|
||||||
|
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||||
|
# to this list to register other decorators that produce valid properties.
|
||||||
|
property-classes=abc.abstractproperty
|
||||||
|
|
||||||
|
# Regular expression matching correct variable names
|
||||||
|
variable-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*)|([a-z]))$
|
||||||
|
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
|
||||||
|
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||||
|
expected-line-ending-format=
|
||||||
|
|
||||||
|
# Regexp for a line that is allowed to be longer than the limit.
|
||||||
|
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||||
|
|
||||||
|
# Number of spaces of indent required inside a hanging or continued line.
|
||||||
|
indent-after-paren=4
|
||||||
|
|
||||||
|
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||||
|
# tab).
|
||||||
|
indent-string=' '
|
||||||
|
|
||||||
|
# Maximum number of characters on a single line.
|
||||||
|
max-line-length=120
|
||||||
|
|
||||||
|
# Maximum number of lines in a module
|
||||||
|
max-module-lines=2000
|
||||||
|
|
||||||
|
# Allow the body of a class to be on the same line as the declaration if body
|
||||||
|
# contains single statement.No config file found, using default configuration
|
||||||
|
|
||||||
|
single-line-class-stmt=no
|
||||||
|
|
||||||
|
# Allow the body of an if to be on the same line as the test if there is no
|
||||||
|
# else.
|
||||||
|
single-line-if-stmt=no
|
||||||
|
|
||||||
|
|
||||||
|
[LOGGING]
|
||||||
|
|
||||||
|
# Logging modules to check that the string format arguments are in logging
|
||||||
|
# function parameter format
|
||||||
|
logging-modules=logging
|
||||||
|
|
||||||
|
|
||||||
|
[MISCELLANEOUS]
|
||||||
|
|
||||||
|
# List of note tags to take in consideration, separated by a comma.
|
||||||
|
notes=FIXME,XXX,TODO
|
||||||
|
|
||||||
|
|
||||||
|
[SIMILARITIES]
|
||||||
|
|
||||||
|
# Ignore comments when computing similarities.
|
||||||
|
ignore-comments=yes
|
||||||
|
|
||||||
|
# Ignore docstrings when computing similarities.
|
||||||
|
ignore-docstrings=yes
|
||||||
|
|
||||||
|
# Ignore imports when computing similarities.
|
||||||
|
ignore-imports=no
|
||||||
|
|
||||||
|
# Minimum lines number of a similarity.
|
||||||
|
min-similarity-lines=4
|
||||||
|
|
||||||
|
|
||||||
|
[SPELLING]
|
||||||
|
|
||||||
|
# Spelling dictionary name. Available dictionaries: none. To make it working
|
||||||
|
# install python-enchant package.
|
||||||
|
spelling-dict=
|
||||||
|
|
||||||
|
# List of comma separated words that should not be checked.
|
||||||
|
spelling-ignore-words=
|
||||||
|
|
||||||
|
# A path to a file that contains private dictionary; one word per line.
|
||||||
|
spelling-private-dict-file=
|
||||||
|
|
||||||
|
# Tells whether to store unknown words to indicated private dictionary in
|
||||||
|
# --spelling-private-dict-file option instead of raising a message.
|
||||||
|
spelling-store-unknown-words=no
|
||||||
|
|
||||||
|
|
||||||
|
[TYPECHECK]
|
||||||
|
|
||||||
|
# List of decorators that produce context managers, such as
|
||||||
|
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||||
|
# produce valid context managers.
|
||||||
|
contextmanager-decorators=contextlib.contextmanager
|
||||||
|
|
||||||
|
# List of members which are set dynamically and missed by pylint inference
|
||||||
|
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||||
|
# expressions are accepted.
|
||||||
|
generated-members=
|
||||||
|
|
||||||
|
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||||
|
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||||
|
ignore-mixin-members=yes
|
||||||
|
|
||||||
|
# This flag controls whether pylint should warn about no-member and similar
|
||||||
|
# checks whenever an opaque object is returned when inferring. The inference
|
||||||
|
# can return multiple potential results while evaluating a Python object, but
|
||||||
|
# some branches might not be evaluated, which results in partial inference. In
|
||||||
|
# that case, it might be useful to still emit no-member and other checks for
|
||||||
|
# the rest of the inferred objects.
|
||||||
|
ignore-on-opaque-inference=yes
|
||||||
|
|
||||||
|
# List of class names for which member attributes should not be checked (useful
|
||||||
|
# for classes with dynamically set attributes). This supports the use of
|
||||||
|
# qualified names.
|
||||||
|
ignored-classes=optparse.Values,thread._local,_thread._local
|
||||||
|
|
||||||
|
# List of module names for which member attributes should not be checked
|
||||||
|
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||||
|
# and thus existing member attributes cannot be deduced by static analysis. It
|
||||||
|
# supports qualified module names, as well as Unix pattern matching.
|
||||||
|
ignored-modules=
|
||||||
|
|
||||||
|
# Show a hint with possible names when a member name was not found. The aspect
|
||||||
|
# of finding the hint is based on edit distance.
|
||||||
|
missing-member-hint=yes
|
||||||
|
|
||||||
|
# The minimum edit distance a name should have in order to be considered a
|
||||||
|
# similar match for a missing member name.
|
||||||
|
missing-member-hint-distance=1
|
||||||
|
|
||||||
|
# The total number of similar names that should be taken in consideration when
|
||||||
|
# showing a hint for a missing member.
|
||||||
|
missing-member-max-choices=1
|
||||||
|
|
||||||
|
|
||||||
|
[VARIABLES]
|
||||||
|
|
||||||
|
# List of additional names supposed to be defined in builtins. Remember that
|
||||||
|
# you should avoid to define new builtins when possible.
|
||||||
|
additional-builtins=
|
||||||
|
|
||||||
|
# Tells whether unused global variables should be treated as a violation.
|
||||||
|
allow-global-unused-variables=yes
|
||||||
|
|
||||||
|
# List of strings which can identify a callback function by name. A callback
|
||||||
|
# name must start or end with one of those strings.
|
||||||
|
callbacks=cb_,_cb
|
||||||
|
|
||||||
|
# A regular expression matching the name of dummy variables (i.e. expectedly
|
||||||
|
# not used).
|
||||||
|
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
|
||||||
|
|
||||||
|
# Argument names that match this expression will be ignored. Default to name
|
||||||
|
# with leading underscore
|
||||||
|
ignored-argument-names=_.*|^ignored_|^unused_
|
||||||
|
|
||||||
|
# Tells whether we should check for unused import in __init__ files.
|
||||||
|
init-import=no
|
||||||
|
|
||||||
|
# List of qualified module names which can have objects that can redefine
|
||||||
|
# builtins.
|
||||||
|
redefining-builtins-modules=six.moves,future.builtins
|
||||||
|
|
||||||
|
|
||||||
|
[CLASSES]
|
||||||
|
|
||||||
|
# List of method names used to declare (i.e. assign) instance attributes.
|
||||||
|
defining-attr-methods=__init__,__new__,setUp
|
||||||
|
|
||||||
|
# List of member names, which should be excluded from the protected access
|
||||||
|
# warning.
|
||||||
|
exclude-protected=_asdict,_fields,_replace,_source,_make
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a class method.
|
||||||
|
valid-classmethod-first-arg=cls
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a metaclass class method.
|
||||||
|
valid-metaclass-classmethod-first-arg=mcs
|
||||||
|
|
||||||
|
|
||||||
|
[DESIGN]
|
||||||
|
|
||||||
|
# Maximum number of arguments for function / method
|
||||||
|
max-args=8
|
||||||
|
|
||||||
|
# Maximum number of attributes for a class (see R0902).
|
||||||
|
max-attributes=20
|
||||||
|
|
||||||
|
# Maximum number of boolean expressions in a if statement
|
||||||
|
max-bool-expr=5
|
||||||
|
|
||||||
|
# Maximum number of branch for function / method body
|
||||||
|
max-branches=12
|
||||||
|
|
||||||
|
# Maximum number of locals for function / method body
|
||||||
|
max-locals=20
|
||||||
|
|
||||||
|
# Maximum number of parents for a class (see R0901).
|
||||||
|
max-parents=7
|
||||||
|
|
||||||
|
# Maximum number of public methods for a class (see R0904).
|
||||||
|
max-public-methods=20
|
||||||
|
|
||||||
|
# Maximum number of return / yield for function / method body
|
||||||
|
max-returns=6
|
||||||
|
|
||||||
|
# Maximum number of statements in function / method body
|
||||||
|
max-statements=50
|
||||||
|
|
||||||
|
# Minimum number of public methods for a class (see R0903).
|
||||||
|
min-public-methods=2
|
||||||
|
|
||||||
|
|
||||||
|
[IMPORTS]
|
||||||
|
|
||||||
|
# Allow wildcard imports from modules that define __all__.
|
||||||
|
allow-wildcard-with-all=no
|
||||||
|
|
||||||
|
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||||
|
# 3 compatible code, which means that the block might have code that exists
|
||||||
|
# only in one or another interpreter, leading to false positives when analysed.
|
||||||
|
analyse-fallback-blocks=no
|
||||||
|
|
||||||
|
# Deprecated modules which should not be used, separated by a comma
|
||||||
|
deprecated-modules=optparse,tkinter.tix
|
||||||
|
|
||||||
|
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
ext-import-graph=
|
||||||
|
|
||||||
|
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||||
|
# given file (report RP0402 must not be disabled)
|
||||||
|
import-graph=
|
||||||
|
|
||||||
|
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
int-import-graph=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of the standard
|
||||||
|
# compatibility libraries.
|
||||||
|
known-standard-library=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of a third party library.
|
||||||
|
known-third-party=enchant
|
||||||
|
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when being caught. Defaults to
|
||||||
|
# "Exception"
|
||||||
|
overgeneral-exceptions=builtins.Exception
|
23
.vscode/launch.json
vendored
Normal file
23
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "SearXNG",
|
||||||
|
"type": "python",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "searx.webapp",
|
||||||
|
"env": {
|
||||||
|
"FLASK_APP": "webapp",
|
||||||
|
"FLASK_DEBUG": "1",
|
||||||
|
"SEARXNG_DEBUG": "1",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"run"
|
||||||
|
],
|
||||||
|
"jinja": true,
|
||||||
|
"justMyCode": true,
|
||||||
|
"python": "${workspaceFolder}/local/py3/bin/python",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"python.testing.unittestArgs": [
|
||||||
|
"-v",
|
||||||
|
"-s",
|
||||||
|
"./tests",
|
||||||
|
"-p",
|
||||||
|
"test_*.py"
|
||||||
|
],
|
||||||
|
"python.testing.pytestEnabled": false,
|
||||||
|
"python.testing.unittestEnabled": true,
|
||||||
|
}
|
36
.vscode/tasks.json
vendored
Normal file
36
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
|
// for the documentation about the tasks.json format
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "make run",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "make run",
|
||||||
|
"problemMatcher": [],
|
||||||
|
"isBackground": true,
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "dedicated"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "make docs.live",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "make docs.live",
|
||||||
|
"problemMatcher": [],
|
||||||
|
"isBackground": true,
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "dedicated"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "build"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
3
.weblate
Normal file
3
.weblate
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[weblate]
|
||||||
|
url = https://translate.codeberg.org/api/
|
||||||
|
translation = searxng/searxng
|
16
.yamllint.yml
Normal file
16
.yamllint.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
extends: default
|
||||||
|
|
||||||
|
rules:
|
||||||
|
|
||||||
|
indentation:
|
||||||
|
spaces: 2
|
||||||
|
|
||||||
|
# 120 chars should be enough, but don't fail if a line is longer
|
||||||
|
line-length:
|
||||||
|
max: 120
|
||||||
|
level: warning
|
||||||
|
allow-non-breakable-words: true
|
||||||
|
|
||||||
|
# we don't have multiple document per file
|
||||||
|
document-start: disable
|
||||||
|
document-end: disable
|
172
AUTHORS.rst
Normal file
172
AUTHORS.rst
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
searxng is a fork from `searx <https://github.com/searx/searx>`_ and is
|
||||||
|
maintained by Markus Heiser (`@return42 <https://github.com/return42>`_)
|
||||||
|
|
||||||
|
People who have submitted patches/translations, reported bugs, consulted
|
||||||
|
features or generally made searx better:
|
||||||
|
|
||||||
|
- Adam Tauber `@asciimoo <https://github.com/asciimoo>`_
|
||||||
|
- Matej Cotman `@matejc <https://github.com/matejc>`_
|
||||||
|
- Émilien Devos `@unixfox <https://github.com/unixfox>`_
|
||||||
|
- Thomas Pointhuber `pointhi <https://github.com/pointhi>`_
|
||||||
|
- Noémi Ványi `@kvch <https://github.com/kvch>`_
|
||||||
|
- `@Cqoicebordel <https://github.com/Cqoicebordel>`_
|
||||||
|
- Marc Abonce Seguin `@MarcAbonce <https://github.com/MarcAbonce>`_
|
||||||
|
- `@pofilo <https://github.com/pofilo>`_
|
||||||
|
|
||||||
|
- Laszlo Hammerl
|
||||||
|
- Stefan Marsiske
|
||||||
|
- Gabor Nagy
|
||||||
|
- @pw3t
|
||||||
|
- @rhapsodhy
|
||||||
|
- András Veres-Szentkirályi
|
||||||
|
- Benjamin Sonntag
|
||||||
|
- @HLFH
|
||||||
|
- @TheRadialActive
|
||||||
|
- @Okhin
|
||||||
|
- André Koot
|
||||||
|
- Alejandro León Aznar
|
||||||
|
- rike
|
||||||
|
- dp
|
||||||
|
- Martin Zimmermann
|
||||||
|
- @courgette
|
||||||
|
- @kernc
|
||||||
|
- @Reventl0v
|
||||||
|
- Caner Başaran
|
||||||
|
- Benjamin Sonntag
|
||||||
|
- @opi
|
||||||
|
- @dimqua
|
||||||
|
- Giorgos Logiotatidis
|
||||||
|
- Luc Didry
|
||||||
|
- Niklas Haas
|
||||||
|
- @underr
|
||||||
|
- Emmanuel Benazera
|
||||||
|
- @GreenLunar
|
||||||
|
- Kang-min Liu
|
||||||
|
- Kirill Isakov
|
||||||
|
- Guilhem Bonnefille
|
||||||
|
- @jibe-b
|
||||||
|
- Christian Pietsch @pietsch
|
||||||
|
- @Maxqia
|
||||||
|
- Ashutosh Das @pyprism
|
||||||
|
- YuLun Shih @imZack
|
||||||
|
- Dmitry Mikhirev @mikhirev
|
||||||
|
- David A Roberts `@davidar <https://github.com/davidar>`_
|
||||||
|
- Jan Verbeek @blyxxyz
|
||||||
|
- Ammar Najjar @ammarnajjar
|
||||||
|
- @stepshal
|
||||||
|
- François Revol @mmuman
|
||||||
|
- Harry Wood @harry-wood
|
||||||
|
- Thomas Renard @threnard
|
||||||
|
- Pydo `<https://github.com/pydo>`_
|
||||||
|
- Athemis `<https://github.com/Athemis>`_
|
||||||
|
- Stefan Antoni `<http://stefan.antoni.io>`
|
||||||
|
- @firebovine
|
||||||
|
- Lorenzo J. Lucchini @luccoj
|
||||||
|
- @eig8phei
|
||||||
|
- @maxigas
|
||||||
|
- Jannik Winkel @kiney
|
||||||
|
- @juanitobananas
|
||||||
|
- Vache Asatryan @vachi
|
||||||
|
- Luca CPZ @lcpz
|
||||||
|
- @nikaiw
|
||||||
|
- Thirnearez
|
||||||
|
- Hypolite Petovan @MrPetovan
|
||||||
|
- @woorst
|
||||||
|
- @Apply55gx
|
||||||
|
- @pyrrh0n1c
|
||||||
|
- @cclauss
|
||||||
|
- QGW @moon2l
|
||||||
|
- Pierre-Alain Toret @daftaupe
|
||||||
|
- Matthew Olmsted @icegiant
|
||||||
|
- Michael Tran @trankmichael
|
||||||
|
- Joseph Nuthalapati @josephkiranbabu
|
||||||
|
- @maiki
|
||||||
|
- Richard Didier @zeph33
|
||||||
|
- Michael Vieria @Themimitoof
|
||||||
|
- Richard Nespithal @rndevfx
|
||||||
|
- Stanislas @angristan
|
||||||
|
- @rinpatch
|
||||||
|
- g. s. @usernameisntallowed
|
||||||
|
- Léo Bourrel @bourrel
|
||||||
|
- @cy8aer
|
||||||
|
- @Popolon
|
||||||
|
- Alice Ferrazzi @aliceinwire
|
||||||
|
- @LiquidLemon
|
||||||
|
- @dadosch
|
||||||
|
- Václav Zouzalík @Venca24
|
||||||
|
- @ZEROF
|
||||||
|
- Ivan Skytte Jørgensen @isj-privacore
|
||||||
|
- @miicha
|
||||||
|
- Étienne Deparis @milouse
|
||||||
|
- @pelag0s
|
||||||
|
- Denis Wernert @d-tux
|
||||||
|
- Robin Hallabro-Kokko @hallabro
|
||||||
|
- Jonas Zohren @jfowl
|
||||||
|
- Elias Ojala @theel0ja
|
||||||
|
- @brunob
|
||||||
|
- Nick Espig @nachtalb
|
||||||
|
- Rachmadani Haryono @rachmadaniHaryono
|
||||||
|
- Frank de Lange @yetangitu
|
||||||
|
- Nicolas Gelot @nfk
|
||||||
|
- @volth
|
||||||
|
- Mathieu Brunot @madmath03
|
||||||
|
- @lorddavidiii
|
||||||
|
- @x250
|
||||||
|
- Robby O'Connor @robbyoconnor
|
||||||
|
- Finn @0xhtml
|
||||||
|
- @tmikaeld
|
||||||
|
- @hobbestigrou
|
||||||
|
- Vipul @finn0
|
||||||
|
- @CaffeinatedTech
|
||||||
|
- Robin Schneider @ypid
|
||||||
|
- @splintah
|
||||||
|
- Lukas van den Berk @lukasvdberk
|
||||||
|
- @piplongrun
|
||||||
|
- Jason Kaltsikis @jjasonkal
|
||||||
|
- Sion Kazama @KazamaSion
|
||||||
|
- @resynth1943
|
||||||
|
- Mostafa Ahangarha @ahangarha
|
||||||
|
- @gordon-quad
|
||||||
|
- Sophie Tauchert @999eagle
|
||||||
|
- @bauruine
|
||||||
|
- Michael Ilsaas `<https://mikeri.net>`_
|
||||||
|
- @renyhp
|
||||||
|
- rachmadani haryono @rachmadaniHaryono
|
||||||
|
- Mohamad Safadieh @msafadieh
|
||||||
|
- @gardouille
|
||||||
|
- @resynth1943
|
||||||
|
- @Eliesemoule
|
||||||
|
- @gardouille
|
||||||
|
- @GazoilKerozen
|
||||||
|
- Lukáš Kucharczyk @KucharczykL
|
||||||
|
- Lynda Lopez @lyndalopez544
|
||||||
|
- M. Efe Çetin @efectn
|
||||||
|
- Nícholas Kegler @nicholasks
|
||||||
|
- @pierrechtux
|
||||||
|
- Scott Wallace @scottwallacesh
|
||||||
|
- @Singustromo
|
||||||
|
- @TheEvilSkeleton
|
||||||
|
- @Wonderfall
|
||||||
|
- @mrwormo
|
||||||
|
- Xiaoyu WEI @xywei
|
||||||
|
- @joshu9h
|
||||||
|
- Daniel Hones
|
||||||
|
- @cyclaero
|
||||||
|
- @thezeroalpha
|
||||||
|
- @Tobi823
|
||||||
|
- @archiecodes
|
||||||
|
- @BBaoVanC
|
||||||
|
- @datagram1
|
||||||
|
- @lucky13820
|
||||||
|
- @jhigginbotham
|
||||||
|
- @xenrox
|
||||||
|
- @OliveiraHermogenes
|
||||||
|
- Paul Alcock @Guilvareux
|
||||||
|
- Sam A. `<https://samsapti.dev>`_
|
||||||
|
- @XavierHorwood
|
||||||
|
- Ahmad Alkadri `<https://github.com/ahmad-alkadri>`_
|
||||||
|
- Milad Laly @Milad-Laly
|
||||||
|
- @llmII
|
||||||
|
- @blob42 `<https://blob42.xyz>`_
|
||||||
|
- Paolo Basso `<https://github.com/paolobasso99>`
|
||||||
|
- Bernie Huang `<https://github.com/BernieHuang2008>`
|
14
CHANGELOG.rst
Normal file
14
CHANGELOG.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
=======
|
||||||
|
SearXNG
|
||||||
|
=======
|
||||||
|
|
||||||
|
SearXNG development has been started in the middle of 2021 as a fork of the
|
||||||
|
searx project. Since it beginning its a rolling release pulled from SearXNG's
|
||||||
|
master branch:
|
||||||
|
|
||||||
|
- The CHANGELOG_ is replaced by the commit history of the master branch.
|
||||||
|
- Since merged PR-229_, the version number is based on the git commit
|
||||||
|
|
||||||
|
.. _CHANGELOG: https://github.com/searxng/searxng/commits/master
|
||||||
|
.. _PR-229: https://github.com/searxng/searxng/pull/229
|
||||||
|
|
49
CONTRIBUTING.md
Normal file
49
CONTRIBUTING.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# How to contribute
|
||||||
|
|
||||||
|
## Resources in the documentation
|
||||||
|
|
||||||
|
* [Development quickstart](https://docs.searxng.org/dev/contribution_guide.html)
|
||||||
|
* [Contribution guide](https://docs.searxng.org/dev/contribution_guide.html)
|
||||||
|
|
||||||
|
## Submitting PRs
|
||||||
|
|
||||||
|
Please follow the provided PR template when writing a description for your changes.
|
||||||
|
|
||||||
|
Do not take criticism personally. When you get feedback, it is about your work,
|
||||||
|
not your character, personality, etc. Keep in mind we all want to make the project better.
|
||||||
|
|
||||||
|
When something is not clear, please ask questions to clear things up.
|
||||||
|
|
||||||
|
If you would like to introduce a big architectural changes or do a refactoring
|
||||||
|
either in the codebase or the development tools, please open an issue with a proposal
|
||||||
|
first. This way we can think together about the problem and probably come up
|
||||||
|
with a better solution.
|
||||||
|
|
||||||
|
## Coding conventions and guidelines
|
||||||
|
|
||||||
|
### Commit messages
|
||||||
|
|
||||||
|
* Always write descriptive commit messages ("fix bug" is not acceptable).
|
||||||
|
* Use the present tense ("Add feature" not "Added feature").
|
||||||
|
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
|
||||||
|
* Limit the first line to 72 characters or less.
|
||||||
|
* Include the number of the issue you are fixing.
|
||||||
|
|
||||||
|
### Coding guidelines
|
||||||
|
|
||||||
|
As a Python project, we must follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) and [PEP 20](https://www.python.org/dev/peps/pep-0020/) guidelines.
|
||||||
|
|
||||||
|
Furthermore, follow the Clean code conventions. The most important
|
||||||
|
in this project are the following rules:
|
||||||
|
|
||||||
|
* Simpler is better. [KISS principle](https://en.wikipedia.org/wiki/KISS_principle)
|
||||||
|
* Be consistent.
|
||||||
|
* Every function must do one thing.
|
||||||
|
* Use descriptive names for functions and variables.
|
||||||
|
* Always look for the root cause.
|
||||||
|
* Keep configurable data high level.
|
||||||
|
* Avoid negative conditionals.
|
||||||
|
* Prefer fewer arguments.
|
||||||
|
* Do not add obvious comment to code.
|
||||||
|
* Do not comment out code, just delete lines.
|
||||||
|
|
88
Dockerfile
Normal file
88
Dockerfile
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
FROM alpine:3.18
|
||||||
|
ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
|
||||||
|
EXPOSE 8080
|
||||||
|
VOLUME /etc/searxng
|
||||||
|
|
||||||
|
ARG SEARXNG_GID=977
|
||||||
|
ARG SEARXNG_UID=977
|
||||||
|
|
||||||
|
RUN addgroup -g ${SEARXNG_GID} searxng && \
|
||||||
|
adduser -u ${SEARXNG_UID} -D -h /usr/local/searxng -s /bin/sh -G searxng searxng
|
||||||
|
|
||||||
|
ENV INSTANCE_NAME=searxng \
|
||||||
|
AUTOCOMPLETE= \
|
||||||
|
BASE_URL= \
|
||||||
|
MORTY_KEY= \
|
||||||
|
MORTY_URL= \
|
||||||
|
SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \
|
||||||
|
UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini
|
||||||
|
|
||||||
|
WORKDIR /usr/local/searxng
|
||||||
|
|
||||||
|
COPY requirements.txt ./requirements.txt
|
||||||
|
|
||||||
|
RUN apk add --no-cache -t build-dependencies \
|
||||||
|
build-base \
|
||||||
|
py3-setuptools \
|
||||||
|
python3-dev \
|
||||||
|
libffi-dev \
|
||||||
|
libxslt-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
openssl-dev \
|
||||||
|
tar \
|
||||||
|
git \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
ca-certificates \
|
||||||
|
su-exec \
|
||||||
|
python3 \
|
||||||
|
py3-pip \
|
||||||
|
libxml2 \
|
||||||
|
libxslt \
|
||||||
|
openssl \
|
||||||
|
tini \
|
||||||
|
uwsgi \
|
||||||
|
uwsgi-python3 \
|
||||||
|
brotli \
|
||||||
|
&& pip3 install --no-cache -r requirements.txt \
|
||||||
|
&& apk del build-dependencies \
|
||||||
|
&& rm -rf /root/.cache
|
||||||
|
|
||||||
|
COPY --chown=searxng:searxng dockerfiles ./dockerfiles
|
||||||
|
COPY --chown=searxng:searxng searx ./searx
|
||||||
|
|
||||||
|
ARG TIMESTAMP_SETTINGS=0
|
||||||
|
ARG TIMESTAMP_UWSGI=0
|
||||||
|
ARG VERSION_GITCOMMIT=unknown
|
||||||
|
|
||||||
|
RUN su searxng -c "/usr/bin/python3 -m compileall -q searx" \
|
||||||
|
&& touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml \
|
||||||
|
&& touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini \
|
||||||
|
&& find /usr/local/searxng/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \
|
||||||
|
-o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
|
||||||
|
-type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
|
||||||
|
|
||||||
|
# Keep these arguments at the end to prevent redundant layer rebuilds
|
||||||
|
ARG LABEL_DATE=
|
||||||
|
ARG GIT_URL=unknown
|
||||||
|
ARG SEARXNG_GIT_VERSION=unknown
|
||||||
|
ARG SEARXNG_DOCKER_TAG=unknown
|
||||||
|
ARG LABEL_VCS_REF=
|
||||||
|
ARG LABEL_VCS_URL=
|
||||||
|
LABEL maintainer="searxng <${GIT_URL}>" \
|
||||||
|
description="A privacy-respecting, hackable metasearch engine." \
|
||||||
|
version="${SEARXNG_GIT_VERSION}" \
|
||||||
|
org.label-schema.schema-version="1.0" \
|
||||||
|
org.label-schema.name="searxng" \
|
||||||
|
org.label-schema.version="${SEARXNG_GIT_VERSION}" \
|
||||||
|
org.label-schema.url="${LABEL_VCS_URL}" \
|
||||||
|
org.label-schema.vcs-ref=${LABEL_VCS_REF} \
|
||||||
|
org.label-schema.vcs-url=${LABEL_VCS_URL} \
|
||||||
|
org.label-schema.build-date="${LABEL_DATE}" \
|
||||||
|
org.label-schema.usage="https://github.com/searxng/searxng-docker" \
|
||||||
|
org.opencontainers.image.title="searxng" \
|
||||||
|
org.opencontainers.image.version="${SEARXNG_DOCKER_TAG}" \
|
||||||
|
org.opencontainers.image.url="${LABEL_VCS_URL}" \
|
||||||
|
org.opencontainers.image.revision=${LABEL_VCS_REF} \
|
||||||
|
org.opencontainers.image.source=${LABEL_VCS_URL} \
|
||||||
|
org.opencontainers.image.created="${LABEL_DATE}" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/searxng/searxng-docker"
|
661
LICENSE
Normal file
661
LICENSE
Normal file
@ -0,0 +1,661 @@
|
|||||||
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
104
Makefile
Normal file
104
Makefile
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# -*- coding: utf-8; mode: makefile-gmake -*-
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
.DEFAULT_GOAL=help
|
||||||
|
export MTOOLS=./manage
|
||||||
|
|
||||||
|
include utils/makefile.include
|
||||||
|
|
||||||
|
all: clean install
|
||||||
|
|
||||||
|
PHONY += help
|
||||||
|
|
||||||
|
help:
|
||||||
|
@./manage --help
|
||||||
|
@echo '----'
|
||||||
|
@echo 'run - run developer instance'
|
||||||
|
@echo 'install - developer install of SearxNG into virtualenv'
|
||||||
|
@echo 'uninstall - uninstall developer installation'
|
||||||
|
@echo 'clean - clean up working tree'
|
||||||
|
@echo 'search.checker - check search engines'
|
||||||
|
@echo 'test - run shell & CI tests'
|
||||||
|
@echo 'test.shell - test shell scripts'
|
||||||
|
@echo 'ci.test - run CI tests'
|
||||||
|
|
||||||
|
|
||||||
|
PHONY += run
|
||||||
|
run: install
|
||||||
|
$(Q)./manage webapp.run
|
||||||
|
|
||||||
|
PHONY += install uninstall
|
||||||
|
install uninstall:
|
||||||
|
$(Q)./manage pyenv.$@
|
||||||
|
|
||||||
|
PHONY += clean
|
||||||
|
clean: py.clean docs.clean node.clean nvm.clean test.clean
|
||||||
|
$(Q)./manage build_msg CLEAN "common files"
|
||||||
|
$(Q)find . -name '*.orig' -exec rm -f {} +
|
||||||
|
$(Q)find . -name '*.rej' -exec rm -f {} +
|
||||||
|
$(Q)find . -name '*~' -exec rm -f {} +
|
||||||
|
$(Q)find . -name '*.bak' -exec rm -f {} +
|
||||||
|
|
||||||
|
lxc.clean:
|
||||||
|
$(Q)rm -rf lxc-env
|
||||||
|
|
||||||
|
PHONY += search.checker search.checker.%
|
||||||
|
search.checker: install
|
||||||
|
$(Q)./manage pyenv.cmd searx-checker -v
|
||||||
|
|
||||||
|
search.checker.%: install
|
||||||
|
$(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
|
||||||
|
|
||||||
|
PHONY += test ci.test test.shell
|
||||||
|
ci.test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.pybabel
|
||||||
|
test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.shell
|
||||||
|
test.shell:
|
||||||
|
$(Q)shellcheck -x -s dash \
|
||||||
|
dockerfiles/docker-entrypoint.sh
|
||||||
|
$(Q)shellcheck -x -s bash \
|
||||||
|
utils/brand.env \
|
||||||
|
$(MTOOLS) \
|
||||||
|
utils/lib.sh \
|
||||||
|
utils/lib_sxng*.sh \
|
||||||
|
utils/lib_go.sh \
|
||||||
|
utils/lib_nvm.sh \
|
||||||
|
utils/lib_redis.sh \
|
||||||
|
utils/searxng.sh \
|
||||||
|
utils/lxc.sh \
|
||||||
|
utils/lxc-searxng.env \
|
||||||
|
utils/searx.sh \
|
||||||
|
utils/filtron.sh \
|
||||||
|
utils/morty.sh
|
||||||
|
$(Q)$(MTOOLS) build_msg TEST "$@ OK"
|
||||||
|
|
||||||
|
|
||||||
|
# wrap ./manage script
|
||||||
|
|
||||||
|
MANAGE += buildenv
|
||||||
|
MANAGE += weblate.translations.commit weblate.push.translations
|
||||||
|
MANAGE += data.all data.traits data.useragents
|
||||||
|
MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
|
||||||
|
MANAGE += docker.build docker.push docker.buildx
|
||||||
|
MANAGE += gecko.driver
|
||||||
|
MANAGE += node.env node.env.dev node.clean
|
||||||
|
MANAGE += py.build py.clean
|
||||||
|
MANAGE += pyenv pyenv.install pyenv.uninstall
|
||||||
|
MANAGE += pypi.upload pypi.upload.test
|
||||||
|
MANAGE += format.python
|
||||||
|
MANAGE += test.yamllint test.pylint test.pyright test.black test.pybabel test.unit test.coverage test.robot test.rst test.clean
|
||||||
|
MANAGE += themes.all themes.simple themes.simple.test pygments.less
|
||||||
|
MANAGE += static.build.commit static.build.drop static.build.restore
|
||||||
|
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
|
||||||
|
|
||||||
|
PHONY += $(MANAGE)
|
||||||
|
|
||||||
|
$(MANAGE):
|
||||||
|
$(Q)$(MTOOLS) $@
|
||||||
|
|
||||||
|
# short hands of selected targets
|
||||||
|
|
||||||
|
PHONY += docs docker themes
|
||||||
|
|
||||||
|
docs: docs.html
|
||||||
|
docker: docker.build
|
||||||
|
themes: themes.all
|
25
PULL_REQUEST_TEMPLATE.md
Normal file
25
PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
## What does this PR do?
|
||||||
|
|
||||||
|
<!-- MANDATORY -->
|
||||||
|
|
||||||
|
<!-- explain the changes in your PR, algorithms, design, architecture -->
|
||||||
|
|
||||||
|
## Why is this change important?
|
||||||
|
|
||||||
|
<!-- MANDATORY -->
|
||||||
|
|
||||||
|
<!-- explain the motivation behind your PR -->
|
||||||
|
|
||||||
|
## How to test this PR locally?
|
||||||
|
|
||||||
|
<!-- commands to run the tests or instructions to test the changes -->
|
||||||
|
|
||||||
|
## Author's checklist
|
||||||
|
|
||||||
|
<!-- additional notes for reviewers -->
|
||||||
|
|
||||||
|
## Related issues
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Closes #234
|
||||||
|
-->
|
87
README.rst
87
README.rst
@ -1,3 +1,86 @@
|
|||||||
This branch is updated automatically.
|
.. SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
See https://searxng.github.io/searxng/dev/translation.html
|
----
|
||||||
|
|
||||||
|
.. figure:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg
|
||||||
|
:target: https://docs.searxng.org/
|
||||||
|
:alt: SearXNG
|
||||||
|
:width: 100%
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
Privacy-respecting, hackable `metasearch engine`_
|
||||||
|
|
||||||
|
Searx.space_ lists ready-to-use running instances.
|
||||||
|
|
||||||
|
A user_, admin_ and developer_ handbook is available on the homepage_.
|
||||||
|
|
||||||
|
|SearXNG install|
|
||||||
|
|SearXNG homepage|
|
||||||
|
|SearXNG wiki|
|
||||||
|
|AGPL License|
|
||||||
|
|Issues|
|
||||||
|
|commits|
|
||||||
|
|weblate|
|
||||||
|
|SearXNG logo|
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
.. _searx.space: https://searx.space
|
||||||
|
.. _user: https://docs.searxng.org/user
|
||||||
|
.. _admin: https://docs.searxng.org/admin
|
||||||
|
.. _developer: https://docs.searxng.org/dev
|
||||||
|
.. _homepage: https://docs.searxng.org/
|
||||||
|
.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
|
||||||
|
|
||||||
|
.. |SearXNG logo| image:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng-wordmark.svg
|
||||||
|
:target: https://docs.searxng.org/
|
||||||
|
:width: 5%
|
||||||
|
|
||||||
|
.. |SearXNG install| image:: https://img.shields.io/badge/-install-blue
|
||||||
|
:target: https://docs.searxng.org/admin/installation.html
|
||||||
|
|
||||||
|
.. |SearXNG homepage| image:: https://img.shields.io/badge/-homepage-blue
|
||||||
|
:target: https://docs.searxng.org/
|
||||||
|
|
||||||
|
.. |SearXNG wiki| image:: https://img.shields.io/badge/-wiki-blue
|
||||||
|
:target: https://github.com/searxng/searxng/wiki
|
||||||
|
|
||||||
|
.. |AGPL License| image:: https://img.shields.io/badge/license-AGPL-blue.svg
|
||||||
|
:target: https://github.com/searxng/searxng/blob/master/LICENSE
|
||||||
|
|
||||||
|
.. |Issues| image:: https://img.shields.io/github/issues/searxng/searxng?color=yellow&label=issues
|
||||||
|
:target: https://github.com/searxng/searxng/issues
|
||||||
|
|
||||||
|
.. |PR| image:: https://img.shields.io/github/issues-pr-raw/searxng/searxng?color=yellow&label=PR
|
||||||
|
:target: https://github.com/searxng/searxng/pulls
|
||||||
|
|
||||||
|
.. |commits| image:: https://img.shields.io/github/commit-activity/y/searxng/searxng?color=yellow&label=commits
|
||||||
|
:target: https://github.com/searxng/searxng/commits/master
|
||||||
|
|
||||||
|
.. |weblate| image:: https://translate.codeberg.org/widgets/searxng/-/searxng/svg-badge.svg
|
||||||
|
:target: https://translate.codeberg.org/projects/searxng/
|
||||||
|
|
||||||
|
|
||||||
|
Contact
|
||||||
|
=======
|
||||||
|
|
||||||
|
Ask questions or just chat about SearXNG on
|
||||||
|
|
||||||
|
IRC
|
||||||
|
`#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_
|
||||||
|
which is bridged to Matrix.
|
||||||
|
|
||||||
|
Matrix
|
||||||
|
`#searxng:matrix.org <https://matrix.to/#/#searxng:matrix.org>`_
|
||||||
|
|
||||||
|
Differences to searXNG
|
||||||
|
====================
|
||||||
|
|
||||||
|
SearXNGRebrandZaclys is a fork of `searXNG`_, with non-notable changes:
|
||||||
|
|
||||||
|
.. _searXNG: https://github.com/searxng/searxng
|
||||||
|
|
||||||
|
|
||||||
|
Simply graphic changes (icons and images) and addition of the Zaclys menu
|
||||||
|
10
SECURITY.md
Normal file
10
SECURITY.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
We love responsible reports of (potential) security issues in SearXNG.
|
||||||
|
|
||||||
|
You can contact us at security@searxng.org.
|
||||||
|
|
||||||
|
Be sure to provide as much information as possible and if found
|
||||||
|
also reproduction steps of the identified vulnerability. Also
|
||||||
|
add the specific URL of the project as well as code you found
|
||||||
|
the issue in to your report.
|
6
babel.cfg
Normal file
6
babel.cfg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[extractors]
|
||||||
|
searxng_msg = searx.babel_extract.extract
|
||||||
|
[ignore: **/node_modules/**]
|
||||||
|
[python: **.py]
|
||||||
|
[jinja2: **/templates/**.html]
|
||||||
|
[searxng_msg: **/searxng.msg]
|
178
dockerfiles/docker-entrypoint.sh
Executable file
178
dockerfiles/docker-entrypoint.sh
Executable file
@ -0,0 +1,178 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
help() {
|
||||||
|
cat <<EOF
|
||||||
|
Command line:
|
||||||
|
-h Display this help
|
||||||
|
-d Dry run to update the configuration files.
|
||||||
|
-f Always update on the configuration files (existing files are renamed with
|
||||||
|
the .old suffix). Without this option, the new configuration files are
|
||||||
|
copied with the .new suffix
|
||||||
|
Environment variables:
|
||||||
|
INSTANCE_NAME settings.yml : general.instance_name
|
||||||
|
AUTOCOMPLETE settings.yml : search.autocomplete
|
||||||
|
BASE_URL settings.yml : server.base_url
|
||||||
|
MORTY_URL settings.yml : result_proxy.url
|
||||||
|
MORTY_KEY settings.yml : result_proxy.key
|
||||||
|
BIND_ADDRESS uwsgi bind to the specified TCP socket using HTTP protocol.
|
||||||
|
Default value: ${DEFAULT_BIND_ADDRESS}
|
||||||
|
Volume:
|
||||||
|
/etc/searxng the docker entry point copies settings.yml and uwsgi.ini in
|
||||||
|
this directory (see the -f command line option)"
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
export DEFAULT_BIND_ADDRESS="0.0.0.0:8080"
|
||||||
|
export BIND_ADDRESS="${BIND_ADDRESS:-${DEFAULT_BIND_ADDRESS}}"
|
||||||
|
|
||||||
|
# Parse command line
|
||||||
|
FORCE_CONF_UPDATE=0
|
||||||
|
DRY_RUN=0
|
||||||
|
|
||||||
|
while getopts "fdh" option
|
||||||
|
do
|
||||||
|
case $option in
|
||||||
|
|
||||||
|
f) FORCE_CONF_UPDATE=1 ;;
|
||||||
|
d) DRY_RUN=1 ;;
|
||||||
|
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "unknow option ${option}"
|
||||||
|
exit 42
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
get_searxng_version(){
|
||||||
|
su searxng -c \
|
||||||
|
'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"' \
|
||||||
|
2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
SEARXNG_VERSION="$(get_searxng_version)"
|
||||||
|
export SEARXNG_VERSION
|
||||||
|
echo "SearXNG version ${SEARXNG_VERSION}"
|
||||||
|
|
||||||
|
# helpers to update the configuration files
|
||||||
|
patch_uwsgi_settings() {
|
||||||
|
CONF="$1"
|
||||||
|
|
||||||
|
# update uwsg.ini
|
||||||
|
sed -i \
|
||||||
|
-e "s|workers = .*|workers = ${UWSGI_WORKERS:-%k}|g" \
|
||||||
|
-e "s|threads = .*|threads = ${UWSGI_THREADS:-4}|g" \
|
||||||
|
"${CONF}"
|
||||||
|
}
|
||||||
|
|
||||||
|
patch_searxng_settings() {
|
||||||
|
CONF="$1"
|
||||||
|
|
||||||
|
# Make sure that there is trailing slash at the end of BASE_URL
|
||||||
|
# see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
|
||||||
|
export BASE_URL="${BASE_URL%/}/"
|
||||||
|
|
||||||
|
# update settings.yml
|
||||||
|
sed -i \
|
||||||
|
-e "s|base_url: false|base_url: ${BASE_URL}|g" \
|
||||||
|
-e "s/instance_name: \"SearXNG\"/instance_name: \"${INSTANCE_NAME}\"/g" \
|
||||||
|
-e "s/autocomplete: \"\"/autocomplete: \"${AUTOCOMPLETE}\"/g" \
|
||||||
|
-e "s/ultrasecretkey/$(openssl rand -hex 32)/g" \
|
||||||
|
"${CONF}"
|
||||||
|
|
||||||
|
# Morty configuration
|
||||||
|
|
||||||
|
if [ -n "${MORTY_KEY}" ] && [ -n "${MORTY_URL}" ]; then
|
||||||
|
sed -i -e "s/image_proxy: false/image_proxy: true/g" \
|
||||||
|
"${CONF}"
|
||||||
|
cat >> "${CONF}" <<-EOF
|
||||||
|
|
||||||
|
# Morty configuration
|
||||||
|
result_proxy:
|
||||||
|
url: ${MORTY_URL}
|
||||||
|
key: !!binary "${MORTY_KEY}"
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
update_conf() {
|
||||||
|
FORCE_CONF_UPDATE=$1
|
||||||
|
CONF="$2"
|
||||||
|
NEW_CONF="${2}.new"
|
||||||
|
OLD_CONF="${2}.old"
|
||||||
|
REF_CONF="$3"
|
||||||
|
PATCH_REF_CONF="$4"
|
||||||
|
|
||||||
|
if [ -f "${CONF}" ]; then
|
||||||
|
if [ "${REF_CONF}" -nt "${CONF}" ]; then
|
||||||
|
# There is a new version
|
||||||
|
if [ "$FORCE_CONF_UPDATE" -ne 0 ]; then
|
||||||
|
# Replace the current configuration
|
||||||
|
printf '⚠️ Automatically update %s to the new version\n' "${CONF}"
|
||||||
|
if [ ! -f "${OLD_CONF}" ]; then
|
||||||
|
printf 'The previous configuration is saved to %s\n' "${OLD_CONF}"
|
||||||
|
mv "${CONF}" "${OLD_CONF}"
|
||||||
|
fi
|
||||||
|
cp "${REF_CONF}" "${CONF}"
|
||||||
|
$PATCH_REF_CONF "${CONF}"
|
||||||
|
else
|
||||||
|
# Keep the current configuration
|
||||||
|
printf '⚠️ Check new version %s to make sure SearXNG is working properly\n' "${NEW_CONF}"
|
||||||
|
cp "${REF_CONF}" "${NEW_CONF}"
|
||||||
|
$PATCH_REF_CONF "${NEW_CONF}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf 'Use existing %s\n' "${CONF}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf 'Create %s\n' "${CONF}"
|
||||||
|
cp "${REF_CONF}" "${CONF}"
|
||||||
|
$PATCH_REF_CONF "${CONF}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# searx compatibility: copy /etc/searx/* to /etc/searxng/*
|
||||||
|
SEARX_CONF=0
|
||||||
|
if [ -f "/etc/searx/settings.yml" ]; then
|
||||||
|
if [ ! -f "${SEARXNG_SETTINGS_PATH}" ]; then
|
||||||
|
printf '⚠️ /etc/searx/settings.yml is copied to /etc/searxng\n'
|
||||||
|
cp "/etc/searx/settings.yml" "${SEARXNG_SETTINGS_PATH}"
|
||||||
|
fi
|
||||||
|
SEARX_CONF=1
|
||||||
|
fi
|
||||||
|
if [ -f "/etc/searx/uwsgi.ini" ]; then
|
||||||
|
printf '⚠️ /etc/searx/uwsgi.ini is ignored. Use the volume /etc/searxng\n'
|
||||||
|
SEARX_CONF=1
|
||||||
|
fi
|
||||||
|
if [ "$SEARX_CONF" -eq "1" ]; then
|
||||||
|
printf '⚠️ The deprecated volume /etc/searx is mounted. Please update your configuration to use /etc/searxng ⚠️\n'
|
||||||
|
cat << EOF > /etc/searx/deprecated_volume_read_me.txt
|
||||||
|
This Docker image uses the volume /etc/searxng
|
||||||
|
Update your configuration:
|
||||||
|
* remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/dockerfiles/uwsgi.ini )
|
||||||
|
* mount /etc/searxng instead of /etc/searx
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
# end of searx compatibility
|
||||||
|
|
||||||
|
# make sure there are uwsgi settings
|
||||||
|
update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/dockerfiles/uwsgi.ini" "patch_uwsgi_settings"
|
||||||
|
|
||||||
|
# make sure there are searxng settings
|
||||||
|
update_conf "${FORCE_CONF_UPDATE}" "${SEARXNG_SETTINGS_PATH}" "/usr/local/searxng/searx/settings.yml" "patch_searxng_settings"
|
||||||
|
|
||||||
|
# dry run (to update configuration files, then inspect them)
|
||||||
|
if [ $DRY_RUN -eq 1 ]; then
|
||||||
|
printf 'Dry run\n'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset MORTY_KEY
|
||||||
|
|
||||||
|
# Start uwsgi
|
||||||
|
printf 'Listen on %s\n' "${BIND_ADDRESS}"
|
||||||
|
exec su-exec searxng:searxng uwsgi --master --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"
|
46
dockerfiles/uwsgi.ini
Normal file
46
dockerfiles/uwsgi.ini
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
[uwsgi]
|
||||||
|
# Who will run the code
|
||||||
|
uid = searxng
|
||||||
|
gid = searxng
|
||||||
|
|
||||||
|
# Number of workers (usually CPU count)
|
||||||
|
workers = %k
|
||||||
|
threads = 4
|
||||||
|
|
||||||
|
# The right granted on the created socket
|
||||||
|
chmod-socket = 666
|
||||||
|
|
||||||
|
# Plugin to use and interpreter config
|
||||||
|
single-interpreter = true
|
||||||
|
master = true
|
||||||
|
plugin = python3
|
||||||
|
lazy-apps = true
|
||||||
|
enable-threads = true
|
||||||
|
|
||||||
|
# Module to import
|
||||||
|
module = searx.webapp
|
||||||
|
|
||||||
|
# Virtualenv and python path
|
||||||
|
pythonpath = /usr/local/searxng/
|
||||||
|
chdir = /usr/local/searxng/searx/
|
||||||
|
|
||||||
|
# automatically set processes name to something meaningful
|
||||||
|
auto-procname = true
|
||||||
|
|
||||||
|
# Disable request logging for privacy
|
||||||
|
disable-logging = true
|
||||||
|
log-5xx = true
|
||||||
|
|
||||||
|
# Set the max size of a request (request-body excluded)
|
||||||
|
buffer-size = 8192
|
||||||
|
|
||||||
|
# No keep alive
|
||||||
|
# See https://github.com/searx/searx-docker/issues/24
|
||||||
|
add-header = Connection: close
|
||||||
|
|
||||||
|
# uwsgi serves the static files
|
||||||
|
static-map = /static=/usr/local/searxng/searx/static
|
||||||
|
# expires set to one day
|
||||||
|
static-expires = /* 86400
|
||||||
|
static-gzip-all = True
|
||||||
|
offload-threads = %k
|
151
docs/_themes/searxng/static/searxng.css
vendored
Normal file
151
docs/_themes/searxng/static/searxng.css
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
@import url("pocoo.css");
|
||||||
|
|
||||||
|
a, a.reference, a.footnote-reference {
|
||||||
|
color: #004b6b;
|
||||||
|
border-color: #004b6b;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #6d4100;
|
||||||
|
border-color: #6d4100;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.version-warning {
|
||||||
|
background-color: #004b6b;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside.sidebar {
|
||||||
|
background-color: whitesmoke;
|
||||||
|
border-color: lightsteelblue;
|
||||||
|
border-radius: 3pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p.caption {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.sidebar-title, .sidebar p {
|
||||||
|
margin: 6pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar li,
|
||||||
|
.hlist li {
|
||||||
|
list-style-type: disclosure-closed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sphinxsidebar .current > a {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* admonitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.admonition, div.topic, nav.contents, div.toctree-wrapper {
|
||||||
|
background-color: #fafafa;
|
||||||
|
margin: 8px 0px;
|
||||||
|
padding: 1em;
|
||||||
|
border-radius: 3pt 0 0 3pt;
|
||||||
|
border-top: none;
|
||||||
|
border-right: none;
|
||||||
|
border-bottom: none;
|
||||||
|
border-left: 5pt solid #ccc;
|
||||||
|
list-style-type: disclosure-closed;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toctree-wrapper p.caption {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 24px;
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition.hint { border-color: #416dc0b0; }
|
||||||
|
.admonition.note { border-color: #6c856cb0; }
|
||||||
|
.admonition.tip { border-color: #85c5c2b0; }
|
||||||
|
.admonition.attention { border-color: #ecec97b0; }
|
||||||
|
.admonition.caution { border-color: #a6c677b0; }
|
||||||
|
.admonition.danger { border-color: #d46262b0; }
|
||||||
|
.admonition.important { border-color: #dfa3a3b0; }
|
||||||
|
.admonition.error { border-color: red; }
|
||||||
|
.admonition.warning { border-color: darkred; }
|
||||||
|
|
||||||
|
.admonition.admonition-generic-admonition-title {
|
||||||
|
border-color: #416dc0b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* admonitions with (rendered) reST markup examples (:class: rst-example)
|
||||||
|
*
|
||||||
|
* .. admonition:: title of the example
|
||||||
|
* :class: rst-example
|
||||||
|
* ....
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.rst-example {
|
||||||
|
background-color: inherit;
|
||||||
|
margin: 0;
|
||||||
|
border-top: none;
|
||||||
|
border-right: 1px solid #ccc;
|
||||||
|
border-bottom: none;
|
||||||
|
border-left: none;
|
||||||
|
border-radius: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.rst-example > p.admonition-title {
|
||||||
|
font-family: Sans Serif;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.8em;
|
||||||
|
display: block;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code block in figures
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.highlight pre {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table theme
|
||||||
|
*/
|
||||||
|
|
||||||
|
thead, tfoot {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
th:hover, td:hover {
|
||||||
|
background-color: #ffc;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead th, tfoot th, tfoot td, tbody th {
|
||||||
|
background-color: #fffaef;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(odd) {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(even) {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption {
|
||||||
|
font-family: Sans Serif;
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0.5em 0 0.5em 0;
|
||||||
|
caption-side: top;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinx-tabs {
|
||||||
|
clear: both;
|
||||||
|
}
|
7
docs/_themes/searxng/theme.conf
vendored
Normal file
7
docs/_themes/searxng/theme.conf
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[theme]
|
||||||
|
inherit = pocoo
|
||||||
|
stylesheet = searxng.css
|
||||||
|
|
||||||
|
[options]
|
||||||
|
touch_icon =
|
||||||
|
globaltoc_maxdepth = 5
|
69
docs/admin/answer-captcha.rst
Normal file
69
docs/admin/answer-captcha.rst
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
===============================
|
||||||
|
Answer CAPTCHA from server's IP
|
||||||
|
===============================
|
||||||
|
|
||||||
|
With a SSH tunnel we can send requests from server's IP and solve a CAPTCHA that
|
||||||
|
blocks requests from this IP. If your SearXNG instance is hosted at
|
||||||
|
``example.org`` and your login is ``user`` you can setup a proxy simply by
|
||||||
|
:man:`ssh`:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
# SOCKS server: socks://127.0.0.1:8080
|
||||||
|
|
||||||
|
$ ssh -q -N -D 8080 user@example.org
|
||||||
|
|
||||||
|
The ``socks://localhost:8080`` from above can be tested by:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: server's IP
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ curl -x socks://127.0.0.1:8080 http://ipecho.net/plain
|
||||||
|
n.n.n.n
|
||||||
|
|
||||||
|
.. group-tab:: desktop's IP
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ curl http://ipecho.net/plain
|
||||||
|
x.x.x.x
|
||||||
|
|
||||||
|
In the settings of the WEB browser open the *"Network Settings"* and setup a
|
||||||
|
proxy on ``SOCKS5 127.0.0.1:8080`` (see screenshot below). In the WEB browser
|
||||||
|
check the IP from the server is used:
|
||||||
|
|
||||||
|
- http://ipecho.net/plain
|
||||||
|
|
||||||
|
Now open the search engine that blocks requests from your server's IP. If you
|
||||||
|
have `issues with the qwant engine
|
||||||
|
<https://github.com/searxng/searxng/issues/2011#issuecomment-1553317619>`__,
|
||||||
|
solve the CAPTCHA from `qwant.com <https://www.qwant.com/>`__.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Firefox
|
||||||
|
|
||||||
|
.. kernel-figure:: answer-captcha/ffox-setting-proxy-socks.png
|
||||||
|
:alt: FFox proxy on SOCKS5, 127.0.0.1:8080
|
||||||
|
|
||||||
|
Firefox's network settings
|
||||||
|
|
||||||
|
|
||||||
|
.. admonition:: :man:`ssh` manual:
|
||||||
|
|
||||||
|
-D [bind_address:]port
|
||||||
|
Specifies a local “dynamic” application-level port forwarding. This works
|
||||||
|
by allocating a socket to listen to port on the local side .. Whenever a
|
||||||
|
connection is made to this port, the connection is forwarded over the
|
||||||
|
secure channel, and the application protocol is then used to determine
|
||||||
|
where to connect to from the remote machine .. ssh will act as a SOCKS
|
||||||
|
server ..
|
||||||
|
|
||||||
|
-N
|
||||||
|
Do not execute a remote command. This is useful for just forwarding ports.
|
||||||
|
|
BIN
docs/admin/answer-captcha/ffox-setting-proxy-socks.png
Normal file
BIN
docs/admin/answer-captcha/ffox-setting-proxy-socks.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 59 KiB |
92
docs/admin/api.rst
Normal file
92
docs/admin/api.rst
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
.. _adminapi:
|
||||||
|
|
||||||
|
==================
|
||||||
|
Administration API
|
||||||
|
==================
|
||||||
|
|
||||||
|
Get configuration data
|
||||||
|
======================
|
||||||
|
|
||||||
|
.. code:: http
|
||||||
|
|
||||||
|
GET /config HTTP/1.1
|
||||||
|
|
||||||
|
Sample response
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. code:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"autocomplete": "",
|
||||||
|
"categories": [
|
||||||
|
"map",
|
||||||
|
"it",
|
||||||
|
"images",
|
||||||
|
],
|
||||||
|
"default_locale": "",
|
||||||
|
"default_theme": "simple",
|
||||||
|
"engines": [
|
||||||
|
{
|
||||||
|
"categories": [
|
||||||
|
"map"
|
||||||
|
],
|
||||||
|
"enabled": true,
|
||||||
|
"name": "openstreetmap",
|
||||||
|
"shortcut": "osm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"categories": [
|
||||||
|
"it"
|
||||||
|
],
|
||||||
|
"enabled": true,
|
||||||
|
"name": "arch linux wiki",
|
||||||
|
"shortcut": "al"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"categories": [
|
||||||
|
"images"
|
||||||
|
],
|
||||||
|
"enabled": true,
|
||||||
|
"name": "google images",
|
||||||
|
"shortcut": "goi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"categories": [
|
||||||
|
"it"
|
||||||
|
],
|
||||||
|
"enabled": false,
|
||||||
|
"name": "bitbucket",
|
||||||
|
"shortcut": "bb"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"instance_name": "searx",
|
||||||
|
"locales": {
|
||||||
|
"de": "Deutsch (German)",
|
||||||
|
"en": "English",
|
||||||
|
"eo": "Esperanto (Esperanto)",
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"name": "HTTPS rewrite"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"safe_search": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Embed search bar
|
||||||
|
================
|
||||||
|
|
||||||
|
The search bar can be embedded into websites. Just paste the example into the
|
||||||
|
HTML of the site. URL of the SearXNG instance and values are customizable.
|
||||||
|
|
||||||
|
.. code:: html
|
||||||
|
|
||||||
|
<form method="post" action="https://example.org/">
|
||||||
|
<!-- search --> <input type="text" name="q" />
|
||||||
|
<!-- categories --> <input type="hidden" name="categories" value="general,social media" />
|
||||||
|
<!-- language --> <input type="hidden" name="lang" value="all" />
|
||||||
|
<!-- locale --> <input type="hidden" name="locale" value="en" />
|
||||||
|
<!-- date filter --> <input type="hidden" name="time_range" value="month" />
|
||||||
|
</form>
|
30
docs/admin/arch_public.dot
Normal file
30
docs/admin/arch_public.dot
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
digraph G {
|
||||||
|
|
||||||
|
node [style=filled, shape=box, fillcolor="#ffffcc", fontname=Sans];
|
||||||
|
edge [fontname="Sans"];
|
||||||
|
|
||||||
|
browser [label="browser", shape=tab, fillcolor=aliceblue];
|
||||||
|
rp [label="reverse proxy"];
|
||||||
|
static [label="static files", shape=folder, href="url to configure static files", fillcolor=lightgray];
|
||||||
|
uwsgi [label="uwsgi", shape=parallelogram href="https://docs.searxng.org/utils/searx.sh.html"]
|
||||||
|
redis [label="redis DB", shape=cylinder];
|
||||||
|
searxng1 [label="SearXNG #1", fontcolor=blue3];
|
||||||
|
searxng2 [label="SearXNG #2", fontcolor=blue3];
|
||||||
|
searxng3 [label="SearXNG #3", fontcolor=blue3];
|
||||||
|
searxng4 [label="SearXNG #4", fontcolor=blue3];
|
||||||
|
|
||||||
|
browser -> rp [label="HTTPS"]
|
||||||
|
|
||||||
|
subgraph cluster_searxng {
|
||||||
|
label = "SearXNG instance" fontname=Sans;
|
||||||
|
bgcolor="#fafafa";
|
||||||
|
{ rank=same; static rp };
|
||||||
|
rp -> static [label="optional: reverse proxy serves static files", fillcolor=slategray, fontcolor=slategray];
|
||||||
|
rp -> uwsgi [label="http:// (tcp) or unix:// (socket)"];
|
||||||
|
uwsgi -> searxng1 -> redis;
|
||||||
|
uwsgi -> searxng2 -> redis;
|
||||||
|
uwsgi -> searxng3 -> redis;
|
||||||
|
uwsgi -> searxng4 -> redis;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
38
docs/admin/architecture.rst
Normal file
38
docs/admin/architecture.rst
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
.. _architecture:
|
||||||
|
|
||||||
|
============
|
||||||
|
Architecture
|
||||||
|
============
|
||||||
|
|
||||||
|
.. sidebar:: Further reading
|
||||||
|
|
||||||
|
- Reverse Proxy: :ref:`Apache <apache searxng site>` & :ref:`nginx <nginx
|
||||||
|
searxng site>`
|
||||||
|
- uWSGI: :ref:`searxng uwsgi`
|
||||||
|
- SearXNG: :ref:`installation basic`
|
||||||
|
|
||||||
|
Herein you will find some hints and suggestions about typical architectures of
|
||||||
|
SearXNG infrastructures.
|
||||||
|
|
||||||
|
.. _architecture uWSGI:
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
.. kernel-figure:: arch_public.dot
|
||||||
|
:alt: arch_public.dot
|
||||||
|
|
||||||
|
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:
|
163
docs/admin/buildhosts.rst
Normal file
163
docs/admin/buildhosts.rst
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
.. _buildhosts:
|
||||||
|
|
||||||
|
==========
|
||||||
|
Buildhosts
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
To get best results from build, it's recommend to install additional packages on
|
||||||
|
build hosts (see :ref:`searxng.sh`).
|
||||||
|
|
||||||
|
.. _searxng.sh install buildhost:
|
||||||
|
|
||||||
|
Build and Development tools
|
||||||
|
===========================
|
||||||
|
|
||||||
|
To Install tools used by build and development tasks in once:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: SearXNG's development tools
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo -H ./utils/searxng.sh install buildhost
|
||||||
|
|
||||||
|
This will install packages needed by SearXNG:
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START distro-packages
|
||||||
|
:end-before: END distro-packages
|
||||||
|
|
||||||
|
and packages needed to build documentation and run tests:
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START build-packages
|
||||||
|
:end-before: END build-packages
|
||||||
|
|
||||||
|
.. _docs build:
|
||||||
|
|
||||||
|
Build docs
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. _Graphviz: https://graphviz.gitlab.io
|
||||||
|
.. _ImageMagick: https://www.imagemagick.org
|
||||||
|
.. _XeTeX: https://tug.org/xetex/
|
||||||
|
.. _dvisvgm: https://dvisvgm.de/
|
||||||
|
|
||||||
|
.. sidebar:: Sphinx build needs
|
||||||
|
|
||||||
|
- ImageMagick_
|
||||||
|
- Graphviz_
|
||||||
|
- XeTeX_
|
||||||
|
- dvisvgm_
|
||||||
|
|
||||||
|
Most of the sphinx requirements are installed from :origin:`setup.py` and the
|
||||||
|
docs can be build from scratch with ``make docs.html``. For better math and
|
||||||
|
image processing additional packages are needed. The XeTeX_ needed not only for
|
||||||
|
PDF creation, it's also needed for :ref:`math` when HTML output is build.
|
||||||
|
|
||||||
|
To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
|
||||||
|
as images (``sphinx.ext.imgmath`` extension).
|
||||||
|
|
||||||
|
Here is the extract from the :origin:`docs/conf.py` file, setting math renderer
|
||||||
|
to ``imgmath``:
|
||||||
|
|
||||||
|
.. literalinclude:: ../conf.py
|
||||||
|
:language: python
|
||||||
|
:start-after: # sphinx.ext.imgmath setup
|
||||||
|
:end-before: # sphinx.ext.imgmath setup END
|
||||||
|
|
||||||
|
If your docs build (``make docs.html``) shows warnings like this::
|
||||||
|
|
||||||
|
WARNING: dot(1) not found, for better output quality install \
|
||||||
|
graphviz from https://www.graphviz.org
|
||||||
|
..
|
||||||
|
WARNING: LaTeX command 'latex' cannot be run (needed for math \
|
||||||
|
display), check the imgmath_latex setting
|
||||||
|
|
||||||
|
you need to install additional packages on your build host, to get better HTML
|
||||||
|
output (:ref:`install buildhost <searxng.sh install buildhost>`).
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo apt install graphviz imagemagick texlive-xetex librsvg2-bin
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo pacman -S graphviz imagemagick texlive-bin extra/librsvg
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo dnf install graphviz graphviz-gd ImageMagick texlive-xetex-bin librsvg2-tools
|
||||||
|
|
||||||
|
|
||||||
|
For PDF output you also need:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo apt texlive-latex-recommended texlive-extra-utils ttf-dejavu
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo pacman -S texlive-core texlive-latexextra ttf-dejavu
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo dnf install \
|
||||||
|
texlive-collection-fontsrecommended texlive-collection-latex \
|
||||||
|
dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
|
||||||
|
|
||||||
|
.. _sh lint:
|
||||||
|
|
||||||
|
Lint shell scripts
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. _ShellCheck: https://github.com/koalaman/shellcheck
|
||||||
|
|
||||||
|
To lint shell scripts we use ShellCheck_ - a shell script static analysis tool
|
||||||
|
(:ref:`install buildhost <searxng.sh install buildhost>`).
|
||||||
|
|
||||||
|
.. SNIP sh lint requirements
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo apt install shellcheck
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo pacman -S shellcheck
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo dnf install ShellCheck
|
||||||
|
|
||||||
|
.. SNAP sh lint requirements
|
22
docs/admin/index.rst
Normal file
22
docs/admin/index.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
===========================
|
||||||
|
Administrator documentation
|
||||||
|
===========================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
settings/index
|
||||||
|
installation
|
||||||
|
installation-docker
|
||||||
|
installation-scripts
|
||||||
|
installation-searxng
|
||||||
|
installation-uwsgi
|
||||||
|
installation-nginx
|
||||||
|
installation-apache
|
||||||
|
update-searxng
|
||||||
|
answer-captcha
|
||||||
|
searx.limiter
|
||||||
|
api
|
||||||
|
architecture
|
||||||
|
plugins
|
||||||
|
buildhosts
|
388
docs/admin/installation-apache.rst
Normal file
388
docs/admin/installation-apache.rst
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
.. _installation apache:
|
||||||
|
|
||||||
|
======
|
||||||
|
Apache
|
||||||
|
======
|
||||||
|
|
||||||
|
.. _Apache: https://httpd.apache.org/
|
||||||
|
.. _Apache Debian:
|
||||||
|
https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):
|
||||||
|
.. _apache2.README.Debian:
|
||||||
|
https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian
|
||||||
|
.. _Apache Arch Linux:
|
||||||
|
https://wiki.archlinux.org/index.php/Apache_HTTP_Server
|
||||||
|
.. _Apache Fedora:
|
||||||
|
https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-apache-http-server/index.html
|
||||||
|
.. _Apache directives:
|
||||||
|
https://httpd.apache.org/docs/trunk/mod/directives.html
|
||||||
|
.. _Getting Started:
|
||||||
|
https://httpd.apache.org/docs/current/en/getting-started.html
|
||||||
|
.. _Terms Used to Describe Directives:
|
||||||
|
https://httpd.apache.org/docs/current/en/mod/directive-dict.html
|
||||||
|
.. _Configuration Files:
|
||||||
|
https://httpd.apache.org/docs/current/en/configuring.html
|
||||||
|
.. _ProxyPreserveHost: https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost
|
||||||
|
.. _LoadModule:
|
||||||
|
https://httpd.apache.org/docs/mod/mod_so.html#loadmodule
|
||||||
|
.. _IncludeOptional:
|
||||||
|
https://httpd.apache.org/docs/mod/core.html#includeoptional
|
||||||
|
.. _DocumentRoot:
|
||||||
|
https://httpd.apache.org/docs/trunk/mod/core.html#documentroot
|
||||||
|
.. _Location:
|
||||||
|
https://httpd.apache.org/docs/trunk/mod/core.html#location
|
||||||
|
.. _uWSGI Apache support:
|
||||||
|
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
|
||||||
|
|
||||||
|
- `Apache Arch Linux`_
|
||||||
|
- `Apache Debian`_
|
||||||
|
- `apache2.README.Debian`_
|
||||||
|
- `Apache Fedora`_
|
||||||
|
- `Apache directives`_
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
The Apache HTTP server
|
||||||
|
======================
|
||||||
|
|
||||||
|
If Apache_ is not installed, install it now. If apache_ is new to you, the
|
||||||
|
`Getting Started`_, `Configuration Files`_ and `Terms Used to Describe
|
||||||
|
Directives`_ documentation gives first orientation. There is also a list of
|
||||||
|
`Apache directives`_ *to keep in the pocket*.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H apt-get install apache2
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H pacman -S apache
|
||||||
|
sudo -H systemctl enable httpd
|
||||||
|
sudo -H systemctl start http
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H dnf install httpd
|
||||||
|
sudo -H systemctl enable httpd
|
||||||
|
sudo -H systemctl start httpd
|
||||||
|
|
||||||
|
Now at http://localhost you should see some kind of *Welcome* or *Test* page.
|
||||||
|
How this default site is configured, depends on the linux distribution
|
||||||
|
(compare `Apache directives`_).
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
less /etc/apache2/sites-enabled/000-default.conf
|
||||||
|
|
||||||
|
In this file, there is a line setting the `DocumentRoot`_ directive:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
DocumentRoot /var/www/html
|
||||||
|
|
||||||
|
And the *welcome* page is the HTML file at ``/var/www/html/index.html``.
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
less /etc/httpd/conf/httpd.conf
|
||||||
|
|
||||||
|
In this file, there is a line setting the `DocumentRoot`_ directive:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
DocumentRoot "/srv/http"
|
||||||
|
<Directory "/srv/http">
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
The *welcome* page of Arch Linux is a page showing the directory located
|
||||||
|
at ``DocumentRoot``. This *directory* page is generated by the Module
|
||||||
|
`mod_autoindex <https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html>`_:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
LoadModule autoindex_module modules/mod_autoindex.so
|
||||||
|
...
|
||||||
|
Include conf/extra/httpd-autoindex.conf
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
less /etc/httpd/conf/httpd.conf
|
||||||
|
|
||||||
|
In this file, there is a line setting the ``DocumentRoot`` directive:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
DocumentRoot "/var/www/html"
|
||||||
|
...
|
||||||
|
<Directory "/var/www">
|
||||||
|
AllowOverride None
|
||||||
|
# Allow open access:
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
On fresh installations, the ``/var/www`` is empty and the *default
|
||||||
|
welcome page* is shown, the configuration is located at::
|
||||||
|
|
||||||
|
less /etc/httpd/conf.d/welcome.conf
|
||||||
|
|
||||||
|
|
||||||
|
.. _Debian's Apache layout:
|
||||||
|
|
||||||
|
Debian's Apache layout
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Be aware, Debian's Apache layout is quite different from the standard Apache
|
||||||
|
configuration. For details look at the apache2.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
|
||||||
|
|
||||||
|
.. _apache modules:
|
||||||
|
|
||||||
|
Apache modules
|
||||||
|
--------------
|
||||||
|
|
||||||
|
To load additional modules, in most distributions you have to uncomment the
|
||||||
|
lines with the corresponding LoadModule_ directive, except in :ref:`Debian's
|
||||||
|
Apache layout`.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
:ref:`Debian's Apache layout` uses :man:`a2enmod` and :man:`a2dismod` to
|
||||||
|
activate or disable modules:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H a2enmod ssl
|
||||||
|
sudo -H a2enmod headers
|
||||||
|
sudo -H a2enmod proxy
|
||||||
|
sudo -H a2enmod proxy_http
|
||||||
|
sudo -H a2enmod proxy_uwsgi
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
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
|
||||||
|
``searxng.conf`` use :man:`a2ensite`:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H a2ensite searxng.conf
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
|
||||||
|
directive:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
IncludeOptional sites-enabled/*.conf
|
||||||
|
|
||||||
|
Create two folders, one for the *available sites* and one for the *enabled sites*:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
mkdir -p /etc/httpd/sites-available
|
||||||
|
mkdir -p /etc/httpd/sites-enabled
|
||||||
|
|
||||||
|
Create configuration at ``/etc/httpd/sites-available`` and place a
|
||||||
|
symlink to ``sites-enabled``:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
|
||||||
|
/etc/httpd/sites-enabled/searxng.conf
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
|
||||||
|
directive:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
IncludeOptional sites-enabled/*.conf
|
||||||
|
|
||||||
|
Create two folders, one for the *available sites* and one for the *enabled sites*:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
mkdir -p /etc/httpd/sites-available
|
||||||
|
mkdir -p /etc/httpd/sites-enabled
|
||||||
|
|
||||||
|
Create configuration at ``/etc/httpd/sites-available`` and place a
|
||||||
|
symlink to ``sites-enabled``:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
|
||||||
|
/etc/httpd/sites-enabled/searxng.conf
|
||||||
|
|
||||||
|
|
||||||
|
.. _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 service:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart apache2
|
||||||
|
sudo -H service uwsgi restart searxng
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart httpd
|
||||||
|
sudo -H systemctl restart uwsgi@searxng
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart httpd
|
||||||
|
sudo -H touch /etc/uwsgi.d/searxng.ini
|
||||||
|
|
||||||
|
|
||||||
|
disable logs
|
||||||
|
============
|
||||||
|
|
||||||
|
For better privacy you can disable Apache logs. In the examples above activate
|
||||||
|
one of the lines and `restart apache`_:
|
||||||
|
|
||||||
|
.. code:: apache
|
||||||
|
|
||||||
|
SetEnvIf Request_URI "/searxng" dontlog
|
||||||
|
# CustomLog /dev/null combined env=dontlog
|
||||||
|
|
||||||
|
The ``CustomLog`` directive disables logs for the entire (virtual) server, use it
|
||||||
|
when the URL of the service does not have a path component (``/searxng``), so when
|
||||||
|
SearXNG is located at root (``/``).
|
194
docs/admin/installation-docker.rst
Normal file
194
docs/admin/installation-docker.rst
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
.. _installation docker:
|
||||||
|
|
||||||
|
================
|
||||||
|
Docker Container
|
||||||
|
================
|
||||||
|
|
||||||
|
.. _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
|
||||||
|
.. _[caddy]: https://hub.docker.com/_/caddy
|
||||||
|
.. _Redis: https://redis.io/
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- `searxng/searxng @dockerhub`_
|
||||||
|
- :origin:`Dockerfile`
|
||||||
|
- `Docker overview <https://docs.docker.com/get-started/overview>`_
|
||||||
|
- `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's ``/bin/sh`` is :man:`dash`
|
||||||
|
|
||||||
|
**If you intend to create a public instance using Docker, use our well maintained
|
||||||
|
docker container**
|
||||||
|
|
||||||
|
- `searxng/searxng @dockerhub`_.
|
||||||
|
|
||||||
|
.. sidebar:: hint
|
||||||
|
|
||||||
|
The rest of this article is of interest only to those who want to create and
|
||||||
|
maintain their own Docker images.
|
||||||
|
|
||||||
|
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 bandwidth
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
$ sudo usermod -a -G docker $USER
|
||||||
|
|
||||||
|
|
||||||
|
searxng/searxng
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. sidebar:: ``docker run``
|
||||||
|
|
||||||
|
- `-\-rm <https://docs.docker.com/engine/reference/run/#clean-up---rm>`__
|
||||||
|
automatically clean up when container exits
|
||||||
|
- `-d <https://docs.docker.com/engine/reference/run/#detached--d>`__ start
|
||||||
|
detached container
|
||||||
|
- `-v <https://docs.docker.com/engine/reference/run/#volume-shared-filesystems>`__
|
||||||
|
mount volume ``HOST:CONTAINER``
|
||||||
|
|
||||||
|
The docker image is based on :origin:`Dockerfile` and available from
|
||||||
|
`searxng/searxng @dockerhub`_. Using the docker image is quite easy, for
|
||||||
|
instance you can pull the `searxng/searxng @dockerhub`_ image and deploy a local
|
||||||
|
instance using `docker run <https://docs.docker.com/engine/reference/run/>`_:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ mkdir my-instance
|
||||||
|
$ cd my-instance
|
||||||
|
$ export PORT=8080
|
||||||
|
$ docker pull searxng/searxng
|
||||||
|
$ docker run --rm \
|
||||||
|
-d -p ${PORT}:8080 \
|
||||||
|
-v "${PWD}/searxng:/etc/searxng" \
|
||||||
|
-e "BASE_URL=http://localhost:$PORT/" \
|
||||||
|
-e "INSTANCE_NAME=my-instance" \
|
||||||
|
searxng/searxng
|
||||||
|
2f998.... # container's ID
|
||||||
|
|
||||||
|
Open your WEB browser and visit the URL:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ xdg-open "http://localhost:$PORT"
|
||||||
|
|
||||||
|
Inside ``${PWD}/searxng``, you will find ``settings.yml`` and ``uwsgi.ini``. You
|
||||||
|
can modify these files according to your needs and restart the Docker image.
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ docker container restart 2f998
|
||||||
|
|
||||||
|
Use command ``container ls`` to list running containers, add flag `-a
|
||||||
|
<https://docs.docker.com/engine/reference/commandline/container_ls>`__ to list
|
||||||
|
exited containers also. With ``container stop`` a running container can be
|
||||||
|
stopped. To get rid of a container use ``container rm``:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ docker container ls
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED ...
|
||||||
|
2f998d725993 searxng/searxng "/sbin/tini -- /usr/…" 7 minutes ago ...
|
||||||
|
|
||||||
|
$ docker container stop 2f998
|
||||||
|
$ docker container rm 2f998
|
||||||
|
|
||||||
|
.. sidebar:: Warning
|
||||||
|
|
||||||
|
This might remove all docker items, not only those from SearXNG.
|
||||||
|
|
||||||
|
If you won't use docker anymore and want to get rid of all containers & images
|
||||||
|
use the following *prune* command:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ docker stop $(docker ps -aq) # stop all containers
|
||||||
|
$ docker system prune # make some housekeeping
|
||||||
|
$ docker rmi -f $(docker images -q) # drop all images
|
||||||
|
|
||||||
|
|
||||||
|
shell inside container
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
.. sidebar:: Bashism
|
||||||
|
|
||||||
|
- `A tale of two shells: bash or dash <https://lwn.net/Articles/343924/>`_
|
||||||
|
- `How to make bash scripts work in dash <http://mywiki.wooledge.org/Bashism>`_
|
||||||
|
- `Checking for Bashisms <https://dev.to/bowmanjd/writing-bash-scripts-that-are-not-only-bash-checking-for-bashisms-and-testing-with-dash-1bli>`_
|
||||||
|
|
||||||
|
Like in many other distributions, Alpine's `/bin/sh
|
||||||
|
<https://wiki.ubuntu.com/DashAsBinSh>`__ is :man:`dash`. Dash is meant to be
|
||||||
|
`POSIX-compliant <https://pubs.opengroup.org/onlinepubs/9699919799>`__.
|
||||||
|
Compared to debian, in the Alpine image :man:`bash` is not installed. The
|
||||||
|
:origin:`dockerfiles/docker-entrypoint.sh` script is checked *against dash*
|
||||||
|
(``make tests.shell``).
|
||||||
|
|
||||||
|
To open a shell inside the container:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ docker exec -it 2f998 sh
|
||||||
|
|
||||||
|
|
||||||
|
Build the image
|
||||||
|
===============
|
||||||
|
|
||||||
|
It's also possible to build SearXNG from the embedded :origin:`Dockerfile`::
|
||||||
|
|
||||||
|
$ git clone https://github.com/searxng/searxng.git
|
||||||
|
$ cd searxng
|
||||||
|
$ make docker.build
|
||||||
|
...
|
||||||
|
Successfully built 49586c016434
|
||||||
|
Successfully tagged searxng/searxng:latest
|
||||||
|
Successfully tagged searxng/searxng:1.0.0-209-9c823800-dirty
|
||||||
|
|
||||||
|
$ docker images
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
searxng/searxng 1.0.0-209-9c823800-dirty 49586c016434 13 minutes ago 308MB
|
||||||
|
searxng/searxng latest 49586c016434 13 minutes ago 308MB
|
||||||
|
alpine 3.13 6dbb9cc54074 3 weeks ago 5.61MB
|
||||||
|
|
||||||
|
|
||||||
|
Command line
|
||||||
|
============
|
||||||
|
|
||||||
|
.. sidebar:: docker run
|
||||||
|
|
||||||
|
Use flags ``-it`` for `interactive processes
|
||||||
|
<https://docs.docker.com/engine/reference/run/#foreground>`__.
|
||||||
|
|
||||||
|
In the :origin:`Dockerfile` the ENTRYPOINT_ is defined as
|
||||||
|
:origin:`dockerfiles/docker-entrypoint.sh`
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
docker run --rm -it searxng/searxng -h
|
||||||
|
|
||||||
|
.. program-output:: ../dockerfiles/docker-entrypoint.sh -h
|
252
docs/admin/installation-nginx.rst
Normal file
252
docs/admin/installation-nginx.rst
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
.. _installation nginx:
|
||||||
|
|
||||||
|
=====
|
||||||
|
NGINX
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. _nginx:
|
||||||
|
https://docs.nginx.com/nginx/admin-guide/
|
||||||
|
.. _nginx server configuration:
|
||||||
|
https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
|
||||||
|
.. _nginx beginners guide:
|
||||||
|
https://nginx.org/en/docs/beginners_guide.html
|
||||||
|
.. _Getting Started wiki:
|
||||||
|
https://www.nginx.com/resources/wiki/start/
|
||||||
|
.. _uWSGI support from nginx:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html
|
||||||
|
.. _uwsgi_params:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#configuring-nginx
|
||||||
|
.. _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
|
||||||
|
|
||||||
|
- nginx_
|
||||||
|
- `nginx beginners guide`_
|
||||||
|
- `nginx server configuration`_
|
||||||
|
- `Getting Started wiki`_
|
||||||
|
- `uWSGI support from nginx`_
|
||||||
|
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
The nginx HTTP server
|
||||||
|
=====================
|
||||||
|
|
||||||
|
If nginx_ is not installed, install it now.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H apt-get install nginx
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
sudo -H pacman -S nginx-mainline
|
||||||
|
sudo -H systemctl enable nginx
|
||||||
|
sudo -H systemctl start nginx
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
sudo -H dnf install nginx
|
||||||
|
sudo -H systemctl enable nginx
|
||||||
|
sudo -H systemctl start nginx
|
||||||
|
|
||||||
|
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
|
||||||
|
`nginx server configuration`_. How this default site is configured,
|
||||||
|
depends on the linux distribution:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
less /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
There is one line that includes site configurations from:
|
||||||
|
|
||||||
|
.. code:: nginx
|
||||||
|
|
||||||
|
include /etc/nginx/sites-enabled/*;
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
less /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
There is a configuration section named ``server``:
|
||||||
|
|
||||||
|
.. code-block:: nginx
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name localhost;
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
less /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
There is one line that includes site configurations from:
|
||||||
|
|
||||||
|
.. code:: nginx
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
|
||||||
|
|
||||||
|
.. _nginx searxng site:
|
||||||
|
|
||||||
|
NGINX's SearXNG site
|
||||||
|
====================
|
||||||
|
|
||||||
|
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*.
|
||||||
|
|
||||||
|
Depending on what your SearXNG installation is listening on, you need a http or socket
|
||||||
|
communication to upstream.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. 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::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
Create configuration at ``/etc/nginx/sites-available/`` and place a
|
||||||
|
symlink to ``sites-enabled``:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H ln -s /etc/nginx/sites-available/searxng.conf \
|
||||||
|
/etc/nginx/sites-enabled/searxng.conf
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
In the ``/etc/nginx/nginx.conf`` file, in the ``server`` section add a
|
||||||
|
`include <https://nginx.org/en/docs/ngx_core_module.html#include>`_
|
||||||
|
directive:
|
||||||
|
|
||||||
|
.. code:: nginx
|
||||||
|
|
||||||
|
server {
|
||||||
|
# ...
|
||||||
|
include /etc/nginx/default.d/*.conf;
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
|
||||||
|
Create two folders, one for the *available sites* and one for the *enabled sites*:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
mkdir -p /etc/nginx/default.d
|
||||||
|
mkdir -p /etc/nginx/default.apps-available
|
||||||
|
|
||||||
|
Create configuration at ``/etc/nginx/default.apps-available`` and place a
|
||||||
|
symlink to ``default.d``:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
|
||||||
|
/etc/nginx/default.d/searxng.conf
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
Create a folder for the *available sites*:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
mkdir -p /etc/nginx/default.apps-available
|
||||||
|
|
||||||
|
Create configuration at ``/etc/nginx/default.apps-available`` and place a
|
||||||
|
symlink to ``conf.d``:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
|
||||||
|
/etc/nginx/conf.d/searxng.conf
|
||||||
|
|
||||||
|
Restart services:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart nginx
|
||||||
|
sudo -H service uwsgi restart searxng
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart nginx
|
||||||
|
sudo -H systemctl restart uwsgi@searxng
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
sudo -H systemctl restart nginx
|
||||||
|
sudo -H touch /etc/uwsgi.d/searxng.ini
|
||||||
|
|
||||||
|
|
||||||
|
Disable logs
|
||||||
|
============
|
||||||
|
|
||||||
|
For better privacy you can disable nginx logs in ``/etc/nginx/nginx.conf``.
|
||||||
|
|
||||||
|
.. code:: nginx
|
||||||
|
|
||||||
|
http {
|
||||||
|
# ...
|
||||||
|
access_log /dev/null;
|
||||||
|
error_log /dev/null;
|
||||||
|
# ...
|
||||||
|
}
|
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 to have 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 regarding 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`
|
132
docs/admin/installation-searxng.rst
Normal file
132
docs/admin/installation-searxng.rst
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
.. _installation basic:
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Step by step installation
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
In this section we show the setup of a SearXNG instance that will be installed
|
||||||
|
by the :ref:`installation scripts`.
|
||||||
|
|
||||||
|
.. _install packages:
|
||||||
|
|
||||||
|
Install packages
|
||||||
|
================
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START distro-packages
|
||||||
|
:end-before: END distro-packages
|
||||||
|
|
||||||
|
.. hint::
|
||||||
|
|
||||||
|
This installs also the packages needed by :ref:`searxng uwsgi`
|
||||||
|
|
||||||
|
.. _create searxng user:
|
||||||
|
|
||||||
|
Create user
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START create user
|
||||||
|
:end-before: END create user
|
||||||
|
|
||||||
|
.. _searxng-src:
|
||||||
|
|
||||||
|
Install SearXNG & dependencies
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Start a interactive shell from new created user and clone SearXNG:
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START clone searxng
|
||||||
|
:end-before: END clone searxng
|
||||||
|
|
||||||
|
In the same shell create *virtualenv*:
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START create virtualenv
|
||||||
|
:end-before: END create virtualenv
|
||||||
|
|
||||||
|
To install SearXNG's dependencies, exit the SearXNG *bash* session you opened above
|
||||||
|
and start a new one. Before installing, check if your *virtualenv* was sourced
|
||||||
|
from the login (*~/.profile*):
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START manage.sh update_packages
|
||||||
|
:end-before: END manage.sh update_packages
|
||||||
|
|
||||||
|
.. tip::
|
||||||
|
|
||||||
|
Open a second terminal for the configuration tasks and leave the ``(searx)$``
|
||||||
|
terminal open for the tasks below.
|
||||||
|
|
||||||
|
|
||||||
|
.. _use_default_settings.yml:
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. sidebar:: ``use_default_settings: True``
|
||||||
|
|
||||||
|
- :ref:`settings.yml`
|
||||||
|
- :ref:`settings location`
|
||||||
|
- :ref:`settings use_default_settings`
|
||||||
|
- :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>`
|
||||||
|
|
||||||
|
To create a initial ``/etc/searxng/settings.yml`` we recommend to start with a
|
||||||
|
copy of the file :origin:`utils/templates/etc/searxng/settings.yml`. This setup
|
||||||
|
:ref:`use default settings <settings use_default_settings>` from
|
||||||
|
:origin:`searx/settings.yml` and is shown in the tab *"Use default settings"*
|
||||||
|
below. This setup:
|
||||||
|
|
||||||
|
- 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 bandwidth
|
||||||
|
|
||||||
|
Modify the ``/etc/searxng/settings.yml`` to your needs:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Use default settings
|
||||||
|
|
||||||
|
.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
|
||||||
|
: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
|
||||||
|
|
||||||
|
.. literalinclude:: ../../searx/settings.yml
|
||||||
|
: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
|
||||||
|
=====
|
||||||
|
|
||||||
|
To check your SearXNG setup, optional enable debugging and start the *webapp*.
|
||||||
|
SearXNG looks at the exported environment ``$SEARXNG_SETTINGS_PATH`` for a
|
||||||
|
configuration file.
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START check searxng installation
|
||||||
|
:end-before: END check searxng installation
|
||||||
|
|
||||||
|
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 session (enter exit
|
||||||
|
command twice). At this point SearXNG is not demonized; uwsgi allows this.
|
||||||
|
|
268
docs/admin/installation-uwsgi.rst
Normal file
268
docs/admin/installation-uwsgi.rst
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
.. _searxng uwsgi:
|
||||||
|
|
||||||
|
=====
|
||||||
|
uWSGI
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. sidebar:: further reading
|
||||||
|
|
||||||
|
- `systemd.unit`_
|
||||||
|
- `uWSGI Emperor`_
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _systemd.unit: https://www.freedesktop.org/software/systemd/man/systemd.unit.html
|
||||||
|
.. _One service per app in systemd:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd
|
||||||
|
.. _uWSGI Emperor:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html
|
||||||
|
.. _uwsgi ini file:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files
|
||||||
|
.. _systemd unit template:
|
||||||
|
http://0pointer.de/blog/projects/instances.html
|
||||||
|
|
||||||
|
|
||||||
|
Origin uWSGI
|
||||||
|
============
|
||||||
|
|
||||||
|
.. _Tyrant mode:
|
||||||
|
https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting
|
||||||
|
|
||||||
|
How uWSGI is implemented by distributors varies. The uWSGI project itself
|
||||||
|
recommends two methods:
|
||||||
|
|
||||||
|
1. `systemd.unit`_ template file as described here `One service per app in systemd`_:
|
||||||
|
|
||||||
|
There is one `systemd unit template`_ on the system installed and one `uwsgi
|
||||||
|
ini file`_ per uWSGI-app placed at dedicated locations. Take archlinux and a
|
||||||
|
``searxng.ini`` as example::
|
||||||
|
|
||||||
|
systemd template unit: /usr/lib/systemd/system/uwsgi@.service
|
||||||
|
contains: [Service]
|
||||||
|
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/%I.ini
|
||||||
|
|
||||||
|
SearXNG application: /etc/uwsgi/searxng.ini
|
||||||
|
links to: /etc/uwsgi/apps-available/searxng.ini
|
||||||
|
|
||||||
|
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
|
||||||
|
events. The Emperor mode (the service) is started by a (common, not template)
|
||||||
|
systemd unit.
|
||||||
|
|
||||||
|
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 stop instance remove ini --> rm /etc/uwsgi.d/searxng.ini
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
interpreter is (python2 vs. python3).
|
||||||
|
|
||||||
|
While archlinux does not start a uWSGI service by default, Fedora (RHEL) starts
|
||||||
|
a Emperor in `Tyrant mode`_ by default (you should have read :ref:`uWSGI Tyrant
|
||||||
|
mode pitfalls`). Worth to know; debian (ubuntu) follow a complete different
|
||||||
|
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-enabled/
|
||||||
|
|
||||||
|
The `uwsgi ini file`_ is enabled by a symbolic link::
|
||||||
|
|
||||||
|
ln -s /etc/uwsgi/apps-available/searxng.ini /etc/uwsgi/apps-enabled/
|
||||||
|
|
||||||
|
More details can be found in the uwsgi.README.Debian_
|
||||||
|
(``/usr/share/doc/uwsgi/README.Debian.gz``). Some commands you should know on
|
||||||
|
Debian:
|
||||||
|
|
||||||
|
.. code:: none
|
||||||
|
|
||||||
|
Commands recognized by init.d script
|
||||||
|
====================================
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
'status' command must be issued with exactly one argument: '<confname>'.
|
||||||
|
|
||||||
|
Controlling specific instances of uWSGI
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
You could control specific instance(s) by issuing:
|
||||||
|
|
||||||
|
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::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START searxng uwsgi-description ubuntu-20.04
|
||||||
|
:end-before: END searxng uwsgi-description ubuntu-20.04
|
||||||
|
|
||||||
|
.. hotfix: a bug group-tab need this comment
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START searxng uwsgi-description arch
|
||||||
|
:end-before: END searxng uwsgi-description arch
|
||||||
|
|
||||||
|
.. hotfix: a bug group-tab need this comment
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START 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::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START searxng uwsgi-appini ubuntu-20.04
|
||||||
|
:end-before: END searxng uwsgi-appini ubuntu-20.04
|
||||||
|
|
||||||
|
.. hotfix: a bug group-tab need this comment
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START searxng uwsgi-appini arch
|
||||||
|
:end-before: END searxng uwsgi-appini arch
|
||||||
|
|
||||||
|
.. hotfix: a bug group-tab need this comment
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
|
||||||
|
:start-after: START 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.redisdb: [searxng (993)] can't connect redis DB ...
|
||||||
|
ERROR:searx.redisdb: 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:
|
||||||
|
...
|
22
docs/admin/installation.rst
Normal file
22
docs/admin/installation.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. _installation:
|
||||||
|
|
||||||
|
============
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
*You're spoilt for choice*, choose your preferred method of installation.
|
||||||
|
|
||||||
|
- :ref:`installation docker`
|
||||||
|
- :ref:`installation scripts`
|
||||||
|
- :ref:`installation basic`
|
||||||
|
|
||||||
|
The :ref:`installation basic` is an excellent illustration of *how a SearXNG
|
||||||
|
instance is build up* (see :ref:`architecture uWSGI`). If you do not have any
|
||||||
|
special preferences, it's recommended to use the :ref:`installation docker` or the
|
||||||
|
:ref:`installation scripts`.
|
||||||
|
|
||||||
|
.. attention::
|
||||||
|
|
||||||
|
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
|
||||||
|
from searx to SearXNG, you should read this section first!
|
39
docs/admin/plugins.rst
Normal file
39
docs/admin/plugins.rst
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
.. _plugins generic:
|
||||||
|
|
||||||
|
===============
|
||||||
|
Plugins builtin
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`dev plugin`
|
||||||
|
|
||||||
|
Configuration defaults (at built time):
|
||||||
|
|
||||||
|
:DO: Default on
|
||||||
|
|
||||||
|
.. _configured plugins:
|
||||||
|
|
||||||
|
.. jinja:: searx
|
||||||
|
|
||||||
|
.. flat-table:: Plugins configured at built time (defaults)
|
||||||
|
:header-rows: 1
|
||||||
|
:stub-columns: 1
|
||||||
|
:widths: 3 1 9
|
||||||
|
|
||||||
|
* - Name
|
||||||
|
- DO
|
||||||
|
- Description
|
||||||
|
|
||||||
|
JS & CSS dependencies
|
||||||
|
|
||||||
|
{% for plgin in plugins %}
|
||||||
|
|
||||||
|
* - {{plgin.name}}
|
||||||
|
- {{(plgin.default_on and "y") or ""}}
|
||||||
|
- {{plgin.description}}
|
||||||
|
|
||||||
|
{% for dep in (plgin.js_dependencies + plgin.css_dependencies) %}
|
||||||
|
| ``{{dep}}`` {% endfor %}
|
||||||
|
|
||||||
|
{% endfor %}
|
17
docs/admin/searx.limiter.rst
Normal file
17
docs/admin/searx.limiter.rst
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
.. _limiter:
|
||||||
|
|
||||||
|
=======
|
||||||
|
Limiter
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
The limiter requires a :ref:`Redis <settings redis>` database.
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.limiter
|
||||||
|
:members:
|
25
docs/admin/settings/index.rst
Normal file
25
docs/admin/settings/index.rst
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
========
|
||||||
|
Settings
|
||||||
|
========
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`engine settings`
|
||||||
|
- :ref:`engine file`
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
settings
|
||||||
|
settings_engine
|
||||||
|
settings_brand
|
||||||
|
settings_general
|
||||||
|
settings_search
|
||||||
|
settings_server
|
||||||
|
settings_ui
|
||||||
|
settings_redis
|
||||||
|
settings_outgoing
|
||||||
|
settings_categories_as_tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
117
docs/admin/settings/settings.rst
Normal file
117
docs/admin/settings/settings.rst
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
.. _settings.yml:
|
||||||
|
|
||||||
|
================
|
||||||
|
``settings.yml``
|
||||||
|
================
|
||||||
|
|
||||||
|
This page describe the options possibilities of the :origin:`searx/settings.yml`
|
||||||
|
file.
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`use_default_settings.yml`
|
||||||
|
- :ref:`search API`
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. _settings location:
|
||||||
|
|
||||||
|
settings.yml location
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The initial ``settings.yml`` we be load from these locations:
|
||||||
|
|
||||||
|
1. the full path specified in the ``SEARXNG_SETTINGS_PATH`` environment variable.
|
||||||
|
2. ``/etc/searxng/settings.yml``
|
||||||
|
|
||||||
|
If these files don't exist (or are empty or can't be read), SearXNG uses the
|
||||||
|
:origin:`searx/settings.yml` file. Read :ref:`settings use_default_settings` to
|
||||||
|
see how you can simplify your *user defined* ``settings.yml``.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. _settings use_default_settings:
|
||||||
|
|
||||||
|
use_default_settings
|
||||||
|
====================
|
||||||
|
|
||||||
|
.. sidebar:: ``use_default_settings: true``
|
||||||
|
|
||||||
|
- :ref:`settings location`
|
||||||
|
- :ref:`use_default_settings.yml`
|
||||||
|
- :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>`
|
||||||
|
|
||||||
|
The user defined ``settings.yml`` is loaded from the :ref:`settings location`
|
||||||
|
and can relied on the default configuration :origin:`searx/settings.yml` using:
|
||||||
|
|
||||||
|
``use_default_settings: true``
|
||||||
|
|
||||||
|
``server:``
|
||||||
|
In the following example, the actual settings are the default settings defined
|
||||||
|
in :origin:`searx/settings.yml` with the exception of the ``secret_key`` and
|
||||||
|
the ``bind_address``:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
use_default_settings: true
|
||||||
|
server:
|
||||||
|
secret_key: "ultrasecretkey" # change this!
|
||||||
|
bind_address: "0.0.0.0"
|
||||||
|
|
||||||
|
``engines:``
|
||||||
|
With ``use_default_settings: true``, each settings can be override in a
|
||||||
|
similar way, the ``engines`` section is merged according to the engine
|
||||||
|
``name``. In this example, SearXNG will load all the default engines, will
|
||||||
|
enable the ``bing`` engine and define a :ref:`token <private engines>` for
|
||||||
|
the arch linux engine:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
use_default_settings: true
|
||||||
|
server:
|
||||||
|
secret_key: "ultrasecretkey" # change this!
|
||||||
|
engines:
|
||||||
|
- name: arch linux wiki
|
||||||
|
tokens: ['$ecretValue']
|
||||||
|
- name: bing
|
||||||
|
disabled: false
|
||||||
|
|
||||||
|
|
||||||
|
``engines:`` / ``remove:``
|
||||||
|
It is possible to remove some engines from the default settings. The following
|
||||||
|
example is similar to the above one, but SearXNG doesn't load the the google
|
||||||
|
engine:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
use_default_settings:
|
||||||
|
engines:
|
||||||
|
remove:
|
||||||
|
- google
|
||||||
|
server:
|
||||||
|
secret_key: "ultrasecretkey" # change this!
|
||||||
|
engines:
|
||||||
|
- name: arch linux wiki
|
||||||
|
tokens: ['$ecretValue']
|
||||||
|
|
||||||
|
``engines:`` / ``keep_only:``
|
||||||
|
As an alternative, it is possible to specify the engines to keep. In the
|
||||||
|
following example, SearXNG has only two engines:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
use_default_settings:
|
||||||
|
engines:
|
||||||
|
keep_only:
|
||||||
|
- google
|
||||||
|
- duckduckgo
|
||||||
|
server:
|
||||||
|
secret_key: "ultrasecretkey" # change this!
|
||||||
|
engines:
|
||||||
|
- name: google
|
||||||
|
tokens: ['$ecretValue']
|
||||||
|
- name: duckduckgo
|
||||||
|
tokens: ['$ecretValue']
|
25
docs/admin/settings/settings_brand.rst
Normal file
25
docs/admin/settings/settings_brand.rst
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
.. _settings brand:
|
||||||
|
|
||||||
|
==========
|
||||||
|
``brand:``
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
brand:
|
||||||
|
issue_url: https://github.com/searxng/searxng/issues
|
||||||
|
docs_url: https://docs.searxng.org
|
||||||
|
public_instances: https://searx.space
|
||||||
|
wiki_url: https://github.com/searxng/searxng/wiki
|
||||||
|
|
||||||
|
``issue_url`` :
|
||||||
|
If you host your own issue tracker change this URL.
|
||||||
|
|
||||||
|
``docs_url`` :
|
||||||
|
If you host your own documentation change this URL.
|
||||||
|
|
||||||
|
``public_instances`` :
|
||||||
|
If you host your own https://searx.space change this URL.
|
||||||
|
|
||||||
|
``wiki_url`` :
|
||||||
|
Link to your wiki (or ``false``)
|
31
docs/admin/settings/settings_categories_as_tabs.rst
Normal file
31
docs/admin/settings/settings_categories_as_tabs.rst
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
.. _settings categories_as_tabs:
|
||||||
|
|
||||||
|
=======================
|
||||||
|
``categories_as_tabs:``
|
||||||
|
=======================
|
||||||
|
|
||||||
|
A list of the categories that are displayed as tabs in the user interface.
|
||||||
|
Categories not listed here can still be searched with the :ref:`search-syntax`.
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
categories_as_tabs:
|
||||||
|
general:
|
||||||
|
images:
|
||||||
|
videos:
|
||||||
|
news:
|
||||||
|
map:
|
||||||
|
music:
|
||||||
|
it:
|
||||||
|
science:
|
||||||
|
files:
|
||||||
|
social media:
|
||||||
|
|
||||||
|
Engines are added to ``categories:`` (compare :ref:`engine categories`), the
|
||||||
|
categories listed in ``categories_as_tabs`` are shown as tabs in the UI. If
|
||||||
|
there are no active engines in a category, the tab is not displayed (e.g. if a
|
||||||
|
user disables all engines in a category).
|
||||||
|
|
||||||
|
On the preferences page (``/preferences``) -- under *engines* -- there is an
|
||||||
|
additional tab, called *other*. In this tab are all engines listed that are not
|
||||||
|
in one of the UI tabs (not included in ``categories_as_tabs``).
|
244
docs/admin/settings/settings_engine.rst
Normal file
244
docs/admin/settings/settings_engine.rst
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
.. _settings engine:
|
||||||
|
|
||||||
|
===========
|
||||||
|
``engine:``
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`configured engines`
|
||||||
|
- :ref:`engines-dev`
|
||||||
|
|
||||||
|
In the code example below a *full fledged* example of a YAML setup from a dummy
|
||||||
|
engine is shown. Most of the options have a default value or even are optional.
|
||||||
|
|
||||||
|
.. hint::
|
||||||
|
|
||||||
|
A few more options are possible, but they are pretty specific to some
|
||||||
|
engines (:ref:`engine implementations`).
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
- name: example engine
|
||||||
|
engine: example
|
||||||
|
shortcut: demo
|
||||||
|
base_url: 'https://{language}.example.com/'
|
||||||
|
send_accept_language_header: false
|
||||||
|
categories: general
|
||||||
|
timeout: 3.0
|
||||||
|
api_key: 'apikey'
|
||||||
|
disabled: false
|
||||||
|
language: en_US
|
||||||
|
tokens: [ 'my-secret-token' ]
|
||||||
|
weight: 1
|
||||||
|
display_error_messages: true
|
||||||
|
about:
|
||||||
|
website: https://example.com
|
||||||
|
wikidata_id: Q306656
|
||||||
|
official_api_documentation: https://example.com/api-doc
|
||||||
|
use_official_api: true
|
||||||
|
require_api_key: true
|
||||||
|
results: HTML
|
||||||
|
|
||||||
|
# overwrite values from section 'outgoing:'
|
||||||
|
enable_http2: false
|
||||||
|
retries: 1
|
||||||
|
max_connections: 100
|
||||||
|
max_keepalive_connections: 10
|
||||||
|
keepalive_expiry: 5.0
|
||||||
|
using_tor_proxy: false
|
||||||
|
proxies:
|
||||||
|
http:
|
||||||
|
- http://proxy1:8080
|
||||||
|
- http://proxy2:8080
|
||||||
|
https:
|
||||||
|
- http://proxy1:8080
|
||||||
|
- http://proxy2:8080
|
||||||
|
- socks5://user:password@proxy3:1080
|
||||||
|
- socks5h://user:password@proxy4:1080
|
||||||
|
|
||||||
|
# other network settings
|
||||||
|
enable_http: false
|
||||||
|
retry_on_http_error: true # or 403 or [404, 429]
|
||||||
|
|
||||||
|
|
||||||
|
``name`` :
|
||||||
|
Name that will be used across SearXNG to define this engine. In settings, on
|
||||||
|
the result page...
|
||||||
|
|
||||||
|
``engine`` :
|
||||||
|
Name of the python file used to handle requests and responses to and from this
|
||||||
|
search engine.
|
||||||
|
|
||||||
|
``shortcut`` :
|
||||||
|
Code used to execute bang requests (in this case using ``!bi``)
|
||||||
|
|
||||||
|
``base_url`` : optional
|
||||||
|
Part of the URL that should be stable across every request. Can be useful to
|
||||||
|
use multiple sites using only one engine, or updating the site URL without
|
||||||
|
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.
|
||||||
|
|
||||||
|
.. _engine categories:
|
||||||
|
|
||||||
|
``categories`` : optional
|
||||||
|
Specifies to which categories the engine should be added. Engines can be
|
||||||
|
assigned to multiple categories.
|
||||||
|
|
||||||
|
Categories can be shown as tabs (:ref:`settings categories_as_tabs`) in the
|
||||||
|
UI. A search in a tab (in the UI) will query all engines that are active in
|
||||||
|
this tab. In the preferences page (``/preferences``) -- under *engines* --
|
||||||
|
users can select what engine should be active when querying in this tab.
|
||||||
|
|
||||||
|
Alternatively, :ref:`\!bang <search-syntax>` can be used to search all engines
|
||||||
|
in a category, regardless of whether they are active or not, or whether they
|
||||||
|
are in a tab of the UI or not. For example, ``!dictionaries`` can be used to
|
||||||
|
query all search engines in that category (group).
|
||||||
|
|
||||||
|
``timeout`` : optional
|
||||||
|
Timeout of the search with the current search engine. Overwrites
|
||||||
|
``request_timeout`` from :ref:`settings outgoing`. **Be careful, it will
|
||||||
|
modify the global timeout of SearXNG.**
|
||||||
|
|
||||||
|
``api_key`` : optional
|
||||||
|
In a few cases, using an API needs the use of a secret key. How to obtain them
|
||||||
|
is described in the file.
|
||||||
|
|
||||||
|
``disabled`` : optional
|
||||||
|
To disable by default the engine, but not deleting it. It will allow the user
|
||||||
|
to manually activate it in the settings.
|
||||||
|
|
||||||
|
``inactive``: optional
|
||||||
|
Remove the engine from the settings (*disabled & removed*).
|
||||||
|
|
||||||
|
``language`` : optional
|
||||||
|
If you want to use another language for a specific engine, you can define it
|
||||||
|
by using the ISO code of language (and region), like ``fr``, ``en-US``,
|
||||||
|
``de-DE``.
|
||||||
|
|
||||||
|
``tokens`` : optional
|
||||||
|
A list of secret tokens to make this engine *private*, more details see
|
||||||
|
:ref:`private engines`.
|
||||||
|
|
||||||
|
``weight`` : default ``1``
|
||||||
|
Weighting of the results of this engine.
|
||||||
|
|
||||||
|
``display_error_messages`` : default ``true``
|
||||||
|
When an engine returns an error, the message is displayed on the user interface.
|
||||||
|
|
||||||
|
``network`` : optional
|
||||||
|
Use the network configuration from another engine.
|
||||||
|
In addition, there are two default networks:
|
||||||
|
|
||||||
|
- ``ipv4`` set ``local_addresses`` to ``0.0.0.0`` (use only IPv4 local addresses)
|
||||||
|
- ``ipv6`` set ``local_addresses`` to ``::`` (use only IPv6 local addresses)
|
||||||
|
|
||||||
|
``enable_http`` : optional
|
||||||
|
Enable HTTP for this engine (by default only HTTPS is enabled).
|
||||||
|
|
||||||
|
``retry_on_http_error`` : optional
|
||||||
|
Retry request on some HTTP status code.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
* ``true`` : on HTTP status code between 400 and 599.
|
||||||
|
* ``403`` : on HTTP status code 403.
|
||||||
|
* ``[403, 429]``: on HTTP status code 403 and 429.
|
||||||
|
|
||||||
|
``proxies`` :
|
||||||
|
Overwrites proxy settings from :ref:`settings outgoing`.
|
||||||
|
|
||||||
|
``using_tor_proxy`` :
|
||||||
|
Using tor proxy (``true``) or not (``false``) for this engine. The default is
|
||||||
|
taken from ``using_tor_proxy`` of the :ref:`settings outgoing`.
|
||||||
|
|
||||||
|
.. _Pool limit configuration: https://www.python-httpx.org/advanced/#pool-limit-configuration
|
||||||
|
|
||||||
|
``max_keepalive_connection#s`` :
|
||||||
|
`Pool limit configuration`_, overwrites value ``pool_maxsize`` from
|
||||||
|
:ref:`settings outgoing` for this engine.
|
||||||
|
|
||||||
|
``max_connections`` :
|
||||||
|
`Pool limit configuration`_, overwrites value ``pool_connections`` from
|
||||||
|
:ref:`settings outgoing` for this engine.
|
||||||
|
|
||||||
|
``keepalive_expiry`` :
|
||||||
|
`Pool limit configuration`_, overwrites value ``keepalive_expiry`` from
|
||||||
|
:ref:`settings outgoing` for this engine.
|
||||||
|
|
||||||
|
|
||||||
|
.. _private engines:
|
||||||
|
|
||||||
|
Private Engines (``tokens``)
|
||||||
|
============================
|
||||||
|
|
||||||
|
Administrators might find themselves wanting to limit access to some of the
|
||||||
|
enabled engines on their instances. It might be because they do not want to
|
||||||
|
expose some private information through :ref:`offline engines`. Or they would
|
||||||
|
rather share engines only with their trusted friends or colleagues.
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
Initial sponsored by `Search and Discovery Fund
|
||||||
|
<https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
|
||||||
|
|
||||||
|
To solve this issue the concept of *private engines* exists.
|
||||||
|
|
||||||
|
A new option was added to engines named `tokens`. It expects a list of strings.
|
||||||
|
If the user making a request presents one of the tokens of an engine, they can
|
||||||
|
access information about the engine and make search requests.
|
||||||
|
|
||||||
|
Example configuration to restrict access to the Arch Linux Wiki engine:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
- name: arch linux wiki
|
||||||
|
engine: archlinux
|
||||||
|
shortcut: al
|
||||||
|
tokens: [ 'my-secret-token' ]
|
||||||
|
|
||||||
|
Unless a user has configured the right token, the engine is going to be hidden
|
||||||
|
from him/her. It is not going to be included in the list of engines on the
|
||||||
|
Preferences page and in the output of `/config` REST API call.
|
||||||
|
|
||||||
|
Tokens can be added to one's configuration on the Preferences page under "Engine
|
||||||
|
tokens". The input expects a comma separated list of strings.
|
||||||
|
|
||||||
|
The distribution of the tokens from the administrator to the users is not carved
|
||||||
|
in stone. As providing access to such engines implies that the admin knows and
|
||||||
|
trusts the user, we do not see necessary to come up with a strict process.
|
||||||
|
Instead, we would like to add guidelines to the documentation of the feature.
|
||||||
|
|
||||||
|
|
||||||
|
Example: Multilingual Search
|
||||||
|
============================
|
||||||
|
|
||||||
|
SearXNG does not support true multilingual search. You have to use the language
|
||||||
|
prefix in your search query when searching in a different language.
|
||||||
|
|
||||||
|
But there is a workaround: By adding a new search engine with a different
|
||||||
|
language, SearXNG will search in your default and other language.
|
||||||
|
|
||||||
|
Example configuration in settings.yml for a German and English speaker:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
search:
|
||||||
|
default_lang : "de"
|
||||||
|
...
|
||||||
|
|
||||||
|
engines:
|
||||||
|
- name : google english
|
||||||
|
engine : google
|
||||||
|
language : en
|
||||||
|
...
|
||||||
|
|
||||||
|
When searching, the default google engine will return German results and
|
||||||
|
"google english" will return English results.
|
||||||
|
|
34
docs/admin/settings/settings_general.rst
Normal file
34
docs/admin/settings/settings_general.rst
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
.. _settings general:
|
||||||
|
|
||||||
|
============
|
||||||
|
``general:``
|
||||||
|
============
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
general:
|
||||||
|
debug: false
|
||||||
|
instance_name: "SearXNG"
|
||||||
|
privacypolicy_url: false
|
||||||
|
donation_url: false
|
||||||
|
contact_url: false
|
||||||
|
enable_metrics: true
|
||||||
|
|
||||||
|
``debug`` : ``$SEARXNG_DEBUG``
|
||||||
|
Allow a more detailed log if you run SearXNG directly. Display *detailed* error
|
||||||
|
messages in the browser too, so this must be deactivated in production.
|
||||||
|
|
||||||
|
``donation_url`` :
|
||||||
|
Set value to ``true`` to use your own donation page written in the
|
||||||
|
:ref:`searx/info/en/donate.md <searx.infopage>` and use ``false`` to disable
|
||||||
|
the donation link altogether.
|
||||||
|
|
||||||
|
``privacypolicy_url``:
|
||||||
|
Link to privacy policy.
|
||||||
|
|
||||||
|
``contact_url``:
|
||||||
|
Contact ``mailto:`` address or WEB form.
|
||||||
|
|
||||||
|
``enable_metrics``:
|
||||||
|
Enabled by default. Record various anonymous metrics available at ``/stats``,
|
||||||
|
``/stats/errors`` and ``/preferences``.
|
110
docs/admin/settings/settings_outgoing.rst
Normal file
110
docs/admin/settings/settings_outgoing.rst
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
.. _settings outgoing:
|
||||||
|
|
||||||
|
=============
|
||||||
|
``outgoing:``
|
||||||
|
=============
|
||||||
|
|
||||||
|
Communication with search engines.
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
outgoing:
|
||||||
|
request_timeout: 2.0 # default timeout in seconds, can be override by engine
|
||||||
|
max_request_timeout: 10.0 # the maximum timeout in seconds
|
||||||
|
useragent_suffix: "" # information like an email address to the administrator
|
||||||
|
pool_connections: 100 # Maximum number of allowable connections, or null
|
||||||
|
# for no limits. The default is 100.
|
||||||
|
pool_maxsize: 10 # Number of allowable keep-alive connections, or null
|
||||||
|
# to always allow. The default is 10.
|
||||||
|
enable_http2: true # See https://www.python-httpx.org/http2/
|
||||||
|
# uncomment below section if you want to use a custom server certificate
|
||||||
|
# see https://www.python-httpx.org/advanced/#changing-the-verification-defaults
|
||||||
|
# and https://www.python-httpx.org/compatibility/#ssl-configuration
|
||||||
|
# verify: ~/.mitmproxy/mitmproxy-ca-cert.cer
|
||||||
|
#
|
||||||
|
# uncomment below section if you want to use a proxyq see: SOCKS proxies
|
||||||
|
# https://2.python-requests.org/en/latest/user/advanced/#proxies
|
||||||
|
# are also supported: see
|
||||||
|
# https://2.python-requests.org/en/latest/user/advanced/#socks
|
||||||
|
#
|
||||||
|
# proxies:
|
||||||
|
# all://:
|
||||||
|
# - http://proxy1:8080
|
||||||
|
# - http://proxy2:8080
|
||||||
|
#
|
||||||
|
# using_tor_proxy: true
|
||||||
|
#
|
||||||
|
# Extra seconds to add in order to account for the time taken by the proxy
|
||||||
|
#
|
||||||
|
# extra_proxy_timeout: 10.0
|
||||||
|
#
|
||||||
|
|
||||||
|
``request_timeout`` :
|
||||||
|
Global timeout of the requests made to others engines in seconds. A bigger
|
||||||
|
timeout will allow to wait for answers from slow engines, but in consequence
|
||||||
|
will slow SearXNG reactivity (the result page may take the time specified in the
|
||||||
|
timeout to load). Can be override by ``timeout`` in the :ref:`settings engine`.
|
||||||
|
|
||||||
|
``useragent_suffix`` :
|
||||||
|
Suffix to the user-agent SearXNG uses to send requests to others engines. If an
|
||||||
|
engine wish to block you, a contact info here may be useful to avoid that.
|
||||||
|
|
||||||
|
.. _Pool limit configuration: https://www.python-httpx.org/advanced/#pool-limit-configuration
|
||||||
|
|
||||||
|
``pool_maxsize``:
|
||||||
|
Number of allowable keep-alive connections, or ``null`` to always allow. The
|
||||||
|
default is 10. See ``max_keepalive_connections`` `Pool limit configuration`_.
|
||||||
|
|
||||||
|
``pool_connections`` :
|
||||||
|
Maximum number of allowable connections, or ``null`` # for no limits. The
|
||||||
|
default is 100. See ``max_connections`` `Pool limit configuration`_.
|
||||||
|
|
||||||
|
``keepalive_expiry`` :
|
||||||
|
Number of seconds to keep a connection in the pool. By default 5.0 seconds.
|
||||||
|
See ``keepalive_expiry`` `Pool limit configuration`_.
|
||||||
|
|
||||||
|
.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
|
||||||
|
|
||||||
|
``proxies`` :
|
||||||
|
Define one or more proxies you wish to use, see `httpx proxies`_.
|
||||||
|
If there are more than one proxy for one protocol (http, https),
|
||||||
|
requests to the engines are distributed in a round-robin fashion.
|
||||||
|
|
||||||
|
``source_ips`` :
|
||||||
|
If you use multiple network interfaces, define from which IP the requests must
|
||||||
|
be made. Example:
|
||||||
|
|
||||||
|
* ``0.0.0.0`` any local IPv4 address.
|
||||||
|
* ``::`` any local IPv6 address.
|
||||||
|
* ``192.168.0.1``
|
||||||
|
* ``[ 192.168.0.1, 192.168.0.2 ]`` these two specific IP addresses
|
||||||
|
* ``fe80::60a2:1691:e5a2:ee1f``
|
||||||
|
* ``fe80::60a2:1691:e5a2:ee1f/126`` all IP addresses in this network.
|
||||||
|
* ``[ 192.168.0.1, fe80::/126 ]``
|
||||||
|
|
||||||
|
``retries`` :
|
||||||
|
Number of retry in case of an HTTP error. On each retry, SearXNG uses an
|
||||||
|
different proxy and source ip.
|
||||||
|
|
||||||
|
``enable_http2`` :
|
||||||
|
Enable by default. Set to ``false`` to disable HTTP/2.
|
||||||
|
|
||||||
|
.. _httpx verification defaults: https://www.python-httpx.org/advanced/#changing-the-verification-defaults
|
||||||
|
.. _httpx ssl configuration: https://www.python-httpx.org/compatibility/#ssl-configuration
|
||||||
|
|
||||||
|
``verify``: : ``$SSL_CERT_FILE``, ``$SSL_CERT_DIR``
|
||||||
|
Allow to specify a path to certificate.
|
||||||
|
see `httpx verification defaults`_.
|
||||||
|
|
||||||
|
In addition to ``verify``, SearXNG supports the ``$SSL_CERT_FILE`` (for a file) and
|
||||||
|
``$SSL_CERT_DIR`` (for a directory) OpenSSL variables.
|
||||||
|
see `httpx ssl configuration`_.
|
||||||
|
|
||||||
|
``max_redirects`` :
|
||||||
|
30 by default. Maximum redirect before it is an error.
|
||||||
|
|
||||||
|
``using_tor_proxy`` :
|
||||||
|
Using tor proxy (``true``) or not (``false``) for all engines. The default is
|
||||||
|
``false`` and can be overwritten in the :ref:`settings engine`
|
||||||
|
|
||||||
|
|
49
docs/admin/settings/settings_redis.rst
Normal file
49
docs/admin/settings/settings_redis.rst
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
.. _settings redis:
|
||||||
|
|
||||||
|
==========
|
||||||
|
``redis:``
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. _Redis.from_url(url): https://redis-py.readthedocs.io/en/stable/connections.html#redis.client.Redis.from_url
|
||||||
|
|
||||||
|
A redis DB can be connected by an URL, in :py:obj:`searx.redisdb` you
|
||||||
|
will find a description to test your redis connection in SearXNG. When using
|
||||||
|
sockets, don't forget to check the access rights on the socket::
|
||||||
|
|
||||||
|
ls -la /usr/local/searxng-redis/run/redis.sock
|
||||||
|
srwxrwx--- 1 searxng-redis searxng-redis ... /usr/local/searxng-redis/run/redis.sock
|
||||||
|
|
||||||
|
In this example read/write access is given to the *searxng-redis* group. To get
|
||||||
|
access rights to redis instance (the socket), your SearXNG (or even your
|
||||||
|
developer) account needs to be added to the *searxng-redis* group.
|
||||||
|
|
||||||
|
``url`` : ``$SEARXNG_REDIS_URL``
|
||||||
|
URL to connect redis database, see `Redis.from_url(url)`_ & :ref:`redis db`::
|
||||||
|
|
||||||
|
redis://[[username]:[password]]@localhost:6379/0
|
||||||
|
rediss://[[username]:[password]]@localhost:6379/0
|
||||||
|
unix://[[username]:[password]]@/path/to/socket.sock?db=0
|
||||||
|
|
||||||
|
.. _Redis Developer Notes:
|
||||||
|
|
||||||
|
Redis Developer Notes
|
||||||
|
=====================
|
||||||
|
|
||||||
|
To set up a local redis instance, first set the socket path of the Redis DB
|
||||||
|
in your YAML setting:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
redis:
|
||||||
|
url: unix:///usr/local/searxng-redis/run/redis.sock?db=0
|
||||||
|
|
||||||
|
Then use the following commands to install the redis instance (:ref:`manage
|
||||||
|
redis.help`):
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ ./manage redis.build
|
||||||
|
$ sudo -H ./manage redis.install
|
||||||
|
$ sudo -H ./manage redis.addgrp "${USER}"
|
||||||
|
# don't forget to logout & login to get member of group
|
||||||
|
|
98
docs/admin/settings/settings_search.rst
Normal file
98
docs/admin/settings/settings_search.rst
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
.. _settings search:
|
||||||
|
|
||||||
|
===========
|
||||||
|
``search:``
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
search:
|
||||||
|
safe_search: 0
|
||||||
|
autocomplete: ""
|
||||||
|
default_lang: ""
|
||||||
|
ban_time_on_fail: 5
|
||||||
|
max_ban_time_on_fail: 120
|
||||||
|
suspended_times:
|
||||||
|
SearxEngineAccessDenied: 86400
|
||||||
|
SearxEngineCaptcha: 86400
|
||||||
|
SearxEngineTooManyRequests: 3600
|
||||||
|
cf_SearxEngineCaptcha: 1296000
|
||||||
|
cf_SearxEngineAccessDenied: 86400
|
||||||
|
recaptcha_SearxEngineCaptcha: 604800
|
||||||
|
formats:
|
||||||
|
- html
|
||||||
|
|
||||||
|
``safe_search``:
|
||||||
|
Filter results.
|
||||||
|
|
||||||
|
- ``0``: None
|
||||||
|
- ``1``: Moderate
|
||||||
|
- ``2``: Strict
|
||||||
|
|
||||||
|
``autocomplete``:
|
||||||
|
Existing autocomplete backends, leave blank to turn it off.
|
||||||
|
|
||||||
|
- ``dbpedia``
|
||||||
|
- ``duckduckgo``
|
||||||
|
- ``google``
|
||||||
|
- ``mwmbl``
|
||||||
|
- ``startpage``
|
||||||
|
- ``swisscows``
|
||||||
|
- ``qwant``
|
||||||
|
- ``wikipedia``
|
||||||
|
|
||||||
|
``default_lang``:
|
||||||
|
Default search language - leave blank to detect from browser information or
|
||||||
|
use codes from :origin:`searx/languages.py`.
|
||||||
|
|
||||||
|
``languages``:
|
||||||
|
List of available languages - leave unset to use all codes from
|
||||||
|
:origin:`searx/languages.py`. Otherwise list codes of available languages.
|
||||||
|
The ``all`` value is shown as the ``Default language`` in the user interface
|
||||||
|
(in most cases, it is meant to send the query without a language parameter ;
|
||||||
|
in some cases, it means the English language) Example:
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
languages:
|
||||||
|
- all
|
||||||
|
- en
|
||||||
|
- en-US
|
||||||
|
- de
|
||||||
|
- it-IT
|
||||||
|
- fr
|
||||||
|
- fr-BE
|
||||||
|
|
||||||
|
``ban_time_on_fail``:
|
||||||
|
Ban time in seconds after engine errors.
|
||||||
|
|
||||||
|
``max_ban_time_on_fail``:
|
||||||
|
Max ban time in seconds after engine errors.
|
||||||
|
|
||||||
|
``suspended_times``:
|
||||||
|
Engine suspension time after error (in seconds; set to 0 to disable)
|
||||||
|
|
||||||
|
``SearxEngineAccessDenied``: 86400
|
||||||
|
For error "Access denied" and "HTTP error [402, 403]"
|
||||||
|
|
||||||
|
``SearxEngineCaptcha``: 86400
|
||||||
|
For error "CAPTCHA"
|
||||||
|
|
||||||
|
``SearxEngineTooManyRequests``: 3600
|
||||||
|
For error "Too many request" and "HTTP error 429"
|
||||||
|
|
||||||
|
Cloudflare CAPTCHA:
|
||||||
|
- ``cf_SearxEngineCaptcha``: 1296000
|
||||||
|
- ``cf_SearxEngineAccessDenied``: 86400
|
||||||
|
|
||||||
|
Google CAPTCHA:
|
||||||
|
- ``recaptcha_SearxEngineCaptcha``: 604800
|
||||||
|
|
||||||
|
``formats``:
|
||||||
|
Result formats available from web, remove format to deny access (use lower
|
||||||
|
case).
|
||||||
|
|
||||||
|
- ``html``
|
||||||
|
- ``csv``
|
||||||
|
- ``json``
|
||||||
|
- ``rss``
|
62
docs/admin/settings/settings_server.rst
Normal file
62
docs/admin/settings/settings_server.rst
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
.. _settings server:
|
||||||
|
|
||||||
|
===========
|
||||||
|
``server:``
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
server:
|
||||||
|
base_url: http://example.org/location # change this!
|
||||||
|
port: 8888
|
||||||
|
bind_address: "127.0.0.1"
|
||||||
|
secret_key: "ultrasecretkey" # change this!
|
||||||
|
limiter: false
|
||||||
|
public_instance: false
|
||||||
|
image_proxy: false
|
||||||
|
default_http_headers:
|
||||||
|
X-Content-Type-Options : nosniff
|
||||||
|
X-XSS-Protection : 1; mode=block
|
||||||
|
X-Download-Options : noopen
|
||||||
|
X-Robots-Tag : noindex, nofollow
|
||||||
|
Referrer-Policy : no-referrer
|
||||||
|
|
||||||
|
``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv <make buildenv>`
|
||||||
|
The base URL where SearXNG is deployed. Used to create correct inbound links.
|
||||||
|
If you change the value, don't forget to rebuild instance's environment
|
||||||
|
(:ref:`utils/brand.env <make buildenv>`)
|
||||||
|
|
||||||
|
``port`` & ``bind_address``: ``$SEARXNG_PORT`` & ``$SEARXNG_BIND_ADDRESS`` :ref:`buildenv <make buildenv>`
|
||||||
|
Port number and *bind address* of the SearXNG web application if you run it
|
||||||
|
directly using ``python searx/webapp.py``. Doesn't apply to a SearXNG
|
||||||
|
services running behind a proxy and using socket communications. If you
|
||||||
|
change the value, don't forget to rebuild instance's environment
|
||||||
|
(:ref:`utils/brand.env <make buildenv>`)
|
||||||
|
|
||||||
|
``secret_key`` : ``$SEARXNG_SECRET``
|
||||||
|
Used for cryptography purpose.
|
||||||
|
|
||||||
|
``limiter`` :
|
||||||
|
Rate limit the number of request on the instance, block some bots. The
|
||||||
|
:ref:`limiter` requires a :ref:`settings redis` database.
|
||||||
|
|
||||||
|
.. _public_instance:
|
||||||
|
|
||||||
|
``public_instance`` :
|
||||||
|
|
||||||
|
Setting that allows to enable features specifically for public instances (not
|
||||||
|
needed for local usage). By set to ``true`` the following features are
|
||||||
|
activated:
|
||||||
|
|
||||||
|
- :py:obj:`searx.botdetection.link_token` in the :ref:`limiter`
|
||||||
|
|
||||||
|
.. _image_proxy:
|
||||||
|
|
||||||
|
``image_proxy`` :
|
||||||
|
Allow your instance of SearXNG of being able to proxy images. Uses memory space.
|
||||||
|
|
||||||
|
.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
|
||||||
|
|
||||||
|
``default_http_headers`` :
|
||||||
|
Set additional HTTP headers, see `#755 <https://github.com/searx/searx/issues/715>`__
|
||||||
|
|
70
docs/admin/settings/settings_ui.rst
Normal file
70
docs/admin/settings/settings_ui.rst
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
.. _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
|
||||||
|
|
||||||
|
ui:
|
||||||
|
static_use_hash: false
|
||||||
|
default_locale: ""
|
||||||
|
query_in_title: false
|
||||||
|
infinite_scroll: false
|
||||||
|
center_alignment: false
|
||||||
|
cache_url: https://web.archive.org/web/
|
||||||
|
default_theme: simple
|
||||||
|
theme_args:
|
||||||
|
simple_style: auto
|
||||||
|
search_on_category_select: true
|
||||||
|
hotkeys: default
|
||||||
|
|
||||||
|
.. _static_use_hash:
|
||||||
|
|
||||||
|
``static_use_hash`` :
|
||||||
|
Enables `cache busting`_ of static files.
|
||||||
|
|
||||||
|
``default_locale`` :
|
||||||
|
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
|
||||||
|
specific instance of searx, a locale can be defined using an ISO language
|
||||||
|
code, like ``fr``, ``en``, ``de``.
|
||||||
|
|
||||||
|
``query_in_title`` :
|
||||||
|
When true, the result page's titles contains the query it decreases the
|
||||||
|
privacy, since the browser can records the page titles.
|
||||||
|
|
||||||
|
``infinite_scroll``:
|
||||||
|
When true, automatically loads the next page when scrolling to bottom of the current page.
|
||||||
|
|
||||||
|
``center_alignment`` : default ``false``
|
||||||
|
When enabled, the results are centered instead of being in the left (or RTL)
|
||||||
|
side of the screen. This setting only affects the *desktop layout*
|
||||||
|
(:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`)
|
||||||
|
|
||||||
|
.. cache_url:
|
||||||
|
|
||||||
|
``cache_url`` : ``https://web.archive.org/web/``
|
||||||
|
URL prefix of the internet archive or cache, don't forget trailing slash (if
|
||||||
|
needed). The default is https://web.archive.org/web/ alternatives are:
|
||||||
|
|
||||||
|
- https://webcache.googleusercontent.com/search?q=cache:
|
||||||
|
- https://archive.today/
|
||||||
|
|
||||||
|
``default_theme`` :
|
||||||
|
Name of the theme you want to use by default on your SearXNG instance.
|
||||||
|
|
||||||
|
``theme_args.simple_style``:
|
||||||
|
Style of simple theme: ``auto``, ``light``, ``dark``
|
||||||
|
|
||||||
|
``results_on_new_tab``:
|
||||||
|
Open result links in a new tab by default.
|
||||||
|
|
||||||
|
``search_on_category_select``:
|
||||||
|
Perform search immediately if a category selected. Disable to select multiple categories.
|
||||||
|
|
||||||
|
``hotkeys``:
|
||||||
|
Hotkeys to use in the search interface: ``default``, ``vim`` (Vim-like).
|
138
docs/admin/update-searxng.rst
Normal file
138
docs/admin/update-searxng.rst
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
.. _searxng maintenance:
|
||||||
|
|
||||||
|
===================
|
||||||
|
SearXNG maintenance
|
||||||
|
===================
|
||||||
|
|
||||||
|
.. sidebar:: further read
|
||||||
|
|
||||||
|
- :ref:`toolboxing`
|
||||||
|
- :ref:`uWSGI maintenance`
|
||||||
|
|
||||||
|
.. 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
|
||||||
|
:ref:`installation scripts`, use the ``inspect`` command from the :ref:`searxng.sh`
|
||||||
|
script.
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
sudo -H ./utils/searxng.sh instance inspect
|
||||||
|
|
||||||
|
.. _migrate and stay tuned:
|
||||||
|
|
||||||
|
Migrate and stay tuned!
|
||||||
|
=======================
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :pull:`1332`
|
||||||
|
- :pull:`456`
|
||||||
|
- :pull:`A comment about rolling release <446#issuecomment-954730358>`
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
- 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 bandwidth :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.redisdb : connecting to Redis db=0 path='/usr/local/searxng-redis/run/redis.sock'
|
||||||
|
INFO searx.redisdb : connected to Redis
|
203
docs/build-templates/searxng.rst
Normal file
203
docs/build-templates/searxng.rst
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
.. template evaluated by: ./utils/searxng.sh searxng.doc.rst
|
||||||
|
.. hint: all dollar-names are variables, dollar sign itself is quoted by: \\$
|
||||||
|
|
||||||
|
.. START distro-packages
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H apt-get install -y \\
|
||||||
|
${debian}
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H pacman -S --noconfirm \\
|
||||||
|
${arch}
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H dnf install -y \\
|
||||||
|
${fedora}
|
||||||
|
|
||||||
|
.. END distro-packages
|
||||||
|
|
||||||
|
.. START build-packages
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H apt-get install -y \\
|
||||||
|
${debian_build}
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H pacman -S --noconfirm \\
|
||||||
|
${arch_build}
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H dnf install -y \\
|
||||||
|
${fedora_build}
|
||||||
|
|
||||||
|
.. END build-packages
|
||||||
|
|
||||||
|
.. START create user
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: bash
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H useradd --shell /bin/bash --system \\
|
||||||
|
--home-dir \"$SERVICE_HOME\" \\
|
||||||
|
--comment 'Privacy-respecting metasearch engine' \\
|
||||||
|
$SERVICE_USER
|
||||||
|
|
||||||
|
$ sudo -H mkdir \"$SERVICE_HOME\"
|
||||||
|
$ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\"
|
||||||
|
|
||||||
|
.. END create user
|
||||||
|
|
||||||
|
.. START clone searxng
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: bash
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H -u ${SERVICE_USER} -i
|
||||||
|
(${SERVICE_USER})$ git clone \"$GIT_URL\" \\
|
||||||
|
\"$SEARXNG_SRC\"
|
||||||
|
|
||||||
|
.. END clone searxng
|
||||||
|
|
||||||
|
.. START create virtualenv
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: bash
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
(${SERVICE_USER})$ python3 -m venv \"${SEARXNG_PYENV}\"
|
||||||
|
(${SERVICE_USER})$ echo \". ${SEARXNG_PYENV}/bin/activate\" \\
|
||||||
|
>> \"$SERVICE_HOME/.profile\"
|
||||||
|
|
||||||
|
.. END create virtualenv
|
||||||
|
|
||||||
|
.. START manage.sh update_packages
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: bash
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H -u ${SERVICE_USER} -i
|
||||||
|
|
||||||
|
(${SERVICE_USER})$ command -v python && python --version
|
||||||
|
$SEARXNG_PYENV/bin/python
|
||||||
|
Python 3.8.1
|
||||||
|
|
||||||
|
# update pip's boilerplate ..
|
||||||
|
pip install -U pip
|
||||||
|
pip install -U setuptools
|
||||||
|
pip install -U wheel
|
||||||
|
pip install -U pyyaml
|
||||||
|
|
||||||
|
# jump to SearXNG's working tree and install SearXNG into virtualenv
|
||||||
|
(${SERVICE_USER})$ cd \"$SEARXNG_SRC\"
|
||||||
|
(${SERVICE_USER})$ pip install -e .
|
||||||
|
|
||||||
|
|
||||||
|
.. END manage.sh update_packages
|
||||||
|
|
||||||
|
.. START searxng config
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Use default settings
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H mkdir -p \"$(dirname ${SEARXNG_SETTINGS_PATH})\"
|
||||||
|
$ sudo -H cp \"$SEARXNG_SRC/utils/templates/etc/searxng/settings.yml\" \\
|
||||||
|
\"${SEARXNG_SETTINGS_PATH}\"
|
||||||
|
|
||||||
|
.. group-tab:: minimal setup
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo -H sed -i -e \"s/ultrasecretkey/\$(openssl rand -hex 16)/g\" \\
|
||||||
|
\"$SEARXNG_SETTINGS_PATH\"
|
||||||
|
|
||||||
|
.. END searxng config
|
||||||
|
|
||||||
|
.. START check searxng installation
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: bash
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
# enable debug ..
|
||||||
|
$ sudo -H sed -i -e \"s/debug : False/debug : True/g\" \"$SEARXNG_SETTINGS_PATH\"
|
||||||
|
|
||||||
|
# start webapp
|
||||||
|
$ sudo -H -u ${SERVICE_USER} -i
|
||||||
|
(${SERVICE_USER})$ cd ${SEARXNG_SRC}
|
||||||
|
(${SERVICE_USER})$ export SEARXNG_SETTINGS_PATH=\"${SEARXNG_SETTINGS_PATH}\"
|
||||||
|
(${SERVICE_USER})$ python searx/webapp.py
|
||||||
|
|
||||||
|
# disable debug
|
||||||
|
$ sudo -H sed -i -e \"s/debug : True/debug : False/g\" \"$SEARXNG_SETTINGS_PATH\"
|
||||||
|
|
||||||
|
Open WEB browser and visit http://$SEARXNG_INTERNAL_HTTP . If you are inside a
|
||||||
|
container or in a script, test with curl:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: WEB browser
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ xdg-open http://$SEARXNG_INTERNAL_HTTP
|
||||||
|
|
||||||
|
.. group-tab:: curl
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ curl --location --verbose --head --insecure $SEARXNG_INTERNAL_HTTP
|
||||||
|
|
||||||
|
* Trying 127.0.0.1:8888...
|
||||||
|
* TCP_NODELAY set
|
||||||
|
* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#0)
|
||||||
|
> HEAD / HTTP/1.1
|
||||||
|
> Host: 127.0.0.1:8888
|
||||||
|
> User-Agent: curl/7.68.0
|
||||||
|
> Accept: */*
|
||||||
|
>
|
||||||
|
* Mark bundle as not supporting multiuse
|
||||||
|
* HTTP 1.0, assume close after body
|
||||||
|
< HTTP/1.0 200 OK
|
||||||
|
HTTP/1.0 200 OK
|
||||||
|
...
|
||||||
|
|
||||||
|
.. END check searxng installation
|
208
docs/conf.py
Normal file
208
docs/conf.py
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
from pathlib import Path
|
||||||
|
from pallets_sphinx_themes import ProjectLink
|
||||||
|
|
||||||
|
from searx import get_setting
|
||||||
|
from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH
|
||||||
|
|
||||||
|
# Project --------------------------------------------------------------
|
||||||
|
|
||||||
|
project = 'SearXNG'
|
||||||
|
copyright = 'SearXNG team'
|
||||||
|
author = 'SearXNG team'
|
||||||
|
release, version = VERSION_STRING, VERSION_STRING
|
||||||
|
SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng'
|
||||||
|
ISSUE_URL = get_setting('brand.issue_url')
|
||||||
|
DOCS_URL = get_setting('brand.docs_url')
|
||||||
|
PUBLIC_INSTANCES = get_setting('brand.public_instances')
|
||||||
|
PRIVACYPOLICY_URL = get_setting('general.privacypolicy_url')
|
||||||
|
CONTACT_URL = get_setting('general.contact_url')
|
||||||
|
WIKI_URL = get_setting('brand.wiki_url')
|
||||||
|
|
||||||
|
SOURCEDIR = Path(__file__).parent.parent / "searx"
|
||||||
|
os.environ['SOURCEDIR'] = str(SOURCEDIR)
|
||||||
|
|
||||||
|
# hint: sphinx.ext.viewcode won't highlight when 'highlight_language' [1] is set
|
||||||
|
# to string 'none' [2]
|
||||||
|
#
|
||||||
|
# [1] https://www.sphinx-doc.org/en/master/usage/extensions/viewcode.html
|
||||||
|
# [2] https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-highlight_language
|
||||||
|
|
||||||
|
highlight_language = 'default'
|
||||||
|
|
||||||
|
# General --------------------------------------------------------------
|
||||||
|
|
||||||
|
master_doc = "index"
|
||||||
|
source_suffix = '.rst'
|
||||||
|
numfig = True
|
||||||
|
|
||||||
|
exclude_patterns = ['build-templates/*.rst', 'user/*.md']
|
||||||
|
|
||||||
|
import searx.engines
|
||||||
|
import searx.plugins
|
||||||
|
import searx.webutils
|
||||||
|
|
||||||
|
# import searx.webapp is needed to init the engines & plugins, to init a
|
||||||
|
# (empty) secret_key is needed.
|
||||||
|
searx.settings['server']['secret_key'] = ''
|
||||||
|
import searx.webapp
|
||||||
|
|
||||||
|
searx.engines.load_engines(searx.settings['engines'])
|
||||||
|
|
||||||
|
jinja_contexts = {
|
||||||
|
'searx': {
|
||||||
|
'engines': searx.engines.engines,
|
||||||
|
'plugins': searx.plugins.plugins,
|
||||||
|
'version': {
|
||||||
|
'node': os.getenv('NODE_MINIMUM_VERSION')
|
||||||
|
},
|
||||||
|
'enabled_engine_count': sum(not x.disabled for x in searx.engines.engines.values()),
|
||||||
|
'categories': searx.engines.categories,
|
||||||
|
'categories_as_tabs': {c: searx.engines.categories[c] for c in searx.settings['categories_as_tabs']},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
jinja_filters = {
|
||||||
|
'group_engines_in_tab': searx.webutils.group_engines_in_tab,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Let the Jinja template in configured_engines.rst access documented_modules
|
||||||
|
# to automatically link documentation for modules if it exists.
|
||||||
|
def setup(app):
|
||||||
|
ENGINES_DOCNAME = 'user/configured_engines'
|
||||||
|
|
||||||
|
def before_read_docs(app, env, docnames):
|
||||||
|
assert ENGINES_DOCNAME in docnames
|
||||||
|
docnames.remove(ENGINES_DOCNAME)
|
||||||
|
docnames.append(ENGINES_DOCNAME)
|
||||||
|
# configured_engines must come last so that sphinx already has
|
||||||
|
# discovered the python module documentations
|
||||||
|
|
||||||
|
def source_read(app, docname, source):
|
||||||
|
if docname == ENGINES_DOCNAME:
|
||||||
|
jinja_contexts['searx']['documented_modules'] = app.env.domains['py'].modules
|
||||||
|
|
||||||
|
app.connect('env-before-read-docs', before_read_docs)
|
||||||
|
app.connect('source-read', source_read)
|
||||||
|
|
||||||
|
# usage:: lorem :patch:`f373169` ipsum
|
||||||
|
extlinks = {}
|
||||||
|
|
||||||
|
# upstream links
|
||||||
|
extlinks['wiki'] = ('https://github.com/searxng/searxng/wiki/%s', ' %s')
|
||||||
|
extlinks['pull'] = ('https://github.com/searxng/searxng/pull/%s', 'PR %s')
|
||||||
|
extlinks['pull-searx'] = ('https://github.com/searx/searx/pull/%s', 'PR %s')
|
||||||
|
|
||||||
|
# links to custom brand
|
||||||
|
extlinks['origin'] = (GIT_URL + '/blob/' + GIT_BRANCH + '/%s', 'git://%s')
|
||||||
|
extlinks['patch'] = (GIT_URL + '/commit/%s', '#%s')
|
||||||
|
extlinks['docs'] = (DOCS_URL + '/%s', 'docs: %s')
|
||||||
|
extlinks['pypi'] = ('https://pypi.org/project/%s', 'PyPi: %s')
|
||||||
|
extlinks['man'] = ('https://manpages.debian.org/jump?q=%s', '%s')
|
||||||
|
#extlinks['role'] = (
|
||||||
|
# 'https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-%s', '')
|
||||||
|
extlinks['duref'] = (
|
||||||
|
'https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#%s', '%s')
|
||||||
|
extlinks['durole'] = (
|
||||||
|
'https://docutils.sourceforge.io/docs/ref/rst/roles.html#%s', '%s')
|
||||||
|
extlinks['dudir'] = (
|
||||||
|
'https://docutils.sourceforge.io/docs/ref/rst/directives.html#%s', '%s')
|
||||||
|
extlinks['ctan'] = (
|
||||||
|
'https://ctan.org/pkg/%s', 'CTAN: %s')
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
'sphinx.ext.imgmath',
|
||||||
|
'sphinx.ext.extlinks',
|
||||||
|
'sphinx.ext.viewcode',
|
||||||
|
"sphinx.ext.autodoc",
|
||||||
|
"sphinx.ext.intersphinx",
|
||||||
|
"pallets_sphinx_themes",
|
||||||
|
"sphinx_issues", # https://github.com/sloria/sphinx-issues/blob/master/README.rst
|
||||||
|
"sphinx_jinja", # https://github.com/tardyp/sphinx-jinja
|
||||||
|
"sphinxcontrib.programoutput", # https://github.com/NextThought/sphinxcontrib-programoutput
|
||||||
|
'linuxdoc.kernel_include', # Implementation of the 'kernel-include' reST-directive.
|
||||||
|
'linuxdoc.rstFlatTable', # Implementation of the 'flat-table' reST-directive.
|
||||||
|
'linuxdoc.kfigure', # Sphinx extension which implements scalable image handling.
|
||||||
|
"sphinx_tabs.tabs", # https://github.com/djungelorm/sphinx-tabs
|
||||||
|
'myst_parser', # https://www.sphinx-doc.org/en/master/usage/markdown.html
|
||||||
|
'notfound.extension', # https://github.com/readthedocs/sphinx-notfound-page
|
||||||
|
]
|
||||||
|
|
||||||
|
autodoc_default_options = {
|
||||||
|
'member-order': 'groupwise',
|
||||||
|
}
|
||||||
|
|
||||||
|
myst_enable_extensions = [
|
||||||
|
"replacements", "smartquotes"
|
||||||
|
]
|
||||||
|
|
||||||
|
suppress_warnings = ['myst.domains']
|
||||||
|
|
||||||
|
intersphinx_mapping = {
|
||||||
|
"python": ("https://docs.python.org/3/", None),
|
||||||
|
"babel" : ("https://babel.readthedocs.io/en/latest/", None),
|
||||||
|
"flask": ("https://flask.palletsprojects.com/", None),
|
||||||
|
"flask_babel": ("https://python-babel.github.io/flask-babel/", None),
|
||||||
|
# "werkzeug": ("https://werkzeug.palletsprojects.com/", None),
|
||||||
|
"jinja": ("https://jinja.palletsprojects.com/", None),
|
||||||
|
"linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
|
||||||
|
"sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
|
||||||
|
"redis": ('https://redis.readthedocs.io/en/stable/', None),
|
||||||
|
}
|
||||||
|
|
||||||
|
issues_github_path = "searxng/searxng"
|
||||||
|
|
||||||
|
# HTML -----------------------------------------------------------------
|
||||||
|
|
||||||
|
# https://searxng.github.io/searxng --> '/searxng/'
|
||||||
|
# https://docs.searxng.org --> '/'
|
||||||
|
notfound_urls_prefix = '/'
|
||||||
|
|
||||||
|
sys.path.append(os.path.abspath('_themes'))
|
||||||
|
sys.path.insert(0, os.path.abspath("../utils/"))
|
||||||
|
html_theme_path = ['_themes']
|
||||||
|
html_theme = "searxng"
|
||||||
|
|
||||||
|
# sphinx.ext.imgmath setup
|
||||||
|
html_math_renderer = 'imgmath'
|
||||||
|
imgmath_image_format = 'svg'
|
||||||
|
imgmath_font_size = 14
|
||||||
|
# sphinx.ext.imgmath setup END
|
||||||
|
|
||||||
|
html_show_sphinx = False
|
||||||
|
html_theme_options = {"index_sidebar_logo": True}
|
||||||
|
html_context = {"project_links": [] }
|
||||||
|
html_context["project_links"].append(ProjectLink("Source", GIT_URL + '/tree/' + GIT_BRANCH))
|
||||||
|
|
||||||
|
if WIKI_URL:
|
||||||
|
html_context["project_links"].append(ProjectLink("Wiki", WIKI_URL))
|
||||||
|
if PUBLIC_INSTANCES:
|
||||||
|
html_context["project_links"].append(ProjectLink("Public instances", PUBLIC_INSTANCES))
|
||||||
|
if ISSUE_URL:
|
||||||
|
html_context["project_links"].append(ProjectLink("Issue Tracker", ISSUE_URL))
|
||||||
|
if PRIVACYPOLICY_URL:
|
||||||
|
html_context["project_links"].append(ProjectLink("Privacy Policy", PRIVACYPOLICY_URL))
|
||||||
|
if CONTACT_URL:
|
||||||
|
html_context["project_links"].append(ProjectLink("Contact", CONTACT_URL))
|
||||||
|
|
||||||
|
html_sidebars = {
|
||||||
|
"**": [
|
||||||
|
"globaltoc.html",
|
||||||
|
"project.html",
|
||||||
|
"relations.html",
|
||||||
|
"searchbox.html",
|
||||||
|
"sourcelink.html"
|
||||||
|
],
|
||||||
|
}
|
||||||
|
singlehtml_sidebars = {"index": ["project.html", "localtoc.html"]}
|
||||||
|
html_logo = "../src/brand/searxng-wordmark.svg"
|
||||||
|
html_title = "SearXNG Documentation ({})".format(VERSION_STRING)
|
||||||
|
html_show_sourcelink = True
|
||||||
|
|
||||||
|
# LaTeX ----------------------------------------------------------------
|
||||||
|
|
||||||
|
latex_documents = [
|
||||||
|
(master_doc, "searxng-{}.tex".format(VERSION_STRING), html_title, author, "manual")
|
||||||
|
]
|
190
docs/dev/contribution_guide.rst
Normal file
190
docs/dev/contribution_guide.rst
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
.. _how to contribute:
|
||||||
|
|
||||||
|
=================
|
||||||
|
How to contribute
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
Prime directives: Privacy, Hackability
|
||||||
|
======================================
|
||||||
|
|
||||||
|
SearXNG has two prime directives, **privacy-by-design and hackability** . The
|
||||||
|
hackability comes in three levels:
|
||||||
|
|
||||||
|
- support of search engines
|
||||||
|
- plugins to alter search behaviour
|
||||||
|
- hacking SearXNG itself
|
||||||
|
|
||||||
|
Note the lack of "world domination" among the directives. SearXNG has no
|
||||||
|
intention of wide mass-adoption, rounded corners, etc. The prime directive
|
||||||
|
"privacy" deserves a separate chapter, as it's quite uncommon unfortunately.
|
||||||
|
|
||||||
|
Privacy-by-design
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
SearXNG was born out of the need for a **privacy-respecting** search tool which
|
||||||
|
can be extended easily to maximize both, its search and its privacy protecting
|
||||||
|
capabilities.
|
||||||
|
|
||||||
|
A few widely used features work differently or turned off by default or not
|
||||||
|
implemented at all **as a consequence of privacy-by-design**.
|
||||||
|
|
||||||
|
If a feature reduces the privacy preserving aspects of searx, it should be
|
||||||
|
switched off by default or should not implemented at all. There are plenty of
|
||||||
|
search engines already providing such features. If a feature reduces the
|
||||||
|
protection of searx, users must be informed about the effect of choosing to
|
||||||
|
enable it. Features that protect privacy but differ from the expectations of
|
||||||
|
the user should also be explained.
|
||||||
|
|
||||||
|
Also, if you think that something works weird with searx, it's might be because
|
||||||
|
of the tool you use is designed in a way to interfere with the privacy respect.
|
||||||
|
Submitting a bugreport to the vendor of the tool that misbehaves might be a good
|
||||||
|
feedback to reconsider the disrespect to its customers (e.g. ``GET`` vs ``POST``
|
||||||
|
requests in various browsers).
|
||||||
|
|
||||||
|
Remember the other prime directive of SearXNG is to be hackable, so if the above
|
||||||
|
privacy concerns do not fancy you, simply fork it.
|
||||||
|
|
||||||
|
*Happy hacking.*
|
||||||
|
|
||||||
|
Code
|
||||||
|
====
|
||||||
|
|
||||||
|
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
|
||||||
|
.. _Conventional Commits: https://www.conventionalcommits.org/
|
||||||
|
.. _Git Commit Good Practice: https://wiki.openstack.org/wiki/GitCommitMessages
|
||||||
|
.. _Structural split of changes:
|
||||||
|
https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes
|
||||||
|
.. _gitmoji: https://gitmoji.carloscuesta.me/
|
||||||
|
.. _Semantic PR: https://github.com/zeke/semantic-pull-requests
|
||||||
|
|
||||||
|
.. sidebar:: Create good commits!
|
||||||
|
|
||||||
|
- `Structural split of changes`_
|
||||||
|
- `Conventional Commits`_
|
||||||
|
- `Git Commit Good Practice`_
|
||||||
|
- some like to use: gitmoji_
|
||||||
|
- not yet active: `Semantic PR`_
|
||||||
|
|
||||||
|
In order to submit a patch, please follow the steps below:
|
||||||
|
|
||||||
|
- Follow coding conventions.
|
||||||
|
|
||||||
|
- PEP8_ standards apply, except the convention of line length
|
||||||
|
- Maximum line length is 120 characters
|
||||||
|
|
||||||
|
- The cardinal rule for creating good commits is to ensure there is only one
|
||||||
|
*logical change* per commit / read `Structural split of changes`_
|
||||||
|
|
||||||
|
- Check if your code breaks existing tests. If so, update the tests or fix your
|
||||||
|
code.
|
||||||
|
|
||||||
|
- If your code can be unit-tested, add unit tests.
|
||||||
|
|
||||||
|
- Add yourself to the :origin:`AUTHORS.rst` file.
|
||||||
|
|
||||||
|
- Choose meaningful commit messages, read `Conventional Commits`_
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
<type>[optional scope]: <description>
|
||||||
|
|
||||||
|
[optional body]
|
||||||
|
|
||||||
|
[optional footer(s)]
|
||||||
|
|
||||||
|
- Create a pull request.
|
||||||
|
|
||||||
|
For more help on getting started with SearXNG development, see :ref:`devquickstart`.
|
||||||
|
|
||||||
|
|
||||||
|
Translation
|
||||||
|
===========
|
||||||
|
|
||||||
|
Translation currently takes place on :ref:`weblate <translation>`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _contrib docs:
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. _Sphinx: https://www.sphinx-doc.org
|
||||||
|
.. _reST: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
|
||||||
|
|
||||||
|
.. sidebar:: The reST sources
|
||||||
|
|
||||||
|
has been moved from ``gh-branch`` into ``master`` (:origin:`docs`).
|
||||||
|
|
||||||
|
The documentation is built using Sphinx_. So in order to be able to generate
|
||||||
|
the required files, you have to install it on your system. Much easier, use
|
||||||
|
our :ref:`makefile`.
|
||||||
|
|
||||||
|
Here is an example which makes a complete rebuild:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make docs.clean docs.html
|
||||||
|
...
|
||||||
|
The HTML pages are in dist/docs.
|
||||||
|
|
||||||
|
.. _make docs.live:
|
||||||
|
|
||||||
|
live build
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _sphinx-autobuild:
|
||||||
|
https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
|
||||||
|
|
||||||
|
.. sidebar:: docs.clean
|
||||||
|
|
||||||
|
It is recommended to assert a complete rebuild before deploying (use
|
||||||
|
``docs.clean``).
|
||||||
|
|
||||||
|
Live build is like WYSIWYG. If you want to edit the documentation, its
|
||||||
|
recommended to use. The Makefile target ``docs.live`` builds the docs, opens
|
||||||
|
URL in your favorite browser and rebuilds every time a reST file has been
|
||||||
|
changed (:ref:`make docs.clean`).
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make docs.live
|
||||||
|
...
|
||||||
|
The HTML pages are in dist/docs.
|
||||||
|
... Serving on http://0.0.0.0:8000
|
||||||
|
... Start watching changes
|
||||||
|
|
||||||
|
Live builds are implemented by sphinx-autobuild_. Use environment
|
||||||
|
``$(SPHINXOPTS)`` to pass arguments to the sphinx-autobuild_ command. Except
|
||||||
|
option ``--host`` (which is always set to ``0.0.0.0``) you can pass any
|
||||||
|
argument. E.g to find and use a free port, use:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ SPHINXOPTS="--port 0" make docs.live
|
||||||
|
...
|
||||||
|
... Serving on http://0.0.0.0:50593
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
.. _deploy on github.io:
|
||||||
|
|
||||||
|
deploy on github.io
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
|
||||||
|
docs.gh-pages`, which builds the documentation and runs all the needed git add,
|
||||||
|
commit and push:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make docs.clean docs.gh-pages
|
||||||
|
|
||||||
|
.. attention::
|
||||||
|
|
||||||
|
If you are working in your own brand, don't forget to adjust your
|
||||||
|
:ref:`settings brand`.
|
6
docs/dev/csv_table.txt
Normal file
6
docs/dev/csv_table.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
stub col row 1, column, "loremLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
|
||||||
|
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
|
||||||
|
voluptua."
|
||||||
|
stub col row 1, "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
|
||||||
|
kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", column
|
||||||
|
stub col row 1, column, column
|
14
docs/dev/engines/demo/demo_offline.rst
Normal file
14
docs/dev/engines/demo/demo_offline.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. _demo offline engine:
|
||||||
|
|
||||||
|
===================
|
||||||
|
Demo Offline Engine
|
||||||
|
===================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.demo_offline
|
||||||
|
:members:
|
||||||
|
|
14
docs/dev/engines/demo/demo_online.rst
Normal file
14
docs/dev/engines/demo/demo_online.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. _demo online engine:
|
||||||
|
|
||||||
|
==================
|
||||||
|
Demo Online Engine
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.demo_online
|
||||||
|
:members:
|
||||||
|
|
468
docs/dev/engines/engine_overview.rst
Normal file
468
docs/dev/engines/engine_overview.rst
Normal file
@ -0,0 +1,468 @@
|
|||||||
|
.. _engines-dev:
|
||||||
|
|
||||||
|
===============
|
||||||
|
Engine Overview
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 3
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. _metasearch-engine: https://en.wikipedia.org/wiki/Metasearch_engine
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`configured engines`
|
||||||
|
- :ref:`settings engine`
|
||||||
|
|
||||||
|
SearXNG is a metasearch-engine_, so it uses different search engines to provide
|
||||||
|
better results.
|
||||||
|
|
||||||
|
Because there is no general search API which could be used for every search
|
||||||
|
engine, an adapter has to be built between SearXNG and the external search
|
||||||
|
engines. Adapters are stored under the folder :origin:`searx/engines`.
|
||||||
|
|
||||||
|
.. _general engine configuration:
|
||||||
|
|
||||||
|
General Engine Configuration
|
||||||
|
============================
|
||||||
|
|
||||||
|
It is required to tell SearXNG the type of results the engine provides. The
|
||||||
|
arguments can be set in the engine file or in the settings file (normally
|
||||||
|
``settings.yml``). The arguments in the settings file override the ones in the
|
||||||
|
engine file.
|
||||||
|
|
||||||
|
It does not matter if an option is stored in the engine file or in the settings.
|
||||||
|
However, the standard way is the following:
|
||||||
|
|
||||||
|
.. _engine file:
|
||||||
|
|
||||||
|
Engine File
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. table:: Common options in the engine module
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
======================= =========== ========================================================
|
||||||
|
argument type information
|
||||||
|
======================= =========== ========================================================
|
||||||
|
categories list categories, in which the engine is working
|
||||||
|
paging boolean support multiple pages
|
||||||
|
time_range_support boolean support search time range
|
||||||
|
engine_type str - ``online`` :ref:`[ref] <online engines>` by
|
||||||
|
default, other possibles values are:
|
||||||
|
- ``offline`` :ref:`[ref] <offline engines>`
|
||||||
|
- ``online_dictionary`` :ref:`[ref] <online dictionary>`
|
||||||
|
- ``online_currency`` :ref:`[ref] <online currency>`
|
||||||
|
- ``online_url_search`` :ref:`[ref] <online url search>`
|
||||||
|
======================= =========== ========================================================
|
||||||
|
|
||||||
|
.. _engine settings:
|
||||||
|
|
||||||
|
Engine ``settings.yml``
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
For a more detailed description, see :ref:`settings engine` in the :ref:`settings.yml`.
|
||||||
|
|
||||||
|
.. table:: Common options in the engine setup (``settings.yml``)
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
======================= =========== ==================================================
|
||||||
|
argument type information
|
||||||
|
======================= =========== ==================================================
|
||||||
|
name string name of search-engine
|
||||||
|
engine string name of searxng-engine (file name without ``.py``)
|
||||||
|
enable_http bool enable HTTP (by default only HTTPS is enabled).
|
||||||
|
shortcut string shortcut of search-engine
|
||||||
|
timeout string specific timeout for search-engine
|
||||||
|
display_error_messages boolean display error messages on the web UI
|
||||||
|
proxies dict set proxies for a specific engine
|
||||||
|
(e.g. ``proxies : {http: socks5://proxy:port,
|
||||||
|
https: socks5://proxy:port}``)
|
||||||
|
======================= =========== ==================================================
|
||||||
|
|
||||||
|
.. _engine overrides:
|
||||||
|
|
||||||
|
Overrides
|
||||||
|
---------
|
||||||
|
|
||||||
|
A few of the options have default values in the namespace of the engine's python
|
||||||
|
module, but are often overwritten by the settings. If ``None`` is assigned to an
|
||||||
|
option in the engine file, it has to be redefined in the settings, otherwise
|
||||||
|
SearXNG will not start with that engine (global names with a leading underline can
|
||||||
|
be ``None``).
|
||||||
|
|
||||||
|
Here is an very simple example of the global names in the namespace of engine's
|
||||||
|
module:
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
# engine dependent config
|
||||||
|
categories = ['general']
|
||||||
|
paging = True
|
||||||
|
_non_overwritten_global = 'foo'
|
||||||
|
|
||||||
|
|
||||||
|
.. table:: The naming of overrides is arbitrary / recommended overrides are:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
======================= =========== ===========================================
|
||||||
|
argument type information
|
||||||
|
======================= =========== ===========================================
|
||||||
|
base_url string base-url, can be overwritten to use same
|
||||||
|
engine on other URL
|
||||||
|
number_of_results int maximum number of results per request
|
||||||
|
language string ISO code of language and country like en_US
|
||||||
|
api_key string api-key if required by engine
|
||||||
|
======================= =========== ===========================================
|
||||||
|
|
||||||
|
.. _engine request:
|
||||||
|
|
||||||
|
Making a Request
|
||||||
|
================
|
||||||
|
|
||||||
|
To perform a search an URL have to be specified. In addition to specifying an
|
||||||
|
URL, arguments can be passed to the query.
|
||||||
|
|
||||||
|
.. _engine request arguments:
|
||||||
|
|
||||||
|
Passed Arguments (request)
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
These arguments can be used to construct the search query. Furthermore,
|
||||||
|
parameters with default value can be redefined for special purposes.
|
||||||
|
|
||||||
|
.. _engine request online:
|
||||||
|
|
||||||
|
.. table:: If the ``engine_type`` is :py:obj:`online
|
||||||
|
<searx.search.processors.online.OnlineProcessor.get_params>`
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
argument type default-value, information
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
url str ``''``
|
||||||
|
method str ``'GET'``
|
||||||
|
headers set ``{}``
|
||||||
|
data set ``{}``
|
||||||
|
cookies set ``{}``
|
||||||
|
verify bool ``True``
|
||||||
|
headers.User-Agent str a random User-Agent
|
||||||
|
category str current category, like ``'general'``
|
||||||
|
safesearch int ``0``, between ``0`` and ``2`` (normal, moderate, strict)
|
||||||
|
time_range Optional[str] ``None``, can be ``day``, ``week``, ``month``, ``year``
|
||||||
|
pageno int current pagenumber
|
||||||
|
searxng_locale str SearXNG's locale selected by user. Specific language code like
|
||||||
|
``'en'``, ``'en-US'``, or ``'all'`` if unspecified.
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine request online_dictionary:
|
||||||
|
|
||||||
|
.. table:: If the ``engine_type`` is :py:obj:`online_dictionary
|
||||||
|
<searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params>`,
|
||||||
|
in addition to the :ref:`online <engine request online>` arguments:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
argument type default-value, information
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
from_lang str specific language code like ``'en_US'``
|
||||||
|
to_lang str specific language code like ``'en_US'``
|
||||||
|
query str the text query without the languages
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
|
||||||
|
.. _engine request online_currency:
|
||||||
|
|
||||||
|
.. table:: If the ``engine_type`` is :py:obj:`online_currency
|
||||||
|
<searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params>`,
|
||||||
|
in addition to the :ref:`online <engine request online>` arguments:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
argument type default-value, information
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
amount float the amount to convert
|
||||||
|
from str ISO 4217 code
|
||||||
|
to str ISO 4217 code
|
||||||
|
from_name str currency name
|
||||||
|
to_name str currency name
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
|
||||||
|
.. _engine request online_url_search:
|
||||||
|
|
||||||
|
.. table:: If the ``engine_type`` is :py:obj:`online_url_search
|
||||||
|
<searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params>`,
|
||||||
|
in addition to the :ref:`online <engine request online>` arguments:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
argument type default-value, information
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
search_url dict URLs from the search query:
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
{
|
||||||
|
'http': str,
|
||||||
|
'ftp': str,
|
||||||
|
'data:image': str
|
||||||
|
}
|
||||||
|
====================== ============== ========================================================================
|
||||||
|
|
||||||
|
Specify Request
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The function :py:func:`def request(query, params):
|
||||||
|
<searx.engines.demo_online.request>` always returns the ``params`` variable, the
|
||||||
|
following parameters can be used to specify a search request:
|
||||||
|
|
||||||
|
.. table::
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
=================== =========== ==========================================================================
|
||||||
|
argument type information
|
||||||
|
=================== =========== ==========================================================================
|
||||||
|
url str requested url
|
||||||
|
method str HTTP request method
|
||||||
|
headers set HTTP header information
|
||||||
|
data set HTTP data information
|
||||||
|
cookies set HTTP cookies
|
||||||
|
verify bool Performing SSL-Validity check
|
||||||
|
allow_redirects bool Follow redirects
|
||||||
|
max_redirects int maximum redirects, hard limit
|
||||||
|
soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
|
||||||
|
raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
|
||||||
|
=================== =========== ==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine results:
|
||||||
|
.. _engine media types:
|
||||||
|
|
||||||
|
Result Types (``template``)
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Each result item of an engine can be of different media-types. Currently the
|
||||||
|
following media-types are supported. To set another media-type as
|
||||||
|
:ref:`template default`, the parameter ``template`` must be set to the desired
|
||||||
|
type.
|
||||||
|
|
||||||
|
.. _template default:
|
||||||
|
|
||||||
|
``default``
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **default** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template images:
|
||||||
|
|
||||||
|
``images``
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **images** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``images.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url to the result site
|
||||||
|
title string, title of the result *(partly implemented)*
|
||||||
|
content *(partly implemented)*
|
||||||
|
publishedDate :py:class:`datetime.datetime`,
|
||||||
|
time of publish *(partly implemented)*
|
||||||
|
img\_src string, url to the result image
|
||||||
|
thumbnail\_src string, url to a small-preview image
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template videos:
|
||||||
|
|
||||||
|
``videos``
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **videos** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``videos.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content *(not implemented yet)*
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
thumbnail string, url to a small-preview image
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template torrent:
|
||||||
|
|
||||||
|
``torrent``
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. _magnetlink: https://en.wikipedia.org/wiki/Magnet_URI_scheme
|
||||||
|
|
||||||
|
.. table:: Parameter of the **torrent** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``torrent.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`,
|
||||||
|
time of publish *(not implemented yet)*
|
||||||
|
seed int, number of seeder
|
||||||
|
leech int, number of leecher
|
||||||
|
filesize int, size of file in bytes
|
||||||
|
files int, number of files
|
||||||
|
magnetlink string, magnetlink_ of the result
|
||||||
|
torrentfile string, torrentfile of the result
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template map:
|
||||||
|
|
||||||
|
``map``
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **map** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``map.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
latitude latitude of result (in decimal format)
|
||||||
|
longitude longitude of result (in decimal format)
|
||||||
|
boundingbox boundingbox of result (array of 4. values
|
||||||
|
``[lat-min, lat-max, lon-min, lon-max]``)
|
||||||
|
geojson geojson of result (https://geojson.org/)
|
||||||
|
osm.type type of osm-object (if OSM-Result)
|
||||||
|
osm.id id of osm-object (if OSM-Result)
|
||||||
|
address.name name of object
|
||||||
|
address.road street name of object
|
||||||
|
address.house_number house number of object
|
||||||
|
address.locality city, place of object
|
||||||
|
address.postcode postcode of object
|
||||||
|
address.country country of object
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template paper:
|
||||||
|
|
||||||
|
``paper``
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. _BibTeX format: https://www.bibtex.com/g/bibtex-format/
|
||||||
|
.. _BibTeX field types: https://en.wikipedia.org/wiki/BibTeX#Field_types
|
||||||
|
|
||||||
|
.. list-table:: Parameter of the **paper** media type /
|
||||||
|
see `BibTeX field types`_ and `BibTeX format`_
|
||||||
|
:header-rows: 2
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
* - result-parameter
|
||||||
|
- Python type
|
||||||
|
- information
|
||||||
|
|
||||||
|
* - template
|
||||||
|
- :py:class:`str`
|
||||||
|
- is set to ``paper.html``
|
||||||
|
|
||||||
|
* - title
|
||||||
|
- :py:class:`str`
|
||||||
|
- title of the result
|
||||||
|
|
||||||
|
* - content
|
||||||
|
- :py:class:`str`
|
||||||
|
- abstract
|
||||||
|
|
||||||
|
* - comments
|
||||||
|
- :py:class:`str`
|
||||||
|
- free text display in italic below the content
|
||||||
|
|
||||||
|
* - tags
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- free tag list
|
||||||
|
|
||||||
|
* - publishedDate
|
||||||
|
- :py:class:`datetime <datetime.datetime>`
|
||||||
|
- last publication date
|
||||||
|
|
||||||
|
* - type
|
||||||
|
- :py:class:`str`
|
||||||
|
- short description of medium type, e.g. *book*, *pdf* or *html* ...
|
||||||
|
|
||||||
|
* - authors
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- list of authors of the work (authors with a "s")
|
||||||
|
|
||||||
|
* - editor
|
||||||
|
- :py:class:`str`
|
||||||
|
- list of editors of a book
|
||||||
|
|
||||||
|
* - publisher
|
||||||
|
- :py:class:`str`
|
||||||
|
- name of the publisher
|
||||||
|
|
||||||
|
* - journal
|
||||||
|
- :py:class:`str`
|
||||||
|
- name of the journal or magazine the article was
|
||||||
|
published in
|
||||||
|
|
||||||
|
* - volume
|
||||||
|
- :py:class:`str`
|
||||||
|
- volume number
|
||||||
|
|
||||||
|
* - pages
|
||||||
|
- :py:class:`str`
|
||||||
|
- page range where the article is
|
||||||
|
|
||||||
|
* - number
|
||||||
|
- :py:class:`str`
|
||||||
|
- number of the report or the issue number for a journal article
|
||||||
|
|
||||||
|
* - doi
|
||||||
|
- :py:class:`str`
|
||||||
|
- DOI number (like ``10.1038/d41586-018-07848-2``)
|
||||||
|
|
||||||
|
* - issn
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- ISSN number like ``1476-4687``
|
||||||
|
|
||||||
|
* - isbn
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- ISBN number like ``9780201896831``
|
||||||
|
|
||||||
|
* - pdf_url
|
||||||
|
- :py:class:`str`
|
||||||
|
- URL to the full article, the PDF version
|
||||||
|
|
||||||
|
* - html_url
|
||||||
|
- :py:class:`str`
|
||||||
|
- URL to full article, HTML version
|
||||||
|
|
22
docs/dev/engines/enginelib.rst
Normal file
22
docs/dev/engines/enginelib.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. _searx.enginelib:
|
||||||
|
|
||||||
|
==============
|
||||||
|
Engine Library
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.enginelib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _searx.enginelib.traits:
|
||||||
|
|
||||||
|
|
||||||
|
Engine traits
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: searx.enginelib.traits
|
||||||
|
:members:
|
9
docs/dev/engines/engines.rst
Normal file
9
docs/dev/engines/engines.rst
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
.. _searx.engines loader:
|
||||||
|
|
||||||
|
========================
|
||||||
|
SearXNG's engines loader
|
||||||
|
========================
|
||||||
|
|
||||||
|
.. automodule:: searx.engines
|
||||||
|
:members:
|
||||||
|
|
107
docs/dev/engines/index.rst
Normal file
107
docs/dev/engines/index.rst
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
.. _engine implementations:
|
||||||
|
|
||||||
|
======================
|
||||||
|
Engine Implementations
|
||||||
|
======================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:caption: Framework Components
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
enginelib
|
||||||
|
engines
|
||||||
|
engine_overview
|
||||||
|
|
||||||
|
|
||||||
|
Engine Types
|
||||||
|
============
|
||||||
|
|
||||||
|
The :py:obj:`engine_type <searx.enginelib.Engine.engine_type>` of an engine
|
||||||
|
determines which :ref:`search processor <searx.search.processors>` is used by
|
||||||
|
the engine.
|
||||||
|
|
||||||
|
In this section a list of the engines that are documented is given, a complete
|
||||||
|
list of the engines can be found in the source under: :origin:`searx/engines`.
|
||||||
|
|
||||||
|
.. _online engines:
|
||||||
|
|
||||||
|
Online Engines
|
||||||
|
--------------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :py:obj:`processors.online <searx.search.processors.online>`
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
demo/demo_online
|
||||||
|
xpath
|
||||||
|
mediawiki
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
online/*
|
||||||
|
|
||||||
|
.. _offline engines:
|
||||||
|
|
||||||
|
Offline Engines
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :py:obj:`processors.offline <searx.search.processors.offline>`
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
offline_concept
|
||||||
|
demo/demo_offline
|
||||||
|
offline/*
|
||||||
|
|
||||||
|
.. _online url search:
|
||||||
|
|
||||||
|
Online URL Search
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :py:obj:`processors.online_url_search <searx.search.processors.online_url_search>`
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
online_url_search/*
|
||||||
|
|
||||||
|
.. _online currency:
|
||||||
|
|
||||||
|
Online Currency
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :py:obj:`processors.online_currency <searx.search.processors.online_currency>`
|
||||||
|
|
||||||
|
*no engine of this type is documented yet / comming soon*
|
||||||
|
|
||||||
|
.. _online dictionary:
|
||||||
|
|
||||||
|
Online Dictionary
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :py:obj:`processors.online_dictionary <searx.search.processors.online_dictionary>`
|
||||||
|
|
||||||
|
*no engine of this type is documented yet / comming soon*
|
13
docs/dev/engines/mediawiki.rst
Normal file
13
docs/dev/engines/mediawiki.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _mediawiki engine:
|
||||||
|
|
||||||
|
================
|
||||||
|
MediaWiki Engine
|
||||||
|
================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mediawiki
|
||||||
|
:members:
|
23
docs/dev/engines/offline/command-line-engines.rst
Normal file
23
docs/dev/engines/offline/command-line-engines.rst
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
.. _engine command:
|
||||||
|
|
||||||
|
====================
|
||||||
|
Command Line Engines
|
||||||
|
====================
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :origin:`command.py <searx/engines/command.py>`
|
||||||
|
- :ref:`offline engines`
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
Initial sponsored by `Search and Discovery Fund
|
||||||
|
<https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.command
|
||||||
|
:members:
|
97
docs/dev/engines/offline/nosql-engines.rst
Normal file
97
docs/dev/engines/offline/nosql-engines.rst
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
.. _nosql engines:
|
||||||
|
|
||||||
|
===============
|
||||||
|
NoSQL databases
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. sidebar:: further read
|
||||||
|
|
||||||
|
- `NoSQL databases <https://en.wikipedia.org/wiki/NoSQL>`_
|
||||||
|
- `redis.io <https://redis.io/>`_
|
||||||
|
- `MongoDB <https://www.mongodb.com>`_
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
Initial sponsored by `Search and Discovery Fund
|
||||||
|
<https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
|
||||||
|
|
||||||
|
The following `NoSQL databases`_ are supported:
|
||||||
|
|
||||||
|
- :ref:`engine redis_server`
|
||||||
|
- :ref:`engine mongodb`
|
||||||
|
|
||||||
|
All of the engines above are just commented out in the :origin:`settings.yml
|
||||||
|
<searx/settings.yml>`, as you have to set various options and install
|
||||||
|
dependencies before using them.
|
||||||
|
|
||||||
|
By default, the engines use the ``key-value`` template for displaying results /
|
||||||
|
see :origin:`simple <searx/templates/simple/result_templates/key-value.html>`
|
||||||
|
theme. If you are not satisfied with the original result layout, you can use
|
||||||
|
your own template, set ``result_template`` attribute to ``{template_name}`` and
|
||||||
|
place the templates at::
|
||||||
|
|
||||||
|
searx/templates/{theme_name}/result_templates/{template_name}
|
||||||
|
|
||||||
|
Furthermore, if you do not wish to expose these engines on a public instance, you
|
||||||
|
can still add them and limit the access by setting ``tokens`` as described in
|
||||||
|
section :ref:`private engines`.
|
||||||
|
|
||||||
|
|
||||||
|
Extra Dependencies
|
||||||
|
==================
|
||||||
|
|
||||||
|
For using :ref:`engine redis_server` or :ref:`engine mongodb` you need to
|
||||||
|
install additional packages in Python's Virtual Environment of your SearXNG
|
||||||
|
instance. To switch into the environment (:ref:`searxng-src`) you can use
|
||||||
|
:ref:`searxng.sh`::
|
||||||
|
|
||||||
|
$ sudo utils/searxng.sh instance cmd bash
|
||||||
|
(searxng-pyenv)$ pip install ...
|
||||||
|
|
||||||
|
|
||||||
|
Configure the engines
|
||||||
|
=====================
|
||||||
|
|
||||||
|
`NoSQL databases`_ are used for storing arbitrary data without first defining
|
||||||
|
their structure.
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine redis_server:
|
||||||
|
|
||||||
|
Redis Server
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. _redis: https://github.com/andymccurdy/redis-py#installation
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- ``pip install`` redis_
|
||||||
|
- redis.io_
|
||||||
|
- :origin:`redis_server.py <searx/engines/redis_server.py>`
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.redis_server
|
||||||
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine mongodb:
|
||||||
|
|
||||||
|
MongoDB
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. _pymongo: https://github.com/mongodb/mongo-python-driver#installation
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- ``pip install`` pymongo_
|
||||||
|
- MongoDB_
|
||||||
|
- :origin:`mongodb.py <searx/engines/mongodb.py>`
|
||||||
|
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mongodb
|
||||||
|
:members:
|
||||||
|
|
62
docs/dev/engines/offline/search-indexer-engines.rst
Normal file
62
docs/dev/engines/offline/search-indexer-engines.rst
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
=================
|
||||||
|
Local Search APIs
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. sidebar:: further read
|
||||||
|
|
||||||
|
- `Comparison to alternatives
|
||||||
|
<https://docs.meilisearch.com/learn/what_is_meilisearch/comparison_to_alternatives.html>`_
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 1
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
Initial sponsored by `Search and Discovery Fund
|
||||||
|
<https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
|
||||||
|
|
||||||
|
Administrators might find themselves wanting to integrate locally running search
|
||||||
|
engines. The following ones are supported for now:
|
||||||
|
|
||||||
|
* `Elasticsearch`_
|
||||||
|
* `Meilisearch`_
|
||||||
|
* `Solr`_
|
||||||
|
|
||||||
|
Each search engine is powerful, capable of full-text search. All of the engines
|
||||||
|
above are added to ``settings.yml`` just commented out, as you have to
|
||||||
|
``base_url`` for all them.
|
||||||
|
|
||||||
|
Please note that if you are not using HTTPS to access these engines, you have to
|
||||||
|
enable HTTP requests by setting ``enable_http`` to ``True``.
|
||||||
|
|
||||||
|
Furthermore, if you do not want to expose these engines on a public instance,
|
||||||
|
you can still add them and limit the access by setting ``tokens`` as described
|
||||||
|
in section :ref:`private engines`.
|
||||||
|
|
||||||
|
.. _engine meilisearch:
|
||||||
|
|
||||||
|
MeiliSearch
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.meilisearch
|
||||||
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine elasticsearch:
|
||||||
|
|
||||||
|
Elasticsearch
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.elasticsearch
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _engine solr:
|
||||||
|
|
||||||
|
Solr
|
||||||
|
====
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.solr
|
||||||
|
:members:
|
||||||
|
|
121
docs/dev/engines/offline/sql-engines.rst
Normal file
121
docs/dev/engines/offline/sql-engines.rst
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
.. _sql engines:
|
||||||
|
|
||||||
|
===========
|
||||||
|
SQL Engines
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. sidebar:: further read
|
||||||
|
|
||||||
|
- `SQLite <https://www.sqlite.org/index.html>`_
|
||||||
|
- `PostgreSQL <https://www.postgresql.org>`_
|
||||||
|
- `MySQL <https://www.mysql.com>`_
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
Initial sponsored by `Search and Discovery Fund
|
||||||
|
<https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
|
||||||
|
|
||||||
|
With the *SQL engines* you can bind SQL databases into SearXNG. The following
|
||||||
|
Relational Database Management System (RDBMS) are supported:
|
||||||
|
|
||||||
|
- :ref:`engine sqlite`
|
||||||
|
- :ref:`engine postgresql`
|
||||||
|
- :ref:`engine mysql_server`
|
||||||
|
|
||||||
|
All of the engines above are just commented out in the :origin:`settings.yml
|
||||||
|
<searx/settings.yml>`, as you have to set the required attributes for the
|
||||||
|
engines, e.g. ``database:`` ...
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
- name: ...
|
||||||
|
engine: {sqlite|postgresql|mysql_server}
|
||||||
|
database: ...
|
||||||
|
result_template: {template_name}
|
||||||
|
query_str: ...
|
||||||
|
|
||||||
|
By default, the engines use the ``key-value`` template for displaying results /
|
||||||
|
see :origin:`simple <searx/templates/simple/result_templates/key-value.html>`
|
||||||
|
theme. If you are not satisfied with the original result layout, you can use
|
||||||
|
your own template, set ``result_template`` attribute to ``{template_name}`` and
|
||||||
|
place the templates at::
|
||||||
|
|
||||||
|
searx/templates/{theme_name}/result_templates/{template_name}
|
||||||
|
|
||||||
|
If you do not wish to expose these engines on a public instance, you can still
|
||||||
|
add them and limit the access by setting ``tokens`` as described in section
|
||||||
|
:ref:`private engines`.
|
||||||
|
|
||||||
|
|
||||||
|
Extra Dependencies
|
||||||
|
==================
|
||||||
|
|
||||||
|
For using :ref:`engine postgresql` or :ref:`engine mysql_server` you need to
|
||||||
|
install additional packages in Python's Virtual Environment of your SearXNG
|
||||||
|
instance. To switch into the environment (:ref:`searxng-src`) you can use
|
||||||
|
:ref:`searxng.sh`::
|
||||||
|
|
||||||
|
$ sudo utils/searxng.sh instance cmd bash
|
||||||
|
(searxng-pyenv)$ pip install ...
|
||||||
|
|
||||||
|
|
||||||
|
Configure the engines
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The configuration of the new database engines are similar. You must put a valid
|
||||||
|
SQL-SELECT query in ``query_str``. At the moment you can only bind at most one
|
||||||
|
parameter in your query. By setting the attribute ``limit`` you can define how
|
||||||
|
many results you want from the SQL server. Basically, it is the same as the
|
||||||
|
``LIMIT`` keyword in SQL.
|
||||||
|
|
||||||
|
Please, do not include ``LIMIT`` or ``OFFSET`` in your SQL query as the engines
|
||||||
|
rely on these keywords during paging. If you want to configure the number of
|
||||||
|
returned results use the option ``limit``.
|
||||||
|
|
||||||
|
.. _engine sqlite:
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
------
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :origin:`sqlite.py <searx/engines/sqlite.py>`
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.sqlite
|
||||||
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
.. _engine postgresql:
|
||||||
|
|
||||||
|
PostgreSQL
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _psycopg2: https://www.psycopg.org/install
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :origin:`postgresql.py <searx/engines/postgresql.py>`
|
||||||
|
- ``pip install`` `psycopg2-binary <psycopg2>`_
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.postgresql
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _engine mysql_server:
|
||||||
|
|
||||||
|
MySQL
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. sidebar:: info
|
||||||
|
|
||||||
|
- :origin:`mysql_server.py <searx/engines/mysql_server.py>`
|
||||||
|
- ``pip install`` :pypi:`mysql-connector-python <mysql-connector-python>`
|
||||||
|
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mysql_server
|
||||||
|
:members:
|
||||||
|
|
69
docs/dev/engines/offline_concept.rst
Normal file
69
docs/dev/engines/offline_concept.rst
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
===============
|
||||||
|
Offline Concept
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. sidebar:: offline engines
|
||||||
|
|
||||||
|
- :ref:`demo offline engine`
|
||||||
|
- :ref:`engine command`
|
||||||
|
- :ref:`sql engines`
|
||||||
|
- :ref:`nosql engines`
|
||||||
|
- :py:obj:`searx.search.processors.offline`
|
||||||
|
|
||||||
|
To extend the functionality of SearXNG, offline engines are going to be
|
||||||
|
introduced. An offline engine is an engine which does not need Internet
|
||||||
|
connection to perform a search and does not use HTTP to communicate.
|
||||||
|
|
||||||
|
Offline engines can be configured, by adding those to the `engines` list of
|
||||||
|
:origin:`settings.yml <searx/settings.yml>`. An example skeleton for offline
|
||||||
|
engines can be found in :ref:`demo offline engine` (:origin:`demo_offline.py
|
||||||
|
<searx/engines/demo_offline.py>`).
|
||||||
|
|
||||||
|
|
||||||
|
Programming Interface
|
||||||
|
=====================
|
||||||
|
|
||||||
|
:py:func:`init(engine_settings=None) <searx.engines.demo_offline.init>`
|
||||||
|
All offline engines can have their own init function to setup the engine before
|
||||||
|
accepting requests. The function gets the settings from settings.yml as a
|
||||||
|
parameter. This function can be omitted, if there is no need to setup anything
|
||||||
|
in advance.
|
||||||
|
|
||||||
|
:py:func:`search(query, params) <searx.engines.demo_offline.searc>`
|
||||||
|
Each offline engine has a function named ``search``. This function is
|
||||||
|
responsible to perform a search and return the results in a presentable
|
||||||
|
format. (Where *presentable* means presentable by the selected result
|
||||||
|
template.)
|
||||||
|
|
||||||
|
The return value is a list of results retrieved by the engine.
|
||||||
|
|
||||||
|
Engine representation in ``/config``
|
||||||
|
If an engine is offline, the attribute ``offline`` is set to ``True``.
|
||||||
|
|
||||||
|
.. _offline requirements:
|
||||||
|
|
||||||
|
Extra Dependencies
|
||||||
|
==================
|
||||||
|
|
||||||
|
If an offline engine depends on an external tool, SearXNG does not install it by
|
||||||
|
default. When an administrator configures such engine and starts the instance,
|
||||||
|
the process returns an error with the list of missing dependencies. Also,
|
||||||
|
required dependencies will be added to the comment/description of the engine, so
|
||||||
|
admins can install packages in advance.
|
||||||
|
|
||||||
|
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
|
||||||
|
(:ref:`searxng-src`) first, for this you can use :ref:`searxng.sh`::
|
||||||
|
|
||||||
|
$ sudo utils/searxng.sh instance cmd bash
|
||||||
|
(searxng-pyenv)$ pip install ...
|
||||||
|
|
||||||
|
|
||||||
|
Private engines (Security)
|
||||||
|
==========================
|
||||||
|
|
||||||
|
To limit the access to offline engines, if an instance is available publicly,
|
||||||
|
administrators can set token(s) for each of the :ref:`private engines`. If a
|
||||||
|
query contains a valid token, then SearXNG performs the requested private
|
||||||
|
search. If not, requests from an offline engines return errors.
|
||||||
|
|
13
docs/dev/engines/online/annas_archive.rst
Normal file
13
docs/dev/engines/online/annas_archive.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _annas_archive engine:
|
||||||
|
|
||||||
|
==============
|
||||||
|
Anna's Archive
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.annas_archive
|
||||||
|
:members:
|
14
docs/dev/engines/online/archlinux.rst
Normal file
14
docs/dev/engines/online/archlinux.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. _archlinux engine:
|
||||||
|
|
||||||
|
==========
|
||||||
|
Arch Linux
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.archlinux
|
||||||
|
:members:
|
||||||
|
|
43
docs/dev/engines/online/bing.rst
Normal file
43
docs/dev/engines/online/bing.rst
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
.. _bing engines:
|
||||||
|
|
||||||
|
============
|
||||||
|
Bing Engines
|
||||||
|
============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _bing web engine:
|
||||||
|
|
||||||
|
Bing WEB
|
||||||
|
========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.bing
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _bing images engine:
|
||||||
|
|
||||||
|
Bing Images
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.bing_images
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _bing videos engine:
|
||||||
|
|
||||||
|
Bing Videos
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.bing_videos
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _bing news engine:
|
||||||
|
|
||||||
|
Bing News
|
||||||
|
=========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.bing_news
|
||||||
|
:members:
|
13
docs/dev/engines/online/brave.rst
Normal file
13
docs/dev/engines/online/brave.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _brave engine:
|
||||||
|
|
||||||
|
=============
|
||||||
|
Brave Engines
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.brave
|
||||||
|
:members:
|
14
docs/dev/engines/online/bt4g.rst
Normal file
14
docs/dev/engines/online/bt4g.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. _bt4g engine:
|
||||||
|
|
||||||
|
====
|
||||||
|
BT4G
|
||||||
|
====
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.bt4g
|
||||||
|
:members:
|
||||||
|
|
13
docs/dev/engines/online/dailymotion.rst
Normal file
13
docs/dev/engines/online/dailymotion.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _dailymotion engine:
|
||||||
|
|
||||||
|
===========
|
||||||
|
Dailymotion
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.dailymotion
|
||||||
|
:members:
|
22
docs/dev/engines/online/duckduckgo.rst
Normal file
22
docs/dev/engines/online/duckduckgo.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. _duckduckgo engines:
|
||||||
|
|
||||||
|
==================
|
||||||
|
DuckDuckGo Engines
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.duckduckgo
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.duckduckgo_extra
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.duckduckgo_definitions
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.duckduckgo_weather
|
||||||
|
:members:
|
76
docs/dev/engines/online/google.rst
Normal file
76
docs/dev/engines/online/google.rst
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
.. _google engines:
|
||||||
|
|
||||||
|
==============
|
||||||
|
Google Engines
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _google API:
|
||||||
|
|
||||||
|
Google API
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. _Query Parameter Definitions:
|
||||||
|
https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions
|
||||||
|
|
||||||
|
SearXNG's implementation of the Google API is mainly done in
|
||||||
|
:py:obj:`get_google_info <searx.engines.google.get_google_info>`.
|
||||||
|
|
||||||
|
For detailed description of the *REST-full* API see: `Query Parameter
|
||||||
|
Definitions`_. The linked API documentation can sometimes be helpful during
|
||||||
|
reverse engineering. However, we cannot use it in the freely accessible WEB
|
||||||
|
services; not all parameters can be applied and some engines are more *special*
|
||||||
|
than other (e.g. :ref:`google news engine`).
|
||||||
|
|
||||||
|
|
||||||
|
.. _google web engine:
|
||||||
|
|
||||||
|
Google WEB
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.google
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _google autocomplete:
|
||||||
|
|
||||||
|
Google Autocomplete
|
||||||
|
====================
|
||||||
|
|
||||||
|
.. autofunction:: searx.autocomplete.google_complete
|
||||||
|
|
||||||
|
.. _google images engine:
|
||||||
|
|
||||||
|
Google Images
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.google_images
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _google videos engine:
|
||||||
|
|
||||||
|
Google Videos
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.google_videos
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _google news engine:
|
||||||
|
|
||||||
|
Google News
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.google_news
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _google scholar engine:
|
||||||
|
|
||||||
|
Google Scholar
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.google_scholar
|
||||||
|
:members:
|
13
docs/dev/engines/online/lemmy.rst
Normal file
13
docs/dev/engines/online/lemmy.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _lemmy engine:
|
||||||
|
|
||||||
|
=====
|
||||||
|
Lemmy
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.lemmy
|
||||||
|
:members:
|
13
docs/dev/engines/online/loc.rst
Normal file
13
docs/dev/engines/online/loc.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _loc engine:
|
||||||
|
|
||||||
|
===================
|
||||||
|
Library of Congress
|
||||||
|
===================
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.loc
|
||||||
|
:members:
|
13
docs/dev/engines/online/mastodon.rst
Normal file
13
docs/dev/engines/online/mastodon.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _mastodon engine:
|
||||||
|
|
||||||
|
========
|
||||||
|
Mastodon
|
||||||
|
========
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mastodon
|
||||||
|
:members:
|
13
docs/dev/engines/online/moviepilot.rst
Normal file
13
docs/dev/engines/online/moviepilot.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _moviepilot engine:
|
||||||
|
|
||||||
|
==========
|
||||||
|
Moviepilot
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.moviepilot
|
||||||
|
:members:
|
13
docs/dev/engines/online/mrs.rst
Normal file
13
docs/dev/engines/online/mrs.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _mrs engine:
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Matrix Rooms Search (MRS)
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mrs
|
||||||
|
:members:
|
27
docs/dev/engines/online/mwmbl.rst
Normal file
27
docs/dev/engines/online/mwmbl.rst
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.. _Mwmbl engine:
|
||||||
|
|
||||||
|
============
|
||||||
|
Mwmbl Engine
|
||||||
|
============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _mwmbl web engine:
|
||||||
|
|
||||||
|
Mwmbl WEB
|
||||||
|
=========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.mwmbl
|
||||||
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
.. _mwmbl autocomplete:
|
||||||
|
|
||||||
|
Mwmbl Autocomplete
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. autofunction:: searx.autocomplete.mwmbl
|
13
docs/dev/engines/online/odysee.rst
Normal file
13
docs/dev/engines/online/odysee.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _odysee engine:
|
||||||
|
|
||||||
|
======
|
||||||
|
Odysee
|
||||||
|
======
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.odysee
|
||||||
|
:members:
|
27
docs/dev/engines/online/peertube.rst
Normal file
27
docs/dev/engines/online/peertube.rst
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.. _peertube engines:
|
||||||
|
|
||||||
|
================
|
||||||
|
Peertube Engines
|
||||||
|
================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _peertube video engine:
|
||||||
|
|
||||||
|
Peertube Video
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.peertube
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. _sepiasearch engine:
|
||||||
|
|
||||||
|
SepiaSearch
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.sepiasearch
|
||||||
|
:members:
|
13
docs/dev/engines/online/piped.rst
Normal file
13
docs/dev/engines/online/piped.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _piped engine:
|
||||||
|
|
||||||
|
=====
|
||||||
|
Piped
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.piped
|
||||||
|
:members:
|
13
docs/dev/engines/online/qwant.rst
Normal file
13
docs/dev/engines/online/qwant.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _qwant engine:
|
||||||
|
|
||||||
|
=====
|
||||||
|
Qwant
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
.. automodule:: searx.engines.qwant
|
||||||
|
:members:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user