Compare commits
1 Commits
master
...
update_js_
Author | SHA1 | Date | |
---|---|---|---|
|
72f5e7cfb8 |
.dir-locals.el.editorconfigindex.rstown-instance.rst
.github
.gitignore.nvmrc.pylintrc.tool-versionsAUTHORS.rstCONTRIBUTING.mdDockerfileMakefileREADME.rstcompose.ymldockerfiles
docs
admin
api.rstindex.rstinstallation-apache.rstinstallation-docker.rstinstallation-searxng.rstplugins.rstsearx.favicons.rstsearx.limiter.rst
settings
build-templates
conf.pydev
answerers
engines
extended_types.rstindex.rstmakefile.rstplugins.rstplugins
builtins.rstcalculator.rstdevelopment.rsthash_plugin.rsthostnames.rstindex.rstself_info.rstunit_converter.rst
quickstart.rstreST.rstresult_types
rtm_asdf.rstsearch_api.rstsearxng_extra
templates.rstsrc
index.rstsearx.botdetection.rstsearx.favicons.rstsearx.locales.rstsearx.plugins.tor_check.rstsearx.settings.rstsearx.sqlitedb.rst
utils
examples
manage@ -16,9 +16,6 @@ max_line_length = 119
|
|||||||
[*.html]
|
[*.html]
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
[*.js]
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
[*.json]
|
[*.json]
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
insert_final_newline = ignore
|
insert_final_newline = ignore
|
||||||
|
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@ -1,4 +1,4 @@
|
|||||||
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: "pip"
|
- package-ecosystem: "pip"
|
||||||
@ -8,9 +8,6 @@ updates:
|
|||||||
day: "friday"
|
day: "friday"
|
||||||
open-pull-requests-limit: 5
|
open-pull-requests-limit: 5
|
||||||
target-branch: "master"
|
target-branch: "master"
|
||||||
commit-message:
|
|
||||||
prefix: "[upd] pypi:"
|
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/searx/static/themes/simple"
|
directory: "/searx/static/themes/simple"
|
||||||
schedule:
|
schedule:
|
||||||
@ -18,5 +15,3 @@ updates:
|
|||||||
day: "friday"
|
day: "friday"
|
||||||
open-pull-requests-limit: 5
|
open-pull-requests-limit: 5
|
||||||
target-branch: "master"
|
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: # yamllint disable-line rule:truthy
|
|
||||||
schedule:
|
|
||||||
- cron: "0 4 * * 5"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
checker:
|
|
||||||
name: Checker
|
|
||||||
runs-on: ubuntu-24.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.13'
|
|
||||||
architecture: 'x64'
|
|
||||||
|
|
||||||
- name: Install Python dependencies
|
|
||||||
run: |
|
|
||||||
make V=1 install
|
|
||||||
|
|
||||||
- name: Checker
|
|
||||||
run: |
|
|
||||||
make search.checker
|
|
16
.github/workflows/data-update.yml
vendored
16
.github/workflows/data-update.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: "Update searx.data"
|
name: "Update searx.data"
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "59 23 28 * *"
|
- cron: "59 23 28 * *"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -7,7 +7,7 @@ on: # yamllint disable-line rule:truthy
|
|||||||
jobs:
|
jobs:
|
||||||
updateData:
|
updateData:
|
||||||
name: Update data - ${{ matrix.fetch }}
|
name: Update data - ${{ matrix.fetch }}
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
if: ${{ github.repository_owner == 'searxng'}}
|
if: ${{ github.repository_owner == 'searxng'}}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@ -29,9 +29,9 @@ jobs:
|
|||||||
sudo ./utils/searxng.sh install packages
|
sudo ./utils/searxng.sh install packages
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
|
|
||||||
- name: Install Python dependencies
|
- name: Install Python dependencies
|
||||||
@ -46,18 +46,18 @@ jobs:
|
|||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
id: cpr
|
id: cpr
|
||||||
uses: peter-evans/create-pull-request@v6
|
uses: peter-evans/create-pull-request@v3
|
||||||
with:
|
with:
|
||||||
commit-message: '[data] update searx.data - ${{ matrix.fetch }}'
|
commit-message: Update searx.data - ${{ matrix.fetch }}
|
||||||
committer: searxng-bot <noreply@github.com>
|
committer: searxng-bot <noreply@github.com>
|
||||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||||
signoff: false
|
signoff: false
|
||||||
branch: update_data_${{ matrix.fetch }}
|
branch: update_data_${{ matrix.fetch }}
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
draft: false
|
draft: false
|
||||||
title: '[data] update searx.data - ${{ matrix.fetch }}'
|
title: 'Update searx.data - ${{ matrix.fetch }}'
|
||||||
body: |
|
body: |
|
||||||
update searx.data - ${{ matrix.fetch }}
|
Update searx.data - ${{ matrix.fetch }}
|
||||||
labels: |
|
labels: |
|
||||||
data
|
data
|
||||||
|
|
||||||
|
246
.github/workflows/integration.yml
vendored
246
.github/workflows/integration.yml
vendored
@ -1,6 +1,6 @@
|
|||||||
name: Integration
|
name: Integration
|
||||||
|
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["master"]
|
branches: ["master"]
|
||||||
pull_request:
|
pull_request:
|
||||||
@ -12,96 +12,119 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
python:
|
python:
|
||||||
name: Python ${{ matrix.python-version }}
|
name: Python ${{ matrix.python-version }}
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-24.04]
|
os: [ubuntu-20.04]
|
||||||
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
python-version: ["3.8", "3.9", "3.10", "3.11"]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Ubuntu packages
|
- name: Install Ubuntu packages
|
||||||
run: |
|
run: |
|
||||||
sudo ./utils/searxng.sh install packages
|
sudo ./utils/searxng.sh install packages
|
||||||
- name: Set up Python
|
sudo apt install firefox
|
||||||
uses: actions/setup-python@v5
|
- name: Set up Python
|
||||||
with:
|
uses: actions/setup-python@v4
|
||||||
python-version: ${{ matrix.python-version }}
|
with:
|
||||||
architecture: 'x64'
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Run tests
|
architecture: 'x64'
|
||||||
run: make V=1 ci.test
|
- 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:
|
themes:
|
||||||
name: Themes
|
name: Themes
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Ubuntu packages
|
- name: Install Ubuntu packages
|
||||||
run: sudo ./utils/searxng.sh install buildhost
|
run: sudo ./utils/searxng.sh install buildhost
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
- name: Cache Python dependencies
|
- name: Cache Python dependencies
|
||||||
id: cache-python
|
id: cache-python
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
./local
|
./local
|
||||||
./.nvm
|
./.nvm
|
||||||
./node_modules
|
./node_modules
|
||||||
key: python-ubuntu-24.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
- name: Install node dependencies
|
- name: Install node dependencies
|
||||||
run: make V=1 node.env
|
run: make V=1 node.env
|
||||||
- name: Build themes
|
- name: Build themes
|
||||||
run: make V=1 themes.all
|
run: make V=1 themes.all
|
||||||
|
|
||||||
documentation:
|
documentation:
|
||||||
name: Documentation
|
name: Documentation
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
permissions:
|
permissions:
|
||||||
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
|
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: '0'
|
fetch-depth: '0'
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install Ubuntu packages
|
- name: Install Ubuntu packages
|
||||||
run: sudo ./utils/searxng.sh install buildhost
|
run: sudo ./utils/searxng.sh install buildhost
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
- name: Cache Python dependencies
|
- name: Cache Python dependencies
|
||||||
id: cache-python
|
id: cache-python
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
./local
|
./local
|
||||||
./.nvm
|
./.nvm
|
||||||
./node_modules
|
./node_modules
|
||||||
key: python-ubuntu-24.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
- name: Build documentation
|
- name: Build documentation
|
||||||
run: |
|
run: |
|
||||||
make V=1 docs.clean docs.html
|
make V=1 docs.clean docs.html
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
if: github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/master'
|
||||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||||
with:
|
with:
|
||||||
GITHUB_TOKEN: ${{ github.token }}
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
BRANCH: gh-pages
|
BRANCH: gh-pages
|
||||||
FOLDER: dist/docs
|
FOLDER: dist/docs
|
||||||
CLEAN: true # Automatically remove deleted files from the deploy branch
|
CLEAN: true # Automatically remove deleted files from the deploy branch
|
||||||
SINGLE_COMMIT: true
|
SINGLE_COMMIT: True
|
||||||
COMMIT_MESSAGE: '[doc] build from commit ${{ github.sha }}'
|
COMMIT_MESSAGE: build from commit ${{ github.sha }}
|
||||||
|
|
||||||
babel:
|
babel:
|
||||||
name: Update translations branch
|
name: Update translations branch
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
||||||
needs:
|
needs:
|
||||||
- python
|
- python
|
||||||
@ -110,37 +133,38 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write # for make V=1 weblate.push.translations
|
contents: write # for make V=1 weblate.push.translations
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: '0'
|
fetch-depth: '0'
|
||||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
- name: Cache Python dependencies
|
- name: Cache Python dependencies
|
||||||
id: cache-python
|
id: cache-python
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
./local
|
./local
|
||||||
./.nvm
|
./.nvm
|
||||||
./node_modules
|
./node_modules
|
||||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
- name: weblate & git setup
|
- name: weblate & git setup
|
||||||
env:
|
env:
|
||||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ~/.config
|
mkdir -p ~/.config
|
||||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||||
git config --global user.name "searxng-bot"
|
git config --global user.name "searxng-bot"
|
||||||
- name: Update transations
|
- name: Update transations
|
||||||
id: update
|
id: update
|
||||||
run: |
|
run: |
|
||||||
make V=1 weblate.push.translations
|
git restore utils/brand.env
|
||||||
|
make V=1 weblate.push.translations
|
||||||
|
|
||||||
dockers:
|
dockers:
|
||||||
name: Docker
|
name: Docker
|
||||||
@ -151,7 +175,7 @@ jobs:
|
|||||||
- documentation
|
- documentation
|
||||||
env:
|
env:
|
||||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
if: env.DOCKERHUB_USERNAME != null
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
@ -160,19 +184,19 @@ jobs:
|
|||||||
# make sure "make docker.push" can get the git history
|
# make sure "make docker.push" can get the git history
|
||||||
fetch-depth: '0'
|
fetch-depth: '0'
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
- name: Cache Python dependencies
|
- name: Cache Python dependencies
|
||||||
id: cache-python
|
id: cache-python
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
./local
|
./local
|
||||||
./.nvm
|
./.nvm
|
||||||
./node_modules
|
./node_modules
|
||||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
if: env.DOCKERHUB_USERNAME != null
|
if: env.DOCKERHUB_USERNAME != null
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1
|
||||||
|
4
.github/workflows/security.yml
vendored
4
.github/workflows/security.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: "Security checks"
|
name: "Security checks"
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "42 05 * * *"
|
- cron: "42 05 * * *"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -7,7 +7,7 @@ on: # yamllint disable-line rule:truthy
|
|||||||
jobs:
|
jobs:
|
||||||
dockers:
|
dockers:
|
||||||
name: Trivy ${{ matrix.image }}
|
name: Trivy ${{ matrix.image }}
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
98
.github/workflows/translations-update.yml
vendored
98
.github/workflows/translations-update.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: "Update translations"
|
name: "Update translations"
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "05 07 * * 5"
|
- cron: "05 07 * * 5"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -7,53 +7,53 @@ on: # yamllint disable-line rule:truthy
|
|||||||
jobs:
|
jobs:
|
||||||
babel:
|
babel:
|
||||||
name: "create PR for additions from weblate"
|
name: "create PR for additions from weblate"
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-20.04
|
||||||
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: '0'
|
fetch-depth: '0'
|
||||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.12'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
- name: Cache Python dependencies
|
- name: Cache Python dependencies
|
||||||
id: cache-python
|
id: cache-python
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
./local
|
./local
|
||||||
./.nvm
|
./.nvm
|
||||||
./node_modules
|
./node_modules
|
||||||
key: python-ubuntu-24.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||||
- name: weblate & git setup
|
- name: weblate & git setup
|
||||||
env:
|
env:
|
||||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ~/.config
|
mkdir -p ~/.config
|
||||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||||
git config --global user.name "searxng-bot"
|
git config --global user.name "searxng-bot"
|
||||||
- name: Merge and push transation updates
|
- name: Merge and push transation updates
|
||||||
run: |
|
run: |
|
||||||
make V=1 weblate.translations.commit
|
make V=1 weblate.translations.commit
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
id: cpr
|
id: cpr
|
||||||
uses: peter-evans/create-pull-request@v3
|
uses: peter-evans/create-pull-request@v3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||||
commit-message: '[l10n] update translations from Weblate'
|
commit-message: Update translations
|
||||||
committer: searxng-bot <searxng-bot@users.noreply.github.com>
|
committer: searxng-bot <searxng-bot@users.noreply.github.com>
|
||||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||||
signoff: false
|
signoff: false
|
||||||
branch: translations_update
|
branch: translations_update
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
draft: false
|
draft: false
|
||||||
title: '[l10n] update translations from Weblate'
|
title: 'Update translations'
|
||||||
body: |
|
body: |
|
||||||
update translations from Weblate
|
Update translations
|
||||||
labels: |
|
labels: |
|
||||||
translation
|
translation
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -23,6 +23,3 @@ gh-pages/
|
|||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
searx/version_frozen.py
|
searx/version_frozen.py
|
||||||
.dir-locals.el
|
|
||||||
|
|
||||||
.python-version
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# -*- coding: utf-8; mode: conf-unix -*-
|
# -*- coding: utf-8; mode: conf -*-
|
||||||
# lint Python modules using external checkers.
|
# lint Python modules using external checkers.
|
||||||
#
|
#
|
||||||
# This is the main checker controlling the other ones and the reports
|
# This is the main checker controlling the other ones and the reports
|
||||||
@ -27,7 +27,7 @@ ignore-patterns=
|
|||||||
#init-hook=
|
#init-hook=
|
||||||
|
|
||||||
# Use multiple processes to speed up Pylint.
|
# Use multiple processes to speed up Pylint.
|
||||||
jobs=0
|
jobs=1
|
||||||
|
|
||||||
# List of plugins (as comma separated values of python modules names) to load,
|
# List of plugins (as comma separated values of python modules names) to load,
|
||||||
# usually to register additional checkers.
|
# usually to register additional checkers.
|
||||||
@ -338,7 +338,6 @@ valid-metaclass-classmethod-first-arg=mcs
|
|||||||
|
|
||||||
# Maximum number of arguments for function / method
|
# Maximum number of arguments for function / method
|
||||||
max-args=8
|
max-args=8
|
||||||
max-positional-arguments=14
|
|
||||||
|
|
||||||
# Maximum number of attributes for a class (see R0902).
|
# Maximum number of attributes for a class (see R0902).
|
||||||
max-attributes=20
|
max-attributes=20
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
nodejs 23.5.0
|
|
||||||
python 3.13.1
|
|
||||||
shellcheck 0.10.0
|
|
||||||
sqlite 3.47.2
|
|
@ -168,10 +168,4 @@ features or generally made searx better:
|
|||||||
- Milad Laly @Milad-Laly
|
- Milad Laly @Milad-Laly
|
||||||
- @llmII
|
- @llmII
|
||||||
- @blob42 `<https://blob42.xyz>`_
|
- @blob42 `<https://blob42.xyz>`_
|
||||||
- Paolo Basso `<https://github.com/paolobasso99>`
|
- 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>`
|
|
||||||
- Patrick Evans `https://github.com/holysoles`
|
|
||||||
- Daniel Mowitz `<https://daniel.mowitz.rocks>`
|
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Resources in the documentation
|
## Resources in the documentation
|
||||||
|
|
||||||
* [Development quickstart](https://docs.searxng.org/dev/quickstart.html)
|
* [Development quickstart](https://docs.searxng.org/dev/contribution_guide.html)
|
||||||
* [Contribution guide](https://docs.searxng.org/dev/contribution_guide.html)
|
* [Contribution guide](https://docs.searxng.org/dev/contribution_guide.html)
|
||||||
|
|
||||||
## Submitting PRs
|
## Submitting PRs
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM alpine:3.20
|
FROM alpine:3.18
|
||||||
ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
|
ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
VOLUME /etc/searxng
|
VOLUME /etc/searxng
|
||||||
@ -15,9 +15,7 @@ ENV INSTANCE_NAME=searxng \
|
|||||||
MORTY_KEY= \
|
MORTY_KEY= \
|
||||||
MORTY_URL= \
|
MORTY_URL= \
|
||||||
SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \
|
SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \
|
||||||
UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini \
|
UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini
|
||||||
UWSGI_WORKERS=%k \
|
|
||||||
UWSGI_THREADS=4
|
|
||||||
|
|
||||||
WORKDIR /usr/local/searxng
|
WORKDIR /usr/local/searxng
|
||||||
|
|
||||||
@ -35,6 +33,7 @@ RUN apk add --no-cache -t build-dependencies \
|
|||||||
git \
|
git \
|
||||||
&& apk add --no-cache \
|
&& apk add --no-cache \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
|
su-exec \
|
||||||
python3 \
|
python3 \
|
||||||
py3-pip \
|
py3-pip \
|
||||||
libxml2 \
|
libxml2 \
|
||||||
@ -44,7 +43,7 @@ RUN apk add --no-cache -t build-dependencies \
|
|||||||
uwsgi \
|
uwsgi \
|
||||||
uwsgi-python3 \
|
uwsgi-python3 \
|
||||||
brotli \
|
brotli \
|
||||||
&& pip3 install --break-system-packages --no-cache -r requirements.txt \
|
&& pip3 install --no-cache -r requirements.txt \
|
||||||
&& apk del build-dependencies \
|
&& apk del build-dependencies \
|
||||||
&& rm -rf /root/.cache
|
&& rm -rf /root/.cache
|
||||||
|
|
||||||
|
19
Makefile
19
Makefile
@ -44,19 +44,19 @@ lxc.clean:
|
|||||||
|
|
||||||
PHONY += search.checker search.checker.%
|
PHONY += search.checker search.checker.%
|
||||||
search.checker: install
|
search.checker: install
|
||||||
$(Q)./manage pyenv.cmd searxng-checker -v
|
$(Q)./manage pyenv.cmd searx-checker -v
|
||||||
|
|
||||||
search.checker.%: install
|
search.checker.%: install
|
||||||
$(Q)./manage pyenv.cmd searxng-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
|
$(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
|
||||||
|
|
||||||
PHONY += test ci.test test.shell
|
PHONY += test ci.test test.shell
|
||||||
ci.test: test.yamllint test.black test.types.ci test.pylint test.unit test.robot test.rst test.shell test.pybabel test.themes
|
ci.test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.pybabel
|
||||||
test: test.yamllint test.black test.types.dev test.pylint test.unit test.robot test.rst test.shell
|
test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.shell
|
||||||
test.shell:
|
test.shell:
|
||||||
$(Q)shellcheck -x -s dash \
|
$(Q)shellcheck -x -s dash \
|
||||||
dockerfiles/docker-entrypoint.sh
|
dockerfiles/docker-entrypoint.sh
|
||||||
$(Q)shellcheck -x -s bash \
|
$(Q)shellcheck -x -s bash \
|
||||||
utils/brand.sh \
|
utils/brand.env \
|
||||||
$(MTOOLS) \
|
$(MTOOLS) \
|
||||||
utils/lib.sh \
|
utils/lib.sh \
|
||||||
utils/lib_sxng*.sh \
|
utils/lib_sxng*.sh \
|
||||||
@ -74,18 +74,19 @@ test.shell:
|
|||||||
|
|
||||||
# wrap ./manage script
|
# wrap ./manage script
|
||||||
|
|
||||||
|
MANAGE += buildenv
|
||||||
MANAGE += weblate.translations.commit weblate.push.translations
|
MANAGE += weblate.translations.commit weblate.push.translations
|
||||||
MANAGE += data.all data.traits data.useragents data.locales
|
MANAGE += data.all data.traits data.useragents
|
||||||
MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
|
MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
|
||||||
MANAGE += docker.build docker.push docker.buildx
|
MANAGE += docker.build docker.push docker.buildx
|
||||||
MANAGE += gecko.driver
|
MANAGE += gecko.driver
|
||||||
MANAGE += node.env node.env.dev node.clean
|
MANAGE += node.env node.env.dev node.clean
|
||||||
MANAGE += py.build py.clean
|
MANAGE += py.build py.clean
|
||||||
MANAGE += pyenv pyenv.install pyenv.uninstall
|
MANAGE += pyenv pyenv.install pyenv.uninstall
|
||||||
|
MANAGE += pypi.upload pypi.upload.test
|
||||||
MANAGE += format.python
|
MANAGE += format.python
|
||||||
MANAGE += test.yamllint test.pylint test.black test.pybabel test.unit test.coverage test.robot test.rst test.clean test.themes test.types.dev test.types.ci
|
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.fix themes.test
|
MANAGE += themes.all themes.simple themes.simple.test pygments.less
|
||||||
MANAGE += themes.simple themes.simple.pygments themes.simple.fix
|
|
||||||
MANAGE += static.build.commit static.build.drop static.build.restore
|
MANAGE += static.build.commit static.build.drop static.build.restore
|
||||||
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
|
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
|
||||||
|
|
||||||
|
10
README.rst
10
README.rst
@ -10,10 +10,6 @@
|
|||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
This is a clone of the original SearXNG project.
|
|
||||||
The only addition by retoor is the compose.yml file.
|
|
||||||
Running this server is just `docker compose up` and it will run on 127.0.0.1:8088.
|
|
||||||
|
|
||||||
Privacy-respecting, hackable `metasearch engine`_
|
Privacy-respecting, hackable `metasearch engine`_
|
||||||
|
|
||||||
Searx.space_ lists ready-to-use running instances.
|
Searx.space_ lists ready-to-use running instances.
|
||||||
@ -70,7 +66,7 @@ A user_, admin_ and developer_ handbook is available on the homepage_.
|
|||||||
Contact
|
Contact
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Ask questions or chat with the SearXNG community (this not a chatbot) on
|
Ask questions or just chat about SearXNG on
|
||||||
|
|
||||||
IRC
|
IRC
|
||||||
`#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_
|
`#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_
|
||||||
@ -125,9 +121,9 @@ You can contribute from your browser using `GitHub Codespaces`_:
|
|||||||
- Click on the ``Codespaces`` tab instead of ``Local``
|
- Click on the ``Codespaces`` tab instead of ``Local``
|
||||||
- Click on ``Create codespace on master``
|
- Click on ``Create codespace on master``
|
||||||
- VSCode is going to start in the browser
|
- VSCode is going to start in the browser
|
||||||
- Wait for ``git pull && make install`` to appear and then disappear
|
- Wait for ``git pull && make install`` to appears and then to disapear
|
||||||
- You have `120 hours per month`_ (see also your `list of existing Codespaces`_)
|
- 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``
|
- 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
|
.. _GitHub Codespaces: https://docs.github.com/en/codespaces/overview
|
||||||
.. _120 hours per month: https://github.com/settings/billing
|
.. _120 hours per month: https://github.com/settings/billing
|
||||||
|
30
compose.yml
30
compose.yml
@ -1,30 +0,0 @@
|
|||||||
services:
|
|
||||||
searxng:
|
|
||||||
restart: always
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
args:
|
|
||||||
SEARXNG_GID: 977
|
|
||||||
SEARXNG_UID: 977
|
|
||||||
LABEL_DATE: ""
|
|
||||||
GIT_URL: "unknown"
|
|
||||||
SEARXNG_GIT_VERSION: "unknown"
|
|
||||||
SEARXNG_DOCKER_TAG: "unknown"
|
|
||||||
LABEL_VCS_REF: ""
|
|
||||||
LABEL_VCS_URL: ""
|
|
||||||
volumes:
|
|
||||||
- ./searx:/etc/searxng
|
|
||||||
ports:
|
|
||||||
- "127.0.0.1:8088:8080"
|
|
||||||
environment:
|
|
||||||
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
|
|
||||||
entrypoint: ["/sbin/tini", "--", "/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
|
|
@ -175,4 +175,4 @@ unset MORTY_KEY
|
|||||||
|
|
||||||
# Start uwsgi
|
# Start uwsgi
|
||||||
printf 'Listen on %s\n' "${BIND_ADDRESS}"
|
printf 'Listen on %s\n' "${BIND_ADDRESS}"
|
||||||
exec uwsgi --master --uid searxng --gid searxng --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"
|
exec su-exec searxng:searxng uwsgi --master --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"
|
||||||
|
@ -4,12 +4,8 @@ uid = searxng
|
|||||||
gid = searxng
|
gid = searxng
|
||||||
|
|
||||||
# Number of workers (usually CPU count)
|
# Number of workers (usually CPU count)
|
||||||
# default value: %k (= number of CPU core, see Dockerfile)
|
workers = %k
|
||||||
workers = $(UWSGI_WORKERS)
|
threads = 4
|
||||||
|
|
||||||
# Number of threads per worker
|
|
||||||
# default value: 4 (see Dockerfile)
|
|
||||||
threads = $(UWSGI_THREADS)
|
|
||||||
|
|
||||||
# The right granted on the created socket
|
# The right granted on the created socket
|
||||||
chmod-socket = 666
|
chmod-socket = 666
|
||||||
@ -42,13 +38,9 @@ buffer-size = 8192
|
|||||||
# See https://github.com/searx/searx-docker/issues/24
|
# See https://github.com/searx/searx-docker/issues/24
|
||||||
add-header = Connection: close
|
add-header = Connection: close
|
||||||
|
|
||||||
# Follow SIGTERM convention
|
|
||||||
# See https://github.com/searxng/searxng/issues/3427
|
|
||||||
die-on-term
|
|
||||||
|
|
||||||
# uwsgi serves the static files
|
# uwsgi serves the static files
|
||||||
|
# expires set to one year since there are hashes
|
||||||
static-map = /static=/usr/local/searxng/searx/static
|
static-map = /static=/usr/local/searxng/searx/static
|
||||||
# expires set to one day
|
static-expires = /* 31557600
|
||||||
static-expires = /* 86400
|
|
||||||
static-gzip-all = True
|
static-gzip-all = True
|
||||||
offload-threads = %k
|
offload-threads = %k
|
||||||
|
@ -69,6 +69,10 @@ Sample response
|
|||||||
{
|
{
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"name": "HTTPS rewrite"
|
"name": "HTTPS rewrite"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enabled": false,
|
||||||
|
"name": "Vim-like hotkeys"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"safe_search": 0
|
"safe_search": 0
|
||||||
@ -84,9 +88,9 @@ HTML of the site. URL of the SearXNG instance and values are customizable.
|
|||||||
.. code:: html
|
.. code:: html
|
||||||
|
|
||||||
<form method="post" action="https://example.org/">
|
<form method="post" action="https://example.org/">
|
||||||
<!-- search --> <input type="text" name="q">
|
<!-- search --> <input type="text" name="q" />
|
||||||
<!-- categories --> <input type="hidden" name="categories" value="general,social media">
|
<!-- categories --> <input type="hidden" name="categories" value="general,social media" />
|
||||||
<!-- language --> <input type="hidden" name="lang" value="all">
|
<!-- language --> <input type="hidden" name="lang" value="all" />
|
||||||
<!-- locale --> <input type="hidden" name="locale" value="en">
|
<!-- locale --> <input type="hidden" name="locale" value="en" />
|
||||||
<!-- date filter --> <input type="hidden" name="time_range" value="month">
|
<!-- date filter --> <input type="hidden" name="time_range" value="month" />
|
||||||
</form>
|
</form>
|
||||||
|
@ -15,8 +15,6 @@ Administrator documentation
|
|||||||
installation-apache
|
installation-apache
|
||||||
update-searxng
|
update-searxng
|
||||||
answer-captcha
|
answer-captcha
|
||||||
searx.favicons
|
|
||||||
searx.limiter
|
|
||||||
api
|
api
|
||||||
architecture
|
architecture
|
||||||
plugins
|
plugins
|
||||||
|
@ -190,7 +190,7 @@ Debian:
|
|||||||
Apache modules
|
Apache modules
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
To load additional modules, in most distributions you have to uncomment the
|
To load additional modules, in most distributions you have to un-comment the
|
||||||
lines with the corresponding LoadModule_ directive, except in :ref:`Debian's
|
lines with the corresponding LoadModule_ directive, except in :ref:`Debian's
|
||||||
Apache layout`.
|
Apache layout`.
|
||||||
|
|
||||||
|
@ -92,9 +92,6 @@ instance using `docker run <https://docs.docker.com/engine/reference/run/>`_:
|
|||||||
searxng/searxng
|
searxng/searxng
|
||||||
2f998.... # container's ID
|
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:
|
Open your WEB browser and visit the URL:
|
||||||
|
|
||||||
.. code:: sh
|
.. code:: sh
|
||||||
|
@ -96,7 +96,7 @@ Modify the ``/etc/searxng/settings.yml`` to your needs:
|
|||||||
|
|
||||||
.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
|
.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
|
||||||
:language: yaml
|
:language: yaml
|
||||||
:end-before: # hostnames:
|
:end-before: # hostname_replace:
|
||||||
|
|
||||||
To see the entire file jump to :origin:`utils/templates/etc/searxng/settings.yml`
|
To see the entire file jump to :origin:`utils/templates/etc/searxng/settings.yml`
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ Modify the ``/etc/searxng/settings.yml`` to your needs:
|
|||||||
|
|
||||||
.. literalinclude:: ../../searx/settings.yml
|
.. literalinclude:: ../../searx/settings.yml
|
||||||
:language: yaml
|
:language: yaml
|
||||||
:end-before: # hostnames:
|
:end-before: # hostname_replace:
|
||||||
|
|
||||||
To see the entire file jump to :origin:`searx/settings.yml`
|
To see the entire file jump to :origin:`searx/settings.yml`
|
||||||
|
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
.. _plugins admin:
|
.. _plugins generic:
|
||||||
|
|
||||||
===============
|
===============
|
||||||
List of plugins
|
Plugins builtin
|
||||||
===============
|
===============
|
||||||
|
|
||||||
.. sidebar:: Further reading ..
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
- :ref:`SearXNG settings <settings plugins>`
|
|
||||||
- :ref:`dev plugin`
|
- :ref:`dev plugin`
|
||||||
- :ref:`builtin plugins`
|
|
||||||
|
|
||||||
Configuration defaults (at built time):
|
Configuration defaults (at built time):
|
||||||
|
|
||||||
@ -27,10 +25,15 @@ Configuration defaults (at built time):
|
|||||||
- DO
|
- DO
|
||||||
- Description
|
- Description
|
||||||
|
|
||||||
{% for plg in plugins %}
|
JS & CSS dependencies
|
||||||
|
|
||||||
* - {{plg.info.name}}
|
{% for plgin in plugins %}
|
||||||
- {{(plg.default_on and "y") or ""}}
|
|
||||||
- {{plg.info.description}}
|
* - {{plgin.name}}
|
||||||
|
- {{(plgin.default_on and "y") or ""}}
|
||||||
|
- {{plgin.description}}
|
||||||
|
|
||||||
|
{% for dep in (plgin.js_dependencies + plgin.css_dependencies) %}
|
||||||
|
| ``{{dep}}`` {% endfor %}
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -1,251 +0,0 @@
|
|||||||
.. _favicons:
|
|
||||||
|
|
||||||
========
|
|
||||||
Favicons
|
|
||||||
========
|
|
||||||
|
|
||||||
.. sidebar:: warning
|
|
||||||
|
|
||||||
Don't activate the favicons before reading the documentation.
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
Activating the favicons in SearXNG is very easy, but this **generates a
|
|
||||||
significantly higher load** in the client/server communication and increases
|
|
||||||
resources needed on the server.
|
|
||||||
|
|
||||||
To mitigate these disadvantages, various methods have been implemented,
|
|
||||||
including a *cache*. The cache must be parameterized according to your own
|
|
||||||
requirements and maintained regularly.
|
|
||||||
|
|
||||||
To activate favicons in SearXNG's result list, set a default
|
|
||||||
``favicon_resolver`` in the :ref:`search <settings search>` settings:
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
search:
|
|
||||||
favicon_resolver: "duckduckgo"
|
|
||||||
|
|
||||||
By default and without any extensions, SearXNG serves these resolvers:
|
|
||||||
|
|
||||||
- ``duckduckgo``
|
|
||||||
- ``allesedv``
|
|
||||||
- ``google``
|
|
||||||
- ``yandex``
|
|
||||||
|
|
||||||
With the above setting favicons are displayed, the user has the option to
|
|
||||||
deactivate this feature in his settings. If the user is to have the option of
|
|
||||||
selecting from several *resolvers*, a further setting is required / but this
|
|
||||||
setting will be discussed :ref:`later <register resolvers>` in this article,
|
|
||||||
first we have to setup the favicons cache.
|
|
||||||
|
|
||||||
Infrastructure
|
|
||||||
==============
|
|
||||||
|
|
||||||
The infrastructure for providing the favicons essentially consists of three
|
|
||||||
parts:
|
|
||||||
|
|
||||||
- :py:obj:`Favicons-Proxy <.favicons.proxy>` (aka *proxy*)
|
|
||||||
- :py:obj:`Favicons-Resolvers <.favicons.resolvers>` (aka *resolver*)
|
|
||||||
- :py:obj:`Favicons-Cache <.favicons.cache>` (aka *cache*)
|
|
||||||
|
|
||||||
To protect the privacy of users, the favicons are provided via a *proxy*. This
|
|
||||||
*proxy* is automatically activated with the above activation of a *resolver*.
|
|
||||||
Additional requests are required to provide the favicons: firstly, the *proxy*
|
|
||||||
must process the incoming requests and secondly, the *resolver* must make
|
|
||||||
outgoing requests to obtain the favicons from external sources.
|
|
||||||
|
|
||||||
A *cache* has been developed to massively reduce both, incoming and outgoing
|
|
||||||
requests. This *cache* is also activated automatically with the above
|
|
||||||
activation of a *resolver*. In its defaults, however, the *cache* is minimal
|
|
||||||
and not well suitable for a production environment!
|
|
||||||
|
|
||||||
.. _favicon cache setup:
|
|
||||||
|
|
||||||
Setting up the cache
|
|
||||||
====================
|
|
||||||
|
|
||||||
To parameterize the *cache* and more settings of the favicons infrastructure, a
|
|
||||||
TOML_ configuration is created in the file ``/etc/searxng/favicons.toml``.
|
|
||||||
|
|
||||||
.. code:: toml
|
|
||||||
|
|
||||||
[favicons]
|
|
||||||
|
|
||||||
cfg_schema = 1 # config's schema version no.
|
|
||||||
|
|
||||||
[favicons.cache]
|
|
||||||
|
|
||||||
db_url = "/var/cache/searxng/faviconcache.db" # default: "/tmp/faviconcache.db"
|
|
||||||
LIMIT_TOTAL_BYTES = 2147483648 # 2 GB / default: 50 MB
|
|
||||||
# HOLD_TIME = 5184000 # 60 days / default: 30 days
|
|
||||||
# BLOB_MAX_BYTES = 40960 # 40 KB / default 20 KB
|
|
||||||
# MAINTENANCE_MODE = "off" # default: "auto"
|
|
||||||
# MAINTENANCE_PERIOD = 600 # 10min / default: 1h
|
|
||||||
|
|
||||||
:py:obj:`cfg_schema <.FaviconConfig.cfg_schema>`:
|
|
||||||
Is required to trigger any processes required for future upgrades / don't
|
|
||||||
change it.
|
|
||||||
|
|
||||||
:py:obj:`cache.db_url <.FaviconCacheConfig.db_url>`:
|
|
||||||
The path to the (SQLite_) database file. The default path is in the `/tmp`_
|
|
||||||
folder, which is deleted on every reboot and is therefore unsuitable for a
|
|
||||||
production environment. The FHS_ provides the folder for the
|
|
||||||
application cache
|
|
||||||
|
|
||||||
The FHS_ provides the folder `/var/cache`_ for the cache of applications, so a
|
|
||||||
suitable storage location of SearXNG's caches is folder ``/var/cache/searxng``.
|
|
||||||
In container systems, a volume should be mounted for this folder and in a
|
|
||||||
standard installation (compare :ref:`create searxng user`), the folder must be
|
|
||||||
created and the user under which the SearXNG process is running must be given
|
|
||||||
write permission to this folder.
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ sudo mkdir /var/cache/searxng
|
|
||||||
$ sudo chown root:searxng /var/cache/searxng/
|
|
||||||
$ sudo chmod g+w /var/cache/searxng/
|
|
||||||
|
|
||||||
:py:obj:`cache.LIMIT_TOTAL_BYTES <.FaviconCacheConfig.LIMIT_TOTAL_BYTES>`:
|
|
||||||
Maximum of bytes stored in the cache of all blobs. The limit is only reached
|
|
||||||
at each maintenance interval after which the oldest BLOBs are deleted; the
|
|
||||||
limit is exceeded during the maintenance period.
|
|
||||||
|
|
||||||
.. attention::
|
|
||||||
|
|
||||||
If the maintenance period is too long or maintenance is switched
|
|
||||||
off completely, the cache grows uncontrollably.
|
|
||||||
|
|
||||||
SearXNG hosters can change other parameters of the cache as required:
|
|
||||||
|
|
||||||
- :py:obj:`cache.HOLD_TIME <.FaviconCacheConfig.HOLD_TIME>`
|
|
||||||
- :py:obj:`cache.BLOB_MAX_BYTES <.FaviconCacheConfig.BLOB_MAX_BYTES>`
|
|
||||||
|
|
||||||
|
|
||||||
Maintenance of the cache
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
Regular maintenance of the cache is required! By default, regular maintenance
|
|
||||||
is triggered automatically as part of the client requests:
|
|
||||||
|
|
||||||
- :py:obj:`cache.MAINTENANCE_MODE <.FaviconCacheConfig.MAINTENANCE_MODE>` (default ``auto``)
|
|
||||||
- :py:obj:`cache.MAINTENANCE_PERIOD <.FaviconCacheConfig.MAINTENANCE_PERIOD>` (default ``6000`` / 1h)
|
|
||||||
|
|
||||||
As an alternative to maintenance as part of the client request process, it is
|
|
||||||
also possible to carry out maintenance using an external process. For example,
|
|
||||||
by creating a :man:`crontab` entry for maintenance:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ python -m searx.favicons cache maintenance
|
|
||||||
|
|
||||||
The following command can be used to display the state of the cache:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ python -m searx.favicons cache state
|
|
||||||
|
|
||||||
|
|
||||||
.. _favicon proxy setup:
|
|
||||||
|
|
||||||
Proxy configuration
|
|
||||||
===================
|
|
||||||
|
|
||||||
Most of the options of the :py:obj:`Favicons-Proxy <.favicons.proxy>` are
|
|
||||||
already set sensibly with settings from the :ref:`settings.yml <searxng
|
|
||||||
settings.yml>` and should not normally be adjusted.
|
|
||||||
|
|
||||||
.. code:: toml
|
|
||||||
|
|
||||||
[favicons.proxy]
|
|
||||||
|
|
||||||
max_age = 5184000 # 60 days / default: 7 days (604800 sec)
|
|
||||||
|
|
||||||
|
|
||||||
:py:obj:`max_age <.FaviconProxyConfig.max_age>`:
|
|
||||||
The `HTTP Cache-Control max-age`_ response directive indicates that the
|
|
||||||
response remains fresh until N seconds after the response is generated. This
|
|
||||||
setting therefore determines how long a favicon remains in the client's cache.
|
|
||||||
As a rule, in the favicons infrastructure of SearXNG's this setting only
|
|
||||||
affects favicons whose byte size exceeds :ref:`BLOB_MAX_BYTES <favicon cache
|
|
||||||
setup>` (the other favicons that are already in the cache are embedded as
|
|
||||||
`data URL`_ in the :py:obj:`generated HTML <.favicons.proxy.favicon_url>`,
|
|
||||||
which can greatly reduce the number of additional requests).
|
|
||||||
|
|
||||||
.. _register resolvers:
|
|
||||||
|
|
||||||
Register resolvers
|
|
||||||
------------------
|
|
||||||
|
|
||||||
A :py:obj:`resolver <.favicon.resolvers>` is a function that obtains the favicon
|
|
||||||
from an external source. The resolver functions available to the user are
|
|
||||||
registered with their fully qualified name (FQN_) in a ``resolver_map``.
|
|
||||||
|
|
||||||
If no ``resolver_map`` is defined in the ``favicon.toml``, the favicon
|
|
||||||
infrastructure of SearXNG generates this ``resolver_map`` automatically
|
|
||||||
depending on the ``settings.yml``. SearXNG would automatically generate the
|
|
||||||
following TOML configuration from the following YAML configuration:
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
search:
|
|
||||||
favicon_resolver: "duckduckgo"
|
|
||||||
|
|
||||||
.. code:: toml
|
|
||||||
|
|
||||||
[favicons.proxy.resolver_map]
|
|
||||||
|
|
||||||
"duckduckgo" = "searx.favicons.resolvers.duckduckgo"
|
|
||||||
|
|
||||||
If this automatism is not desired, then (and only then) a separate
|
|
||||||
``resolver_map`` must be created. For example, to give the user two resolvers to
|
|
||||||
choose from, the following configuration could be used:
|
|
||||||
|
|
||||||
.. code:: toml
|
|
||||||
|
|
||||||
[favicons.proxy.resolver_map]
|
|
||||||
|
|
||||||
"duckduckgo" = "searx.favicons.resolvers.duckduckgo"
|
|
||||||
"allesedv" = "searx.favicons.resolvers.allesedv"
|
|
||||||
# "google" = "searx.favicons.resolvers.google"
|
|
||||||
# "yandex" = "searx.favicons.resolvers.yandex"
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
With each resolver, the resource requirement increases significantly.
|
|
||||||
|
|
||||||
The number of resolvers increases:
|
|
||||||
|
|
||||||
- the number of incoming/outgoing requests and
|
|
||||||
- the number of favicons to be stored in the cache.
|
|
||||||
|
|
||||||
In the following we list the resolvers available in the core of SearXNG, but via
|
|
||||||
the FQN_ it is also possible to implement your own resolvers and integrate them
|
|
||||||
into the *proxy*:
|
|
||||||
|
|
||||||
- :py:obj:`searx.favicons.resolvers.duckduckgo`
|
|
||||||
- :py:obj:`searx.favicons.resolvers.allesedv`
|
|
||||||
- :py:obj:`searx.favicons.resolvers.google`
|
|
||||||
- :py:obj:`searx.favicons.resolvers.yandex`
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _SQLite:
|
|
||||||
https://www.sqlite.org/
|
|
||||||
.. _FHS:
|
|
||||||
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html
|
|
||||||
.. _`/var/cache`:
|
|
||||||
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s05.html
|
|
||||||
.. _`/tmp`:
|
|
||||||
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html
|
|
||||||
.. _TOML:
|
|
||||||
https://toml.io/en/
|
|
||||||
.. _HTTP Cache-Control max-age:
|
|
||||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#response_directives
|
|
||||||
.. _data URL:
|
|
||||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
|
|
||||||
.. _FQN: https://en.wikipedia.org/wiki/Fully_qualified_name
|
|
||||||
|
|
@ -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,5 +1,3 @@
|
|||||||
.. _searxng settings.yml:
|
|
||||||
|
|
||||||
========
|
========
|
||||||
Settings
|
Settings
|
||||||
========
|
========
|
||||||
@ -22,6 +20,6 @@ Settings
|
|||||||
settings_redis
|
settings_redis
|
||||||
settings_outgoing
|
settings_outgoing
|
||||||
settings_categories_as_tabs
|
settings_categories_as_tabs
|
||||||
settings_plugins
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ Example configuration to restrict access to the Arch Linux Wiki engine:
|
|||||||
tokens: [ 'my-secret-token' ]
|
tokens: [ 'my-secret-token' ]
|
||||||
|
|
||||||
Unless a user has configured the right token, the engine is going to be hidden
|
Unless a user has configured the right token, the engine is going to be hidden
|
||||||
from them. It is not going to be included in the list of engines on the
|
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.
|
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 can be added to one's configuration on the Preferences page under "Engine
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
donation_url: false
|
donation_url: false
|
||||||
contact_url: false
|
contact_url: false
|
||||||
enable_metrics: true
|
enable_metrics: true
|
||||||
open_metrics: ''
|
|
||||||
|
|
||||||
``debug`` : ``$SEARXNG_DEBUG``
|
``debug`` : ``$SEARXNG_DEBUG``
|
||||||
Allow a more detailed log if you run SearXNG directly. Display *detailed* error
|
Allow a more detailed log if you run SearXNG directly. Display *detailed* error
|
||||||
@ -33,10 +32,3 @@
|
|||||||
``enable_metrics``:
|
``enable_metrics``:
|
||||||
Enabled by default. Record various anonymous metrics available at ``/stats``,
|
Enabled by default. Record various anonymous metrics available at ``/stats``,
|
||||||
``/stats/errors`` and ``/preferences``.
|
``/stats/errors`` and ``/preferences``.
|
||||||
|
|
||||||
``open_metrics``:
|
|
||||||
Disabled by default. Set to a secret password to expose an
|
|
||||||
`OpenMetrics API <https://github.com/prometheus/OpenMetrics>`_ at ``/metrics``,
|
|
||||||
e.g. for usage with Prometheus. The ``/metrics`` endpoint is using HTTP Basic Auth,
|
|
||||||
where the password is the value of ``open_metrics`` set above. The username used for
|
|
||||||
Basic Auth can be randomly chosen as only the password is being validated.
|
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
.. _settings plugins:
|
|
||||||
|
|
||||||
=======
|
|
||||||
Plugins
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. sidebar:: Further reading ..
|
|
||||||
|
|
||||||
- :ref:`plugins admin`
|
|
||||||
- :ref:`dev plugin`
|
|
||||||
- :ref:`builtin plugins`
|
|
||||||
|
|
||||||
|
|
||||||
The built-in plugins can be activated or deactivated via the settings
|
|
||||||
(:ref:`settings enabled_plugins`) and external plugins can be integrated into
|
|
||||||
SearXNG (:ref:`settings external_plugins`).
|
|
||||||
|
|
||||||
|
|
||||||
.. _settings enabled_plugins:
|
|
||||||
|
|
||||||
``enabled_plugins:`` (internal)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
In :ref:`plugins admin` you find a complete list of all plugins, the default
|
|
||||||
configuration looks like:
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
enabled_plugins:
|
|
||||||
- 'Basic Calculator'
|
|
||||||
- 'Hash plugin'
|
|
||||||
- 'Self Information'
|
|
||||||
- 'Tracker URL remover'
|
|
||||||
- 'Unit converter plugin'
|
|
||||||
- 'Ahmia blacklist'
|
|
||||||
|
|
||||||
|
|
||||||
.. _settings external_plugins:
|
|
||||||
|
|
||||||
``plugins:`` (external)
|
|
||||||
=======================
|
|
||||||
|
|
||||||
SearXNG supports *external plugins* / there is no need to install one, SearXNG
|
|
||||||
runs out of the box. But to demonstrate; in the example below we install the
|
|
||||||
SearXNG plugins from *The Green Web Foundation* `[ref]
|
|
||||||
<https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/>`__:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ sudo utils/searxng.sh instance cmd bash -c
|
|
||||||
(searxng-pyenv)$ pip install git+https://github.com/return42/tgwf-searx-plugins
|
|
||||||
|
|
||||||
In the :ref:`settings.yml` activate the ``plugins:`` section and add module
|
|
||||||
``only_show_green_results`` from ``tgwf-searx-plugins``.
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
plugins:
|
|
||||||
- only_show_green_results
|
|
||||||
# - mypackage.mymodule.MyPlugin
|
|
||||||
# - mypackage.mymodule.MyOtherPlugin
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
``only_show_green_results`` is an old plugin that was still implemented in
|
|
||||||
the old style. There is a legacy treatment for backward compatibility, but
|
|
||||||
new plugins should be implemented as a :py:obj:`searx.plugins.Plugin` class.
|
|
@ -9,7 +9,6 @@
|
|||||||
search:
|
search:
|
||||||
safe_search: 0
|
safe_search: 0
|
||||||
autocomplete: ""
|
autocomplete: ""
|
||||||
favicon_resolver: ""
|
|
||||||
default_lang: ""
|
default_lang: ""
|
||||||
ban_time_on_fail: 5
|
ban_time_on_fail: 5
|
||||||
max_ban_time_on_fail: 120
|
max_ban_time_on_fail: 120
|
||||||
@ -33,24 +32,14 @@
|
|||||||
``autocomplete``:
|
``autocomplete``:
|
||||||
Existing autocomplete backends, leave blank to turn it off.
|
Existing autocomplete backends, leave blank to turn it off.
|
||||||
|
|
||||||
- ``baidu```
|
- ``dbpedia``
|
||||||
- ``brave```
|
- ``duckduckgo``
|
||||||
- ``dbpedia```
|
- ``google``
|
||||||
- ``duckduckgo```
|
- ``mwmbl``
|
||||||
- ``google```
|
- ``startpage``
|
||||||
- ``mwmbl```
|
- ``swisscows``
|
||||||
- ``qwant```
|
- ``qwant``
|
||||||
- ``seznam```
|
- ``wikipedia``
|
||||||
- ``startpage```
|
|
||||||
- ``stract```
|
|
||||||
- ``swisscows```
|
|
||||||
- ``wikipedia```
|
|
||||||
- ``yandex```
|
|
||||||
|
|
||||||
``favicon_resolver``:
|
|
||||||
To activate favicons in SearXNG's result list select a default
|
|
||||||
favicon-resolver, leave blank to turn off the feature. Don't activate the
|
|
||||||
favicons before reading the :ref:`Favicons documentation <favicons>`.
|
|
||||||
|
|
||||||
``default_lang``:
|
``default_lang``:
|
||||||
Default search language - leave blank to detect from browser information or
|
Default search language - leave blank to detect from browser information or
|
||||||
|
@ -12,42 +12,39 @@
|
|||||||
bind_address: "127.0.0.1"
|
bind_address: "127.0.0.1"
|
||||||
secret_key: "ultrasecretkey" # change this!
|
secret_key: "ultrasecretkey" # change this!
|
||||||
limiter: false
|
limiter: false
|
||||||
public_instance: false
|
|
||||||
image_proxy: false
|
image_proxy: false
|
||||||
default_http_headers:
|
default_http_headers:
|
||||||
X-Content-Type-Options : nosniff
|
X-Content-Type-Options : nosniff
|
||||||
|
X-XSS-Protection : 1; mode=block
|
||||||
X-Download-Options : noopen
|
X-Download-Options : noopen
|
||||||
X-Robots-Tag : noindex, nofollow
|
X-Robots-Tag : noindex, nofollow
|
||||||
Referrer-Policy : no-referrer
|
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``
|
``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv <make buildenv>`
|
||||||
|
The base URL where SearXNG is deployed. Used to create correct inbound links.
|
||||||
|
If you change the value, don't forget to rebuild instance's environment
|
||||||
|
(:ref:`utils/brand.env <make buildenv>`)
|
||||||
|
|
||||||
|
``port`` & ``bind_address``: ``$SEARXNG_PORT`` & ``$SEARXNG_BIND_ADDRESS`` :ref:`buildenv <make buildenv>`
|
||||||
Port number and *bind address* of the SearXNG web application if you run it
|
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
|
directly using ``python searx/webapp.py``. Doesn't apply to a SearXNG
|
||||||
services running behind a proxy and using socket communications.
|
services running behind a proxy and using socket communications. If you
|
||||||
|
change the value, don't forget to rebuild instance's environment
|
||||||
|
(:ref:`utils/brand.env <make buildenv>`)
|
||||||
|
|
||||||
``secret_key`` : ``$SEARXNG_SECRET``
|
``secret_key`` : ``$SEARXNG_SECRET``
|
||||||
Used for cryptography purpose.
|
Used for cryptography purpose.
|
||||||
|
|
||||||
``limiter`` : ``$SEARXNG_LIMITER``
|
.. _limiter:
|
||||||
|
|
||||||
|
``limiter`` :
|
||||||
Rate limit the number of request on the instance, block some bots. The
|
Rate limit the number of request on the instance, block some bots. The
|
||||||
:ref:`limiter` requires a :ref:`settings redis` database.
|
:ref:`limiter src` requires a :ref:`settings redis` database.
|
||||||
|
|
||||||
.. _public_instance:
|
|
||||||
|
|
||||||
``public_instance`` : ``$SEARXNG_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:
|
||||||
|
|
||||||
``image_proxy`` : ``$SEARXNG_IMAGE_PROXY``
|
``image_proxy`` :
|
||||||
Allow your instance of SearXNG of being able to proxy images. Uses memory space.
|
Allow your instance of SearXNG of being able to proxy images. Uses memory space.
|
||||||
|
|
||||||
.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
|
.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
|
||||||
|
@ -19,13 +19,10 @@
|
|||||||
default_theme: simple
|
default_theme: simple
|
||||||
theme_args:
|
theme_args:
|
||||||
simple_style: auto
|
simple_style: auto
|
||||||
search_on_category_select: true
|
|
||||||
hotkeys: default
|
|
||||||
url_formatting: pretty
|
|
||||||
|
|
||||||
.. _static_use_hash:
|
.. _static_use_hash:
|
||||||
|
|
||||||
``static_use_hash`` : ``$SEARXNG_STATIC_USE_HASH``
|
``static_use_hash`` :
|
||||||
Enables `cache busting`_ of static files.
|
Enables `cache busting`_ of static files.
|
||||||
|
|
||||||
``default_locale`` :
|
``default_locale`` :
|
||||||
@ -59,16 +56,7 @@
|
|||||||
Name of the theme you want to use by default on your SearXNG instance.
|
Name of the theme you want to use by default on your SearXNG instance.
|
||||||
|
|
||||||
``theme_args.simple_style``:
|
``theme_args.simple_style``:
|
||||||
Style of simple theme: ``auto``, ``light``, ``dark``, ``black``
|
Style of simple theme: ``auto``, ``light``, ``dark``
|
||||||
|
|
||||||
``results_on_new_tab``:
|
``results_on_new_tab``:
|
||||||
Open result links in a new tab by default.
|
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).
|
|
||||||
|
|
||||||
``url_formatting``:
|
|
||||||
Formatting type to use for result URLs: ``pretty``, ``full`` or ``host``.
|
|
||||||
|
@ -113,7 +113,7 @@ ${fedora_build}
|
|||||||
|
|
||||||
(${SERVICE_USER})$ command -v python && python --version
|
(${SERVICE_USER})$ command -v python && python --version
|
||||||
$SEARXNG_PYENV/bin/python
|
$SEARXNG_PYENV/bin/python
|
||||||
Python 3.11.10
|
Python 3.8.1
|
||||||
|
|
||||||
# update pip's boilerplate ..
|
# update pip's boilerplate ..
|
||||||
pip install -U pip
|
pip install -U pip
|
||||||
@ -123,7 +123,7 @@ ${fedora_build}
|
|||||||
|
|
||||||
# jump to SearXNG's working tree and install SearXNG into virtualenv
|
# jump to SearXNG's working tree and install SearXNG into virtualenv
|
||||||
(${SERVICE_USER})$ cd \"$SEARXNG_SRC\"
|
(${SERVICE_USER})$ cd \"$SEARXNG_SRC\"
|
||||||
(${SERVICE_USER})$ pip install --use-pep517 --no-build-isolation -e .
|
(${SERVICE_USER})$ pip install -e .
|
||||||
|
|
||||||
|
|
||||||
.. END manage.sh update_packages
|
.. END manage.sh update_packages
|
||||||
|
11
docs/conf.py
11
docs/conf.py
@ -1,7 +1,7 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
import sys, os
|
import sys, os
|
||||||
from pathlib import Path
|
|
||||||
from pallets_sphinx_themes import ProjectLink
|
from pallets_sphinx_themes import ProjectLink
|
||||||
|
|
||||||
from searx import get_setting
|
from searx import get_setting
|
||||||
@ -13,6 +13,7 @@ project = 'SearXNG'
|
|||||||
copyright = 'SearXNG team'
|
copyright = 'SearXNG team'
|
||||||
author = 'SearXNG team'
|
author = 'SearXNG team'
|
||||||
release, version = VERSION_STRING, VERSION_STRING
|
release, version = VERSION_STRING, VERSION_STRING
|
||||||
|
|
||||||
SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng'
|
SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng'
|
||||||
ISSUE_URL = get_setting('brand.issue_url')
|
ISSUE_URL = get_setting('brand.issue_url')
|
||||||
DOCS_URL = get_setting('brand.docs_url')
|
DOCS_URL = get_setting('brand.docs_url')
|
||||||
@ -21,9 +22,6 @@ PRIVACYPOLICY_URL = get_setting('general.privacypolicy_url')
|
|||||||
CONTACT_URL = get_setting('general.contact_url')
|
CONTACT_URL = get_setting('general.contact_url')
|
||||||
WIKI_URL = get_setting('brand.wiki_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
|
# hint: sphinx.ext.viewcode won't highlight when 'highlight_language' [1] is set
|
||||||
# to string 'none' [2]
|
# to string 'none' [2]
|
||||||
#
|
#
|
||||||
@ -54,7 +52,7 @@ searx.engines.load_engines(searx.settings['engines'])
|
|||||||
jinja_contexts = {
|
jinja_contexts = {
|
||||||
'searx': {
|
'searx': {
|
||||||
'engines': searx.engines.engines,
|
'engines': searx.engines.engines,
|
||||||
'plugins': searx.plugins.STORAGE,
|
'plugins': searx.plugins.plugins,
|
||||||
'version': {
|
'version': {
|
||||||
'node': os.getenv('NODE_MINIMUM_VERSION')
|
'node': os.getenv('NODE_MINIMUM_VERSION')
|
||||||
},
|
},
|
||||||
@ -129,9 +127,8 @@ extensions = [
|
|||||||
'notfound.extension', # https://github.com/readthedocs/sphinx-notfound-page
|
'notfound.extension', # https://github.com/readthedocs/sphinx-notfound-page
|
||||||
]
|
]
|
||||||
|
|
||||||
# autodoc_typehints = "description"
|
|
||||||
autodoc_default_options = {
|
autodoc_default_options = {
|
||||||
'member-order': 'bysource',
|
'member-order': 'groupwise',
|
||||||
}
|
}
|
||||||
|
|
||||||
myst_enable_extensions = [
|
myst_enable_extensions = [
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
.. _builtin answerers:
|
|
||||||
|
|
||||||
==================
|
|
||||||
Built-in Answerers
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
random
|
|
||||||
statistics
|
|
@ -1,7 +0,0 @@
|
|||||||
.. _dev answerers:
|
|
||||||
|
|
||||||
====================
|
|
||||||
Answerer Development
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. automodule:: searx.answerers
|
|
@ -1,9 +0,0 @@
|
|||||||
=========
|
|
||||||
Answerers
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
development
|
|
||||||
builtins
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _answerer.random:
|
|
||||||
|
|
||||||
======
|
|
||||||
Random
|
|
||||||
======
|
|
||||||
|
|
||||||
.. autoclass:: searx.answerers.random.SXNGAnswerer
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _answerer.statistics:
|
|
||||||
|
|
||||||
==========
|
|
||||||
Statistics
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. autoclass:: searx.answerers.statistics.SXNGAnswerer
|
|
||||||
:members:
|
|
@ -87,8 +87,8 @@ For a more detailed description, see :ref:`settings engine` in the :ref:`settin
|
|||||||
Overrides
|
Overrides
|
||||||
---------
|
---------
|
||||||
|
|
||||||
A few of the options have default values in the namespace of the engine's python
|
A few of the options have default values in the namespace of engine's python
|
||||||
module, but are often overwritten by the settings. If ``None`` is assigned to an
|
modul, 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
|
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
|
SearXNG will not start with that engine (global names with a leading underline can
|
||||||
be ``None``).
|
be ``None``).
|
||||||
@ -237,18 +237,232 @@ following parameters can be used to specify a search request:
|
|||||||
=================== =========== ==========================================================================
|
=================== =========== ==========================================================================
|
||||||
|
|
||||||
|
|
||||||
Making a Response
|
.. _engine results:
|
||||||
=================
|
.. _engine media types:
|
||||||
|
|
||||||
In the ``response`` function of the engine, the HTTP response (``resp``) is
|
Result Types (``template``)
|
||||||
parsed and a list of results is returned.
|
===========================
|
||||||
|
|
||||||
A engine can append result-items of different media-types and different
|
Each result item of an engine can be of different media-types. Currently the
|
||||||
result-types to the result list. The list of the result items is render to HTML
|
following media-types are supported. To set another media-type as
|
||||||
by templates. For more details read section:
|
:ref:`template default`, the parameter ``template`` must be set to the desired
|
||||||
|
type.
|
||||||
|
|
||||||
- :ref:`simple theme templates`
|
.. _template default:
|
||||||
- :ref:`result types`
|
|
||||||
|
``default``
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **default** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template images:
|
||||||
|
|
||||||
|
``images``
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **images** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``images.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url to the result site
|
||||||
|
title string, title of the result *(partly implemented)*
|
||||||
|
content *(partly implemented)*
|
||||||
|
publishedDate :py:class:`datetime.datetime`,
|
||||||
|
time of publish *(partly implemented)*
|
||||||
|
img\_src string, url to the result image
|
||||||
|
thumbnail\_src string, url to a small-preview image
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template videos:
|
||||||
|
|
||||||
|
``videos``
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **videos** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``videos.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content *(not implemented yet)*
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
thumbnail string, url to a small-preview image
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template torrent:
|
||||||
|
|
||||||
|
``torrent``
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. _magnetlink: https://en.wikipedia.org/wiki/Magnet_URI_scheme
|
||||||
|
|
||||||
|
.. table:: Parameter of the **torrent** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``torrent.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`,
|
||||||
|
time of publish *(not implemented yet)*
|
||||||
|
seed int, number of seeder
|
||||||
|
leech int, number of leecher
|
||||||
|
filesize int, size of file in bytes
|
||||||
|
files int, number of files
|
||||||
|
magnetlink string, magnetlink_ of the result
|
||||||
|
torrentfile string, torrentfile of the result
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template map:
|
||||||
|
|
||||||
|
``map``
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. table:: Parameter of the **map** media type:
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
========================= =====================================================
|
||||||
|
result-parameter information
|
||||||
|
------------------------- -----------------------------------------------------
|
||||||
|
template is set to ``map.html``
|
||||||
|
========================= =====================================================
|
||||||
|
url string, url of the result
|
||||||
|
title string, title of the result
|
||||||
|
content string, general result-text
|
||||||
|
publishedDate :py:class:`datetime.datetime`, time of publish
|
||||||
|
latitude latitude of result (in decimal format)
|
||||||
|
longitude longitude of result (in decimal format)
|
||||||
|
boundingbox boundingbox of result (array of 4. values
|
||||||
|
``[lat-min, lat-max, lon-min, lon-max]``)
|
||||||
|
geojson geojson of result (https://geojson.org/)
|
||||||
|
osm.type type of osm-object (if OSM-Result)
|
||||||
|
osm.id id of osm-object (if OSM-Result)
|
||||||
|
address.name name of object
|
||||||
|
address.road street name of object
|
||||||
|
address.house_number house number of object
|
||||||
|
address.locality city, place of object
|
||||||
|
address.postcode postcode of object
|
||||||
|
address.country country of object
|
||||||
|
========================= =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
.. _template paper:
|
||||||
|
|
||||||
|
``paper``
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. _BibTeX format: https://www.bibtex.com/g/bibtex-format/
|
||||||
|
.. _BibTeX field types: https://en.wikipedia.org/wiki/BibTeX#Field_types
|
||||||
|
|
||||||
|
.. list-table:: Parameter of the **paper** media type /
|
||||||
|
see `BibTeX field types`_ and `BibTeX format`_
|
||||||
|
:header-rows: 2
|
||||||
|
:width: 100%
|
||||||
|
|
||||||
|
* - result-parameter
|
||||||
|
- Python type
|
||||||
|
- information
|
||||||
|
|
||||||
|
* - template
|
||||||
|
- :py:class:`str`
|
||||||
|
- is set to ``paper.html``
|
||||||
|
|
||||||
|
* - title
|
||||||
|
- :py:class:`str`
|
||||||
|
- title of the result
|
||||||
|
|
||||||
|
* - content
|
||||||
|
- :py:class:`str`
|
||||||
|
- abstract
|
||||||
|
|
||||||
|
* - comments
|
||||||
|
- :py:class:`str`
|
||||||
|
- free text display in italic below the content
|
||||||
|
|
||||||
|
* - tags
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- free tag list
|
||||||
|
|
||||||
|
* - publishedDate
|
||||||
|
- :py:class:`datetime <datetime.datetime>`
|
||||||
|
- last publication date
|
||||||
|
|
||||||
|
* - type
|
||||||
|
- :py:class:`str`
|
||||||
|
- short description of medium type, e.g. *book*, *pdf* or *html* ...
|
||||||
|
|
||||||
|
* - authors
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- list of authors of the work (authors with a "s")
|
||||||
|
|
||||||
|
* - editor
|
||||||
|
- :py:class:`str`
|
||||||
|
- list of editors of a book
|
||||||
|
|
||||||
|
* - publisher
|
||||||
|
- :py:class:`str`
|
||||||
|
- name of the publisher
|
||||||
|
|
||||||
|
* - journal
|
||||||
|
- :py:class:`str`
|
||||||
|
- name of the journal or magazine the article was
|
||||||
|
published in
|
||||||
|
|
||||||
|
* - volume
|
||||||
|
- :py:class:`str`
|
||||||
|
- volume number
|
||||||
|
|
||||||
|
* - pages
|
||||||
|
- :py:class:`str`
|
||||||
|
- page range where the article is
|
||||||
|
|
||||||
|
* - number
|
||||||
|
- :py:class:`str`
|
||||||
|
- number of the report or the issue number for a journal article
|
||||||
|
|
||||||
|
* - doi
|
||||||
|
- :py:class:`str`
|
||||||
|
- DOI number (like ``10.1038/d41586-018-07848-2``)
|
||||||
|
|
||||||
|
* - issn
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- ISSN number like ``1476-4687``
|
||||||
|
|
||||||
|
* - isbn
|
||||||
|
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
||||||
|
- ISBN number like ``9780201896831``
|
||||||
|
|
||||||
|
* - pdf_url
|
||||||
|
- :py:class:`str`
|
||||||
|
- URL to the full article, the PDF version
|
||||||
|
|
||||||
|
* - html_url
|
||||||
|
- :py:class:`str`
|
||||||
|
- URL to full article, HTML version
|
||||||
|
|
||||||
|
@ -19,14 +19,6 @@ Engine Implementations
|
|||||||
engine_overview
|
engine_overview
|
||||||
|
|
||||||
|
|
||||||
ResultList and engines
|
|
||||||
======================
|
|
||||||
|
|
||||||
.. autoclass:: searx.result_types.ResultList
|
|
||||||
|
|
||||||
.. autoclass:: searx.result_types.EngineResults
|
|
||||||
|
|
||||||
|
|
||||||
Engine Types
|
Engine Types
|
||||||
============
|
============
|
||||||
|
|
||||||
@ -53,7 +45,6 @@ Online Engines
|
|||||||
demo/demo_online
|
demo/demo_online
|
||||||
xpath
|
xpath
|
||||||
mediawiki
|
mediawiki
|
||||||
json_engine
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
@ -102,7 +93,7 @@ Online Currency
|
|||||||
|
|
||||||
- :py:obj:`processors.online_currency <searx.search.processors.online_currency>`
|
- :py:obj:`processors.online_currency <searx.search.processors.online_currency>`
|
||||||
|
|
||||||
*no engine of this type is documented yet / coming soon*
|
*no engine of this type is documented yet / comming soon*
|
||||||
|
|
||||||
.. _online dictionary:
|
.. _online dictionary:
|
||||||
|
|
||||||
@ -113,4 +104,4 @@ Online Dictionary
|
|||||||
|
|
||||||
- :py:obj:`processors.online_dictionary <searx.search.processors.online_dictionary>`
|
- :py:obj:`processors.online_dictionary <searx.search.processors.online_dictionary>`
|
||||||
|
|
||||||
*no engine of this type is documented yet / coming soon*
|
*no engine of this type is documented yet / comming soon*
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
.. _json_engine engine:
|
|
||||||
|
|
||||||
============
|
|
||||||
JSON Engine
|
|
||||||
============
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.json_engine
|
|
||||||
:members:
|
|
@ -25,7 +25,7 @@ Relational Database Management System (RDBMS) are supported:
|
|||||||
|
|
||||||
- :ref:`engine sqlite`
|
- :ref:`engine sqlite`
|
||||||
- :ref:`engine postgresql`
|
- :ref:`engine postgresql`
|
||||||
- :ref:`engine mysql_server` & :ref:`engine mariadb_server`
|
- :ref:`engine mysql_server`
|
||||||
|
|
||||||
All of the engines above are just commented out in the :origin:`settings.yml
|
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
|
<searx/settings.yml>`, as you have to set the required attributes for the
|
||||||
@ -119,16 +119,3 @@ MySQL
|
|||||||
.. automodule:: searx.engines.mysql_server
|
.. automodule:: searx.engines.mysql_server
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. _engine mariadb_server:
|
|
||||||
|
|
||||||
MariaDB
|
|
||||||
--------
|
|
||||||
|
|
||||||
.. sidebar:: info
|
|
||||||
|
|
||||||
- :origin:`mariadb_server.py <searx/engines/mariadb_server.py>`
|
|
||||||
- ``pip install`` :pypi:`mariadb <mariadb>`
|
|
||||||
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.mariadb_server
|
|
||||||
:members:
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
.. _adobe stock engine:
|
|
||||||
|
|
||||||
===========
|
|
||||||
Adobe Stock
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.adobe_stock
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _alpinelinux engine:
|
|
||||||
|
|
||||||
=====================
|
|
||||||
Alpine Linux Packages
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.alpinelinux
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _bpb engine:
|
|
||||||
|
|
||||||
===
|
|
||||||
Bpb
|
|
||||||
===
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.bpb
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _discourse engine:
|
|
||||||
|
|
||||||
================
|
|
||||||
Discourse Forums
|
|
||||||
================
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.discourse
|
|
||||||
:members:
|
|
@ -12,7 +12,7 @@ DuckDuckGo Engines
|
|||||||
.. automodule:: searx.engines.duckduckgo
|
.. automodule:: searx.engines.duckduckgo
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. automodule:: searx.engines.duckduckgo_extra
|
.. automodule:: searx.engines.duckduckgo_images
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. automodule:: searx.engines.duckduckgo_definitions
|
.. automodule:: searx.engines.duckduckgo_definitions
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
.. _gitea geizhals:
|
|
||||||
|
|
||||||
========
|
|
||||||
Geizhals
|
|
||||||
========
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.geizhals
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _gitea engine:
|
|
||||||
|
|
||||||
=====
|
|
||||||
Gitea
|
|
||||||
=====
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.gitea
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _gitlab engine:
|
|
||||||
|
|
||||||
======
|
|
||||||
GitLab
|
|
||||||
======
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.gitlab
|
|
||||||
: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:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _engine presearch:
|
|
||||||
|
|
||||||
================
|
|
||||||
Presearch Engine
|
|
||||||
================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.presearch
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _qwant engine:
|
|
||||||
|
|
||||||
=====
|
|
||||||
Qwant
|
|
||||||
=====
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.qwant
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _RadioBrowser engine:
|
|
||||||
|
|
||||||
============
|
|
||||||
RadioBrowser
|
|
||||||
============
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.radio_browser
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _voidlinux engine:
|
|
||||||
|
|
||||||
==========================
|
|
||||||
Void Linux binary packages
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.voidlinux
|
|
||||||
:members:
|
|
@ -1,13 +0,0 @@
|
|||||||
.. _wallhaven engine:
|
|
||||||
|
|
||||||
=========
|
|
||||||
Wallhaven
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.engines.wallhaven
|
|
||||||
:members:
|
|
@ -1,7 +0,0 @@
|
|||||||
.. _extended_types.:
|
|
||||||
|
|
||||||
==============
|
|
||||||
Extended Types
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. automodule:: searx.extended_types
|
|
@ -6,15 +6,10 @@ Developer documentation
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
quickstart
|
quickstart
|
||||||
rtm_asdf
|
|
||||||
contribution_guide
|
contribution_guide
|
||||||
extended_types
|
|
||||||
engines/index
|
engines/index
|
||||||
result_types/index
|
|
||||||
templates
|
|
||||||
search_api
|
search_api
|
||||||
plugins/index
|
plugins
|
||||||
answerers/index
|
|
||||||
translation
|
translation
|
||||||
lxcdev
|
lxcdev
|
||||||
makefile
|
makefile
|
||||||
|
@ -61,9 +61,13 @@ working tree and release a ``make install`` to get a virtualenv with a
|
|||||||
$ make install
|
$ make install
|
||||||
PYENV [virtualenv] installing ./requirements*.txt into local/py3
|
PYENV [virtualenv] installing ./requirements*.txt into local/py3
|
||||||
...
|
...
|
||||||
PYENV [install] pip install --use-pep517 --no-build-isolation -e 'searx[test]'
|
PYENV OK
|
||||||
|
PYENV [install] pip install -e 'searx[test]'
|
||||||
...
|
...
|
||||||
Successfully installed searxng-2023.7.19+a446dea1b
|
Successfully installed argparse-1.4.0 searx
|
||||||
|
BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
|
||||||
|
BUILDENV INFO:searx:Initialisation done
|
||||||
|
BUILDENV build utils/brand.env
|
||||||
|
|
||||||
If you release ``make install`` multiple times the installation will only
|
If you release ``make install`` multiple times the installation will only
|
||||||
rebuild if the sha256 sum of the *requirement files* fails. With other words:
|
rebuild if the sha256 sum of the *requirement files* fails. With other words:
|
||||||
@ -78,9 +82,13 @@ the check fails if you edit the requirements listed in
|
|||||||
...
|
...
|
||||||
PYENV [virtualenv] installing ./requirements*.txt into local/py3
|
PYENV [virtualenv] installing ./requirements*.txt into local/py3
|
||||||
...
|
...
|
||||||
PYENV [install] pip install --use-pep517 --no-build-isolation -e 'searx[test]'
|
PYENV OK
|
||||||
|
PYENV [install] pip install -e 'searx[test]'
|
||||||
...
|
...
|
||||||
Successfully installed searxng-2023.7.19+a446dea1b
|
Successfully installed argparse-1.4.0 searx
|
||||||
|
BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
|
||||||
|
BUILDENV INFO:searx:Initialisation done
|
||||||
|
BUILDENV build utils/brand.env
|
||||||
|
|
||||||
.. sidebar:: drop environment
|
.. sidebar:: drop environment
|
||||||
|
|
||||||
@ -90,6 +98,67 @@ the check fails if you edit the requirements listed in
|
|||||||
If you think, something goes wrong with your ./local environment or you change
|
If you think, something goes wrong with your ./local environment or you change
|
||||||
the :origin:`setup.py` file, you have to call :ref:`make clean`.
|
the :origin:`setup.py` file, you have to call :ref:`make clean`.
|
||||||
|
|
||||||
|
.. _make buildenv:
|
||||||
|
|
||||||
|
``make buildenv``
|
||||||
|
=================
|
||||||
|
|
||||||
|
Rebuild instance's environment with the modified settings from the
|
||||||
|
:ref:`settings brand` and :ref:`settings server` section of your
|
||||||
|
:ref:`settings.yml <settings location>`.
|
||||||
|
|
||||||
|
What is the :origin:`utils/brand.env` needed for and why do you need to rebuild
|
||||||
|
it if necessary?
|
||||||
|
|
||||||
|
Short answer: :ref:`installation and maintenance <searxng maintenance>`
|
||||||
|
scripts are running outside of instance's runtime environment and need some
|
||||||
|
values defined in the runtime environment.
|
||||||
|
|
||||||
|
All the SearXNG setups are centralized in the :ref:`settings.yml` file. This
|
||||||
|
setup is available as long we are in a *installed instance*. E.g. the
|
||||||
|
*installed instance* on the server or the *installed developer instance* at
|
||||||
|
``./local`` (the later one is created by a :ref:`make install <make install>` or
|
||||||
|
:ref:`make run <make run>`).
|
||||||
|
|
||||||
|
Tasks running outside of an *installed instance*, especially :ref:`installation
|
||||||
|
and maintenance <searxng maintenance>` tasks running at (pre-) installation time
|
||||||
|
do not have access to the SearXNG setup (from a *installed instance*). Those
|
||||||
|
tasks need a *build environment*.
|
||||||
|
|
||||||
|
The ``make buildenv`` target will update the *build environment* in:
|
||||||
|
|
||||||
|
- :origin:`utils/brand.env`
|
||||||
|
|
||||||
|
Tasks running outside of an *installed instance*, need the following settings
|
||||||
|
from the YAML configuration:
|
||||||
|
|
||||||
|
- ``SEARXNG_URL`` from :ref:`server.base_url <settings server>` (aka
|
||||||
|
``PUBLIC_URL``)
|
||||||
|
- ``SEARXNG_BIND_ADDRESS`` from :ref:`server.bind_address <settings server>`
|
||||||
|
- ``SEARXNG_PORT`` from :ref:`server.port <settings server>`
|
||||||
|
|
||||||
|
The ``GIT_URL`` and ``GIT_BRANCH`` in the origin:`utils/brand.env` file, are
|
||||||
|
read from the git VCS and the branch that is checked out when ``make
|
||||||
|
buildenv`` command runs.
|
||||||
|
|
||||||
|
.. _brand:
|
||||||
|
|
||||||
|
**I would like to create my own brand, how should I proceed?**
|
||||||
|
|
||||||
|
Create a remote branch (``example.org``), checkout the remote branch (on your
|
||||||
|
local developer desktop) and in the :origin:`searx/settings.yml` file in the
|
||||||
|
:ref:`settings server` section set ``base_url``. Run ``make buildenv`` and
|
||||||
|
create a commit for your brand.
|
||||||
|
|
||||||
|
On your server you clone the branch (``example.org``) into your HOME folder
|
||||||
|
``~`` from where you run the :ref:`installation <installation>` and
|
||||||
|
:ref:`maintenance <searxng maintenance>` task.
|
||||||
|
|
||||||
|
To upgrade you brand, rebase on SearXNG's master branch (on your local
|
||||||
|
developer desktop), force push it to your remote branch. Go to your server, do
|
||||||
|
a force pull and run :ref:`sudo -H ./utils/searxng.sh instance update <update
|
||||||
|
searxng>`.
|
||||||
|
|
||||||
.. _make node.env:
|
.. _make node.env:
|
||||||
|
|
||||||
Node.js environment (``make node.env``)
|
Node.js environment (``make node.env``)
|
||||||
@ -190,7 +259,7 @@ modify (:ref:`make themes`)::
|
|||||||
``make format.python``
|
``make format.python``
|
||||||
======================
|
======================
|
||||||
|
|
||||||
Format Python source code using `Black code style`_. See ``$BLACK_OPTIONS``
|
Format Python sourcee code using `Black code style`_. See ``$BLACK_OPTIONS``
|
||||||
and ``$BLACK_TARGETS`` in :origin:`Makefile`.
|
and ``$BLACK_TARGETS`` in :origin:`Makefile`.
|
||||||
|
|
||||||
.. attention::
|
.. attention::
|
||||||
|
106
docs/dev/plugins.rst
Normal file
106
docs/dev/plugins.rst
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
.. _dev plugin:
|
||||||
|
|
||||||
|
=======
|
||||||
|
Plugins
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`plugins generic`
|
||||||
|
|
||||||
|
Plugins can extend or replace functionality of various components of searx.
|
||||||
|
|
||||||
|
Example plugin
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
name = 'Example plugin'
|
||||||
|
description = 'This plugin extends the suggestions with the word "example"'
|
||||||
|
default_on = False # disabled by default
|
||||||
|
|
||||||
|
# attach callback to the post search hook
|
||||||
|
# request: flask request object
|
||||||
|
# ctx: the whole local context of the post search hook
|
||||||
|
def post_search(request, search):
|
||||||
|
search.result_container.suggestions.add('example')
|
||||||
|
return True
|
||||||
|
|
||||||
|
External plugins
|
||||||
|
================
|
||||||
|
|
||||||
|
SearXNG supports *external plugins* / there is no need to install one, SearXNG
|
||||||
|
runs out of the box. But to demonstrate; in the example below we install the
|
||||||
|
SearXNG plugins from *The Green Web Foundation* `[ref]
|
||||||
|
<https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/>`__:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ sudo utils/searxng.sh instance cmd bash -c
|
||||||
|
(searxng-pyenv)$ pip install git+https://github.com/return42/tgwf-searx-plugins
|
||||||
|
|
||||||
|
In the :ref:`settings.yml` activate the ``plugins:`` section and add module
|
||||||
|
``only_show_green_results`` from ``tgwf-searx-plugins``.
|
||||||
|
|
||||||
|
.. code:: yaml
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
...
|
||||||
|
- only_show_green_results
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
Plugin entry points
|
||||||
|
===================
|
||||||
|
|
||||||
|
Entry points (hooks) define when a plugin runs. Right now only three hooks are
|
||||||
|
implemented. So feel free to implement a hook if it fits the behaviour of your
|
||||||
|
plugin. A plugin doesn't need to implement all the hooks.
|
||||||
|
|
||||||
|
|
||||||
|
.. py:function:: pre_search(request, search) -> bool
|
||||||
|
|
||||||
|
Runs BEFORE the search request.
|
||||||
|
|
||||||
|
`search.result_container` can be changed.
|
||||||
|
|
||||||
|
Return a boolean:
|
||||||
|
|
||||||
|
* True to continue the search
|
||||||
|
* False to stop the search
|
||||||
|
|
||||||
|
:param flask.request request:
|
||||||
|
:param searx.search.SearchWithPlugins search:
|
||||||
|
:return: False to stop the search
|
||||||
|
:rtype: bool
|
||||||
|
|
||||||
|
|
||||||
|
.. py:function:: post_search(request, search) -> None
|
||||||
|
|
||||||
|
Runs AFTER the search request.
|
||||||
|
|
||||||
|
:param flask.request request: Flask request.
|
||||||
|
:param searx.search.SearchWithPlugins search: Context.
|
||||||
|
|
||||||
|
|
||||||
|
.. py:function:: on_result(request, search, result) -> bool
|
||||||
|
|
||||||
|
Runs for each result of each engine.
|
||||||
|
|
||||||
|
`result` can be changed.
|
||||||
|
|
||||||
|
If `result["url"]` is defined, then `result["parsed_url"] = urlparse(result['url'])`
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
`result["url"]` can be changed, but `result["parsed_url"]` must be updated too.
|
||||||
|
|
||||||
|
Return a boolean:
|
||||||
|
|
||||||
|
* True to keep the result
|
||||||
|
* False to remove the result
|
||||||
|
|
||||||
|
:param flask.request request:
|
||||||
|
:param searx.search.SearchWithPlugins search:
|
||||||
|
:param typing.Dict result: Result, see - :ref:`engine results`
|
||||||
|
:return: True to keep the result
|
||||||
|
:rtype: bool
|
@ -1,15 +0,0 @@
|
|||||||
.. _builtin plugins:
|
|
||||||
|
|
||||||
================
|
|
||||||
Built-in Plugins
|
|
||||||
================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
calculator
|
|
||||||
hash_plugin
|
|
||||||
hostnames
|
|
||||||
self_info
|
|
||||||
tor_check
|
|
||||||
unit_converter
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _plugins.calculator:
|
|
||||||
|
|
||||||
==========
|
|
||||||
Calculator
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. automodule:: searx.plugins.calculator
|
|
||||||
:members:
|
|
@ -1,7 +0,0 @@
|
|||||||
.. _dev plugin:
|
|
||||||
|
|
||||||
==================
|
|
||||||
Plugin Development
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. automodule:: searx.plugins
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _hash_plugin plugin:
|
|
||||||
|
|
||||||
===========
|
|
||||||
Hash Values
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. autoclass:: searx.plugins.hash_plugin.SXNGPlugin
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _hostnames plugin:
|
|
||||||
|
|
||||||
=========
|
|
||||||
Hostnames
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. automodule:: searx.plugins.hostnames
|
|
||||||
:members:
|
|
@ -1,9 +0,0 @@
|
|||||||
=======
|
|
||||||
Plugins
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
development
|
|
||||||
builtins
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _self_info plugin:
|
|
||||||
|
|
||||||
=========
|
|
||||||
Self-Info
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. autoclass:: searx.plugins.self_info.SXNGPlugin
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _unit converter plugin:
|
|
||||||
|
|
||||||
==============
|
|
||||||
Unit Converter
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. automodule:: searx.plugins.unit_converter
|
|
||||||
:members:
|
|
@ -6,8 +6,7 @@ Development Quickstart
|
|||||||
|
|
||||||
.. _npm: https://www.npmjs.com/
|
.. _npm: https://www.npmjs.com/
|
||||||
.. _Node.js: https://nodejs.org/
|
.. _Node.js: https://nodejs.org/
|
||||||
.. _eslint: https://eslint.org/
|
|
||||||
.. _stylelint: https://stylelint.io/
|
|
||||||
|
|
||||||
.. sidebar:: further read
|
.. sidebar:: further read
|
||||||
|
|
||||||
@ -40,9 +39,10 @@ to our ":ref:`how to contribute`" guideline.
|
|||||||
- :ref:`make themes`
|
- :ref:`make themes`
|
||||||
|
|
||||||
If you implement themes, you will need to setup a :ref:`Node.js environment
|
If you implement themes, you will need to setup a :ref:`Node.js environment
|
||||||
<make node.env>`. Before you call *make run* (2.), you need to compile the
|
<make node.env>`: ``make node.env``
|
||||||
modified styles and JavaScript: ``make node.clean themes.all``. If eslint_ or
|
|
||||||
stylelint_ report some issues, try ``make themes.fix``.
|
Before you call *make run* (2.), you need to compile the modified styles and
|
||||||
|
JavaScript: ``make themes.all``
|
||||||
|
|
||||||
Alternatively you can also compile selective the theme you have modified,
|
Alternatively you can also compile selective the theme you have modified,
|
||||||
e.g. the *simple* theme.
|
e.g. the *simple* theme.
|
||||||
|
@ -235,7 +235,7 @@ To refer anchors use the `ref role`_ markup:
|
|||||||
.. admonition:: ``:ref:`` role
|
.. admonition:: ``:ref:`` role
|
||||||
:class: rst-example
|
:class: rst-example
|
||||||
|
|
||||||
Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
|
Visist chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
|
||||||
bar <reST anchor>`.
|
bar <reST anchor>`.
|
||||||
|
|
||||||
.. _reST ordinary ref:
|
.. _reST ordinary ref:
|
||||||
@ -292,7 +292,7 @@ content becomes smart.
|
|||||||
files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
|
files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
|
||||||
pull request :pull:`4` ``:pull:`4```
|
pull request :pull:`4` ``:pull:`4```
|
||||||
patch :patch:`af2cae6` ``:patch:`af2cae6```
|
patch :patch:`af2cae6` ``:patch:`af2cae6```
|
||||||
PyPi package :pypi:`httpx` ``:pypi:`httpx```
|
PyPi package :pypi:`searx` ``:pypi:`searx```
|
||||||
manual page man :man:`bash` ``:man:`bash```
|
manual page man :man:`bash` ``:man:`bash```
|
||||||
intersphinx_
|
intersphinx_
|
||||||
--------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
.. _result_types.answer:
|
|
||||||
|
|
||||||
==============
|
|
||||||
Answer Results
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. automodule:: searx.result_types.answer
|
|
@ -1,5 +0,0 @@
|
|||||||
======
|
|
||||||
Result
|
|
||||||
======
|
|
||||||
|
|
||||||
.. automodule:: searx.result_types._base
|
|
@ -1,34 +0,0 @@
|
|||||||
.. _result_types.corrections:
|
|
||||||
|
|
||||||
==================
|
|
||||||
Correction Results
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
There is still no typing for these result items. The templates can be used as
|
|
||||||
orientation until the final typing is complete.
|
|
||||||
|
|
||||||
The corrections area shows the user alternative search terms.
|
|
||||||
|
|
||||||
A result of this type is a very simple dictionary with only one key/value pair
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
{"correction" : "lorem ipsum .."}
|
|
||||||
|
|
||||||
From this simple dict another dict is build up:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
# use RawTextQuery to get the corrections URLs with the same bang
|
|
||||||
{"url" : "!bang lorem ipsum ..", "title": "lorem ipsum .." }
|
|
||||||
|
|
||||||
and used in the template :origin:`corrections.html
|
|
||||||
<searx/templates/simple/elements/corrections.html>`:
|
|
||||||
|
|
||||||
title : :py:class:`str`
|
|
||||||
Corrected search term.
|
|
||||||
|
|
||||||
url : :py:class:`str`
|
|
||||||
Not really an URL, its the value to insert in a HTML form for a SearXNG query.
|
|
@ -1,95 +0,0 @@
|
|||||||
.. _result types:
|
|
||||||
|
|
||||||
============
|
|
||||||
Result Types
|
|
||||||
============
|
|
||||||
|
|
||||||
To understand the typification of the results, let's take a brief look at the
|
|
||||||
structure of SearXNG .. At its core, SearXNG is nothing more than an aggregator
|
|
||||||
that aggregates the results from various sources, renders them via templates and
|
|
||||||
displays them to the user.
|
|
||||||
|
|
||||||
The **sources** can be:
|
|
||||||
|
|
||||||
1. :ref:`engines <engine implementations>`
|
|
||||||
2. :ref:`plugins <dev plugin>`
|
|
||||||
3. :ref:`answerers <dev answerers>`
|
|
||||||
|
|
||||||
The sources provide the results, which are displayed in different **areas**
|
|
||||||
depending on the type of result. The areas are:
|
|
||||||
|
|
||||||
main results:
|
|
||||||
It is the main area in which -- as is typical for search engines -- the
|
|
||||||
results that a search engine has found for the search term are displayed.
|
|
||||||
|
|
||||||
answers:
|
|
||||||
This area displays short answers that could be found for the search term.
|
|
||||||
|
|
||||||
info box:
|
|
||||||
An area in which additional information can be displayed, e.g. excerpts from
|
|
||||||
wikipedia or other sources such as maps.
|
|
||||||
|
|
||||||
suggestions:
|
|
||||||
Suggestions for alternative search terms can be found in this area. These can
|
|
||||||
be clicked on and a search is carried out with these search terms.
|
|
||||||
|
|
||||||
corrections:
|
|
||||||
Results in this area are like the suggestion of alternative search terms,
|
|
||||||
which usually result from spelling corrections
|
|
||||||
|
|
||||||
At this point it is important to note that all **sources** can contribute
|
|
||||||
results to all of the areas mentioned above.
|
|
||||||
|
|
||||||
In most cases, however, the :ref:`engines <engine implementations>` will fill
|
|
||||||
the *main results* and the :ref:`answerers <dev answerers>` will generally
|
|
||||||
provide the contributions for the *answer* area. Not necessary to mention here
|
|
||||||
but for a better understanding: the plugins can also filter out or change
|
|
||||||
results from the main results area (e.g. the URL of the link).
|
|
||||||
|
|
||||||
The result items are organized in the :py:obj:`results.ResultContainer` and
|
|
||||||
after all sources have delivered their results, this container is passed to the
|
|
||||||
templating to build a HTML output. The output is usually HTML, but it is also
|
|
||||||
possible to output the result lists as JSON or RSS feed. Thats quite all we need
|
|
||||||
to know before we dive into typification of result items.
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
Typification of result items: we are at the very first beginng!
|
|
||||||
|
|
||||||
The first thing we have to realize is that there is no typification of the
|
|
||||||
result items so far, we have to build it up first .. and that is quite a big
|
|
||||||
task, which we will only be able to accomplish gradually.
|
|
||||||
|
|
||||||
The foundation for the typeless results was laid back in 2013 in the very first
|
|
||||||
commit :commit:`ae9fb1d7d`, and the principle has not changed since then. At
|
|
||||||
the time, the approach was perfectly adequate, but we have since evolved and the
|
|
||||||
demands on SearXNG increase with every feature request.
|
|
||||||
|
|
||||||
**Motivation:** in the meantime, it has become very difficult to develop new
|
|
||||||
features that require structural changes and it is especially hard for newcomers
|
|
||||||
to find their way in this typeless world. As long as the results are only
|
|
||||||
simple key/value dictionaries, it is not even possible for the IDEs to support
|
|
||||||
the application developer in his work.
|
|
||||||
|
|
||||||
**Planning:** The procedure for subsequent typing will have to be based on the
|
|
||||||
circumstances ..
|
|
||||||
|
|
||||||
.. attention::
|
|
||||||
|
|
||||||
As long as there is no type defined for a kind of result the HTML template
|
|
||||||
specify what the properties of a type are.
|
|
||||||
|
|
||||||
In this sense, you will either find a type definition here in the
|
|
||||||
documentation or, if this does not yet exist, a description of the HTML
|
|
||||||
template.
|
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
base_result
|
|
||||||
main_result
|
|
||||||
answer
|
|
||||||
correction
|
|
||||||
suggestion
|
|
||||||
infobox
|
|
@ -1,60 +0,0 @@
|
|||||||
.. _result_types.infobox:
|
|
||||||
|
|
||||||
===============
|
|
||||||
Infobox Results
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
There is still no typing for these result items. The templates can be used as
|
|
||||||
orientation until the final typing is complete.
|
|
||||||
|
|
||||||
The infobox is an area where addtional infos shown to the user.
|
|
||||||
|
|
||||||
Fields used in the :origin:`infobox.html
|
|
||||||
<searx/templates/simple/elements/infobox.html>`:
|
|
||||||
|
|
||||||
img_src: :py:class:`str`
|
|
||||||
URL of a image or thumbnail that is displayed in the infobox.
|
|
||||||
|
|
||||||
infobox: :py:class:`str`
|
|
||||||
Title of the info box.
|
|
||||||
|
|
||||||
content: :py:class:`str`
|
|
||||||
Text of the info box.
|
|
||||||
|
|
||||||
The infobox has additional subsections for *attributes*, *urls* and
|
|
||||||
*relatedTopics*:
|
|
||||||
|
|
||||||
attributes: :py:class:`List <list>`\ [\ :py:class:`dict`\ ]
|
|
||||||
A list of attributes. An *attribute* is a dictionary with keys:
|
|
||||||
|
|
||||||
- label :py:class:`str`: (mandatory)
|
|
||||||
|
|
||||||
- value :py:class:`str`: (mandatory)
|
|
||||||
|
|
||||||
- image :py:class:`List <list>`\ [\ :py:class:`dict`\ ] (optional)
|
|
||||||
|
|
||||||
A list of images. An *image* is a dictionary with keys:
|
|
||||||
|
|
||||||
- src :py:class:`str`: URL of an image/thumbnail (mandatory)
|
|
||||||
- alt :py:class:`str`: alternative text for the image (mandatory)
|
|
||||||
|
|
||||||
urls: :py:class:`List <list>`\ [\ :py:class:`dict`\ ]
|
|
||||||
A list of links. An *link* is a dictionary with keys:
|
|
||||||
|
|
||||||
- url :py:class:`str`: URL of the link (mandatory)
|
|
||||||
- title :py:class:`str`: Title of the link (mandatory)
|
|
||||||
|
|
||||||
relatedTopics: :py:class:`List <list>`\ [\ :py:class:`dict`\ ]
|
|
||||||
A list of topics. An *topic* is a dictionary with keys:
|
|
||||||
|
|
||||||
- name: :py:class:`str`: (mandatory)
|
|
||||||
|
|
||||||
- suggestions: :py:class:`List <list>`\ [\ :py:class:`dict`\ ] (optional)
|
|
||||||
|
|
||||||
A list of suggestions. A *suggestion* is simple dictionary with just one
|
|
||||||
key/value pair:
|
|
||||||
|
|
||||||
- suggestion: :py:class:`str`: suggested search term (mandatory)
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
============
|
|
||||||
Main Results
|
|
||||||
============
|
|
||||||
|
|
||||||
There is still no typing for the items in the :ref:`main result list`. The
|
|
||||||
templates can be used as orientation until the final typing is complete.
|
|
||||||
|
|
||||||
- :ref:`template default`
|
|
||||||
- :ref:`template images`
|
|
||||||
- :ref:`template videos`
|
|
||||||
- :ref:`template torrent`
|
|
||||||
- :ref:`template map`
|
|
||||||
- :ref:`template paper`
|
|
||||||
- :ref:`template packages`
|
|
||||||
- :ref:`template code`
|
|
||||||
- :ref:`template files`
|
|
||||||
- :ref:`template products`
|
|
@ -1,38 +0,0 @@
|
|||||||
.. _result_types.suggestion:
|
|
||||||
|
|
||||||
==================
|
|
||||||
Suggestion Results
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
There is still no typing for these result items. The templates can be used as
|
|
||||||
orientation until the final typing is complete.
|
|
||||||
|
|
||||||
The suggestions area shows the user alternative search terms.
|
|
||||||
|
|
||||||
A result of this type is a very simple dictionary with only one key/value pair
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
{"suggestion" : "lorem ipsum .."}
|
|
||||||
|
|
||||||
From this simple dict another dict is build up:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
{"url" : "!bang lorem ipsum ..", "title": "lorem ipsum" }
|
|
||||||
|
|
||||||
and used in the template :origin:`suggestions.html
|
|
||||||
<searx/templates/simple/elements/suggestions.html>`:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
# use RawTextQuery to get the suggestion URLs with the same bang
|
|
||||||
{"url" : "!bang lorem ipsum ..", "title": "lorem ipsum" }
|
|
||||||
|
|
||||||
title : :py:class:`str`
|
|
||||||
Suggested search term
|
|
||||||
|
|
||||||
url : :py:class:`str`
|
|
||||||
Not really an URL, its the value to insert in a HTML form for a SearXNG query.
|
|
@ -1,121 +0,0 @@
|
|||||||
==================
|
|
||||||
Runtime Management
|
|
||||||
==================
|
|
||||||
|
|
||||||
The runtimes are managed with asdf and are activated in this project via the
|
|
||||||
`.tool-versions <.tool-versions>`_. If you have not yet installed asdf_, then
|
|
||||||
chapter :ref:`introduce asdf` may be of help to you.
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
|
|
||||||
Get started
|
|
||||||
===========
|
|
||||||
|
|
||||||
If you have asdf installed you can install the runtimes of this project by:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ cd /path/to/searxng
|
|
||||||
$ asdf install # will install runtimes listed in .tool-versions
|
|
||||||
...
|
|
||||||
|
|
||||||
Manage Versions
|
|
||||||
===============
|
|
||||||
|
|
||||||
If you want to perform a ``test`` with special runtime versions of nodejs,
|
|
||||||
python or shellcheck, you can patch the ``.tool-versions``:
|
|
||||||
|
|
||||||
.. code:: diff
|
|
||||||
|
|
||||||
--- a/.tool-versions
|
|
||||||
+++ b/.tool-versions
|
|
||||||
@@ -1,2 +1,2 @@
|
|
||||||
-python 3.12.0
|
|
||||||
-shellcheck 0.9.0
|
|
||||||
+python 3.11.6
|
|
||||||
+shellcheck 0.8.0
|
|
||||||
|
|
||||||
To install use ``asdf install`` again. If the runtime tools have changed, any
|
|
||||||
existing (nodejs and python) environments should be cleaned up with a ``make
|
|
||||||
clean``.
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ asdf install
|
|
||||||
...
|
|
||||||
$ make clean test
|
|
||||||
|
|
||||||
|
|
||||||
.. _introduce asdf:
|
|
||||||
|
|
||||||
Introduce asdf
|
|
||||||
==============
|
|
||||||
|
|
||||||
To `download asdf`_ and `install asdf`_:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch <version>
|
|
||||||
$ echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
|
|
||||||
$ echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
|
|
||||||
|
|
||||||
Start a new shell and try to `install plugins`_:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ asdf plugin-list-all | grep -E '(golang|python|nodejs|shellcheck).git'
|
|
||||||
golang https://github.com/asdf-community/asdf-golang.git
|
|
||||||
nodejs https://github.com/asdf-vm/asdf-nodejs.git
|
|
||||||
python https://github.com/danhper/asdf-python.git
|
|
||||||
shellcheck https://github.com/luizm/asdf-shellcheck.git
|
|
||||||
|
|
||||||
$ asdf plugin add golang https://github.com/asdf-community/asdf-golang.git
|
|
||||||
$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
|
|
||||||
$ asdf plugin add python https://github.com/danhper/asdf-python.git
|
|
||||||
$ asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
|
|
||||||
|
|
||||||
Each plugin has dependencies, to compile runtimes visit the URLs from above and
|
|
||||||
look out for the dependencies you need to install on your OS, on Debian for the
|
|
||||||
runtimes listed above you will need:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ sudo apt update
|
|
||||||
$ sudo apt install \
|
|
||||||
dirmngr gpg curl gawk coreutils build-essential libssl-dev zlib1g-dev \
|
|
||||||
libbz2-dev libreadline-dev libsqlite3-dev \
|
|
||||||
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
|
|
||||||
|
|
||||||
With dependencies installed you can install/compile runtimes:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ asdf install golang latest
|
|
||||||
$ asdf install nodejs latest
|
|
||||||
$ asdf install python latest
|
|
||||||
$ asdf install shellcheck latest
|
|
||||||
|
|
||||||
Python will be compiled and will take a while.
|
|
||||||
|
|
||||||
In the repository the version is defined in `.tool-versions`_. Outside the
|
|
||||||
repository, its recommended that the runtime should use the versions of the OS
|
|
||||||
(`Fallback to System Version`_) / if not already done register the system
|
|
||||||
versions global:
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
$ cd /
|
|
||||||
$ asdf global golang system
|
|
||||||
$ asdf global nodejs system
|
|
||||||
$ asdf global python system
|
|
||||||
$ asdf global shellcheck system
|
|
||||||
|
|
||||||
.. _asdf: https://asdf-vm.com/
|
|
||||||
.. _download asdf: https://asdf-vm.com/guide/getting-started.html#_2-download-asdf
|
|
||||||
.. _install asdf: https://asdf-vm.com/guide/getting-started.html#_3-install-asdf
|
|
||||||
.. _install plugins: https://asdf-vm.com/guide/getting-started.html#install-the-plugin
|
|
||||||
.. _Fallback to System Version: https://asdf-vm.com/manage/versions.html#fallback-to-system-version
|
|
@ -69,7 +69,7 @@ Parameters
|
|||||||
|
|
||||||
``autocomplete`` : default from :ref:`settings search`
|
``autocomplete`` : default from :ref:`settings search`
|
||||||
[ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
|
[ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
|
||||||
``wikipedia``, ``stract``, ``swisscows``, ``qwant`` ]
|
``wikipedia``, ``swisscows``, ``qwant`` ]
|
||||||
|
|
||||||
Service which completes words as you type.
|
Service which completes words as you type.
|
||||||
|
|
||||||
@ -92,25 +92,27 @@ Parameters
|
|||||||
List of enabled plugins.
|
List of enabled plugins.
|
||||||
|
|
||||||
:default:
|
:default:
|
||||||
``Hash_plugin``, ``Self_Information``,
|
``Hash_plugin``, ``Search_on_category_select``,
|
||||||
``Tracker_URL_remover``, ``Ahmia_blacklist``
|
``Self_Information``, ``Tracker_URL_remover``,
|
||||||
|
``Ahmia_blacklist``
|
||||||
|
|
||||||
:values:
|
:values:
|
||||||
.. enabled by default
|
.. enabled by default
|
||||||
|
|
||||||
``Hash_plugin``, ``Self_Information``,
|
``Hash_plugin``, ``Search_on_category_select``,
|
||||||
``Tracker_URL_remover``, ``Ahmia_blacklist``,
|
``Self_Information``, ``Tracker_URL_remover``,
|
||||||
|
``Ahmia_blacklist``,
|
||||||
|
|
||||||
.. disabled by default
|
.. disabled by default
|
||||||
|
|
||||||
``Hostnames_plugin``, ``Open_Access_DOI_rewrite``,
|
``Hostname_replace``, ``Open_Access_DOI_rewrite``,
|
||||||
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
||||||
|
|
||||||
``disabled_plugins``: optional
|
``disabled_plugins``: optional
|
||||||
List of disabled plugins.
|
List of disabled plugins.
|
||||||
|
|
||||||
:default:
|
:default:
|
||||||
``Hostnames_plugin``, ``Open_Access_DOI_rewrite``,
|
``Hostname_replace``, ``Open_Access_DOI_rewrite``,
|
||||||
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
||||||
|
|
||||||
:values:
|
:values:
|
||||||
|
@ -60,7 +60,6 @@ Scripts to update static data in :origin:`searx/data/`
|
|||||||
.. automodule:: searxng_extra.update.update_engine_traits
|
.. automodule:: searxng_extra.update.update_engine_traits
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. _update_osm_keys_tags.py:
|
|
||||||
|
|
||||||
``update_osm_keys_tags.py``
|
``update_osm_keys_tags.py``
|
||||||
===========================
|
===========================
|
||||||
@ -79,16 +78,6 @@ Scripts to update static data in :origin:`searx/data/`
|
|||||||
.. automodule:: searxng_extra.update.update_pygments
|
.. automodule:: searxng_extra.update.update_pygments
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. _update_locales.py:
|
|
||||||
|
|
||||||
``update_locales.py``
|
|
||||||
=====================
|
|
||||||
|
|
||||||
:origin:`[source] <searxng_extra/update/update_locales.py>`
|
|
||||||
|
|
||||||
.. automodule:: searxng_extra.update.update_locales
|
|
||||||
:members:
|
|
||||||
|
|
||||||
|
|
||||||
``update_wikidata_units.py``
|
``update_wikidata_units.py``
|
||||||
============================
|
============================
|
||||||
|
@ -1,577 +0,0 @@
|
|||||||
.. _simple theme templates:
|
|
||||||
|
|
||||||
======================
|
|
||||||
Simple Theme Templates
|
|
||||||
======================
|
|
||||||
|
|
||||||
The simple template is complex, it consists of many different elements and also
|
|
||||||
uses macros and include statements. The following is a rough overview that we
|
|
||||||
would like to give the developerat hand, details must still be taken from the
|
|
||||||
:origin:`sources <searx/templates/simple/>`.
|
|
||||||
|
|
||||||
A :ref:`result item <result types>` can be of different media types. The media
|
|
||||||
type of a result is defined by the :py:obj:`result_type.Result.template`. To
|
|
||||||
set another media-type as :ref:`template default`, the field ``template``
|
|
||||||
in the result item must be set to the desired type.
|
|
||||||
|
|
||||||
.. contents:: Contents
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
|
|
||||||
.. _result template macros:
|
|
||||||
|
|
||||||
Result template macros
|
|
||||||
======================
|
|
||||||
|
|
||||||
.. _macro result_header:
|
|
||||||
|
|
||||||
``result_header``
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Execpt ``image.html`` and some others this macro is used in nearly all result
|
|
||||||
types in the :ref:`main result list`.
|
|
||||||
|
|
||||||
Fields used in the template :origin:`macro result_header
|
|
||||||
<searx/templates/simple/macros.html>`:
|
|
||||||
|
|
||||||
url : :py:class:`str`
|
|
||||||
Link URL of the result item.
|
|
||||||
|
|
||||||
title : :py:class:`str`
|
|
||||||
Link title of the result item.
|
|
||||||
|
|
||||||
img_src, thumbnail : :py:class:`str`
|
|
||||||
URL of a image or thumbnail that is displayed in the result item.
|
|
||||||
|
|
||||||
|
|
||||||
.. _macro result_sub_header:
|
|
||||||
|
|
||||||
``result_sub_header``
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Execpt ``image.html`` and some others this macro is used in nearly all result
|
|
||||||
types in the :ref:`main result list`.
|
|
||||||
|
|
||||||
Fields used in the template :origin:`macro result_sub_header
|
|
||||||
<searx/templates/simple/macros.html>`:
|
|
||||||
|
|
||||||
publishedDate : :py:obj:`datetime.datetime`
|
|
||||||
The date on which the object was published.
|
|
||||||
|
|
||||||
length: :py:obj:`time.struct_time`
|
|
||||||
Playing duration in seconds.
|
|
||||||
|
|
||||||
views: :py:class:`str`
|
|
||||||
View count in humanized number format.
|
|
||||||
|
|
||||||
author : :py:class:`str`
|
|
||||||
Author of the title.
|
|
||||||
|
|
||||||
metadata : :py:class:`str`
|
|
||||||
Miscellaneous metadata.
|
|
||||||
|
|
||||||
|
|
||||||
.. _engine_data:
|
|
||||||
|
|
||||||
``engine_data_form``
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The ``engine_data_form`` macro is used in :origin:`results,html
|
|
||||||
<searx/templates/simple/results.html>` in a HTML ``<form/>`` element. The
|
|
||||||
intention of this macro is to pass data of a engine from one :py:obj:`response
|
|
||||||
<searx.engines.demo_online.response>` to the :py:obj:`searx.search.SearchQuery`
|
|
||||||
of the next :py:obj:`request <searx.engines.demo_online.request>`.
|
|
||||||
|
|
||||||
To pass data, engine's response handler can append result items of typ
|
|
||||||
``engine_data``. This is by example used to pass a token from the response to
|
|
||||||
the next request:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
def response(resp):
|
|
||||||
...
|
|
||||||
results.append({
|
|
||||||
'engine_data': token,
|
|
||||||
'key': 'next_page_token',
|
|
||||||
})
|
|
||||||
...
|
|
||||||
return results
|
|
||||||
|
|
||||||
def request(query, params):
|
|
||||||
page_token = params['engine_data'].get('next_page_token')
|
|
||||||
|
|
||||||
|
|
||||||
.. _main result list:
|
|
||||||
|
|
||||||
Main Result List
|
|
||||||
================
|
|
||||||
|
|
||||||
The **media types** of the **main result type** are the template files in
|
|
||||||
the :origin:`result_templates <searx/templates/simple/result_templates>`.
|
|
||||||
|
|
||||||
.. _template default:
|
|
||||||
|
|
||||||
``default.html``
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`default.html
|
|
||||||
<searx/templates/simple/result_templates/default.html>`:
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
General text of the result item.
|
|
||||||
|
|
||||||
iframe_src : :py:class:`str`
|
|
||||||
URL of an embedded ``<iframe>`` / the frame is collapsible.
|
|
||||||
|
|
||||||
audio_src : uri,
|
|
||||||
URL of an embedded ``<audio controls>``.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template images:
|
|
||||||
|
|
||||||
``images.html``
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The images are displayed as small thumbnails in the main results list.
|
|
||||||
|
|
||||||
title : :py:class:`str`
|
|
||||||
Title of the image.
|
|
||||||
|
|
||||||
thumbnail_src : :py:class:`str`
|
|
||||||
URL of a preview of the image.
|
|
||||||
|
|
||||||
resolution :py:class:`str`
|
|
||||||
The resolution of the image (e.g. ``1920 x 1080`` pixel)
|
|
||||||
|
|
||||||
|
|
||||||
Image labels
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Clicking on the preview opens a gallery view in which all further metadata for
|
|
||||||
the image is displayed. Addition fields used in the :origin:`images.html
|
|
||||||
<searx/templates/simple/result_templates/images.html>`:
|
|
||||||
|
|
||||||
img_src : :py:class:`str`
|
|
||||||
URL of the full size image.
|
|
||||||
|
|
||||||
content: :py:class:`str`
|
|
||||||
Description of the image.
|
|
||||||
|
|
||||||
author: :py:class:`str`
|
|
||||||
Name of the author of the image.
|
|
||||||
|
|
||||||
img_format : :py:class:`str`
|
|
||||||
The format of the image (e.g. ``png``).
|
|
||||||
|
|
||||||
source : :py:class:`str`
|
|
||||||
Source of the image.
|
|
||||||
|
|
||||||
filesize: :py:class:`str`
|
|
||||||
Size of bytes in :py:obj:`human readable <searx.humanize_bytes>` notation
|
|
||||||
(e.g. ``MB`` for 1024 \* 1024 Bytes filesize).
|
|
||||||
|
|
||||||
url : :py:class:`str`
|
|
||||||
URL of the page from where the images comes from (source).
|
|
||||||
|
|
||||||
|
|
||||||
.. _template videos:
|
|
||||||
|
|
||||||
``videos.html``
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`videos.html
|
|
||||||
<searx/templates/simple/result_templates/videos.html>`:
|
|
||||||
|
|
||||||
iframe_src : :py:class:`str`
|
|
||||||
URL of an embedded ``<iframe>`` / the frame is collapsible.
|
|
||||||
|
|
||||||
The videos are displayed as small thumbnails in the main results list, there
|
|
||||||
is an additional button to collaps/open the embeded video.
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
Description of the code fragment.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template torrent:
|
|
||||||
|
|
||||||
``torrent.html``
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. _magnet link: https://en.wikipedia.org/wiki/Magnet_URI_scheme
|
|
||||||
.. _torrent file: https://en.wikipedia.org/wiki/Torrent_file
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`torrent.html
|
|
||||||
<searx/templates/simple/result_templates/torrent.html>`:
|
|
||||||
|
|
||||||
magnetlink:
|
|
||||||
URL of the `magnet link`_.
|
|
||||||
|
|
||||||
torrentfile
|
|
||||||
URL of the `torrent file`_.
|
|
||||||
|
|
||||||
seed : ``int``
|
|
||||||
Number of seeders.
|
|
||||||
|
|
||||||
leech : ``int``
|
|
||||||
Number of leecher
|
|
||||||
|
|
||||||
filesize : ``int``
|
|
||||||
Size in Bytes (rendered to human readable unit of measurement).
|
|
||||||
|
|
||||||
files : ``int``
|
|
||||||
Number of files.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template map:
|
|
||||||
|
|
||||||
``map.html``
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. _GeoJSON: https://en.wikipedia.org/wiki/GeoJSON
|
|
||||||
.. _Leaflet: https://github.com/Leaflet/Leaflet
|
|
||||||
.. _bbox: https://wiki.openstreetmap.org/wiki/Bounding_Box
|
|
||||||
.. _HTMLElement.dataset: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
|
|
||||||
.. _Nominatim: https://nominatim.org/release-docs/latest/
|
|
||||||
.. _Lookup: https://nominatim.org/release-docs/latest/api/Lookup/
|
|
||||||
.. _place_id is not a persistent id:
|
|
||||||
https://nominatim.org/release-docs/latest/api/Output/#place_id-is-not-a-persistent-id
|
|
||||||
.. _perma_id: https://wiki.openstreetmap.org/wiki/Permanent_ID
|
|
||||||
.. _country code: https://wiki.openstreetmap.org/wiki/Country_code
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`map.html
|
|
||||||
<searx/templates/simple/result_templates/map.html>`:
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
Description of the item.
|
|
||||||
|
|
||||||
address_label : :py:class:`str`
|
|
||||||
Label of the address / default ``_('address')``.
|
|
||||||
|
|
||||||
geojson : GeoJSON_
|
|
||||||
Geometries mapped to HTMLElement.dataset_ (``data-map-geojson``) and used by
|
|
||||||
Leaflet_.
|
|
||||||
|
|
||||||
boundingbox : ``[ min-lon, min-lat, max-lon, max-lat]``
|
|
||||||
A bbox_ area defined by min longitude , min latitude , max longitude and max
|
|
||||||
latitude. The bounding box is mapped to HTMLElement.dataset_
|
|
||||||
(``data-map-boundingbox``) and is used by Leaflet_.
|
|
||||||
|
|
||||||
longitude, latitude : :py:class:`str`
|
|
||||||
Geographical coordinates, mapped to HTMLElement.dataset_ (``data-map-lon``,
|
|
||||||
``data-map-lat``) and is used by Leaflet_.
|
|
||||||
|
|
||||||
address : ``{...}``
|
|
||||||
A dicticonary with the address data:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
address = {
|
|
||||||
'name' : str, # name of object
|
|
||||||
'road' : str, # street name of object
|
|
||||||
'house_number' : str, # house number of object
|
|
||||||
'postcode' : str, # postcode of object
|
|
||||||
'country' : str, # country of object
|
|
||||||
'country_code' : str,
|
|
||||||
'locality' : str,
|
|
||||||
}
|
|
||||||
|
|
||||||
country_code : :py:class:`str`
|
|
||||||
`Country code`_ of the object.
|
|
||||||
|
|
||||||
locality : :py:class:`str`
|
|
||||||
The name of the city, town, township, village, borough, etc. in which this
|
|
||||||
object is located.
|
|
||||||
|
|
||||||
links : ``[link1, link2, ...]``
|
|
||||||
A list of links with labels:
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
links.append({
|
|
||||||
'label' : str,
|
|
||||||
'url' : str,
|
|
||||||
'url_label' : str, # set by some engines but unused (oscar)
|
|
||||||
})
|
|
||||||
|
|
||||||
data : ``[data1, data2, ...]``
|
|
||||||
A list of additional data, shown in two columns and containing a label and
|
|
||||||
value.
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
data.append({
|
|
||||||
'label' : str,
|
|
||||||
'value' : str,
|
|
||||||
'key' : str, # set by some engines but unused
|
|
||||||
})
|
|
||||||
|
|
||||||
type : :py:class:`str` # set by some engines but unused (oscar)
|
|
||||||
Tag label from :ref:`OSM_KEYS_TAGS['tags'] <update_osm_keys_tags.py>`.
|
|
||||||
|
|
||||||
type_icon : :py:class:`str` # set by some engines but unused (oscar)
|
|
||||||
Type's icon.
|
|
||||||
|
|
||||||
osm : ``{...}``
|
|
||||||
OSM-type and OSM-ID, can be used to Lookup_ OSM data (Nominatim_). There is
|
|
||||||
also a discussion about "`place_id is not a persistent id`_" and the
|
|
||||||
perma_id_.
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
osm = {
|
|
||||||
'type': str,
|
|
||||||
'id': str,
|
|
||||||
}
|
|
||||||
|
|
||||||
type : :py:class:`str`
|
|
||||||
Type of osm-object (if OSM-Result).
|
|
||||||
|
|
||||||
id :
|
|
||||||
ID of osm-object (if OSM-Result).
|
|
||||||
|
|
||||||
.. hint::
|
|
||||||
|
|
||||||
The ``osm`` property is set by engine ``openstreetmap.py``, but it is not
|
|
||||||
used in the ``map.html`` template yet.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _template paper:
|
|
||||||
|
|
||||||
``paper.html``
|
|
||||||
--------------
|
|
||||||
|
|
||||||
.. _BibTeX format: https://www.bibtex.com/g/bibtex-format/
|
|
||||||
.. _BibTeX field types: https://en.wikipedia.org/wiki/BibTeX#Field_types
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`paper.html
|
|
||||||
<searx/templates/simple/result_templates/paper.html>`:
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
An abstract or excerpt from the document.
|
|
||||||
|
|
||||||
comments : :py:class:`str`
|
|
||||||
Free text display in italic below the content.
|
|
||||||
|
|
||||||
tags : :py:class:`List <list>`\ [\ :py:class:`str`\ ]
|
|
||||||
Free tag list.
|
|
||||||
|
|
||||||
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" suffix, the "author" is in the
|
|
||||||
:ref:`macro result_sub_header`).
|
|
||||||
|
|
||||||
editor : :py:class:`str`
|
|
||||||
Editor of the book/paper.
|
|
||||||
|
|
||||||
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``
|
|
||||||
------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`packages.html
|
|
||||||
<searx/templates/simple/result_templates/packages.html>`:
|
|
||||||
|
|
||||||
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'}``
|
|
||||||
|
|
||||||
|
|
||||||
.. _template code:
|
|
||||||
|
|
||||||
``code.html``
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`code.html
|
|
||||||
<searx/templates/simple/result_templates/code.html>`:
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
Description of the code fragment.
|
|
||||||
|
|
||||||
codelines : ``[line1, line2, ...]``
|
|
||||||
Lines of the code fragment.
|
|
||||||
|
|
||||||
code_language : :py:class:`str`
|
|
||||||
Name of the code language, the value is passed to
|
|
||||||
:py:obj:`pygments.lexers.get_lexer_by_name`.
|
|
||||||
|
|
||||||
repository : :py:class:`str`
|
|
||||||
URL of the repository of the code fragment.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template files:
|
|
||||||
|
|
||||||
``files.html``
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`code.html
|
|
||||||
<searx/templates/simple/result_templates/files.html>`:
|
|
||||||
|
|
||||||
filename, size, time: :py:class:`str`
|
|
||||||
Filename, Filesize and Date of the file.
|
|
||||||
|
|
||||||
mtype : ``audio`` | ``video`` | :py:class:`str`
|
|
||||||
Mimetype type of the file.
|
|
||||||
|
|
||||||
subtype : :py:class:`str`
|
|
||||||
Mimetype / subtype of the file.
|
|
||||||
|
|
||||||
abstract : :py:class:`str`
|
|
||||||
Abstract of the file.
|
|
||||||
|
|
||||||
author : :py:class:`str`
|
|
||||||
Name of the author of the file
|
|
||||||
|
|
||||||
embedded : :py:class:`str`
|
|
||||||
URL of an embedded media type (``audio`` or ``video``) / is collapsible.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template products:
|
|
||||||
|
|
||||||
``products.html``
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Displays result fields from:
|
|
||||||
|
|
||||||
- :ref:`macro result_header` and
|
|
||||||
- :ref:`macro result_sub_header`
|
|
||||||
|
|
||||||
Additional fields used in the :origin:`products.html
|
|
||||||
<searx/templates/simple/result_templates/products.html>`:
|
|
||||||
|
|
||||||
content : :py:class:`str`
|
|
||||||
Description of the product.
|
|
||||||
|
|
||||||
price : :py:class:`str`
|
|
||||||
The price must include the currency.
|
|
||||||
|
|
||||||
shipping : :py:class:`str`
|
|
||||||
Shipping details.
|
|
||||||
|
|
||||||
source_country : :py:class:`str`
|
|
||||||
Place from which the shipment is made.
|
|
||||||
|
|
||||||
|
|
||||||
.. _template answer results:
|
|
||||||
|
|
||||||
Answer results
|
|
||||||
==============
|
|
||||||
|
|
||||||
See :ref:`result_types.answer`
|
|
||||||
|
|
||||||
Suggestion results
|
|
||||||
==================
|
|
||||||
|
|
||||||
See :ref:`result_types.suggestion`
|
|
||||||
|
|
||||||
Correction results
|
|
||||||
==================
|
|
||||||
|
|
||||||
See :ref:`result_types.corrections`
|
|
||||||
|
|
||||||
Infobox results
|
|
||||||
===============
|
|
||||||
|
|
||||||
See :ref:`result_types.infobox`
|
|
@ -4,31 +4,26 @@ Welcome to SearXNG
|
|||||||
|
|
||||||
*Search without being tracked.*
|
*Search without being tracked.*
|
||||||
|
|
||||||
.. jinja:: searx
|
SearXNG is a free internet metasearch engine which aggregates results from more
|
||||||
|
than 70 search services. Users are neither tracked nor profiled. Additionally,
|
||||||
SearXNG is a free internet metasearch engine which aggregates results from up
|
SearXNG can be used over Tor for online anonymity.
|
||||||
to {{engines | length}} :ref:`search services <configured engines>`. Users
|
|
||||||
are neither tracked nor profiled. Additionally, SearXNG can be used over Tor
|
|
||||||
for online anonymity.
|
|
||||||
|
|
||||||
Get started with SearXNG by using one of the instances listed at searx.space_.
|
Get started with SearXNG by using one of the instances listed at searx.space_.
|
||||||
If you don't trust anyone, you can set up your own, see :ref:`installation`.
|
If you don't trust anyone, you can set up your own, see :ref:`installation`.
|
||||||
|
|
||||||
.. jinja:: searx
|
.. sidebar:: features
|
||||||
|
|
||||||
.. sidebar:: features
|
- :ref:`self hosted <installation>`
|
||||||
|
- :ref:`no user tracking / no profiling <SearXNG protect privacy>`
|
||||||
- :ref:`self hosted <installation>`
|
- script & cookies are optional
|
||||||
- :ref:`no user tracking / no profiling <SearXNG protect privacy>`
|
- secure, encrypted connections
|
||||||
- script & cookies are optional
|
- :ref:`about 130 search engines <configured engines>`
|
||||||
- secure, encrypted connections
|
- `about 60 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
|
||||||
- :ref:`{{engines | length}} search engines <configured engines>`
|
- about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
|
||||||
- `58 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
|
- :ref:`easy integration of search engines <demo online engine>`
|
||||||
- about 70 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
|
- professional development: `CI <https://github.com/searxng/searxng/actions>`_,
|
||||||
- :ref:`easy integration of search engines <demo online engine>`
|
`quality assurance <https://dev.searxng.org/>`_ &
|
||||||
- professional development: `CI <https://github.com/searxng/searxng/actions>`_,
|
`automated tested UI <https://dev.searxng.org/screenshots.html>`_
|
||||||
`quality assurance <https://dev.searxng.org/>`_ &
|
|
||||||
`automated tested UI <https://dev.searxng.org/screenshots.html>`_
|
|
||||||
|
|
||||||
.. sidebar:: be a part
|
.. sidebar:: be a part
|
||||||
|
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
Why use a private instance?
|
Why use a private instance?
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. sidebar:: Is running my own instance worth it?
|
.. sidebar:: Is it worth to run my own instance?
|
||||||
|
|
||||||
\.\.\.is a common question among SearXNG users. Before answering this
|
\.\. is a common question among SearXNG users. Before answering this
|
||||||
question, see what options a SearXNG user has.
|
question, see what options a SearXNG user has.
|
||||||
|
|
||||||
.. contents::
|
.. contents::
|
||||||
@ -12,13 +12,13 @@ Why use a private instance?
|
|||||||
:local:
|
:local:
|
||||||
:backlinks: entry
|
:backlinks: entry
|
||||||
|
|
||||||
Public instances are open to everyone who has access to their URL. Usually, they
|
Public instances are open to everyone who has access to its URL. Usually, these
|
||||||
are operated by unknown parties (from the users' point of view). Private
|
are operated by unknown parties (from the users' point of view). Private
|
||||||
instances can be used by a select group of people, such as a SearXNG instance for a
|
instances can be used by a select group of people. It is for example a SearXNG of
|
||||||
group of friends, or a company which can be accessed through a VPN. Instances can also be
|
group of friends or a company which can be accessed through VPN. Also it can be
|
||||||
single-user instances, which run locally on the user's machine.
|
single user one which runs on the user's laptop.
|
||||||
|
|
||||||
To gain more insight on how these instances work, let's dive into how SearXNG
|
To gain more insight on how these instances work let's dive into how SearXNG
|
||||||
protects its users.
|
protects its users.
|
||||||
|
|
||||||
.. _SearXNG protect privacy:
|
.. _SearXNG protect privacy:
|
||||||
@ -26,26 +26,26 @@ protects its users.
|
|||||||
How does SearXNG protect privacy?
|
How does SearXNG protect privacy?
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
SearXNG protects the privacy of its users in multiple ways, regardless of the type
|
SearXNG protects the privacy of its users in multiple ways regardless of the type
|
||||||
of the instance (private or public). Removal of private data from search requests
|
of the instance (private, public). Removal of private data from search requests
|
||||||
comes in three forms:
|
comes in three forms:
|
||||||
|
|
||||||
1. Removing private data from requests going to search services
|
1. removal of private data from requests going to search services
|
||||||
2. Not forwarding anything from third party services through search services
|
2. not forwarding anything from a third party services through search services
|
||||||
(e.g. advertisement)
|
(e.g. advertisement)
|
||||||
3. Removing private data from requests going to the results pages
|
3. removal of private data from requests going to the result pages
|
||||||
|
|
||||||
Removing private data means not sending cookies to external search engines and
|
Removing private data means not sending cookies to external search engines and
|
||||||
generating a random browser profile for every request. Thus, it does not matter
|
generating a random browser profile for every request. Thus, it does not matter
|
||||||
if a public or private instance handles the request, because it is anonymized in
|
if a public or private instance handles the request, because it is anonymized in
|
||||||
both cases. The IP address used will be the IP of the instance, but SearXNG can also be
|
both cases. IP addresses will be the IP of the instance. But SearXNG can be
|
||||||
configured to use proxy or Tor. `Result proxy
|
configured to use proxy or Tor. `Result proxy
|
||||||
<https://github.com/asciimoo/morty>`__ is supported, too.
|
<https://github.com/asciimoo/morty>`__ is supported, too.
|
||||||
|
|
||||||
SearXNG does not serve ads or tracking content, unlike most search services. Therefore,
|
SearXNG does not serve ads or tracking content unlike most search services. So
|
||||||
private data is not forwarded to third parties who might monetize it. Besides
|
private data is not forwarded to third parties who might monetize it. Besides
|
||||||
protecting users from search services, both the referring page and search query are
|
protecting users from search services, both referring page and search query are
|
||||||
hidden from the results pages being visited.
|
hidden from visited result pages.
|
||||||
|
|
||||||
|
|
||||||
What are the consequences of using public instances?
|
What are the consequences of using public instances?
|
||||||
@ -53,11 +53,11 @@ What are the consequences of using public instances?
|
|||||||
|
|
||||||
If someone uses a public instance, they have to trust the administrator of that
|
If someone uses a public instance, they have to trust the administrator of that
|
||||||
instance. This means that the user of the public instance does not know whether
|
instance. This means that the user of the public instance does not know whether
|
||||||
their requests are logged, aggregated, and sent or sold to a third party.
|
their requests are logged, aggregated and sent or sold to a third party.
|
||||||
|
|
||||||
Also, public instances without proper protection are more vulnerable to abuse of
|
Also, public instances without proper protection are more vulnerable to abusing
|
||||||
the search service, which may cause the external service to enforce
|
the search service, In this case the external service in exchange returns
|
||||||
CAPTCHAs or to ban the IP address of the instance. Thus, search requests would return less
|
CAPTCHAs or bans the IP of the instance. Thus, search requests return less
|
||||||
results.
|
results.
|
||||||
|
|
||||||
I see. What about private instances?
|
I see. What about private instances?
|
||||||
@ -67,10 +67,10 @@ If users run their :ref:`own instances <installation>`, everything is in their
|
|||||||
control: the source code, logging settings and private data. Unknown instance
|
control: the source code, logging settings and private data. Unknown instance
|
||||||
administrators do not have to be trusted.
|
administrators do not have to be trusted.
|
||||||
|
|
||||||
Furthermore, as the default settings of their instance are editable, there is no
|
Furthermore, as the default settings of their instance is editable, there is no
|
||||||
need to use cookies to tailor SearXNG to their needs and preferences will not
|
need to use cookies to tailor SearXNG to their needs. So preferences will not be
|
||||||
reset to defaults when clearing browser cookies. As settings are stored on
|
reset to defaults when clearing browser cookies. As settings are stored on
|
||||||
the user's computer, they will not be accessible to others as long as their computer is
|
their computer, it will not be accessible to others as long as their computer is
|
||||||
not compromised.
|
not compromised.
|
||||||
|
|
||||||
Conclusion
|
Conclusion
|
||||||
@ -80,7 +80,7 @@ Always use an instance which is operated by people you trust. The privacy
|
|||||||
features of SearXNG are available to users no matter what kind of instance they
|
features of SearXNG are available to users no matter what kind of instance they
|
||||||
use.
|
use.
|
||||||
|
|
||||||
For those on the go, or just wanting to try SearXNG for the first time, public
|
If someone is on the go or just wants to try SearXNG for the first time public
|
||||||
instances are the best choice. Public instances are also making the
|
instances are the best choices. Additionally, public instance are making a
|
||||||
world a better place by giving those who cannot, or do not want to, run an
|
world a better place, because those who cannot or do not want to run an
|
||||||
instance access to a privacy-respecting search service.
|
instance, have access to a privacy respecting search service.
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
Source-Code
|
Source-Code
|
||||||
===========
|
===========
|
||||||
|
|
||||||
This is a partial documentation of our source code. We are not aiming to
|
This is a partial documentation of our source code. We are not aiming to document
|
||||||
document every item from the source code, but we will add documentation when
|
every item from the source code, but we will add documentation when requested.
|
||||||
requested.
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
@ -12,17 +12,13 @@ Bot Detection
|
|||||||
.. automodule:: searx.botdetection
|
.. automodule:: searx.botdetection
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. _botdetection ip_lists:
|
.. automodule:: searx.botdetection.limiter
|
||||||
|
:members:
|
||||||
IP lists
|
|
||||||
========
|
|
||||||
|
|
||||||
.. automodule:: searx.botdetection.ip_lists
|
.. automodule:: searx.botdetection.ip_lists
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
|
||||||
.. _botdetection rate limit:
|
|
||||||
|
|
||||||
Rate limit
|
Rate limit
|
||||||
==========
|
==========
|
||||||
|
|
||||||
@ -33,8 +29,6 @@ Rate limit
|
|||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
|
||||||
.. _botdetection probe headers:
|
|
||||||
|
|
||||||
Probe HTTP headers
|
Probe HTTP headers
|
||||||
==================
|
==================
|
||||||
|
|
||||||
@ -52,11 +46,3 @@ Probe HTTP headers
|
|||||||
|
|
||||||
.. automodule:: searx.botdetection.http_user_agent
|
.. automodule:: searx.botdetection.http_user_agent
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. _botdetection config:
|
|
||||||
|
|
||||||
Config
|
|
||||||
======
|
|
||||||
|
|
||||||
.. automodule:: searx.botdetection.config
|
|
||||||
:members:
|
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
.. _favicons source:
|
|
||||||
|
|
||||||
=================
|
|
||||||
Favicons (source)
|
|
||||||
=================
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:depth: 2
|
|
||||||
:local:
|
|
||||||
:backlinks: entry
|
|
||||||
|
|
||||||
.. automodule:: searx.favicons
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _favicons.config:
|
|
||||||
|
|
||||||
Favicons Config
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. automodule:: searx.favicons.config
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _favicons.proxy:
|
|
||||||
|
|
||||||
Favicons Proxy
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. automodule:: searx.favicons.proxy
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _favicons.resolver:
|
|
||||||
|
|
||||||
Favicons Resolver
|
|
||||||
=================
|
|
||||||
|
|
||||||
.. automodule:: searx.favicons.resolvers
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _favicons.cache:
|
|
||||||
|
|
||||||
Favicons Cache
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. automodule:: searx.favicons.cache
|
|
||||||
:members:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,6 +10,11 @@ Locales
|
|||||||
:backlinks: entry
|
:backlinks: entry
|
||||||
|
|
||||||
.. automodule:: searx.locales
|
.. automodule:: searx.locales
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
SearXNG's locale codes
|
||||||
|
======================
|
||||||
|
|
||||||
|
.. automodule:: searx.sxng_locales
|
||||||
|
:members:
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
.. _tor check plugin:
|
.. _tor check plugin:
|
||||||
|
|
||||||
=========
|
================
|
||||||
Tor check
|
Tor check plugin
|
||||||
=========
|
================
|
||||||
|
|
||||||
.. automodule:: searx.plugins.tor_check
|
.. automodule:: searx.plugins.tor_check
|
||||||
:members:
|
:members:
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _searx.settings_loader:
|
|
||||||
|
|
||||||
===============
|
|
||||||
Settings Loader
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. automodule:: searx.settings_loader
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _sqlite db:
|
|
||||||
|
|
||||||
=========
|
|
||||||
SQLite DB
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. automodule:: searx.sqlitedb
|
|
||||||
:members:
|
|
@ -188,7 +188,7 @@ output of::
|
|||||||
|
|
||||||
Since the path ``/share/SearXNG`` of the HOST system is wrapped into the
|
Since the path ``/share/SearXNG`` of the HOST system is wrapped into the
|
||||||
container under the same name, the shown ``Makefile`` (inode ``47712402``) in
|
container under the same name, the shown ``Makefile`` (inode ``47712402``) in
|
||||||
the output is always the identical ``/share/SearXNG/Makefile`` from the HOST
|
the ouput is always the identical ``/share/SearXNG/Makefile`` from the HOST
|
||||||
system. In the example shown above the owner of the path in the container is
|
system. In the example shown above the owner of the path in the container is
|
||||||
the ``root`` user of the container (and the timezone in the container is
|
the ``root`` user of the container (and the timezone in the container is
|
||||||
different to HOST system).
|
different to HOST system).
|
||||||
|
25
examples/basic_engine.py
Normal file
25
examples/basic_engine.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
categories = ['general'] # optional
|
||||||
|
|
||||||
|
|
||||||
|
def request(query, params):
|
||||||
|
'''pre-request callback
|
||||||
|
params<dict>:
|
||||||
|
method : POST/GET
|
||||||
|
headers : {}
|
||||||
|
data : {} # if method == POST
|
||||||
|
url : ''
|
||||||
|
category: 'search category'
|
||||||
|
pageno : 1 # number of the requested page
|
||||||
|
'''
|
||||||
|
|
||||||
|
params['url'] = 'https://host/%s' % query
|
||||||
|
|
||||||
|
return params
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp):
|
||||||
|
'''post-response callback
|
||||||
|
resp: requests response object
|
||||||
|
'''
|
||||||
|
return [{'url': '', 'title': '', 'content': ''}]
|
93
manage
93
manage
@ -41,10 +41,10 @@ PATH="${REPO_ROOT}/node_modules/.bin:${PATH}"
|
|||||||
|
|
||||||
PYOBJECTS="searx"
|
PYOBJECTS="searx"
|
||||||
PY_SETUP_EXTRAS='[test]'
|
PY_SETUP_EXTRAS='[test]'
|
||||||
GECKODRIVER_VERSION="v0.35.0"
|
GECKODRIVER_VERSION="v0.30.0"
|
||||||
# SPHINXOPTS=
|
# SPHINXOPTS=
|
||||||
BLACK_OPTIONS=("--target-version" "py311" "--line-length" "120" "--skip-string-normalization")
|
BLACK_OPTIONS=("--target-version" "py311" "--line-length" "120" "--skip-string-normalization")
|
||||||
BLACK_TARGETS=("--exclude" "(searx/static|searx/languages.py)" "--include" 'searxng.msg|\.pyi?$' "searx" "searxng_extra" "tests")
|
BLACK_TARGETS=("--exclude" "searx/static,searx/languages.py" "--include" 'searxng.msg|\.pyi?$' "searx" "searxng_extra" "tests")
|
||||||
|
|
||||||
_dev_redis_sock="/usr/local/searxng-redis/run/redis.sock"
|
_dev_redis_sock="/usr/local/searxng-redis/run/redis.sock"
|
||||||
# set SEARXNG_REDIS_URL if it is not defined and "{_dev_redis_sock}" exists.
|
# set SEARXNG_REDIS_URL if it is not defined and "{_dev_redis_sock}" exists.
|
||||||
@ -52,20 +52,39 @@ if [ -S "${_dev_redis_sock}" ] && [ -z "${SEARXNG_REDIS_URL}" ]; then
|
|||||||
export SEARXNG_REDIS_URL="unix://${_dev_redis_sock}?db=0"
|
export SEARXNG_REDIS_URL="unix://${_dev_redis_sock}?db=0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
pylint.FILES() {
|
||||||
|
|
||||||
|
# List files tagged by comment:
|
||||||
|
#
|
||||||
|
# # lint: pylint
|
||||||
|
#
|
||||||
|
# These py files are linted by test.pylint()
|
||||||
|
|
||||||
|
grep -l -r --include \*.py '^#[[:blank:]]*lint:[[:blank:]]*pylint' searx searxng_extra tests
|
||||||
|
find . -name searxng.msg
|
||||||
|
}
|
||||||
|
|
||||||
YAMLLINT_FILES=()
|
YAMLLINT_FILES=()
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
if [ "$line" != "tests/unit/settings/syntaxerror_settings.yml" ]; then
|
YAMLLINT_FILES+=("$line")
|
||||||
YAMLLINT_FILES+=("$line")
|
done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')"
|
||||||
fi
|
|
||||||
done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml' '.github/*.yml' '.github/*/*.yml')"
|
|
||||||
|
|
||||||
RST_FILES=(
|
RST_FILES=(
|
||||||
'README.rst'
|
'README.rst'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
PYLINT_SEARXNG_DISABLE_OPTION="\
|
||||||
|
I,C,R,\
|
||||||
|
W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\
|
||||||
|
E1136"
|
||||||
|
PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES="traits,supported_languages,language_aliases,logger,categories"
|
||||||
|
PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc"
|
||||||
|
|
||||||
help() {
|
help() {
|
||||||
nvm.help
|
nvm.help
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
buildenv:
|
||||||
|
rebuild ./utils/brand.env
|
||||||
webapp.:
|
webapp.:
|
||||||
run : run developer instance
|
run : run developer instance
|
||||||
docs.:
|
docs.:
|
||||||
@ -92,8 +111,12 @@ pyenv.:
|
|||||||
uninstall : uninstall developer installation
|
uninstall : uninstall developer installation
|
||||||
cmd ... : run command ... in virtualenv
|
cmd ... : run command ... in virtualenv
|
||||||
OK : test if virtualenv is OK
|
OK : test if virtualenv is OK
|
||||||
|
pypi.upload:
|
||||||
|
Upload python packages to PyPi (to test use pypi.upload.test)
|
||||||
format.:
|
format.:
|
||||||
python : format Python code source using black
|
python : format Python code source using black
|
||||||
|
pygments.:
|
||||||
|
less : build LESS files for pygments
|
||||||
EOF
|
EOF
|
||||||
go.help
|
go.help
|
||||||
node.help
|
node.help
|
||||||
@ -132,6 +155,29 @@ webapp.run() {
|
|||||||
SEARXNG_DEBUG=1 pyenv.cmd python -m searx.webapp
|
SEARXNG_DEBUG=1 pyenv.cmd python -m searx.webapp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildenv() {
|
||||||
|
|
||||||
|
# settings file from repository's working tree are used by default
|
||||||
|
SEARXNG_SETTINGS_PATH="${REPO_ROOT}/searx/settings.yml"
|
||||||
|
|
||||||
|
if [ -f /etc/searx/settings.yml ]; then
|
||||||
|
err_msg "settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -r '/etc/searxng/settings.yml' ]; then
|
||||||
|
if ask_yn "should settings read from: /etc/searxng/settings.yml"; then
|
||||||
|
SEARXNG_SETTINGS_PATH='/etc/searxng/settings.yml'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
export SEARXNG_SETTINGS_PATH
|
||||||
|
(
|
||||||
|
set -e
|
||||||
|
SEARXNG_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \
|
||||||
|
| prefix_stdout "${_Blue}BUILDENV${_creset} "
|
||||||
|
)
|
||||||
|
return "${PIPESTATUS[0]}"
|
||||||
|
}
|
||||||
|
|
||||||
docker.push() {
|
docker.push() {
|
||||||
docker.build push
|
docker.build push
|
||||||
}
|
}
|
||||||
@ -231,7 +277,7 @@ gecko.driver() {
|
|||||||
build_msg INSTALL "geckodriver already installed"
|
build_msg INSTALL "geckodriver already installed"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
PLATFORM="$(python -c 'import platform; print(platform.system().lower(), platform.architecture()[0])')"
|
PLATFORM="$(python3 -c 'import platform; print(platform.system().lower(), platform.architecture()[0])')"
|
||||||
case "$PLATFORM" in
|
case "$PLATFORM" in
|
||||||
"linux 32bit" | "linux2 32bit") ARCH="linux32";;
|
"linux 32bit" | "linux2 32bit") ARCH="linux32";;
|
||||||
"linux 64bit" | "linux2 64bit") ARCH="linux64";;
|
"linux 64bit" | "linux2 64bit") ARCH="linux64";;
|
||||||
@ -251,6 +297,15 @@ gecko.driver() {
|
|||||||
dump_return $?
|
dump_return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pygments.less() {
|
||||||
|
build_msg PYGMENTS "searxng_extra/update/update_pygments.py"
|
||||||
|
if ! pyenv.cmd python searxng_extra/update/update_pygments.py; then
|
||||||
|
build_msg PYGMENTS "building LESS files for pygments failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
py.build() {
|
py.build() {
|
||||||
build_msg BUILD "python package ${PYDIST}"
|
build_msg BUILD "python package ${PYDIST}"
|
||||||
pyenv.cmd python setup.py \
|
pyenv.cmd python setup.py \
|
||||||
@ -288,8 +343,9 @@ pyenv.install() {
|
|||||||
|
|
||||||
( set -e
|
( set -e
|
||||||
pyenv
|
pyenv
|
||||||
build_msg PYENV "[install] pip install --use-pep517 --no-build-isolation -e 'searx${PY_SETUP_EXTRAS}'"
|
build_msg PYENV "[install] pip install -e 'searx${PY_SETUP_EXTRAS}'"
|
||||||
"${PY_ENV_BIN}/python" -m pip install --use-pep517 --no-build-isolation -e ".${PY_SETUP_EXTRAS}"
|
"${PY_ENV_BIN}/python" -m pip install -e ".${PY_SETUP_EXTRAS}"
|
||||||
|
buildenv
|
||||||
)
|
)
|
||||||
local exit_val=$?
|
local exit_val=$?
|
||||||
if [ ! $exit_val -eq 0 ]; then
|
if [ ! $exit_val -eq 0 ]; then
|
||||||
@ -304,12 +360,31 @@ pyenv.uninstall() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pypi.upload() {
|
||||||
|
py.clean
|
||||||
|
py.build
|
||||||
|
# https://github.com/pypa/twine
|
||||||
|
pyenv.cmd twine upload "${PYDIST}"/*
|
||||||
|
}
|
||||||
|
|
||||||
|
pypi.upload.test() {
|
||||||
|
py.clean
|
||||||
|
py.build
|
||||||
|
pyenv.cmd twine upload -r testpypi "${PYDIST}"/*
|
||||||
|
}
|
||||||
|
|
||||||
format.python() {
|
format.python() {
|
||||||
build_msg TEST "[format.python] black \$BLACK_TARGETS"
|
build_msg TEST "[format.python] black \$BLACK_TARGETS"
|
||||||
pyenv.cmd black "${BLACK_OPTIONS[@]}" "${BLACK_TARGETS[@]}"
|
pyenv.cmd black "${BLACK_OPTIONS[@]}" "${BLACK_TARGETS[@]}"
|
||||||
dump_return $?
|
dump_return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PYLINT_FILES=()
|
||||||
|
while IFS= read -r line; do
|
||||||
|
PYLINT_FILES+=("$line")
|
||||||
|
done <<< "$(pylint.FILES)"
|
||||||
|
|
||||||
# shellcheck disable=SC2119
|
# shellcheck disable=SC2119
|
||||||
main() {
|
main() {
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user