forked from Ponysearch/Ponysearch
Compare commits
No commits in common. "master" and "translations" have entirely different histories.
master
...
translatio
761 changed files with 3 additions and 226055 deletions
11
.coveragerc
11
.coveragerc
|
@ -1,11 +0,0 @@
|
||||||
[run]
|
|
||||||
branch = True
|
|
||||||
source = searx
|
|
||||||
|
|
||||||
[report]
|
|
||||||
show_missing = True
|
|
||||||
exclude_lines =
|
|
||||||
if __name__ == .__main__.:
|
|
||||||
|
|
||||||
[html]
|
|
||||||
directory = coverage
|
|
|
@ -1,4 +0,0 @@
|
||||||
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
|
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
|
@ -1,163 +0,0 @@
|
||||||
;;; .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"
|
|
||||||
;; ))
|
|
||||||
))))
|
|
||||||
)
|
|
|
@ -1,44 +0,0 @@
|
||||||
*~
|
|
||||||
*/*~
|
|
||||||
*/*/*~
|
|
||||||
*/*/*/*~
|
|
||||||
*/*/*/*/*~
|
|
||||||
|
|
||||||
# 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/
|
|
|
@ -1,43 +0,0 @@
|
||||||
# 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
|
|
||||||
|
|
||||||
[*.js]
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
[*.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,12 +1 @@
|
||||||
*.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
39
.github/ISSUE_TEMPLATE/bug-report.md
vendored
|
@ -1,39 +0,0 @@
|
||||||
---
|
|
||||||
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
5
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1,5 +0,0 @@
|
||||||
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
31
.github/ISSUE_TEMPLATE/engine-request.md
vendored
|
@ -1,31 +0,0 @@
|
||||||
---
|
|
||||||
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
21
.github/ISSUE_TEMPLATE/feature-request.md
vendored
|
@ -1,21 +0,0 @@
|
||||||
---
|
|
||||||
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. -->
|
|
22
.github/dependabot.yml
vendored
22
.github/dependabot.yml
vendored
|
@ -1,22 +0,0 @@
|
||||||
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "pip"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
day: "friday"
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
target-branch: "master"
|
|
||||||
commit-message:
|
|
||||||
prefix: "[upd] pypi:"
|
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
|
||||||
directory: "/searx/static/themes/simple"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
day: "friday"
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
target-branch: "master"
|
|
||||||
commit-message:
|
|
||||||
prefix: "[upd] npm:"
|
|
31
.github/workflows/checker.yml
vendored
31
.github/workflows/checker.yml
vendored
|
@ -1,31 +0,0 @@
|
||||||
name: "Checker"
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 4 * * 5"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
checker:
|
|
||||||
name: Checker
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
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@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.11'
|
|
||||||
architecture: 'x64'
|
|
||||||
|
|
||||||
- name: Install Python dependencies
|
|
||||||
run: |
|
|
||||||
make V=1 install
|
|
||||||
|
|
||||||
- name: Checker
|
|
||||||
run: |
|
|
||||||
make search.checker
|
|
67
.github/workflows/data-update.yml
vendored
67
.github/workflows/data-update.yml
vendored
|
@ -1,67 +0,0 @@
|
||||||
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: '[data] 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: '[data] 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 }}"
|
|
213
.github/workflows/integration.yml
vendored
213
.github/workflows/integration.yml
vendored
|
@ -1,213 +0,0 @@
|
||||||
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: '[doc] 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: |
|
|
||||||
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
28
.github/workflows/security.yml
vendored
|
@ -1,28 +0,0 @@
|
||||||
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
59
.github/workflows/translations-update.yml
vendored
|
@ -1,59 +0,0 @@
|
||||||
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: '[l10n] update translations from Weblate'
|
|
||||||
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: '[l10n] update translations from Weblate'
|
|
||||||
body: |
|
|
||||||
update translations from Weblate
|
|
||||||
labels: |
|
|
||||||
translation
|
|
29
.gitignore
vendored
29
.gitignore
vendored
|
@ -1,28 +1 @@
|
||||||
# to sync with .dockerignore & pyrightconfig.json
|
messages.mo
|
||||||
|
|
||||||
*.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
|
|
||||||
.dir-locals.el
|
|
||||||
|
|
||||||
.python-version
|
|
||||||
|
|
1
.nvmrc
1
.nvmrc
|
@ -1 +0,0 @@
|
||||||
v20.10
|
|
407
.pylintrc
407
.pylintrc
|
@ -1,407 +0,0 @@
|
||||||
# -*- coding: utf-8; mode: conf-unix -*-
|
|
||||||
# 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=0
|
|
||||||
|
|
||||||
# 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
|
|
|
@ -1,2 +0,0 @@
|
||||||
python 3.12.0
|
|
||||||
shellcheck 0.9.0
|
|
23
.vscode/launch.json
vendored
23
.vscode/launch.json
vendored
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
// 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
11
.vscode/settings.json
vendored
|
@ -1,11 +0,0 @@
|
||||||
{
|
|
||||||
"python.testing.unittestArgs": [
|
|
||||||
"-v",
|
|
||||||
"-s",
|
|
||||||
"./tests",
|
|
||||||
"-p",
|
|
||||||
"test_*.py"
|
|
||||||
],
|
|
||||||
"python.testing.pytestEnabled": false,
|
|
||||||
"python.testing.unittestEnabled": true,
|
|
||||||
}
|
|
36
.vscode/tasks.json
vendored
36
.vscode/tasks.json
vendored
|
@ -1,36 +0,0 @@
|
||||||
{
|
|
||||||
// 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
3
.weblate
|
@ -1,3 +0,0 @@
|
||||||
[weblate]
|
|
||||||
url = https://translate.codeberg.org/api/
|
|
||||||
translation = searxng/searxng
|
|
|
@ -1,16 +0,0 @@
|
||||||
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
|
|
175
AUTHORS.rst
175
AUTHORS.rst
|
@ -1,175 +0,0 @@
|
||||||
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>`
|
|
||||||
- Austin Olacsi `<https://github.com/Austin-Olacsi>`
|
|
||||||
- @micsthepick
|
|
||||||
- Daniel Kukula `<https://github.com/dkuku>`
|
|
|
@ -1,14 +0,0 @@
|
||||||
=======
|
|
||||||
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
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
# How to contribute
|
|
||||||
|
|
||||||
## Resources in the documentation
|
|
||||||
|
|
||||||
* [Development quickstart](https://docs.searxng.org/dev/quickstart.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.
|
|
||||||
|
|
90
Dockerfile
90
Dockerfile
|
@ -1,90 +0,0 @@
|
||||||
FROM alpine:3.19
|
|
||||||
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 \
|
|
||||||
UWSGI_WORKERS=%k \
|
|
||||||
UWSGI_THREADS=4
|
|
||||||
|
|
||||||
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 --break-system-packages --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
661
LICENSE
|
@ -1,661 +0,0 @@
|
||||||
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/>.
|
|
102
Makefile
102
Makefile
|
@ -1,102 +0,0 @@
|
||||||
# -*- 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 searxng-checker -v
|
|
||||||
|
|
||||||
search.checker.%: install
|
|
||||||
$(Q)./manage pyenv.cmd searxng-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.sh \
|
|
||||||
$(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 += weblate.translations.commit weblate.push.translations
|
|
||||||
MANAGE += data.all data.traits data.useragents data.locales
|
|
||||||
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 += 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
|
|
|
@ -1,25 +0,0 @@
|
||||||
## 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
|
|
||||||
-->
|
|
131
README.rst
131
README.rst
|
@ -1,130 +1,3 @@
|
||||||
.. SPDX-License-Identifier: AGPL-3.0-or-later
|
This branch is updated automatically.
|
||||||
|
|
||||||
----
|
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>`_
|
|
||||||
|
|
||||||
|
|
||||||
Setup
|
|
||||||
=====
|
|
||||||
|
|
||||||
- A well maintained `Docker image`_, also built for ARM64 and ARM/v7
|
|
||||||
architectures.
|
|
||||||
- Alternatively there are *up to date* `installation scripts`_.
|
|
||||||
- For individual setup consult our detailed `Step by step`_ instructions.
|
|
||||||
- To fine-tune your instance, take a look at the `Administrator documentation`_.
|
|
||||||
|
|
||||||
.. _Administrator documentation: https://docs.searxng.org/admin/index.html
|
|
||||||
.. _Step by step: https://docs.searxng.org/admin/installation-searxng.html
|
|
||||||
.. _installation scripts: https://docs.searxng.org/admin/installation-scripts.html
|
|
||||||
.. _Docker image: https://github.com/searxng/searxng-docker
|
|
||||||
|
|
||||||
Translations
|
|
||||||
============
|
|
||||||
|
|
||||||
.. _Weblate: https://translate.codeberg.org/projects/searxng/searxng/
|
|
||||||
|
|
||||||
Help translate SearXNG at `Weblate`_
|
|
||||||
|
|
||||||
.. figure:: https://translate.codeberg.org/widgets/searxng/-/multi-auto.svg
|
|
||||||
:target: https://translate.codeberg.org/projects/searxng/
|
|
||||||
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
============
|
|
||||||
|
|
||||||
.. _development quickstart: https://docs.searxng.org/dev/quickstart.html
|
|
||||||
.. _developer documentation: https://docs.searxng.org/dev/index.html
|
|
||||||
|
|
||||||
Are you a developer? Have a look at our `development quickstart`_ guide, it's
|
|
||||||
very easy to contribute. Additionally we have a `developer documentation`_.
|
|
||||||
|
|
||||||
|
|
||||||
Codespaces
|
|
||||||
==========
|
|
||||||
|
|
||||||
You can contribute from your browser using `GitHub Codespaces`_:
|
|
||||||
|
|
||||||
- Fork the repository
|
|
||||||
- Click on the ``<> Code`` green button
|
|
||||||
- Click on the ``Codespaces`` tab instead of ``Local``
|
|
||||||
- Click on ``Create codespace on master``
|
|
||||||
- VSCode is going to start in the browser
|
|
||||||
- Wait for ``git pull && make install`` to appear and then disappear
|
|
||||||
- You have `120 hours per month`_ (see also your `list of existing Codespaces`_)
|
|
||||||
- You can start SearXNG using ``make run`` in the terminal or by pressing ``Ctrl+Shift+B``
|
|
||||||
|
|
||||||
.. _GitHub Codespaces: https://docs.github.com/en/codespaces/overview
|
|
||||||
.. _120 hours per month: https://github.com/settings/billing
|
|
||||||
.. _list of existing Codespaces: https://github.com/codespaces
|
|
||||||
|
|
10
SECURITY.md
10
SECURITY.md
|
@ -1,10 +0,0 @@
|
||||||
# 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.
|
|
|
@ -1,6 +0,0 @@
|
||||||
[extractors]
|
|
||||||
searxng_msg = searx.babel_extract.extract
|
|
||||||
[ignore: **/node_modules/**]
|
|
||||||
[python: **.py]
|
|
||||||
[jinja2: **/templates/**.html]
|
|
||||||
[searxng_msg: **/searxng.msg]
|
|
|
@ -1,178 +0,0 @@
|
||||||
#!/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}"
|
|
|
@ -1,54 +0,0 @@
|
||||||
[uwsgi]
|
|
||||||
# Who will run the code
|
|
||||||
uid = searxng
|
|
||||||
gid = searxng
|
|
||||||
|
|
||||||
# Number of workers (usually CPU count)
|
|
||||||
# default value: %k (= number of CPU core, see Dockerfile)
|
|
||||||
workers = $(UWSGI_WORKERS)
|
|
||||||
|
|
||||||
# Number of threads per worker
|
|
||||||
# default value: 4 (see Dockerfile)
|
|
||||||
threads = $(UWSGI_THREADS)
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# Follow SIGTERM convention
|
|
||||||
# See https://github.com/searxng/searxng/issues/3427
|
|
||||||
die-on-term
|
|
||||||
|
|
||||||
# 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
151
docs/_themes/searxng/static/searxng.css
vendored
|
@ -1,151 +0,0 @@
|
||||||
@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
7
docs/_themes/searxng/theme.conf
vendored
|
@ -1,7 +0,0 @@
|
||||||
[theme]
|
|
||||||
inherit = pocoo
|
|
||||||
stylesheet = searxng.css
|
|
||||||
|
|
||||||
[options]
|
|
||||||
touch_icon =
|
|
||||||
globaltoc_maxdepth = 5
|
|
|
@ -1,69 +0,0 @@
|
||||||
===============================
|
|
||||||
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.
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 59 KiB |
|
@ -1,92 +0,0 @@
|
||||||
.. _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>
|
|
|
@ -1,30 +0,0 @@
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
.. _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:
|
|
|
@ -1,163 +0,0 @@
|
||||||
.. _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
|
|
|
@ -1,22 +0,0 @@
|
||||||
===========================
|
|
||||||
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
|
|
|
@ -1,388 +0,0 @@
|
||||||
.. _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 (``/``).
|
|
|
@ -1,197 +0,0 @@
|
||||||
.. _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
|
|
||||||
|
|
||||||
The environment variables UWSGI_WORKERS and UWSGI_THREADS overwrite the default
|
|
||||||
number of UWSGI processes and UWSGI threads specified in `/etc/searxng/uwsgi.ini`.
|
|
||||||
|
|
||||||
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
|
|
|
@ -1,252 +0,0 @@
|
||||||
.. _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;
|
|
||||||
# ...
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
.. _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`
|
|
|
@ -1,132 +0,0 @@
|
||||||
.. _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.
|
|
||||||
|
|
|
@ -1,268 +0,0 @@
|
||||||
.. _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:
|
|
||||||
...
|
|
|
@ -1,22 +0,0 @@
|
||||||
.. _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!
|
|
|
@ -1,39 +0,0 @@
|
||||||
.. _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 %}
|
|
|
@ -1,17 +0,0 @@
|
||||||
.. _limiter:
|
|
||||||
|
|
||||||
=======
|
|
||||||
Limiter
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. sidebar:: info
|
|
||||||
|
|
||||||
The limiter requires a :ref:`Redis <settings redis>` database.
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.limiter
|
|
||||||
:members:
|
|
|
@ -1,25 +0,0 @@
|
||||||
========
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
.. _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']
|
|
|
@ -1,25 +0,0 @@
|
||||||
.. _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``)
|
|
|
@ -1,31 +0,0 @@
|
||||||
.. _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``).
|
|
|
@ -1,244 +0,0 @@
|
||||||
.. _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.
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
.. _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``.
|
|
|
@ -1,110 +0,0 @@
|
||||||
.. _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`
|
|
||||||
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
.. _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
|
|
||||||
|
|
|
@ -1,98 +0,0 @@
|
||||||
.. _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``
|
|
|
@ -1,57 +0,0 @@
|
||||||
.. _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-Download-Options : noopen
|
|
||||||
X-Robots-Tag : noindex, nofollow
|
|
||||||
Referrer-Policy : no-referrer
|
|
||||||
|
|
||||||
``base_url`` : ``$SEARXNG_URL``
|
|
||||||
The base URL where SearXNG is deployed. Used to create correct inbound links.
|
|
||||||
|
|
||||||
``port`` & ``bind_address``: ``$SEARXNG_PORT`` & ``$SEARXNG_BIND_ADDRESS``
|
|
||||||
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.
|
|
||||||
|
|
||||||
``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>`__
|
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
.. _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).
|
|
|
@ -1,138 +0,0 @@
|
||||||
.. _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
|
|
|
@ -1,203 +0,0 @@
|
||||||
.. 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
|
|
207
docs/conf.py
207
docs/conf.py
|
@ -1,207 +0,0 @@
|
||||||
# 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")
|
|
||||||
]
|
|
|
@ -1,190 +0,0 @@
|
||||||
.. _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`.
|
|
|
@ -1,6 +0,0 @@
|
||||||
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
|
|
|
@ -1,14 +0,0 @@
|
||||||
.. _demo offline engine:
|
|
||||||
|
|
||||||
===================
|
|
||||||
Demo Offline Engine
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.demo_offline
|
|
||||||
:members:
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
.. _demo online engine:
|
|
||||||
|
|
||||||
==================
|
|
||||||
Demo Online Engine
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.demo_online
|
|
||||||
:members:
|
|
||||||
|
|
|
@ -1,569 +0,0 @@
|
||||||
.. _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``
|
|
||||||
----------
|
|
||||||
|
|
||||||
.. list-table:: Parameter of the **images** media type
|
|
||||||
:header-rows: 2
|
|
||||||
:width: 100%
|
|
||||||
|
|
||||||
* - result-parameter
|
|
||||||
- Python type
|
|
||||||
- information
|
|
||||||
|
|
||||||
* - template
|
|
||||||
- :py:class:`str`
|
|
||||||
- is set to ``images.html``
|
|
||||||
|
|
||||||
* - url
|
|
||||||
- :py:class:`str`
|
|
||||||
- url to the result site
|
|
||||||
|
|
||||||
* - title
|
|
||||||
- :py:class:`str`
|
|
||||||
- title of the result
|
|
||||||
|
|
||||||
* - content
|
|
||||||
- :py:class:`str`
|
|
||||||
- description of the image
|
|
||||||
|
|
||||||
* - publishedDate
|
|
||||||
- :py:class:`datetime <datetime.datetime>`
|
|
||||||
- time of publish
|
|
||||||
|
|
||||||
* - img_src
|
|
||||||
- :py:class:`str`
|
|
||||||
- url to the result image
|
|
||||||
|
|
||||||
* - thumbnail_src
|
|
||||||
- :py:class:`str`
|
|
||||||
- url to a small-preview image
|
|
||||||
|
|
||||||
* - resolution
|
|
||||||
- :py:class:`str`
|
|
||||||
- the resolution of the image (e.g. ``1920 x 1080`` pixel)
|
|
||||||
|
|
||||||
* - img_format
|
|
||||||
- :py:class:`str`
|
|
||||||
- the format of the image (e.g. ``png``)
|
|
||||||
|
|
||||||
* - filesize
|
|
||||||
- :py:class:`str`
|
|
||||||
- size of bytes in :py:obj:`human readable <searx.humanize_bytes>` notation
|
|
||||||
(e.g. ``MB`` for 1024 \* 1024 Bytes filesize).
|
|
||||||
|
|
||||||
|
|
||||||
.. _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
|
|
||||||
|
|
||||||
|
|
||||||
.. _template packages:
|
|
||||||
|
|
||||||
``packages``
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. list-table:: Parameter of the **packages** media type
|
|
||||||
:header-rows: 2
|
|
||||||
:width: 100%
|
|
||||||
|
|
||||||
* - result-parameter
|
|
||||||
- Python type
|
|
||||||
- information
|
|
||||||
|
|
||||||
* - template
|
|
||||||
- :py:class:`str`
|
|
||||||
- is set to ``packages.html``
|
|
||||||
|
|
||||||
* - title
|
|
||||||
- :py:class:`str`
|
|
||||||
- title of the result
|
|
||||||
|
|
||||||
* - content
|
|
||||||
- :py:class:`str`
|
|
||||||
- abstract
|
|
||||||
|
|
||||||
* - package_name
|
|
||||||
- :py:class:`str`
|
|
||||||
- the name of the package
|
|
||||||
|
|
||||||
* - version
|
|
||||||
- :py:class:`str`
|
|
||||||
- the current version of the package
|
|
||||||
|
|
||||||
* - maintainer
|
|
||||||
- :py:class:`str`
|
|
||||||
- the maintainer or author of the project
|
|
||||||
|
|
||||||
* - publishedDate
|
|
||||||
- :py:class:`datetime <datetime.datetime>`
|
|
||||||
- date of latest update or release
|
|
||||||
|
|
||||||
* - tags
|
|
||||||
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
|
||||||
- free tag list
|
|
||||||
|
|
||||||
* - popularity
|
|
||||||
- :py:class:`str`
|
|
||||||
- the popularity of the package, e.g. rating or download count
|
|
||||||
|
|
||||||
* - license_name
|
|
||||||
- :py:class:`str`
|
|
||||||
- the name of the license
|
|
||||||
|
|
||||||
* - license_url
|
|
||||||
- :py:class:`str`
|
|
||||||
- the web location of a license copy
|
|
||||||
|
|
||||||
* - homepage
|
|
||||||
- :py:class:`str`
|
|
||||||
- the url of the project's homepage
|
|
||||||
|
|
||||||
* - source_code_url
|
|
||||||
- :py:class:`str`
|
|
||||||
- the location of the project's source code
|
|
||||||
|
|
||||||
* - links
|
|
||||||
- :py:class:`dict`
|
|
||||||
- additional links in the form of ``{'link_name': 'http://example.com'}``
|
|
|
@ -1,22 +0,0 @@
|
||||||
.. _searx.enginelib:
|
|
||||||
|
|
||||||
==============
|
|
||||||
Engine Library
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.enginelib
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _searx.enginelib.traits:
|
|
||||||
|
|
||||||
|
|
||||||
Engine traits
|
|
||||||
=============
|
|
||||||
|
|
||||||
.. automodule:: searx.enginelib.traits
|
|
||||||
:members:
|
|
|
@ -1,9 +0,0 @@
|
||||||
.. _searx.engines loader:
|
|
||||||
|
|
||||||
========================
|
|
||||||
SearXNG's engines loader
|
|
||||||
========================
|
|
||||||
|
|
||||||
.. automodule:: searx.engines
|
|
||||||
:members:
|
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
.. _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*
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _mediawiki engine:
|
|
||||||
|
|
||||||
================
|
|
||||||
MediaWiki Engine
|
|
||||||
================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.mediawiki
|
|
||||||
:members:
|
|
|
@ -1,23 +0,0 @@
|
||||||
.. _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:
|
|
|
@ -1,97 +0,0 @@
|
||||||
.. _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:
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
=================
|
|
||||||
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:
|
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
.. _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:
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
===============
|
|
||||||
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.
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _annas_archive engine:
|
|
||||||
|
|
||||||
==============
|
|
||||||
Anna's Archive
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.annas_archive
|
|
||||||
:members:
|
|
|
@ -1,14 +0,0 @@
|
||||||
.. _archlinux engine:
|
|
||||||
|
|
||||||
==========
|
|
||||||
Arch Linux
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.archlinux
|
|
||||||
:members:
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
.. _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:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _bpb engine:
|
|
||||||
|
|
||||||
===
|
|
||||||
Bpb
|
|
||||||
===
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.bpb
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _brave engine:
|
|
||||||
|
|
||||||
=============
|
|
||||||
Brave Engines
|
|
||||||
=============
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.brave
|
|
||||||
:members:
|
|
|
@ -1,14 +0,0 @@
|
||||||
.. _bt4g engine:
|
|
||||||
|
|
||||||
====
|
|
||||||
BT4G
|
|
||||||
====
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.bt4g
|
|
||||||
:members:
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _dailymotion engine:
|
|
||||||
|
|
||||||
===========
|
|
||||||
Dailymotion
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.dailymotion
|
|
||||||
:members:
|
|
|
@ -1,22 +0,0 @@
|
||||||
.. _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:
|
|
|
@ -1,8 +0,0 @@
|
||||||
.. _gitea engine:
|
|
||||||
|
|
||||||
=====
|
|
||||||
Gitea
|
|
||||||
=====
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.gitea
|
|
||||||
:members:
|
|
|
@ -1,76 +0,0 @@
|
||||||
.. _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:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _lemmy engine:
|
|
||||||
|
|
||||||
=====
|
|
||||||
Lemmy
|
|
||||||
=====
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.lemmy
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _loc engine:
|
|
||||||
|
|
||||||
===================
|
|
||||||
Library of Congress
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.loc
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _mastodon engine:
|
|
||||||
|
|
||||||
========
|
|
||||||
Mastodon
|
|
||||||
========
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.mastodon
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _moviepilot engine:
|
|
||||||
|
|
||||||
==========
|
|
||||||
Moviepilot
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.moviepilot
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _mrs engine:
|
|
||||||
|
|
||||||
=========================
|
|
||||||
Matrix Rooms Search (MRS)
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.mrs
|
|
||||||
:members:
|
|
|
@ -1,13 +0,0 @@
|
||||||
.. _voidlinux mullvad_leta:
|
|
||||||
|
|
||||||
============
|
|
||||||
Mullvad-Leta
|
|
||||||
============
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.mullvad_leta
|
|
||||||
:members:
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue