From 79ae7112659fa92ac1b785b577150a9e6d643da9 Mon Sep 17 00:00:00 2001 From: Andrew Baek Date: Wed, 26 Nov 2025 18:50:24 +0400 Subject: [PATCH 1/2] Updated SearXNG Web Search Documents --- docs/features/web-search/searxng.md | 219 +++++++++------------------- static/images/web_search_toggle.png | Bin 9412 -> 12786 bytes 2 files changed, 66 insertions(+), 153 deletions(-) diff --git a/docs/features/web-search/searxng.md b/docs/features/web-search/searxng.md index fcbc79c..82082fc 100644 --- a/docs/features/web-search/searxng.md +++ b/docs/features/web-search/searxng.md @@ -21,15 +21,15 @@ To configure SearXNG optimally for use with Open WebUI, follow these steps: **Step 1: `git clone` SearXNG Docker and navigate to the folder:** -1. Create a New Directory `searxng-docker` +1. Clone the repository `searxng-docker` - Clone the searxng-docker repository. This folder will contain your SearXNG configuration files. Refer to the [SearXNG documentation](https://docs.searxng.org/) for configuration instructions. + Clone the searxng-docker repository. This will create a new directory called `searxng-docker`, which will contain your SearXNG configuration files. Refer to the [SearXNG documentation](https://docs.searxng.org/) for configuration instructions. ```bash git clone https://github.com/searxng/searxng-docker.git ``` -Navigate to the `searxng-docker` repository: +Navigate to the `searxng-docker` repository, and run all commands from there: ```bash cd searxng-docker @@ -49,7 +49,7 @@ cd searxng-docker # * uncomment LETSENCRYPT_EMAIL, and replace by your email (require to create a Let's Encrypt certificate) -SEARXNG_HOSTNAME=localhost:8080/ +SEARXNG_HOSTNAME=localhost # LETSENCRYPT_EMAIL= @@ -68,8 +68,18 @@ SEARXNG_HOSTNAME=localhost:8080/ 3. Remove the `localhost` restriction by modifying the `docker-compose.yaml` file: +If port 8080 is already in use, change `0.0.0.0:8080` to `0.0.0.0:[available port]` in the command before running it. + +Run the appropriate command for your operating system: + +- **Linux** ```bash -sed -i "s/127.0.0.1:8080/0.0.0.0:8080/" +sed -i 's/127.0.0.1:8080/0.0.0.0:8080/' docker-compose.yaml +``` + +- **macOS**: +```bash +sed -i '' 's/127.0.0.1:8080/0.0.0.0:8080/' docker-compose.yaml ``` **Step 4: Grant Necessary Permissions** @@ -77,13 +87,15 @@ sed -i "s/127.0.0.1:8080/0.0.0.0:8080/" 4. Allow the container to create new config files by running the following command in the root directory: ```bash -sudo chmod a+rwx searxng-docker/searxng +sudo chmod a+rwx searxng ``` **Step 5: Create a Non-Restrictive `limiter.toml` File** 5. Create a non-restrictive `searxng-docker/searxng/limiter.toml` config file: +*If the file already exists, append the missing lines to it.* +
@@ -112,172 +124,72 @@ pass_ip = [] 6. Delete the default `searxng-docker/searxng/settings.yml` file if it exists, as it will be regenerated on the first launch of SearXNG: ```bash -rm searxng-docker/searxng/settings.yml +rm searxng/settings.yml ``` **Step 7: Create a Fresh `settings.yml` File** -:::note - -On the first run, you must remove `cap_drop: - ALL` from the `docker-compose.yaml` file for the `searxng` service to successfully create `/etc/searxng/uwsgi`.ini. This is necessary because the `cap_drop: - ALL` directive removes all capabilities, including those required for the creation of the `uwsgi.ini` file. After the first run, you should re-add `cap_drop: - ALL` to the `docker-compose.yaml` file for security reasons. - -::: - 7. Bring up the container momentarily to generate a fresh settings.yml file: +If the container name caddy, redis, searxng is already in use, change it to another name of your choice in the docker-compose.yaml file. + ```bash docker compose up -d ; sleep 10 ; docker compose down ``` -**Step 8: Add Formats and Update Port Number** +After the initial run, add `cap_drop: - ALL` to the `docker-compose.yaml` file for security reasons. + +
+docker-compose.yaml + +```yaml +searxng: + container_name: searxng + image: docker.io/searxng/searxng:latest + restart: unless-stopped + networks: + - searxng + ports: + - "0.0.0.0:9630:8080" + volumes: + - ./searxng:/etc/searxng:rw + - searxng-data:/var/cache/searxng:rw + environment: + - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/ + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "1" + cap_drop: + - ALL +``` + +
+ +**Step 8: Add Formats** 8. Add HTML and JSON formats to the `searxng-docker/searxng/settings.yml` file: +- **Linux** ```bash -sed -i 's/formats: \[\"html\"\/]/formats: [\"html\", \"json\"]/' searxng-docker/searxng/settings.yml +sed -i 's/- html/- html\n - json/' searxng/settings.yml ``` -Generate a secret key for your SearXNG instance: +- **macOS** +```bash +sed -i '' 's/- html/- html\n - json/' searxng/settings.yml +``` + +**Step 9: Run the Server** + +9. Start the container with the following command: ```bash -sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng-docker/searxng/settings.yml +docker compose up -d ``` -Windows users can use the following powershell script to generate the secret key: - -```powershell -$randomBytes = New-Object byte[] 32 -(New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($randomBytes) -$secretKey = -join ($randomBytes | ForEach-Object { "{0:x2}" -f $_ }) -(Get-Content searxng-docker/searxng/settings.yml) -replace 'ultrasecretkey', $secretKey | Set-Content searxng-docker/searxng/settings.yml -``` - -Update the port number in the `server` section to match the one you set earlier (in this case, `8080`): - -```bash -sed -i 's/port: 8080/port: 8080/' searxng-docker/searxng/settings.yml -``` - -Change the `bind_address` as desired: - -```bash -sed -i 's/bind_address: "0.0.0.0"/bind_address: "127.0.0.1"/' searxng-docker/searxng/settings.yml -``` - -#### Configuration Files - -#### searxng-docker/searxng/settings.yml (Extract) - -The default `settings.yml` file contains many engine settings. Below is an extract of what the default `settings.yml` file might look like: - - -
- -searxng-docker/searxng/settings.yml - -```yaml - -# see https://docs.searxng.org/admin/settings/settings.html#settings-use-default-settings -use_default_settings: true - -server: - # base_url is defined in the SEARXNG_BASE_URL environment variable, see .env and docker-compose.yml - secret_key: "ultrasecretkey" # change this! - limiter: true # can be disabled for a private instance - image_proxy: true - port: 8080 - bind_address: "0.0.0.0" - -ui: - static_use_hash: true - -search: - safe_search: 0 - autocomplete: "" - default_lang: "" - formats: - - html - - json # json is required - # remove format to deny access, use lower case. - # formats: [html, csv, json, rss] -redis: - # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. - # https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis - url: redis://redis:6379/0 -``` - -The port in the settings.yml file for SearXNG should match that of the port number in your docker-compose.yml file for SearXNG. - -
- -**Step 9: Update `uwsgi.ini` File** - -9. Ensure your `searxng-docker/searxng/uwsgi.ini` file matches the following: - - -
- -searxng-docker/searxng/uwsgi.ini - -```ini -[uwsgi] - -# Who will run the code -uid = searxng -gid = searxng - -# Number of workers (usually CPU count) - -# default value: %k (= number of CPU core, see Dockerfile) -workers = %k - -# Number of threads per worker - -# default value: 4 (see Dockerfile) -threads = 4 - -# The right granted on the created socket -chmod-socket = 666 - -# Plugin to use and interpreter config -single-interpreter = true -master = true -plugin = python3 -lazy-apps = true -enable-threads = 4 - -# Module to import -module = searx.webapp - -# Virtualenv and python path -pythonpath = /usr/local/searxng/ -chdir = /usr/local/searxng/searx/ - -# automatically set processes name to something meaningful -auto-procname = true - -# Disable request logging for privacy -disable-logging = true -log-5xx = true - -# Set the max size of a request (request-body excluded) -buffer-size = 8192 - -# No keep alive - -# See https://github.com/searx/searx-docker/issues/24 -add-header = Connection: close - -# uwsgi serves the static files -static-map = /static=/usr/local/searxng/searx/static - -# expires set to one day -static-expires = /* 86400 -static-gzip-all = True -offload-threads = 4 -``` - -
+The searXNG will be available at http://localhost:8080 (or the port number you set earlier). ## 2. Alternative Setup @@ -412,6 +324,7 @@ docker exec -it open-webui curl http://host.docker.internal:8080/search?q=this+i 3. Set `Web Search Engine` from dropdown menu to `searxng` 4. Set `Searxng Query URL` to one of the following examples: +- `http://localhost:8080/search?q=` (using the host and exposed port, suitable for Docker-based setups) - `http://searxng:8080/search?q=` (using the container name and exposed port, suitable for Docker-based setups) - `http://host.docker.internal:8080/search?q=` (using the `host.docker.internal` DNS name and the host port, suitable for Docker-based setups) - `http:///search?q=` (using a local domain name, suitable for local network access) @@ -426,7 +339,7 @@ docker exec -it open-webui curl http://host.docker.internal:8080/search?q=this+i ## 5. Using Web Search in a Chat -To access Web Search, Click on the + next to the message input field. +To access Web Search, Click the Integrations button next to the + icon. Here you can toggle Web Search On/Off. diff --git a/static/images/web_search_toggle.png b/static/images/web_search_toggle.png index 7071d1efabb44c495462cf5649e11d519cc64417..5eb71f2e48901931612ec6efade0f53bb7a01318 100644 GIT binary patch literal 12786 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 S@SDg%z(+|=Rkj3f6!1U6jew>A literal 9412 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 ZboQno(%1=Sc!Uvxw77y;1;{AyKLCTmJn{el From 9799fb40c984bc5449fca6bc656a7fde1b8728f5 Mon Sep 17 00:00:00 2001 From: Andrew Baek Date: Fri, 28 Nov 2025 19:06:27 +0400 Subject: [PATCH 2/2] Update searxng.md --- docs/features/web-search/searxng.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/features/web-search/searxng.md b/docs/features/web-search/searxng.md index 82082fc..7de9c98 100644 --- a/docs/features/web-search/searxng.md +++ b/docs/features/web-search/searxng.md @@ -131,7 +131,7 @@ rm searxng/settings.yml 7. Bring up the container momentarily to generate a fresh settings.yml file: -If the container name caddy, redis, searxng is already in use, change it to another name of your choice in the docker-compose.yaml file. +If you have multiple containers running with the same name, such as caddy, redis, or searxng, you need to rename them in the docker-compose.yaml file to avoid conflicts. ```bash docker compose up -d ; sleep 10 ; docker compose down @@ -139,6 +139,8 @@ docker compose up -d ; sleep 10 ; docker compose down After the initial run, add `cap_drop: - ALL` to the `docker-compose.yaml` file for security reasons. +If Open WebUI is running in the same Docker network as Searxng, you may remove the `0.0.0.0` and only specify the port mapping. In this case, Open WebUI can access Searxng directly using the container name. +
docker-compose.yaml @@ -150,7 +152,7 @@ searxng: networks: - searxng ports: - - "0.0.0.0:9630:8080" + - "0.0.0.0:8080:8080" # use 8080:8080 if containers are in the same Docker network volumes: - ./searxng:/etc/searxng:rw - searxng-data:/var/cache/searxng:rw @@ -324,7 +326,7 @@ docker exec -it open-webui curl http://host.docker.internal:8080/search?q=this+i 3. Set `Web Search Engine` from dropdown menu to `searxng` 4. Set `Searxng Query URL` to one of the following examples: -- `http://localhost:8080/search?q=` (using the host and exposed port, suitable for Docker-based setups) +- `http://localhost:8080/search?q=` (using the host and host port, suitable for Docker-based setups) - `http://searxng:8080/search?q=` (using the container name and exposed port, suitable for Docker-based setups) - `http://host.docker.internal:8080/search?q=` (using the `host.docker.internal` DNS name and the host port, suitable for Docker-based setups) - `http:///search?q=` (using a local domain name, suitable for local network access)