# SearXNG 本地部署同配置

CherryStudio 支援透過 SearXNG 進行網絡搜尋，SearXNG 係一個可以喺本地部署亦可以喺伺服器上部署嘅開源項目，所以同其他需要 API 提供商嘅配置方式有少少唔同。

**SearXNG 項目連結**：[SearXNG](https://github.com/searxng/searxng)

## SearXNG 嘅優勢

* 開源免費，唔使 API
* 私隱性相對較高
* 可以高度自訂化

## 本地部署

### 一、Docker 直接部署

由於 SearXNG 唔需要複雜嘅環境配置，可以唔使 docker compose，只需要簡單提供一個空閒端口就可以部署，所以最快捷嘅方式可以用 Docker 直接拉取映像進行部署。

#### 1. 下載安裝並配置 [docker](https://www.docker.com/)

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-1b27ead287467473e771c8b405fc4b9e1a534a80%2Fsearxng_config_img_01.png?alt=media" alt=""><figcaption></figcaption></figure>

安裝後揀一個映像儲存路徑：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-8493779a643cd38286826902f472600739a22aca%2Fsearxng_config_img_02.png?alt=media" alt=""><figcaption></figcaption></figure>

#### 2. 搜尋並拉取 SearXNG 映像

搜尋欄輸入 **searxng** ：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-cdd8b1aad320ea28a095ce1d3fd92cfdbe2e880c%2Fsearxng_config_img_03.png?alt=media" alt=""><figcaption></figcaption></figure>

拉取映像：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-75ad78ce6fbaa00eb5fc4e7c1f91ba459fe4cf30%2Fsearxng_config_img_04.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-f59e5e9a9979733a4b6053d87d4b30879dcd56c0%2Fsearxng_config_img_05.png?alt=media" alt=""><figcaption></figcaption></figure>

#### 3. 運行映像

拉取成功後去到 **images** 頁面：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-d24c69efec2b7a6ea06c11d3c41848180d581ef0%2Fsearxng_config_img_06.png?alt=media" alt=""><figcaption></figcaption></figure>

揀選拉取嘅映像並撳運行：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-3f6443a1e0bab7e657d53f475faa40b6c0302d7b%2Fsearxng_config_img_07.png?alt=media" alt=""><figcaption></figcaption></figure>

打開設定項進行配置：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-db842f9d7f6e8bd9a524e9f517cc079d22962892%2Fsearxng_config_img_08.png?alt=media" alt=""><figcaption></figcaption></figure>

以 `8085` 端口為例：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-b79fc989c242def95dc2255d56560822211b8bb2%2Fsearxng_config_img_09.png?alt=media" alt=""><figcaption></figcaption></figure>

運行成功後撳連結就可以打開 SearXNG 嘅前端界面：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-2f61f7351d1c63e740c00d4d5fc23449c5824976%2Fsearxng_config_img_10.png?alt=media" alt=""><figcaption></figcaption></figure>

出現呢個頁面就代表部署成功：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-44472c972b4deb761cfd649536760ebe3d8ba634%2Fsearxng_config_img_11.png?alt=media" alt=""><figcaption></figcaption></figure>

## 伺服器部署

鑑於 Windows 底下安裝 Docker 係一件比較麻煩嘅事，用户可以將 SearXNG 部署喺伺服器上，亦可以順便共享俾其他人用。不過好可惜，SearXNG 自身暫時唔支援鑑權，導致其他人可以透過技術手段掃描到並濫用你部署嘅實例。

為此，Cherry Studio 目前已支援配置 [HTTP 基本認證（RFC7617）](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/Authentication)，如果用户想將自己部署嘅 SearXNG 暴露喺公網環境下，請**務必**透過 Nginx 等反向代理軟件配置 HTTP 基本認證。下面提供簡要教學，需要你有基本嘅 Linux 運維知識。

### 部署 SearXNG

類似地，仍然用 Docker 部署。假設你已經按照[官方教程](https://docs.docker.com/engine/install)喺伺服器上安裝好最新版 Docker CE，以下提供一條龍命令，適用於 Debian 系統下全新安裝：

```bash
sudo apt update
sudo apt install git -y

# 拉取官方倉庫
cd /opt
git clone https://github.com/searxng/searxng-docker.git
cd /opt/searxng-docker

# 如果你嘅伺服器帶寬好細, 可以設為 false
export IMAGE_PROXY=true

# 修改配置文件
cat <<EOF > /opt/searxng-docker/searxng/settings.yml
# 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: $(openssl rand -hex 32)
  limiter: false  # can be disabled for a private instance
  image_proxy: $IMAGE_PROXY
ui:
  static_use_hash: true
redis:
  url: redis://redis:6379/0
search:
  formats:
    - html
    - json
EOF
```

如果你需要修改本地監聽端口、重用本地已有嘅 nginx，可以編輯 `docker-compose.yaml` 文件，參考如下：

```yaml
version: "3.7"

services:
# 如果唔需要 Caddy 而重用本地已經有嘅 Nginx, 就將下面嗰段刪走。我哋預設唔需要 Caddy.
  caddy:
    container_name: caddy
    image: docker.io/library/caddy:2-alpine
    network_mode: host
    restart: unless-stopped
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy-data:/data:rw
      - caddy-config:/config:rw
    environment:
      - SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME:-http://localhost}
      - SEARXNG_TLS=${LETSENCRYPT_EMAIL:-internal}
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"
# 如果唔需要 Caddy 而重用本地已經有嘅 Nginx, 就將上面嗰段刪走。我哋預設唔需要 Caddy.
  redis:
    container_name: redis
    image: docker.io/valkey/valkey:8-alpine
    command: valkey-server --save 30 1 --loglevel warning
    restart: unless-stopped
    networks:
      - searxng
    volumes:
      - valkey-data2:/data
    cap_drop:
      - ALL
    cap_add:
      - SETGID
      - SETUID
      - DAC_OVERRIDE
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

  searxng:
    container_name: searxng
    image: docker.io/searxng/searxng:latest
    restart: unless-stopped
    networks:
      - searxng
    # 預設映射到宿主機 8080 端口, 假如你想監聽 8000 就改成 "127.0.0.1:8000:8080"
    ports:
      - "127.0.0.1:8080:8080"
    volumes:
      - ./searxng:/etc/searxng:rw
    environment:
      - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
      - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}
      - UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

networks:
  searxng:

volumes:
# 如果唔需要 Caddy 而重用本地已經有嘅 Nginx, 就將下面嗰段刪走
  caddy-data:
  caddy-config:
# 如果唔需要 Caddy 而重用本地已經有嘅 Nginx, 就將上面嗰段刪走
  valkey-data2:
```

執行 `docker compose up -d` 啟動。執行 `docker compose logs -f searxng` 可以睇到日誌。

### 部署 Nginx 反向代理同 HTTP 基本認證

如果你用咗一啲伺服器面板程式，例如寶塔面板或 1Panel，請參閱其文件新增網站並配置 nginx 反向代理，之後搵到修改 nginx 配置文件嘅地方，\
參考下面嘅示例進行修改：

```conf
server
{
    listen 443 ssl;

    # 呢行係你嘅主機名
    server_name search.example.com;

    # index index.html;
    # root /data/www/default;

    # 如果配置咗 SSL 應該有呢兩行
    ssl_certificate    /path/to/your/cert/fullchain.pem;
    ssl_certificate_key    /path/to/your/cert/privkey.pem;

    # HSTS
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

    # 預設情況下透過面板配置反向代理，預設嘅 location 區塊就係咁樣
    location / {
        # 只需要喺 location 區塊加入下面兩行，其他保留原樣就得。
        # 呢度示例假設你嘅配置文件保存在 /etc/nginx/conf.d/ 目錄下。
        # 如果係寶塔應該係保存在 /www 之類嘅目錄下，要留意。
        auth_basic "Please enter your username and password";
        auth_basic_user_file /etc/nginx/conf.d/search.htpasswd;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        proxy_pass http://127.0.0.1:8000;
        client_max_body_size 0;
    }

    # access_log  ...;
    # error_log  ...;
}
```

假設 Nginx 配置文件保存於 `/etc/nginx/conf.d` 底下，我哋將密碼文件保存喺同目錄下。

執行命令（自行將 `example_name`、`example_password` 替換成你將要設定嘅用戶名同密碼）：

```bash
echo "example_name:$(openssl passwd -5 'example_password')" > /etc/nginx/conf.d/search.htpasswd
```

重啟 Nginx（重新載入配置都得）。

呢個時候可以打開網頁，已經會提示你輸入用戶名同密碼，請輸入前面設定嘅用戶名同密碼睇下可唔可以成功入到 SearXNG 搜尋頁面，藉此檢查配置係咪正確。

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-0fd45564d581a615a393b9a142b2369045190718%2Fsearxng-basic-auth-example.png?alt=media" alt=""><figcaption></figcaption></figure>

## Cherry Studio 相關配置

SearXNG 喺本地或者伺服器部署成功後，接落嚟就係 CherryStudio 嘅相關配置。

去到網絡搜尋設定頁面，揀 Searxng ：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-fa81664e84bfd1aedd4cc49c8f8aad776d01bb8f%2Fsearxng_config_img_12.png?alt=media" alt=""><figcaption></figcaption></figure>

直接輸入本地部署嘅連結發現驗證失敗，呢個時候唔使擔心：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-c510fe82cadd0a6b88285ce5aafe411098fdd213%2Fsearxng_config_img_13.png?alt=media" alt=""><figcaption></figcaption></figure>

因為直接部署之後預設並冇配置 json 返回類型，所以攞唔到資料，需要修改配置文件。

返去 Docker，去到 Files 標籤頁搵到映像入面帶標籤嘅文件夾：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-6382e59d154564d3a5dc374a218fe692e4209e13%2Fsearxng_config_img_14.png?alt=media" alt=""><figcaption></figcaption></figure>

展開後繼續往下搵，會發現另一個帶標籤嘅文件夾：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-cf7b94e43ae1dde481264c178a6c1f7e093afeb3%2Fsearxng_config_img_15.png?alt=media" alt=""><figcaption></figcaption></figure>

繼續展開，搵到 **settings.yml** 配置文件：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-0747ac7fe0eeb0bf473eefea761e066c8999b4d4%2Fsearxng_config_img_16.png?alt=media" alt=""><figcaption></figcaption></figure>

撳打開文件編輯器：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-8f7e112dfab03c2f5eb10e7cef2b3356cc0851f9%2Fsearxng_config_img_17.png?alt=media" alt=""><figcaption></figcaption></figure>

搵到 78 行，可以睇到類型只有一個 html

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-1e12ae76d3bff19083cb789e472678fe612b9f96%2Fsearxng_config_img_18.png?alt=media" alt=""><figcaption></figcaption></figure>

加上 json 類型後儲存，重新運行映像

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-daa0caf9233f6a660a15917b9d3493d14b3e36f1%2Fsearxng_config_img_19.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-228489598185ce0aee9897456b0bab09bbb3e372%2Fsearxng_config_img_20.png?alt=media" alt=""><figcaption></figcaption></figure>

重新返去 Cherry Studio 進行驗證，驗證成功：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-52538fdd22755875d512a2e2a3f1fd095e070e99%2Fsearxng_config_img_21.png?alt=media" alt=""><figcaption></figcaption></figure>

地址可以填本地： <http://localhost> : 端口號\
亦可以填 docker 地址：<http://host.docker.internal> : 端口號

如果用户跟住前面嘅示例喺伺服器上部署並正確配置咗反向代理，已經開啟咗 json 返回類型。輸入地址後進行驗證，由於已經為反向代理配置咗 HTTP 基本認證，呢個時候驗證應該返回 401 錯誤碼：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-208ee5d8a5957588317419c48b6de6ee226929a5%2Fsearxng-basic-auth-client-setting-failed.png?alt=media" alt=""><figcaption></figcaption></figure>

喺客戶端配置 HTTP 基本認證，輸入頭先設定嘅用戶名同密碼：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-8c7b8e50f4aa95e97978a66b86d732783bce4641%2Fsearxng-basic-auth-client-setting.png?alt=media" alt=""><figcaption></figcaption></figure>

進行驗證，應該驗證成功。

### 其他配置

呢個時候 SearXNG 已經具備預設聯網搜尋能力，如需自訂搜尋引擎需要自行進行配置

要留意嘅係呢度首選項並唔能夠影響大模型調用時嘅配置

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-384924a65c9928b78115892800ab5ff455a91c6c%2Fsearxng_config_img_22.png?alt=media" alt=""><figcaption></figcaption></figure>

如需配置需要大模型調用嘅搜尋引擎，需喺配置文件中設定：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-15e46c46d2898344c2bcd43a080b39fce5afc5fe%2Fsearxng_config_img_23.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-5c7ec8410e12f42e5fc6ea3d266fccbc8ed118ad%2Fsearxng_config_img_24.png?alt=media" alt=""><figcaption></figcaption></figure>

配置語言參考：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-1443187b2ee0a0afb855608f6f6690a16fce88fd%2Fsearxng_config_img_25.png?alt=media" alt=""><figcaption></figcaption></figure>

如果內容太長直接修改唔方便，可以將佢複製到本地 IDE 入面，修改後再貼返去配置文件中就得。

## 驗證失敗常見原因

### 返回格式未加入 json 格式

喺配置文件中將返回格式加上 json：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-8a3a8b9289c077719d93edfb70cc9490409868a1%2Fsearxng_json_format.png?alt=media" alt=""><figcaption></figcaption></figure>

### 未正確配置搜尋引擎

Cherry Studio 會預設揀選 categories 同時包含 web general 嘅引擎進行搜尋，預設情況下會揀中 google 等引擎，由於內地無法直接訪問 google 等網站導致失敗。加上以下配置令 searxng 強制使用 baidu 引擎，就可以解決問題：

```
use_default_settings:
  engines:
    keep_only:
      - baidu
engines:
  - name: baidu
    engine: baidu 
    categories: 
      - web
      - general
    disabled: false
```

### 訪問速率過快

searxng 嘅 limiter 配置阻礙咗 API 訪問，請嘗試喺設定中將佢設為 false：

<figure><img src="https://2742912793-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0Ut5BptC3t8CtSU1UWpM%2Fuploads%2Fgit-blob-07cea181ce108242012b0971b27b81c132e0eee3%2Fsearxng_limiter.png?alt=media" alt=""><figcaption></figcaption></figure>
