├── .gitignore ├── LICENSE ├── README.md ├── auth ├── Dockerfile ├── go.mod ├── go.sum └── main.go ├── compose.yml.example ├── conf ├── cloudflare │ └── config.example ├── comfyui │ └── runner-scripts │ │ └── download-models.txt.example ├── mcposerver │ └── config.example ├── nginx │ ├── conf.d │ │ └── default.example │ └── nginx.example └── searxng │ ├── settings.yml.example │ └── uwsgi.ini.example ├── docs └── service-architecture-diagram.md ├── env ├── auth.example ├── cloudflared.example ├── db.example ├── docling.example ├── edgetts.example ├── mcposerver.example ├── ollama.example ├── openwebui.example ├── redis.example ├── searxng.example ├── tika.example └── watchtower.example └── images ├── alert-original.png ├── cloudflare-account.png ├── cloudflare-connector.png ├── cloudflare-signup.png ├── cloudflare-tunnel.png ├── owui-settings-tools-general-dialog.png └── owui-settings-tools-general.png /.gitignore: -------------------------------------------------------------------------------- 1 | compose.yml 2 | 3 | conf/**/*.conf 4 | conf/**/*.ini 5 | conf/**/*.json 6 | conf/**/*.yml 7 | 8 | conf/comfyui/runner-scripts/download-models.txt 9 | 10 | 11 | data/comfyui 12 | data/nginx 13 | data/ollama 14 | data/openwebui 15 | data/pipelines 16 | data/postgres 17 | data/redis 18 | 19 | env/*.env 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Observable Art 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Open WebUI Starter 4 | ===================== 5 | 6 | The Open WebUI Starter project is meant to provide a quick template for 7 | setting up [Open WebUI](https://openwebui.com/). More information can be found 8 | about configurations on the [Open WebUI Docs](https://docs.openwebui.com/) or the [Gitub repository](https://github.com/open-webui/open-webui). 9 | 10 | 11 | ## 📢Join others on Discord 12 | 13 | If you run into issues, please join the [Open WebUI Starter project discord channel](https://discord.gg/xD89WPmgut). We will attempt to help! 14 | 15 | 16 | ## 👷Project Overview 17 | 18 | The Open WebUI Starter project is a entry into using the open-source project 19 | Open WebUI. Open WebUI integrates with various Large Language Models (LLMs) and provides a private, user-friendly, and local interface for interacting with computer intelligence. 20 | 21 | Here is a link to follow 🔗[project development](https://github.com/users/iamobservable/projects/1) if you so desire. 22 | 23 | ## Table of Contents 24 | 1. [Dependencies](#dependencies) 25 | 2. [Tooling and Applications](#tooling-and-applications) 26 | 3. [Installation](#installation) 27 | 4. [Additional Setup](#additional-setup) 28 | 5. [Service Examples](#service-examples) 29 | 6. [Contribution](#contribution) 30 | 31 | ## Dependencies 32 | 33 | - **[Git](https://git-scm.com/)**: Version control system for managing code changes 34 | - **[Docker](https://docs.docker.com/)**: Containerization platform for running and deploying applications 35 | 36 | 37 | ## Tooling and Applications 38 | 39 | This starter project includes the following tooling and applications. A [Service Architecture Diagram](https://github.com/iamobservable/open-webui-starter/blob/main/docs/service-architecture-diagram.md) is also available that describes how the components of are connected. 40 | 41 | - **[Cloudflare](https://www.cloudflare.com/)**: Platform providing anonymous proxying and SSL certificates 42 | - **[Docling](https://github.com/docling-project/docling-serve)**: Simplifies document processing, parsing diverse formats — including advanced PDF understanding — and providing seamless integrations with the gen AI ecosystem. (created by IBM) 43 | - **[Edge TTS](https://github.com/rany2/edge-tts)**: Python module that using Microsoft Edge's online text-to-speech service 44 | - **[MCP Server](https://modelcontextprotocol.io/introduction)**: Open protocol that standardizes how applications provide context to LLMs. 45 | - **[Nginx](https://nginx.org/)**: Web server, reverse proxy, load balancer, mail proxy, and HTTP cache 46 | - **[Ollama](https://ollama.com/)**: Local service API serving open source large language models 47 | - **[Open WebUI](https://openwebui.com/)**: Open WebUI is an extensible, feature-rich, and user-friendly self-hosted AI platform designed to operate entirely offline 48 | - **[Postgresql](https://www.postgresql.org/)/[PgVector](https://github.com/pgvector/pgvector)**: A free and open-source relational database management system (RDBMS) emphasizing extensibility and SQL compliance (has vector addon) 49 | - **[Redis](https://redis.io/)**: An open source-available, in-memory storage, used as a distributed, in-memory key–value database, cache and message broker, with optional durability 50 | - **[Searxng](https://docs.searxng.org/)**: Free internet metasearch engine for open webui tool integration 51 | - **[Sqlite](https://www.sqlite.org/index.html)**: A C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine 52 | - **[Tika](https://tika.apache.org/)**: A toolkit that detects and extracts metadata and text from over a thousand different file types 53 | - **[Watchtower](https://github.com/containrrr/watchtower)**: Automated Docker container for updating container images automatically 54 | 55 | 56 | ## Installation 57 | 58 | To install the Open WebUI Starter project, follow these steps: 59 | 60 | ### Clone this repository 61 | 62 | ```sh 63 | git clone https://github.com/iamobservable/open-webui-starter.git 64 | ``` 65 | 66 | ### Create the docker compose and environment files 67 | 68 | ```sh 69 | cp compose.yml.example compose.yml 70 | 71 | cp conf/cloudflare/config.example conf/cloudflare/config.yml 72 | cp conf/mcposerver/config.example conf/mcposerver/config.json 73 | cp conf/nginx/nginx.example conf/nginx/nginx.conf 74 | cp conf/nginx/conf.d/default.example conf/nginx/conf.d/default.conf 75 | cp conf/searxng/settings.yml.example conf/searxng/settings.yml 76 | cp conf/searxng/uwsgi.ini.example conf/searxng/uwsgi.ini 77 | 78 | cp env/auth.example env/auth.env 79 | cp env/cloudflared.example env/cloudflared.env 80 | cp env/db.example env/db.env 81 | cp env/docling.example env/docling.env 82 | cp env/edgetts.example env/edgetts.env 83 | cp env/ollama.example env/ollama.env 84 | cp env/mcposerver.example env/mcposerver.env 85 | cp env/openwebui.example env/openwebui.env 86 | cp env/redis.example env/redis.env 87 | cp env/searxng.example env/searxng.env 88 | cp env/tika.example env/tika.env 89 | cp env/watchtower.example env/watchtower.env 90 | ``` 91 | 92 | *The environment files can contain sensitive information such as API keys 93 | and passwords. Do not check them into source control.* 94 | 95 | ### Add a unique SEARXNG_SECRET 96 | 97 | Make this change to your searxng environment file [env/searxng.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/searxng.example#L3). The link provided will lead you to the github repository to read about it. 98 | 99 | ### Update and uncomment SEARXNG_BASE_URL 100 | 101 | Update the [env/searxng.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/searxng.example#L4) with the domain name you will be using and uncomment the line by removing the # from the beginning. The link provided will lead you to the github repository to read about it. 102 | 103 | ### Add a unique WEBUI_SECRET_KEY to your environment files 104 | 105 | Make this change to your auth environment file [env/auth.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/auth.example#L2). The link provided will lead you to the github repository to read about it. 106 | 107 | Make this change to your openwebui environment file [env/openwebui.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/openwebui.example#L38). 108 | 109 | **Make sure the environment files match**:. This allows jwt token authentication to work with the main Open WebUI (/), swagger (/docs), redis (/redis), and searxng (/searxng) 110 | 111 | ### Add your domain name as WEBUI_URL to your environment files 112 | 113 | Make this change to your openwebui environment file [env/openwebui.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/openwebui.example#L39). 114 | 115 | ### Setup Cloudflare 116 | 117 | Cloudflare provides a way to point web browsers to a domain name that connects to your local Open WebUI environment. The platform will also setup and provide a free certificate so you can secure your domain name with SSL. 118 | 119 | Beware Image **Beware** 120 | 121 | One additional point about moving forward without using a proxying platform like Cloudflare. With the right tools, IP addresses can be mapped to a physical location in the real world. If you connect a domain name to your home IP without the use of a proxying platform, it is possible to [DOX](https://en.wikipedia.org/wiki/Doxing) the location. *It is in your best interest to use a proxy, thus anonymizing the location.* 122 | 123 | #### Sign up with a [free account](https://www.cloudflare.com/plans/) 124 | 125 | Get started using Cloudflare. 126 | 127 | Cloudflare Signup 128 | 129 | #### Add a domain for Cloudflare to manage 130 | 131 | This allows Cloudflare to receive visitors when they look up your domain in a browser. 132 | 133 | Cloudflare Account 134 | 135 | #### Configure a Zero Trust Network tunnel 136 | 137 | This allows Cloudflare to send visitors to your connected environment (home or otherwise) 138 | 139 | Cloudflare Tunnel 140 | 141 | 142 | ### Assign your tunnel id 143 | 144 | Update your [conf/cloudflared/config.yml line #1](https://github.com/iamobservable/open-webui-starter/blob/main/conf/cloudflare/config.example#L1) and [conf/cloudflared/config.yml line #2](https://github.com/iamobservable/open-webui-starter/blob/main/conf/cloudflare/config.example#L2) with your tunnel id. It can be found located in one of the two red rectangles on the image above. 145 | 146 | ### Assign your tunnel token 147 | 148 | Update the [env/cloudflared.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/cloudflared.example#L1) file with your token. It can be found in the red rectangle on the image below. 149 | 150 | Cloudflare Connector 151 | 152 | ### Add your domain name 153 | 154 | Update the [conf/nginx/conf.d/default.conf](https://github.com/iamobservable/open-webui-starter/blob/main/conf/nginx/conf.d/default.example#L24) file with your domain name. The link provided will show you the specific line in the file to change. 155 | 156 | ### Start your docker container environment from a terminal 157 | 158 | You are ready to start up the containers. Let's do it! 159 | 160 | ```sh 161 | docker compose up -d 162 | ``` 163 | 164 | ### Download your first Ollama model from a terminal 165 | 166 | You are ready to download an LLM for Ollama. Llama3.2:3b is listed below, but feel free to change this to any model you feel is right. [More on Ollama models](https://ollama.com/search) 167 | 168 | ```sh 169 | docker compose exec ollama bash 170 | 171 | ollama pull llama3.2:3b 172 | ``` 173 | 174 | Once the containers are started, and your model downloaded, you are ready to access the Open WebUI platform. Visit 175 | `http:///` in your web browser. 176 | 177 | 178 | 179 | ## Additional Setup 180 | 181 | ### MCP Servers 182 | 183 | Model Context Protocol (MCP) is a configurable set of tools, resources, prompts, samplings, and roots. They provide 184 | a structured way to expose local functionality to the LLM. Examples are providing access to the local file system, 185 | searching the internet, interacting with git or github, and much more. 186 | 187 | #### Manual entry (MUST COMPLETE) 188 | 189 | The configuration for tools currently requires a manual step to complete. This is due my own lack of understanding of how 190 | the environment variable TOOL_SERVER_CONNECTIONS is used in [env/openwebui.env](http://github.com/iamobservable/open-webui-starter/blob/main/env/openwebui.example#L34). 191 | If anyone has a good understanding, and has been able to see it work in practice, please share a [pull request](https://github.com/iamobservable/open-webui-starter/pulls) or 192 | message me [directly on Discord](https://discordapp.com/users/observable). 193 | 194 | For now, to use the two default tools, it is required to add them manually. **They will NOT** automatically load using the environment variable TOOL_SERVER_CONNECTIONS, enen 195 | though it is added. Add the following two urls using the Settings -> Tools -> General interface. This can also be set in the Admin Settings as well. 196 | 197 | *Note - the default postgres tool is configured to access your Open WebUI postgres database. While this is read-only, the tool server that is defined allows any user with 198 | the credentials added to the [env/mcposerver.env](http://github.com/iamobservable/open-webui-starter/blob/main/conf/mcposerver/config.example#L12) to access the database tables. If 199 | anything should be restricted, make sure to do so ahead of time.* 200 | 201 | 202 | ```clipboard 203 | http://mcposerver:8000/time 204 | ``` 205 | ```clipboard 206 | http://mcposerver:8000/postgres 207 | ``` 208 | 209 | OWUI Tool Settings 210 | 211 | #### Initial configuration 212 | 213 | Configurations for MCP services can be found in the [conf/mcposerver/config.json](https://github.com/iamobservable/open-webui-starter/blob/main/conf/mcposerver/config.example) file. Links below in the table describe the initially configuration. 214 | 215 | ***Note - the time tool is configured using uvx instead of directly with the python binary, as the repository describes*** 216 | 217 | You may expand on the tools available to your interface. A few examples are listed below. 218 | 219 | | Tool | Description | Configuration | 220 | | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------- | 221 | | [time](https://github.com/modelcontextprotocol/servers/tree/main/src/time) | Provides current time values for [configured timezone](https://github.com/iamobservable/open-webui-starter/blob/main/conf/mcposerver/config.example#L5) | [config/mcposerver/config.json](https://github.com/iamobservable/open-webui-starter/blob/main/conf/mcposerver/config.example#L3) | 222 | | [postgres](https://github.com/modelcontextprotocol/servers/tree/main/src/postgres) | Provides sql querying for the configured database (defaults to openwebui) | [config/mcposerver/config.json](https://github.com/iamobservable/open-webui-starter/blob/main/conf/mcposerver/config.example#L7) | 223 | 224 | #### MCP Server Discovery 225 | 226 | If you are looking for tools to add, the following three MCP Server sources are a great place to look. It may even inspire you to create your own over time! 227 | 228 | - [Model Context Protocol servers](https://github.com/modelcontextprotocol/servers?tab=readme-ov-file#model-context-protocol-servers) 229 | - [Awesome MCP Servers](https://mcpservers.org/) 230 | - [Smithery](https://smithery.ai/) 231 | 232 | ### Watchtower and Notifications 233 | 234 | A Watchtower container provides a convenient way to check in on your container 235 | versions to see if updates have been released. Once updates are found, Watchtower 236 | will pull the latest container image(s), stop the currently running container and 237 | start a new container based on the new image. **And it is all automatic, look no hands!** 238 | 239 | After completing its process, 240 | Watchtower can send notifications to you. More can be found on notifications via 241 | the [Watchtower website](https://containrrr.dev/watchtower/notifications/). 242 | 243 | For the sake of simplicity, this document will cover the instructions for setting 244 | up notifications via Discord. If you desire to be more detailed in your configuration, 245 | the [arguments section](https://containrrr.dev/watchtower/arguments/) describes 246 | additional settings available for the watchtower setup. 247 | 248 | 1. Edit your [env/watchtower.env](https://github.com/iamobservable/open-webui-starter/blob/main/env/watchtower.example#L2) with your discord link. [More information](https://containrrr.dev/shoutrrr/v0.8/services/discord/) is provided on how to create your discord link (token@webhookid). 249 | 2. Restart your watchtower container 250 | 251 | ```bash 252 | docker compose down watchtower && docker compose up watchtower -d 253 | ``` 254 | 255 | ### Migrating from Sqlite to Postgresql 256 | 257 | **Please note, the starter project does not use Sqlite for storage. Postgresql has been configured by default.** 258 | 259 | For installations where the 260 | environment was already setup to use Sqlite, please refer to 261 | [Taylor Wilsdon](https://github.com/taylorwilsdon)'s github repository 262 | [open-webui-postgres-migration](https://github.com/taylorwilsdon/open-webui-postgres-migration). 263 | In it, he provides a migration tool for converting between the two databases. 264 | 265 | 266 | ## Service Examples 267 | 268 | This section is to show how services within docker compose infra can be used 269 | directly or programmatically without the Open WebUI interface. The examples 270 | have been created as *.sh scripts that can be executed via the command line. 271 | 272 | 273 | ### Docling 274 | 275 | **PDF document to markdown** 276 | 277 | Generates a JSON document with the markdown text included. Changes to the config.json document, located in the same directory, can change how Docling responds. More information on how to configure Docling can be found in the [Advance usage section](https://github.com/docling-project/docling-serve/blob/main/docs/usage.md) of the [Docling Serve documentation](https://github.com/docling-project/docling-serve/blob/main/docs/README.md). 278 | 279 | ```sh 280 | curl -X POST "http://localhost:5001/v1alpha/convert/source" \ 281 | -H "accept: application/json" \ 282 | -H "Content-Type: application/json" \ 283 | -d '{ 284 | "options": { 285 | "do_picture_description": false, 286 | "image_export_mode": "embedded", 287 | "images_scale": 2.0, 288 | "include_images": false, 289 | "return_as_file": false, 290 | "to_formats": ["md"] 291 | }, 292 | "http_sources": [{ "url": "https://arxiv.org/pdf/2408.09869" }] 293 | }' 294 | ``` 295 | 296 | 297 | ### Edgetts 298 | 299 | EdgeTTS is a service integration that uses Microsoft's online text-to-speech 300 | service. Keep in mind, if you want to be completely local, this service is not 301 | for you. 302 | 303 | *More information about [available voice samples](https://tts.travisvn.com/) 304 | the [EdgeTTS codebase and configuration](https://github.com/travisvn/openai-edge-tts)*. 305 | 306 | **Speech in Spanish** 307 | 308 | Generate Spanish speech from a speaker with a Spanish accent. 309 | 310 | ```sh 311 | curl -X POST "http://localhost:5050/v1/audio/speech" \ 312 | -H "Content-Type: application/json" \ 313 | -H "Authorization: Bearer your_api_key_here" \ 314 | -d '{ 315 | "input": "Hola! Mi nombre es Alonso", 316 | "response_format": "mp3", 317 | "speed": 1, 318 | "stream": true, 319 | "voice": "es-US-AlonsoNeural", 320 | "model": "tts-1-hd" 321 | }' > alonso-es-hola.mp3 322 | ``` 323 | 324 | **Speech in English** 325 | 326 | Generates English speech from a speaker with an English accent. 327 | 328 | ```sh 329 | curl -X POST "http://localhost:5050/v1/audio/speech" \ 330 | -H "Content-Type: application/json" \ 331 | -H "Authorization: Bearer your_api_key_here" \ 332 | -d '{ 333 | "input": "Hi, my name is Wayland. This is an audio example.", 334 | "response_format": "mp3", 335 | "speed": 1, 336 | "stream": true, 337 | "voice": "en-US-AndrewMultilingualNeural", 338 | "model": "tts-1-hd" 339 | }' > wayland-intro.mp3 340 | ``` 341 | 342 | 343 | ### Tika 344 | 345 | **Information about the PDF document** 346 | 347 | Generates meta data from a provided url. More information can be found via the [Metadata Resource documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=148639291#TikaServer-MetadataResource) 348 | 349 | ```sh 350 | curl https://arxiv.org/abs/2408.09869v5 > 2408.09869v5.pdf 351 | curl http://localhost:9998/meta \ 352 | -H "Accept: application/json" -T 2408.09869v5.pdf 353 | ``` 354 | 355 | **PDF document (url) to HTML** 356 | 357 | Generates HTML from a provided url. More information can be found via the [Tika Resource Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=148639291#TikaServer-GettheTextofaDocument) 358 | 359 | ```sh 360 | curl https://arxiv.org/abs/2408.09869v5 > 2408.09869v5.pdf 361 | curl http://localhost:9998/tika \ 362 | -H "Accept: text/html" -T 2408.09869v5.pdf 363 | ``` 364 | 365 | **PDF document (url) to plain text** 366 | 367 | Generates plain text from a provided url. More information can be found via the [Tika Resource Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=148639291#TikaServer-GettheTextofaDocument) 368 | 369 | ```sh 370 | curl https://arxiv.org/abs/2408.09869v5 > 2408.09869v5.pdf 371 | curl http://localhost:9998/tika \ 372 | -H "Accept: text/plain" -T 2408.09869v5.pdf 373 | ``` 374 | 375 | 376 | ## Contribution 377 | 378 | Contributions to the Open WebUI Starter project are welcome and encouraged! If you'd like to 379 | contribute, please fork this repository and submit a [pull request](https://github.com/iamobservable/open-webui-starter/pulls) with any 380 | suggested changes or additions. 381 | 382 | -------------------------------------------------------------------------------- /auth/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.24-alpine as builder 2 | 3 | WORKDIR /app 4 | 5 | COPY . . 6 | 7 | RUN ls 8 | 9 | RUN go mod vendor 10 | 11 | RUN go build -o main 12 | 13 | FROM alpine:latest 14 | 15 | WORKDIR /app 16 | 17 | COPY --from=builder /app/main . 18 | 19 | EXPOSE 9090 20 | 21 | CMD ["./main"] 22 | -------------------------------------------------------------------------------- /auth/go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.23.4 4 | 5 | require github.com/gin-gonic/gin v1.10.0 6 | 7 | require ( 8 | github.com/bytedance/sonic v1.11.6 // indirect 9 | github.com/bytedance/sonic/loader v0.1.1 // indirect 10 | github.com/cloudwego/base64x v0.1.4 // indirect 11 | github.com/cloudwego/iasm v0.2.0 // indirect 12 | github.com/gabriel-vasile/mimetype v1.4.3 // indirect 13 | github.com/gin-contrib/sse v0.1.0 // indirect 14 | github.com/go-playground/locales v0.14.1 // indirect 15 | github.com/go-playground/universal-translator v0.18.1 // indirect 16 | github.com/go-playground/validator/v10 v10.20.0 // indirect 17 | github.com/goccy/go-json v0.10.2 // indirect 18 | github.com/golang-jwt/jwt v3.2.2+incompatible // indirect 19 | github.com/golang-jwt/jwt/v5 v5.2.1 // indirect 20 | github.com/json-iterator/go v1.1.12 // indirect 21 | github.com/klauspost/cpuid/v2 v2.2.7 // indirect 22 | github.com/leodido/go-urn v1.4.0 // indirect 23 | github.com/mattn/go-isatty v0.0.20 // indirect 24 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 25 | github.com/modern-go/reflect2 v1.0.2 // indirect 26 | github.com/pelletier/go-toml/v2 v2.2.2 // indirect 27 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 28 | github.com/ugorji/go/codec v1.2.12 // indirect 29 | golang.org/x/arch v0.8.0 // indirect 30 | golang.org/x/crypto v0.23.0 // indirect 31 | golang.org/x/net v0.25.0 // indirect 32 | golang.org/x/sys v0.20.0 // indirect 33 | golang.org/x/text v0.15.0 // indirect 34 | google.golang.org/protobuf v1.34.1 // indirect 35 | gopkg.in/yaml.v3 v3.0.1 // indirect 36 | ) 37 | -------------------------------------------------------------------------------- /auth/go.sum: -------------------------------------------------------------------------------- 1 | github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= 2 | github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= 3 | github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= 4 | github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= 5 | github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= 6 | github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= 7 | github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= 8 | github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 9 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 10 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 11 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 12 | github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= 13 | github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 14 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 15 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 16 | github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= 17 | github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= 18 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 19 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 20 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 21 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 22 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 23 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 24 | github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= 25 | github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= 26 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 27 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 28 | github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= 29 | github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= 30 | github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= 31 | github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= 32 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 33 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 34 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 35 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 36 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 37 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 38 | github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 39 | github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 40 | github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 41 | github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= 42 | github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 43 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 44 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 45 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 46 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 47 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 48 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 49 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 50 | github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= 51 | github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 52 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 53 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 54 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 55 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 56 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 57 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 58 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 59 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 60 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 61 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 62 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 63 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 64 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 65 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 66 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 67 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 68 | github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= 69 | github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 70 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 71 | golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= 72 | golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 73 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 74 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 75 | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 76 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 77 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 78 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 79 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 80 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 81 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= 82 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 83 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 84 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 85 | google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= 86 | google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 87 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 88 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 89 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 90 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 91 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 92 | nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= 93 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 94 | -------------------------------------------------------------------------------- /auth/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "os" 7 | 8 | "github.com/gin-gonic/gin" 9 | "github.com/golang-jwt/jwt" 10 | ) 11 | 12 | func main() { 13 | r := gin.Default() 14 | r.GET("/", func(c *gin.Context) { 15 | c.JSON(http.StatusOK, gin.H{ 16 | "message": "auth-service is running", 17 | }) 18 | }) 19 | 20 | r.GET("/validate", func(c *gin.Context) { 21 | cookieToken, err := c.Cookie("token") 22 | if err != nil { 23 | c.JSON(http.StatusUnauthorized, gin.H{ 24 | "message": "unauthorized", 25 | "error": "token missing", 26 | }) 27 | return 28 | } 29 | 30 | valid, err := verifyToken(cookieToken) 31 | if err != nil { 32 | c.JSON(http.StatusUnauthorized, gin.H{ 33 | "message": "unauthorized", 34 | "error": err, 35 | }) 36 | return 37 | } 38 | 39 | if valid { 40 | c.JSON(http.StatusOK, gin.H{ 41 | "message": "authorized", 42 | }) 43 | } 44 | }) 45 | 46 | err := r.Run("0.0.0.0:9090") 47 | if err != nil { 48 | return 49 | } 50 | } 51 | 52 | func verifyToken(tokenString string) (bool, error) { 53 | jwtSecret := os.Getenv(("WEBUI_SECRET_KEY")) 54 | 55 | if len(jwtSecret) == 0 { 56 | return false, fmt.Errorf("JWT_SECRET env variable missing") 57 | } 58 | 59 | mySigningKey := []byte(jwtSecret) 60 | 61 | token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { 62 | if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { 63 | return nil, fmt.Errorf("error parsing jwt") 64 | } 65 | return mySigningKey, nil 66 | }) 67 | if err != nil { 68 | return false, err 69 | } 70 | 71 | return token.Valid, nil 72 | } 73 | -------------------------------------------------------------------------------- /compose.yml.example: -------------------------------------------------------------------------------- 1 | services: 2 | auth: 3 | build: 4 | context: ./auth 5 | dockerfile: Dockerfile 6 | env_file: env/auth.env 7 | labels: 8 | - "com.centurylinklabs.watchtower.enable=false" 9 | restart: unless-stopped 10 | 11 | cloudflared: 12 | command: tunnel --no-autoupdate run 13 | depends_on: 14 | - watchtower 15 | env_file: env/cloudflared.env 16 | image: cloudflare/cloudflared:latest 17 | restart: unless-stopped 18 | volumes: 19 | - ./conf/cloudflare/config:/home/nonroot/.cloudflared 20 | 21 | db: 22 | depends_on: 23 | - watchtower 24 | env_file: env/db.env 25 | healthcheck: 26 | interval: 30s 27 | retries: 5 28 | start_period: 20s 29 | test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] 30 | timeout: 5s 31 | image: pgvector/pgvector:pg15 32 | restart: unless-stopped 33 | volumes: 34 | - ./data/postgres:/var/lib/postgresql/data 35 | 36 | docling: 37 | env_file: env/docling.env 38 | healthcheck: 39 | interval: 30s 40 | retries: 5 41 | start_period: 10s 42 | test: curl --fail http://localhost:5001/health || exit 1 43 | timeout: 5s 44 | image: quay.io/docling-project/docling-serve:latest 45 | ports: 46 | - 5001:5001 47 | restart: unless-stopped 48 | 49 | edgetts: 50 | depends_on: 51 | - watchtower 52 | env_file: env/edgetts.env 53 | healthcheck: 54 | interval: 30s 55 | retries: 5 56 | start_period: 5s 57 | test: "curl --fail http://localhost:5050/voices -H 'Authorization: Bearer your_api_key_here' || exit 1" 58 | timeout: 5s 59 | image: travisvn/openai-edge-tts:latest 60 | ports: 61 | - 5050:5050 62 | restart: unless-stopped 63 | 64 | mcposerver: 65 | command: ["--config", "/app/conf/config.json"] 66 | depends_on: 67 | - watchtower 68 | env_file: env/mcposerver.env 69 | image: ghcr.io/open-webui/mcpo:latest 70 | restart: unless-stopped 71 | volumes: 72 | - ./conf/mcposerver:/app/conf:ro 73 | 74 | nginx: 75 | depends_on: 76 | - cloudflared 77 | - watchtower 78 | healthcheck: 79 | interval: 30s 80 | retries: 5 81 | start_period: 5s 82 | test: curl --fail http://localhost/ || exit 1 83 | timeout: 3s 84 | image: nginx:latest 85 | ports: 86 | - 80:80 87 | restart: unless-stopped 88 | volumes: 89 | - ./conf/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf 90 | - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf 91 | 92 | ollama: 93 | depends_on: 94 | - watchtower 95 | deploy: *gpu-deploy 96 | env_file: env/ollama.env 97 | healthcheck: 98 | interval: 30s 99 | retries: 5 100 | start_period: 10s 101 | test: curl --fail http://localhost:11434/api/version || exit 1 102 | timeout: 3s 103 | image: ollama/ollama:latest 104 | ports: 105 | - 11434:11434 106 | restart: unless-stopped 107 | volumes: 108 | - ./data/ollama:/root/.ollama 109 | 110 | openwebui: 111 | depends_on: 112 | - auth 113 | - docling 114 | - db 115 | - edgetts 116 | - mcposerver 117 | - nginx 118 | - ollama 119 | - searxng 120 | - tika 121 | - watchtower 122 | deploy: *gpu-deploy 123 | env_file: env/openwebui.env 124 | healthcheck: 125 | interval: 30s 126 | retries: 5 127 | start_period: 10s 128 | test: curl --fail http://localhost:8080/health || exit 1 129 | timeout: 3s 130 | image: ghcr.io/open-webui/open-webui:cuda 131 | restart: unless-stopped 132 | volumes: 133 | - ./data/openwebui:/app/backend/data 134 | 135 | redis: 136 | depends_on: 137 | - watchtower 138 | env_file: env/redis.env 139 | healthcheck: 140 | interval: 30s 141 | retries: 5 142 | start_period: 20s 143 | test: ["CMD-SHELL", "redis-cli ping | grep PONG"] 144 | timeout: 3s 145 | image: redis/redis-stack:latest 146 | restart: unless-stopped 147 | volumes: 148 | - ./data/redis:/data 149 | 150 | searxng: 151 | cap_add: 152 | - CHOWN 153 | - SETGID 154 | - SETUID 155 | - DAC_OVERRIDE 156 | cap_drop: 157 | - ALL 158 | env_file: env/searxng.env 159 | depends_on: 160 | - redis 161 | - watchtower 162 | healthcheck: 163 | interval: 30s 164 | retries: 5 165 | start_period: 10s 166 | test: curl --fail http://localhost:8080/ || exit 1 167 | timeout: 3s 168 | image: searxng/searxng:latest 169 | logging: 170 | driver: "json-file" 171 | options: 172 | max-size: "1m" 173 | max-file: "1" 174 | restart: unless-stopped 175 | volumes: 176 | - ./conf/searxng/settings.yml:/etc/searxng/settings.yml:rw 177 | - ./conf/searxng/uwsgi.ini:/etc/searxng/uwsgi.ini:rw 178 | 179 | tika: 180 | env_file: env/tika.env 181 | healthcheck: 182 | interval: 30s 183 | retries: 5 184 | start_period: 5s 185 | test: curl --fail http://localhost:9998/tika || exit 1 186 | timeout: 5s 187 | image: apache/tika:latest-full 188 | ports: 189 | - 9998:9998 190 | restart: unless-stopped 191 | 192 | watchtower: 193 | command: --cleanup --debug --interval 300 194 | env_file: env/watchtower.env 195 | image: containrrr/watchtower 196 | restart: unless-stopped 197 | volumes: 198 | - /var/run/docker.sock:/var/run/docker.sock 199 | -------------------------------------------------------------------------------- /conf/cloudflare/config.example: -------------------------------------------------------------------------------- 1 | tunnel: 2 | credentials-file: /home/nonroot/.cloudflared/.json 3 | -------------------------------------------------------------------------------- /conf/comfyui/runner-scripts/download-models.txt.example: -------------------------------------------------------------------------------- 1 | # TAESD models for high-quality on-the-fly previews 2 | 3 | https://raw.githubusercontent.com/madebyollin/taesd/main/taesd_decoder.pth 4 | dir=vae_approx 5 | out=taesd_decoder.pth 6 | https://raw.githubusercontent.com/madebyollin/taesd/main/taesdxl_decoder.pth 7 | dir=vae_approx 8 | out=taesdxl_decoder.pth 9 | https://raw.githubusercontent.com/madebyollin/taesd/main/taesd3_decoder.pth 10 | dir=vae_approx 11 | out=taesd3_decoder.pth 12 | https://raw.githubusercontent.com/madebyollin/taesd/main/taef1_decoder.pth 13 | dir=vae_approx 14 | out=taef1_decoder.pth 15 | 16 | https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/ae.safetensors 17 | dir=vae 18 | out=ae.safetensors 19 | https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/clip_l.safetensors 20 | dir=clip 21 | out=clip_l.safetensors 22 | https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors 23 | dir=clip 24 | out=t5xxl_fp8_e4m3fn.safetensors 25 | https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/flux1-schnell.safetensors 26 | dir=checkpoints 27 | out=flux1-schnell.safetensors 28 | https://huggingface.co/black-forest-labs/FLUX.1-schnell/resolve/main/flux1-schnell.safetensors 29 | dir=unet 30 | out=flux1-schnell.safetensors 31 | -------------------------------------------------------------------------------- /conf/mcposerver/config.example: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "time": { 4 | "command": "uvx", 5 | "args": ["mcp-server-time", "--local-timezone=America/Chicago"] 6 | }, 7 | "postgres": { 8 | "command": "npx", 9 | "args": [ 10 | "-y", 11 | "@modelcontextprotocol/server-postgres", 12 | "postgresql://postgres:postgres@db/openwebui" 13 | ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /conf/nginx/conf.d/default.example: -------------------------------------------------------------------------------- 1 | upstream docsUpstream { 2 | server openwebui:8080 max_fails=0 fail_timeout=10s; 3 | keepalive 512; 4 | } 5 | 6 | upstream redisUpstream { 7 | server redis:8001 max_fails=0 fail_timeout=10s; 8 | keepalive 512; 9 | } 10 | 11 | upstream searxngUpstream { 12 | server searxng:8080 max_fails=0 fail_timeout=10s; 13 | keepalive 512; 14 | } 15 | 16 | upstream authUpstream { 17 | server auth:9090 max_fails=0 fail_timeout=10s; 18 | keepalive 512; 19 | } 20 | 21 | 22 | server { 23 | listen 80; 24 | server_name ; 25 | 26 | location ~ ^/(docs|redis|searxng) { 27 | auth_request /auth-server/validate; 28 | auth_request_set $auth_status $upstream_status; 29 | 30 | error_page 401 = @fallback; 31 | error_page 404 = @notfound; 32 | add_header X-Auth-Status $auth_status; 33 | 34 | proxy_pass http://$1Upstream; 35 | proxy_set_header Host $host; 36 | proxy_set_header X-Real-IP $remote_addr; 37 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 38 | proxy_set_header X-Forwarded-Proto $scheme; 39 | } 40 | 41 | location /auth-server/ { 42 | internal; 43 | proxy_pass http://authUpstream/; 44 | proxy_buffers 7 16k; 45 | proxy_buffer_size 31k; 46 | } 47 | 48 | location / { 49 | proxy_set_header Host $host; 50 | proxy_set_header X-Real-IP $remote_addr; 51 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 52 | proxy_set_header X-Forwarded-Proto $scheme; 53 | 54 | proxy_http_version 1.1; 55 | proxy_set_header Upgrade $http_upgrade; 56 | proxy_set_header Connection 'upgrade'; 57 | proxy_cache_bypass $http_upgrade; 58 | 59 | client_max_body_size 20M; 60 | 61 | proxy_pass http://docsUpstream; 62 | } 63 | 64 | location @fallback { 65 | return 302 /auth?redirect=$uri?$query_string; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /conf/nginx/nginx.example: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | 4 | error_log /var/log/nginx/error.log notice; 5 | pid /var/run/nginx.pid; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | include /etc/nginx/mime.types; 13 | default_type application/octet-stream; 14 | log_format compression '$remote_addr - $remote_user [$time_local] ' 15 | '"$request" $status $body_bytes_sent ' 16 | '"$http_referer" "$http_user_agent" "$gzip_ratio"'; 17 | 18 | # access_log /var/log/nginx/access.log combined; 19 | 20 | sendfile on; 21 | keepalive_timeout 65; 22 | 23 | include /etc/nginx/conf.d/*.conf; 24 | } 25 | -------------------------------------------------------------------------------- /conf/searxng/settings.yml.example: -------------------------------------------------------------------------------- 1 | general: 2 | # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} 3 | debug: false 4 | # displayed name 5 | instance_name: "searxng" 6 | # For example: https://example.com/privacy 7 | privacypolicy_url: false 8 | # use true to use your own donation page written in searx/info/en/donate.md 9 | # use false to disable the donation link 10 | donation_url: false 11 | # mailto:contact@example.com 12 | contact_url: false 13 | # record stats 14 | enable_metrics: true 15 | # expose stats in open metrics format at /metrics 16 | # leave empty to disable (no password set) 17 | # open_metrics: 18 | open_metrics: "" 19 | 20 | brand: 21 | new_issue_url: https://github.com/searxng/searxng/issues/new 22 | docs_url: https://docs.searxng.org/ 23 | public_instances: https://searx.space 24 | wiki_url: https://github.com/searxng/searxng/wiki 25 | issue_url: https://github.com/searxng/searxng/issues 26 | # custom: 27 | # maintainer: "Jon Doe" 28 | # # Custom entries in the footer: [title]: [link] 29 | # links: 30 | # Uptime: https://uptime.searxng.org/history/darmarit-org 31 | # About: "https://searxng.org" 32 | 33 | search: 34 | # Filter results. 0: None, 1: Moderate, 2: Strict 35 | safe_search: 0 36 | # Existing autocomplete backends: "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex", 37 | # "mwmbl", "seznam", "startpage", "stract", "swisscows", "qwant", "wikipedia" - 38 | # leave blank to turn it off by default. 39 | autocomplete: "" 40 | # minimun characters to type before autocompleter starts 41 | autocomplete_min: 4 42 | # backend for the favicon near URL in search results. 43 | # Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default. 44 | favicon_resolver: "" 45 | # Default search language - leave blank to detect from browser information or 46 | # use codes from 'languages.py' 47 | default_lang: "auto" 48 | # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages 49 | # Available languages 50 | # languages: 51 | # - all 52 | # - en 53 | # - en-US 54 | # - de 55 | # - it-IT 56 | # - fr 57 | # - fr-BE 58 | # ban time in seconds after engine errors 59 | ban_time_on_fail: 5 60 | # max ban time in seconds after engine errors 61 | max_ban_time_on_fail: 120 62 | suspended_times: 63 | # Engine suspension time after error (in seconds; set to 0 to disable) 64 | # For error "Access denied" and "HTTP error [402, 403]" 65 | SearxEngineAccessDenied: 86400 66 | # For error "CAPTCHA" 67 | SearxEngineCaptcha: 86400 68 | # For error "Too many request" and "HTTP error 429" 69 | SearxEngineTooManyRequests: 3600 70 | # Cloudflare CAPTCHA 71 | cf_SearxEngineCaptcha: 1296000 72 | cf_SearxEngineAccessDenied: 86400 73 | # ReCAPTCHA 74 | recaptcha_SearxEngineCaptcha: 604800 75 | 76 | # remove format to deny access, use lower case. 77 | # formats: [html, csv, json, rss] 78 | formats: 79 | - html 80 | - json 81 | 82 | server: 83 | # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} 84 | port: 8888 85 | bind_address: "127.0.0.1" 86 | # public URL of the instance, to ensure correct inbound links. Is overwritten 87 | # by ${SEARXNG_URL}. 88 | ### BEWARE... THE PREVIOUS IS INCORRECT AND REQUIRES THE USE OF SEARXNG_BASE_URL 89 | base_url: / # "http://example.com/location" 90 | # rate limit the number of request on the instance, block some bots. 91 | # Is overwritten by ${SEARXNG_LIMITER} 92 | limiter: false 93 | # enable features designed only for public instances. 94 | # Is overwritten by ${SEARXNG_PUBLIC_INSTANCE} 95 | public_instance: false 96 | 97 | # If your instance owns a /etc/searxng/settings.yml file, then set the following 98 | # values there. 99 | 100 | secret_key: "a48ea95e8eb0b9997e8285bcfeea0bc34802ade2f5fdb0d336b1d82a3959eed7" # Is overwritten by ${SEARXNG_SECRET} 101 | # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} 102 | image_proxy: false 103 | # 1.0 and 1.1 are supported 104 | http_protocol_version: "1.0" 105 | # POST queries are more secure as they don't show up in history but may cause 106 | # problems when using Firefox containers 107 | method: "POST" 108 | default_http_headers: 109 | X-Content-Type-Options: nosniff 110 | X-Download-Options: noopen 111 | X-Robots-Tag: noindex, nofollow 112 | Referrer-Policy: no-referrer 113 | 114 | redis: 115 | # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. 116 | # https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis 117 | url: false 118 | 119 | ui: 120 | # Custom static path - leave it blank if you didn't change 121 | static_path: "" 122 | # Is overwritten by ${SEARXNG_STATIC_USE_HASH}. 123 | static_use_hash: false 124 | # Custom templates path - leave it blank if you didn't change 125 | templates_path: "" 126 | # query_in_title: When true, the result page's titles contains the query 127 | # it decreases the privacy, since the browser can records the page titles. 128 | query_in_title: false 129 | # infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page. 130 | infinite_scroll: false 131 | # ui theme 132 | default_theme: simple 133 | # center the results ? 134 | center_alignment: false 135 | # URL prefix of the internet archive, don't forget trailing slash (if needed). 136 | # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" 137 | # Default interface locale - leave blank to detect from browser information or 138 | # use codes from the 'locales' config section 139 | default_locale: "" 140 | # Open result links in a new tab by default 141 | # results_on_new_tab: false 142 | theme_args: 143 | # style of simple theme: auto, light, dark 144 | simple_style: auto 145 | # Perform search immediately if a category selected. 146 | # Disable to select multiple categories at once and start the search manually. 147 | search_on_category_select: true 148 | # Hotkeys: default or vim 149 | hotkeys: default 150 | # URL formatting: pretty, full or host 151 | url_formatting: pretty 152 | 153 | # Lock arbitrary settings on the preferences page. 154 | # 155 | # preferences: 156 | # lock: 157 | # - categories 158 | # - language 159 | # - autocomplete 160 | # - favicon 161 | # - safesearch 162 | # - method 163 | # - doi_resolver 164 | # - locale 165 | # - theme 166 | # - results_on_new_tab 167 | # - infinite_scroll 168 | # - search_on_category_select 169 | # - method 170 | # - image_proxy 171 | # - query_in_title 172 | 173 | # searx supports result proxification using an external service: 174 | # https://github.com/asciimoo/morty uncomment below section if you have running 175 | # morty proxy the key is base64 encoded (keep the !!binary notation) 176 | # Note: since commit af77ec3, morty accepts a base64 encoded key. 177 | # 178 | # result_proxy: 179 | # url: http://127.0.0.1:3000/ 180 | # # the key is a base64 encoded string, the YAML !!binary prefix is optional 181 | # key: !!binary "your_morty_proxy_key" 182 | # # [true|false] enable the "proxy" button next to each result 183 | # proxify_results: true 184 | 185 | # communication with search engines 186 | # 187 | outgoing: 188 | # default timeout in seconds, can be override by engine 189 | request_timeout: 3.0 190 | # the maximum timeout in seconds 191 | # max_request_timeout: 10.0 192 | # suffix of searx_useragent, could contain information like an email address 193 | # to the administrator 194 | useragent_suffix: "" 195 | # The maximum number of concurrent connections that may be established. 196 | pool_connections: 100 197 | # Allow the connection pool to maintain keep-alive connections below this 198 | # point. 199 | pool_maxsize: 20 200 | # See https://www.python-httpx.org/http2/ 201 | enable_http2: true 202 | # uncomment below section if you want to use a custom server certificate 203 | # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults 204 | # and https://www.python-httpx.org/compatibility/#ssl-configuration 205 | # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer 206 | # 207 | # uncomment below section if you want to use a proxyq see: SOCKS proxies 208 | # https://2.python-requests.org/en/latest/user/advanced/#proxies 209 | # are also supported: see 210 | # https://2.python-requests.org/en/latest/user/advanced/#socks 211 | # 212 | # proxies: 213 | # all://: 214 | # - http://proxy1:8080 215 | # - http://proxy2:8080 216 | # 217 | # using_tor_proxy: true 218 | # 219 | # Extra seconds to add in order to account for the time taken by the proxy 220 | # 221 | # extra_proxy_timeout: 10 222 | # 223 | # uncomment below section only if you have more than one network interface 224 | # which can be the source of outgoing search requests 225 | # 226 | # source_ips: 227 | # - 1.1.1.1 228 | # - 1.1.1.2 229 | # - fe80::/126 230 | 231 | # External plugin configuration, for more details see 232 | # https://docs.searxng.org/admin/settings/settings_plugins.html 233 | # 234 | # plugins: 235 | # - mypackage.mymodule.MyPlugin 236 | # - mypackage.mymodule.MyOtherPlugin 237 | # - ... 238 | 239 | # Comment or un-comment plugin to activate / deactivate by default. 240 | # https://docs.searxng.org/admin/settings/settings_plugins.html 241 | # 242 | # enabled_plugins: 243 | # # these plugins are enabled if nothing is configured .. 244 | # - 'Basic Calculator' 245 | # - 'Hash plugin' 246 | # - 'Self Information' 247 | # - 'Tracker URL remover' 248 | # - 'Unit converter plugin' 249 | # - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy 250 | # # these plugins are disabled if nothing is configured .. 251 | # - 'Hostnames plugin' # see 'hostnames' configuration below 252 | # - 'Open Access DOI rewrite' 253 | # - 'Tor check plugin' 254 | 255 | # Configuration of the "Hostnames plugin": 256 | # 257 | # hostnames: 258 | # replace: 259 | # '(.*\.)?youtube\.com$': 'invidious.example.com' 260 | # '(.*\.)?youtu\.be$': 'invidious.example.com' 261 | # '(.*\.)?reddit\.com$': 'teddit.example.com' 262 | # '(.*\.)?redd\.it$': 'teddit.example.com' 263 | # '(www\.)?twitter\.com$': 'nitter.example.com' 264 | # remove: 265 | # - '(.*\.)?facebook.com$' 266 | # low_priority: 267 | # - '(.*\.)?google(\..*)?$' 268 | # high_priority: 269 | # - '(.*\.)?wikipedia.org$' 270 | # 271 | # Alternatively you can use external files for configuring the "Hostnames plugin": 272 | # 273 | # hostnames: 274 | # replace: 'rewrite-hosts.yml' 275 | # 276 | # Content of 'rewrite-hosts.yml' (place the file in the same directory as 'settings.yml'): 277 | # '(.*\.)?youtube\.com$': 'invidious.example.com' 278 | # '(.*\.)?youtu\.be$': 'invidious.example.com' 279 | # 280 | 281 | checker: 282 | # disable checker when in debug mode 283 | off_when_debug: true 284 | 285 | # use "scheduling: false" to disable scheduling 286 | # scheduling: interval or int 287 | 288 | # to activate the scheduler: 289 | # * uncomment "scheduling" section 290 | # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" 291 | # to your uwsgi.ini 292 | 293 | # scheduling: 294 | # start_after: [300, 1800] # delay to start the first run of the checker 295 | # every: [86400, 90000] # how often the checker runs 296 | 297 | # additional tests: only for the YAML anchors (see the engines section) 298 | # 299 | additional_tests: 300 | rosebud: &test_rosebud 301 | matrix: 302 | query: rosebud 303 | lang: en 304 | result_container: 305 | - not_empty 306 | - ["one_title_contains", "citizen kane"] 307 | test: 308 | - unique_results 309 | 310 | android: &test_android 311 | matrix: 312 | query: ["android"] 313 | lang: ["en", "de", "fr", "zh-CN"] 314 | result_container: 315 | - not_empty 316 | - ["one_title_contains", "google"] 317 | test: 318 | - unique_results 319 | 320 | # tests: only for the YAML anchors (see the engines section) 321 | tests: 322 | infobox: &tests_infobox 323 | infobox: 324 | matrix: 325 | query: ["linux", "new york", "bbc"] 326 | result_container: 327 | - has_infobox 328 | 329 | categories_as_tabs: 330 | general: 331 | images: 332 | videos: 333 | news: 334 | map: 335 | music: 336 | it: 337 | science: 338 | files: 339 | social media: 340 | 341 | engines: 342 | - name: 9gag 343 | engine: 9gag 344 | shortcut: 9g 345 | disabled: true 346 | 347 | - name: adobe stock 348 | engine: adobe_stock 349 | shortcut: asi 350 | categories: ["images"] 351 | # https://docs.searxng.org/dev/engines/online/adobe_stock.html 352 | adobe_order: relevance 353 | adobe_content_types: 354 | ["photo", "illustration", "zip_vector", "template", "3d", "image"] 355 | timeout: 6 356 | disabled: true 357 | 358 | - name: adobe stock video 359 | engine: adobe_stock 360 | shortcut: asv 361 | network: adobe stock 362 | categories: ["videos"] 363 | adobe_order: relevance 364 | adobe_content_types: ["video"] 365 | timeout: 6 366 | disabled: true 367 | 368 | - name: adobe stock audio 369 | engine: adobe_stock 370 | shortcut: asa 371 | network: adobe stock 372 | categories: ["music"] 373 | adobe_order: relevance 374 | adobe_content_types: ["audio"] 375 | timeout: 6 376 | disabled: true 377 | 378 | - name: alexandria 379 | engine: json_engine 380 | shortcut: alx 381 | categories: general 382 | paging: true 383 | search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} 384 | results_query: results 385 | title_query: title 386 | url_query: url 387 | content_query: snippet 388 | timeout: 1.5 389 | disabled: true 390 | about: 391 | website: https://alexandria.org/ 392 | official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md 393 | use_official_api: true 394 | require_api_key: false 395 | results: JSON 396 | 397 | # - name: astrophysics data system 398 | # engine: astrophysics_data_system 399 | # sort: asc 400 | # weight: 5 401 | # categories: [science] 402 | # api_key: your-new-key 403 | # shortcut: ads 404 | 405 | - name: alpine linux packages 406 | engine: alpinelinux 407 | disabled: true 408 | shortcut: alp 409 | 410 | - name: annas archive 411 | engine: annas_archive 412 | disabled: true 413 | shortcut: aa 414 | 415 | # - name: annas articles 416 | # engine: annas_archive 417 | # shortcut: aaa 418 | # # https://docs.searxng.org/dev/engines/online/annas_archive.html 419 | # aa_content: 'magazine' # book_fiction, book_unknown, book_nonfiction, book_comic 420 | # aa_ext: 'pdf' # pdf, epub, .. 421 | # aa_sort: oldest' # newest, oldest, largest, smallest 422 | 423 | - name: apk mirror 424 | engine: apkmirror 425 | timeout: 4.0 426 | shortcut: apkm 427 | disabled: true 428 | 429 | - name: apple app store 430 | engine: apple_app_store 431 | shortcut: aps 432 | disabled: true 433 | 434 | # Requires Tor 435 | - name: ahmia 436 | engine: ahmia 437 | categories: onions 438 | enable_http: true 439 | shortcut: ah 440 | 441 | - name: anaconda 442 | engine: xpath 443 | paging: true 444 | first_page_num: 0 445 | search_url: https://anaconda.org/search?q={query}&page={pageno} 446 | results_xpath: //tbody/tr 447 | url_xpath: ./td/h5/a[last()]/@href 448 | title_xpath: ./td/h5 449 | content_xpath: ./td[h5]/text() 450 | categories: it 451 | timeout: 6.0 452 | shortcut: conda 453 | disabled: true 454 | 455 | - name: arch linux wiki 456 | engine: archlinux 457 | shortcut: al 458 | 459 | - name: nixos wiki 460 | engine: mediawiki 461 | shortcut: nixw 462 | base_url: https://wiki.nixos.org/ 463 | search_type: text 464 | disabled: true 465 | categories: [it, software wikis] 466 | 467 | - name: artic 468 | engine: artic 469 | shortcut: arc 470 | timeout: 4.0 471 | 472 | - name: arxiv 473 | engine: arxiv 474 | shortcut: arx 475 | timeout: 4.0 476 | 477 | - name: ask 478 | engine: ask 479 | shortcut: ask 480 | disabled: true 481 | 482 | # tmp suspended: dh key too small 483 | # - name: base 484 | # engine: base 485 | # shortcut: bs 486 | 487 | - name: bandcamp 488 | engine: bandcamp 489 | shortcut: bc 490 | categories: music 491 | 492 | - name: wikipedia 493 | engine: wikipedia 494 | shortcut: wp 495 | # add "list" to the array to get results in the results list 496 | display_type: ["infobox"] 497 | categories: [general] 498 | 499 | - name: bilibili 500 | engine: bilibili 501 | shortcut: bil 502 | disabled: true 503 | 504 | - name: bing 505 | engine: bing 506 | shortcut: bi 507 | disabled: true 508 | 509 | - name: bing images 510 | engine: bing_images 511 | shortcut: bii 512 | 513 | - name: bing news 514 | engine: bing_news 515 | shortcut: bin 516 | 517 | - name: bing videos 518 | engine: bing_videos 519 | shortcut: biv 520 | 521 | - name: bitbucket 522 | engine: xpath 523 | paging: true 524 | search_url: https://bitbucket.org/repo/all/{pageno}?name={query} 525 | url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href 526 | title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] 527 | content_xpath: //article[@class="repo-summary"]/p 528 | categories: [it, repos] 529 | timeout: 4.0 530 | disabled: true 531 | shortcut: bb 532 | about: 533 | website: https://bitbucket.org/ 534 | wikidata_id: Q2493781 535 | official_api_documentation: https://developer.atlassian.com/bitbucket 536 | use_official_api: false 537 | require_api_key: false 538 | results: HTML 539 | 540 | - name: bpb 541 | engine: bpb 542 | shortcut: bpb 543 | disabled: true 544 | 545 | - name: btdigg 546 | engine: btdigg 547 | shortcut: bt 548 | disabled: true 549 | 550 | - name: openverse 551 | engine: openverse 552 | categories: images 553 | shortcut: opv 554 | 555 | - name: media.ccc.de 556 | engine: ccc_media 557 | shortcut: c3tv 558 | # We don't set language: de here because media.ccc.de is not just 559 | # for a German audience. It contains many English videos and many 560 | # German videos have English subtitles. 561 | disabled: true 562 | 563 | - name: chefkoch 564 | engine: chefkoch 565 | shortcut: chef 566 | # to show premium or plus results too: 567 | # skip_premium: false 568 | 569 | - name: cloudflareai 570 | engine: cloudflareai 571 | shortcut: cfai 572 | # get api token and accont id from https://developers.cloudflare.com/workers-ai/get-started/rest-api/ 573 | cf_account_id: "your_cf_accout_id" 574 | cf_ai_api: "your_cf_api" 575 | # create your ai gateway by https://developers.cloudflare.com/ai-gateway/get-started/creating-gateway/ 576 | cf_ai_gateway: "your_cf_ai_gateway_name" 577 | # find the model name from https://developers.cloudflare.com/workers-ai/models/#text-generation 578 | cf_ai_model: "ai_model_name" 579 | # custom your preferences 580 | # cf_ai_model_display_name: 'Cloudflare AI' 581 | # cf_ai_model_assistant: 'prompts_for_assistant_role' 582 | # cf_ai_model_system: 'prompts_for_system_role' 583 | timeout: 30 584 | disabled: true 585 | 586 | # - name: core.ac.uk 587 | # engine: core 588 | # categories: science 589 | # shortcut: cor 590 | # # get your API key from: https://core.ac.uk/api-keys/register/ 591 | # api_key: 'unset' 592 | 593 | - name: cppreference 594 | engine: cppreference 595 | shortcut: cpp 596 | paging: false 597 | disabled: true 598 | 599 | - name: crossref 600 | engine: crossref 601 | shortcut: cr 602 | timeout: 30 603 | disabled: true 604 | 605 | - name: crowdview 606 | engine: json_engine 607 | shortcut: cv 608 | categories: general 609 | paging: false 610 | search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} 611 | results_query: results 612 | url_query: link 613 | title_query: title 614 | content_query: snippet 615 | title_html_to_text: true 616 | content_html_to_text: true 617 | disabled: true 618 | about: 619 | website: https://crowdview.ai/ 620 | 621 | - name: yep 622 | engine: yep 623 | shortcut: yep 624 | categories: general 625 | search_type: web 626 | timeout: 5 627 | disabled: true 628 | 629 | - name: yep images 630 | engine: yep 631 | shortcut: yepi 632 | categories: images 633 | search_type: images 634 | disabled: true 635 | 636 | - name: yep news 637 | engine: yep 638 | shortcut: yepn 639 | categories: news 640 | search_type: news 641 | disabled: true 642 | 643 | - name: curlie 644 | engine: xpath 645 | shortcut: cl 646 | categories: general 647 | disabled: true 648 | paging: true 649 | lang_all: "" 650 | search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 651 | page_size: 20 652 | results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] 653 | url_xpath: ./div[@class="title-and-desc"]/a/@href 654 | title_xpath: ./div[@class="title-and-desc"]/a/div 655 | content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] 656 | about: 657 | website: https://curlie.org/ 658 | wikidata_id: Q60715723 659 | use_official_api: false 660 | require_api_key: false 661 | results: HTML 662 | 663 | - name: currency 664 | engine: currency_convert 665 | categories: general 666 | shortcut: cc 667 | 668 | - name: deezer 669 | engine: deezer 670 | shortcut: dz 671 | disabled: true 672 | 673 | - name: destatis 674 | engine: destatis 675 | shortcut: destat 676 | disabled: true 677 | 678 | - name: deviantart 679 | engine: deviantart 680 | shortcut: da 681 | timeout: 3.0 682 | 683 | - name: ddg definitions 684 | engine: duckduckgo_definitions 685 | shortcut: ddd 686 | weight: 2 687 | disabled: true 688 | tests: *tests_infobox 689 | 690 | # cloudflare protected 691 | # - name: digbt 692 | # engine: digbt 693 | # shortcut: dbt 694 | # timeout: 6.0 695 | # disabled: true 696 | 697 | - name: docker hub 698 | engine: docker_hub 699 | shortcut: dh 700 | categories: [it, packages] 701 | 702 | - name: encyclosearch 703 | engine: json_engine 704 | shortcut: es 705 | categories: general 706 | paging: true 707 | search_url: https://encyclosearch.org/encyclosphere/search?q={query}&page={pageno}&resultsPerPage=15 708 | results_query: Results 709 | url_query: SourceURL 710 | title_query: Title 711 | content_query: Description 712 | disabled: true 713 | about: 714 | website: https://encyclosearch.org 715 | official_api_documentation: https://encyclosearch.org/docs/#/rest-api 716 | use_official_api: true 717 | require_api_key: false 718 | results: JSON 719 | 720 | - name: erowid 721 | engine: xpath 722 | paging: true 723 | first_page_num: 0 724 | page_size: 30 725 | search_url: https://www.erowid.org/search.php?q={query}&s={pageno} 726 | url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href 727 | title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() 728 | content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] 729 | categories: [] 730 | shortcut: ew 731 | disabled: true 732 | about: 733 | website: https://www.erowid.org/ 734 | wikidata_id: Q1430691 735 | official_api_documentation: 736 | use_official_api: false 737 | require_api_key: false 738 | results: HTML 739 | 740 | # - name: elasticsearch 741 | # shortcut: es 742 | # engine: elasticsearch 743 | # base_url: http://localhost:9200 744 | # username: elastic 745 | # password: changeme 746 | # index: my-index 747 | # # available options: match, simple_query_string, term, terms, custom 748 | # query_type: match 749 | # # if query_type is set to custom, provide your query here 750 | # #custom_query_json: {"query":{"match_all": {}}} 751 | # #show_metadata: false 752 | # disabled: true 753 | 754 | - name: wikidata 755 | engine: wikidata 756 | shortcut: wd 757 | timeout: 3.0 758 | weight: 2 759 | # add "list" to the array to get results in the results list 760 | display_type: ["infobox"] 761 | tests: *tests_infobox 762 | categories: [general] 763 | 764 | - name: duckduckgo 765 | engine: duckduckgo 766 | shortcut: ddg 767 | 768 | - name: duckduckgo images 769 | engine: duckduckgo_extra 770 | categories: [images, web] 771 | ddg_category: images 772 | shortcut: ddi 773 | disabled: true 774 | 775 | - name: duckduckgo videos 776 | engine: duckduckgo_extra 777 | categories: [videos, web] 778 | ddg_category: videos 779 | shortcut: ddv 780 | disabled: true 781 | 782 | - name: duckduckgo news 783 | engine: duckduckgo_extra 784 | categories: [news, web] 785 | ddg_category: news 786 | shortcut: ddn 787 | disabled: true 788 | 789 | - name: duckduckgo weather 790 | engine: duckduckgo_weather 791 | shortcut: ddw 792 | disabled: true 793 | 794 | - name: apple maps 795 | engine: apple_maps 796 | shortcut: apm 797 | disabled: true 798 | timeout: 5.0 799 | 800 | - name: emojipedia 801 | engine: emojipedia 802 | timeout: 4.0 803 | shortcut: em 804 | disabled: true 805 | 806 | - name: tineye 807 | engine: tineye 808 | shortcut: tin 809 | timeout: 9.0 810 | disabled: true 811 | 812 | - name: etymonline 813 | engine: xpath 814 | paging: true 815 | search_url: https://etymonline.com/search?page={pageno}&q={query} 816 | url_xpath: //a[contains(@class, "word__name--")]/@href 817 | title_xpath: //a[contains(@class, "word__name--")] 818 | content_xpath: //section[contains(@class, "word__defination")] 819 | first_page_num: 1 820 | shortcut: et 821 | categories: [dictionaries] 822 | about: 823 | website: https://www.etymonline.com/ 824 | wikidata_id: Q1188617 825 | official_api_documentation: 826 | use_official_api: false 827 | require_api_key: false 828 | results: HTML 829 | 830 | # - name: ebay 831 | # engine: ebay 832 | # shortcut: eb 833 | # base_url: 'https://www.ebay.com' 834 | # disabled: true 835 | # timeout: 5 836 | 837 | - name: 1x 838 | engine: www1x 839 | shortcut: 1x 840 | timeout: 3.0 841 | disabled: true 842 | 843 | - name: fdroid 844 | engine: fdroid 845 | shortcut: fd 846 | disabled: true 847 | 848 | - name: findthatmeme 849 | engine: findthatmeme 850 | shortcut: ftm 851 | disabled: true 852 | 853 | - name: flickr 854 | categories: images 855 | shortcut: fl 856 | # You can use the engine using the official stable API, but you need an API 857 | # key, see: https://www.flickr.com/services/apps/create/ 858 | # engine: flickr 859 | # api_key: 'apikey' # required! 860 | # Or you can use the html non-stable engine, activated by default 861 | engine: flickr_noapi 862 | 863 | - name: free software directory 864 | engine: mediawiki 865 | shortcut: fsd 866 | categories: [it, software wikis] 867 | base_url: https://directory.fsf.org/ 868 | search_type: title 869 | timeout: 5.0 870 | disabled: true 871 | about: 872 | website: https://directory.fsf.org/ 873 | wikidata_id: Q2470288 874 | 875 | # - name: freesound 876 | # engine: freesound 877 | # shortcut: fnd 878 | # disabled: true 879 | # timeout: 15.0 880 | # API key required, see: https://freesound.org/docs/api/overview.html 881 | # api_key: MyAPIkey 882 | 883 | - name: frinkiac 884 | engine: frinkiac 885 | shortcut: frk 886 | disabled: true 887 | 888 | - name: fyyd 889 | engine: fyyd 890 | shortcut: fy 891 | timeout: 8.0 892 | disabled: true 893 | 894 | - name: geizhals 895 | engine: geizhals 896 | shortcut: geiz 897 | disabled: true 898 | 899 | - name: genius 900 | engine: genius 901 | shortcut: gen 902 | 903 | - name: gentoo 904 | engine: mediawiki 905 | shortcut: ge 906 | categories: ["it", "software wikis"] 907 | base_url: "https://wiki.gentoo.org/" 908 | api_path: "api.php" 909 | search_type: text 910 | timeout: 10 911 | 912 | - name: gitlab 913 | engine: gitlab 914 | base_url: https://gitlab.com 915 | shortcut: gl 916 | disabled: true 917 | about: 918 | website: https://gitlab.com/ 919 | wikidata_id: Q16639197 920 | 921 | # - name: gnome 922 | # engine: gitlab 923 | # base_url: https://gitlab.gnome.org 924 | # shortcut: gn 925 | # about: 926 | # website: https://gitlab.gnome.org 927 | # wikidata_id: Q44316 928 | 929 | - name: github 930 | engine: github 931 | shortcut: gh 932 | 933 | - name: codeberg 934 | # https://docs.searxng.org/dev/engines/online/gitea.html 935 | engine: gitea 936 | base_url: https://codeberg.org 937 | shortcut: cb 938 | disabled: true 939 | 940 | - name: gitea.com 941 | engine: gitea 942 | base_url: https://gitea.com 943 | shortcut: gitea 944 | disabled: true 945 | 946 | - name: goodreads 947 | engine: goodreads 948 | shortcut: good 949 | timeout: 4.0 950 | disabled: true 951 | 952 | - name: google 953 | engine: google 954 | shortcut: go 955 | # additional_tests: 956 | # android: *test_android 957 | 958 | - name: google images 959 | engine: google_images 960 | shortcut: goi 961 | # additional_tests: 962 | # android: *test_android 963 | # dali: 964 | # matrix: 965 | # query: ['Dali Christ'] 966 | # lang: ['en', 'de', 'fr', 'zh-CN'] 967 | # result_container: 968 | # - ['one_title_contains', 'Salvador'] 969 | 970 | - name: google news 971 | engine: google_news 972 | shortcut: gon 973 | # additional_tests: 974 | # android: *test_android 975 | 976 | - name: google videos 977 | engine: google_videos 978 | shortcut: gov 979 | # additional_tests: 980 | # android: *test_android 981 | 982 | - name: google scholar 983 | engine: google_scholar 984 | shortcut: gos 985 | 986 | - name: google play apps 987 | engine: google_play 988 | categories: [files, apps] 989 | shortcut: gpa 990 | play_categ: apps 991 | disabled: true 992 | 993 | - name: google play movies 994 | engine: google_play 995 | categories: videos 996 | shortcut: gpm 997 | play_categ: movies 998 | disabled: true 999 | 1000 | - name: material icons 1001 | engine: material_icons 1002 | categories: images 1003 | shortcut: mi 1004 | disabled: true 1005 | 1006 | - name: habrahabr 1007 | engine: xpath 1008 | paging: true 1009 | search_url: https://habr.com/en/search/page{pageno}/?q={query} 1010 | results_xpath: //article[contains(@class, "tm-articles-list__item")] 1011 | url_xpath: .//a[@class="tm-title__link"]/@href 1012 | title_xpath: .//a[@class="tm-title__link"] 1013 | content_xpath: .//div[contains(@class, "article-formatted-body")] 1014 | categories: it 1015 | timeout: 4.0 1016 | disabled: true 1017 | shortcut: habr 1018 | about: 1019 | website: https://habr.com/ 1020 | wikidata_id: Q4494434 1021 | official_api_documentation: https://habr.com/en/docs/help/api/ 1022 | use_official_api: false 1023 | require_api_key: false 1024 | results: HTML 1025 | 1026 | - name: hackernews 1027 | engine: hackernews 1028 | shortcut: hn 1029 | disabled: true 1030 | 1031 | - name: hex 1032 | engine: hex 1033 | shortcut: hex 1034 | disabled: true 1035 | # Valid values: name inserted_at updated_at total_downloads recent_downloads 1036 | sort_criteria: "recent_downloads" 1037 | page_size: 10 1038 | 1039 | - name: crates.io 1040 | engine: crates 1041 | shortcut: crates 1042 | disabled: true 1043 | timeout: 6.0 1044 | 1045 | - name: hoogle 1046 | engine: xpath 1047 | search_url: https://hoogle.haskell.org/?hoogle={query} 1048 | results_xpath: '//div[@class="result"]' 1049 | title_xpath: './/div[@class="ans"]//a' 1050 | url_xpath: './/div[@class="ans"]//a/@href' 1051 | content_xpath: './/div[@class="from"]' 1052 | page_size: 20 1053 | categories: [it, packages] 1054 | shortcut: ho 1055 | about: 1056 | website: https://hoogle.haskell.org/ 1057 | wikidata_id: Q34010 1058 | official_api_documentation: https://hackage.haskell.org/api 1059 | use_official_api: false 1060 | require_api_key: false 1061 | results: JSON 1062 | 1063 | - name: imdb 1064 | engine: imdb 1065 | shortcut: imdb 1066 | timeout: 6.0 1067 | disabled: true 1068 | 1069 | - name: imgur 1070 | engine: imgur 1071 | shortcut: img 1072 | disabled: true 1073 | 1074 | - name: ina 1075 | engine: ina 1076 | shortcut: in 1077 | timeout: 6.0 1078 | disabled: true 1079 | 1080 | - name: invidious 1081 | engine: invidious 1082 | # Instanes will be selected randomly, see https://api.invidious.io/ for 1083 | # instances that are stable (good uptime) and close to you. 1084 | base_url: 1085 | - https://invidious.io.lol 1086 | - https://invidious.fdn.fr 1087 | - https://yt.artemislena.eu 1088 | - https://invidious.tiekoetter.com 1089 | - https://invidious.flokinet.to 1090 | - https://vid.puffyan.us 1091 | - https://invidious.privacydev.net 1092 | - https://inv.tux.pizza 1093 | shortcut: iv 1094 | timeout: 3.0 1095 | disabled: true 1096 | 1097 | - name: ipernity 1098 | engine: ipernity 1099 | shortcut: ip 1100 | disabled: true 1101 | 1102 | - name: jisho 1103 | engine: jisho 1104 | shortcut: js 1105 | timeout: 3.0 1106 | disabled: true 1107 | 1108 | - name: kickass 1109 | engine: kickass 1110 | base_url: 1111 | - https://kickasstorrents.to 1112 | - https://kickasstorrents.cr 1113 | - https://kickasstorrent.cr 1114 | - https://kickass.sx 1115 | - https://kat.am 1116 | shortcut: kc 1117 | timeout: 4.0 1118 | 1119 | - name: lemmy communities 1120 | engine: lemmy 1121 | lemmy_type: Communities 1122 | shortcut: leco 1123 | 1124 | - name: lemmy users 1125 | engine: lemmy 1126 | network: lemmy communities 1127 | lemmy_type: Users 1128 | shortcut: leus 1129 | 1130 | - name: lemmy posts 1131 | engine: lemmy 1132 | network: lemmy communities 1133 | lemmy_type: Posts 1134 | shortcut: lepo 1135 | 1136 | - name: lemmy comments 1137 | engine: lemmy 1138 | network: lemmy communities 1139 | lemmy_type: Comments 1140 | shortcut: lecom 1141 | 1142 | - name: library genesis 1143 | engine: xpath 1144 | # search_url: https://libgen.is/search.php?req={query} 1145 | search_url: https://libgen.rs/search.php?req={query} 1146 | url_xpath: //a[contains(@href,"book/index.php?md5")]/@href 1147 | title_xpath: //a[contains(@href,"book/")]/text()[1] 1148 | content_xpath: //td/a[1][contains(@href,"=author")]/text() 1149 | categories: files 1150 | timeout: 7.0 1151 | disabled: true 1152 | shortcut: lg 1153 | about: 1154 | website: https://libgen.fun/ 1155 | wikidata_id: Q22017206 1156 | official_api_documentation: 1157 | use_official_api: false 1158 | require_api_key: false 1159 | results: HTML 1160 | 1161 | - name: z-library 1162 | engine: zlibrary 1163 | shortcut: zlib 1164 | categories: files 1165 | timeout: 7.0 1166 | 1167 | - name: library of congress 1168 | engine: loc 1169 | shortcut: loc 1170 | categories: images 1171 | 1172 | - name: libretranslate 1173 | engine: libretranslate 1174 | # https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#mirrors 1175 | base_url: 1176 | - https://libretranslate.com/translate 1177 | # api_key: abc123 1178 | shortcut: lt 1179 | disabled: true 1180 | 1181 | - name: lingva 1182 | engine: lingva 1183 | shortcut: lv 1184 | # set lingva instance in url, by default it will use the official instance 1185 | # url: https://lingva.thedaviddelta.com 1186 | 1187 | - name: lobste.rs 1188 | engine: xpath 1189 | search_url: https://lobste.rs/search?q={query}&what=stories&order=relevance 1190 | results_xpath: //li[contains(@class, "story")] 1191 | url_xpath: .//a[@class="u-url"]/@href 1192 | title_xpath: .//a[@class="u-url"] 1193 | content_xpath: .//a[@class="domain"] 1194 | categories: it 1195 | shortcut: lo 1196 | timeout: 5.0 1197 | disabled: true 1198 | about: 1199 | website: https://lobste.rs/ 1200 | wikidata_id: Q60762874 1201 | official_api_documentation: 1202 | use_official_api: false 1203 | require_api_key: false 1204 | results: HTML 1205 | 1206 | - name: mastodon users 1207 | engine: mastodon 1208 | mastodon_type: accounts 1209 | base_url: https://mastodon.social 1210 | shortcut: mau 1211 | 1212 | - name: mastodon hashtags 1213 | engine: mastodon 1214 | mastodon_type: hashtags 1215 | base_url: https://mastodon.social 1216 | shortcut: mah 1217 | 1218 | # - name: matrixrooms 1219 | # engine: mrs 1220 | # # https://docs.searxng.org/dev/engines/online/mrs.html 1221 | # # base_url: https://mrs-api-host 1222 | # shortcut: mtrx 1223 | # disabled: true 1224 | 1225 | - name: mdn 1226 | shortcut: mdn 1227 | engine: json_engine 1228 | categories: [it] 1229 | paging: true 1230 | search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} 1231 | results_query: documents 1232 | url_query: mdn_url 1233 | url_prefix: https://developer.mozilla.org 1234 | title_query: title 1235 | content_query: summary 1236 | about: 1237 | website: https://developer.mozilla.org 1238 | wikidata_id: Q3273508 1239 | official_api_documentation: null 1240 | use_official_api: false 1241 | require_api_key: false 1242 | results: JSON 1243 | 1244 | - name: metacpan 1245 | engine: metacpan 1246 | shortcut: cpan 1247 | disabled: true 1248 | number_of_results: 20 1249 | 1250 | # - name: meilisearch 1251 | # engine: meilisearch 1252 | # shortcut: mes 1253 | # enable_http: true 1254 | # base_url: http://localhost:7700 1255 | # index: my-index 1256 | 1257 | - name: mixcloud 1258 | engine: mixcloud 1259 | shortcut: mc 1260 | 1261 | # MongoDB engine 1262 | # Required dependency: pymongo 1263 | # - name: mymongo 1264 | # engine: mongodb 1265 | # shortcut: md 1266 | # exact_match_only: false 1267 | # host: '127.0.0.1' 1268 | # port: 27017 1269 | # enable_http: true 1270 | # results_per_page: 20 1271 | # database: 'business' 1272 | # collection: 'reviews' # name of the db collection 1273 | # key: 'name' # key in the collection to search for 1274 | 1275 | - name: mozhi 1276 | engine: mozhi 1277 | base_url: 1278 | - https://mozhi.aryak.me 1279 | - https://translate.bus-hit.me 1280 | - https://nyc1.mz.ggtyler.dev 1281 | # mozhi_engine: google - see https://mozhi.aryak.me for supported engines 1282 | timeout: 4.0 1283 | shortcut: mz 1284 | disabled: true 1285 | 1286 | - name: mwmbl 1287 | engine: mwmbl 1288 | # api_url: https://api.mwmbl.org 1289 | shortcut: mwm 1290 | disabled: true 1291 | 1292 | - name: npm 1293 | engine: npm 1294 | shortcut: npm 1295 | timeout: 5.0 1296 | disabled: true 1297 | 1298 | - name: nyaa 1299 | engine: nyaa 1300 | shortcut: nt 1301 | disabled: true 1302 | 1303 | - name: mankier 1304 | engine: json_engine 1305 | search_url: https://www.mankier.com/api/v2/mans/?q={query} 1306 | results_query: results 1307 | url_query: url 1308 | title_query: name 1309 | content_query: description 1310 | categories: it 1311 | shortcut: man 1312 | about: 1313 | website: https://www.mankier.com/ 1314 | official_api_documentation: https://www.mankier.com/api 1315 | use_official_api: true 1316 | require_api_key: false 1317 | results: JSON 1318 | 1319 | # read https://docs.searxng.org/dev/engines/online/mullvad_leta.html 1320 | # - name: mullvadleta 1321 | # engine: mullvad_leta 1322 | # leta_engine: google # choose one of the following: google, brave 1323 | # use_cache: true # Only 100 non-cache searches per day, suggested only for private instances 1324 | # search_url: https://leta.mullvad.net 1325 | # categories: [general, web] 1326 | # shortcut: ml 1327 | 1328 | - name: odysee 1329 | engine: odysee 1330 | shortcut: od 1331 | disabled: true 1332 | 1333 | - name: openairedatasets 1334 | engine: json_engine 1335 | paging: true 1336 | search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} 1337 | results_query: response/results/result 1338 | url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ 1339 | title_query: metadata/oaf:entity/oaf:result/title/$ 1340 | content_query: metadata/oaf:entity/oaf:result/description/$ 1341 | content_html_to_text: true 1342 | categories: "science" 1343 | shortcut: oad 1344 | timeout: 5.0 1345 | about: 1346 | website: https://www.openaire.eu/ 1347 | wikidata_id: Q25106053 1348 | official_api_documentation: https://api.openaire.eu/ 1349 | use_official_api: false 1350 | require_api_key: false 1351 | results: JSON 1352 | 1353 | - name: openairepublications 1354 | engine: json_engine 1355 | paging: true 1356 | search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} 1357 | results_query: response/results/result 1358 | url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ 1359 | title_query: metadata/oaf:entity/oaf:result/title/$ 1360 | content_query: metadata/oaf:entity/oaf:result/description/$ 1361 | content_html_to_text: true 1362 | categories: science 1363 | shortcut: oap 1364 | timeout: 5.0 1365 | about: 1366 | website: https://www.openaire.eu/ 1367 | wikidata_id: Q25106053 1368 | official_api_documentation: https://api.openaire.eu/ 1369 | use_official_api: false 1370 | require_api_key: false 1371 | results: JSON 1372 | 1373 | - name: openlibrary 1374 | engine: openlibrary 1375 | shortcut: ol 1376 | timeout: 5 1377 | disabled: true 1378 | 1379 | - name: openmeteo 1380 | engine: open_meteo 1381 | shortcut: om 1382 | disabled: true 1383 | 1384 | # - name: opensemanticsearch 1385 | # engine: opensemantic 1386 | # shortcut: oss 1387 | # base_url: 'http://localhost:8983/solr/opensemanticsearch/' 1388 | 1389 | - name: openstreetmap 1390 | engine: openstreetmap 1391 | shortcut: osm 1392 | 1393 | - name: openrepos 1394 | engine: xpath 1395 | paging: true 1396 | search_url: https://openrepos.net/search/node/{query}?page={pageno} 1397 | url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href 1398 | title_xpath: //li[@class="search-result"]//h3[@class="title"]/a 1399 | content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] 1400 | categories: files 1401 | timeout: 4.0 1402 | disabled: true 1403 | shortcut: or 1404 | about: 1405 | website: https://openrepos.net/ 1406 | wikidata_id: 1407 | official_api_documentation: 1408 | use_official_api: false 1409 | require_api_key: false 1410 | results: HTML 1411 | 1412 | - name: packagist 1413 | engine: json_engine 1414 | paging: true 1415 | search_url: https://packagist.org/search.json?q={query}&page={pageno} 1416 | results_query: results 1417 | url_query: url 1418 | title_query: name 1419 | content_query: description 1420 | categories: [it, packages] 1421 | disabled: true 1422 | timeout: 5.0 1423 | shortcut: pack 1424 | about: 1425 | website: https://packagist.org 1426 | wikidata_id: Q108311377 1427 | official_api_documentation: https://packagist.org/apidoc 1428 | use_official_api: true 1429 | require_api_key: false 1430 | results: JSON 1431 | 1432 | - name: pdbe 1433 | engine: pdbe 1434 | shortcut: pdb 1435 | # Hide obsolete PDB entries. Default is not to hide obsolete structures 1436 | # hide_obsolete: false 1437 | 1438 | - name: photon 1439 | engine: photon 1440 | shortcut: ph 1441 | 1442 | - name: pinterest 1443 | engine: pinterest 1444 | shortcut: pin 1445 | 1446 | - name: piped 1447 | engine: piped 1448 | shortcut: ppd 1449 | categories: videos 1450 | piped_filter: videos 1451 | timeout: 3.0 1452 | 1453 | # URL to use as link and for embeds 1454 | frontend_url: https://srv.piped.video 1455 | # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ 1456 | backend_url: 1457 | - https://pipedapi.kavin.rocks 1458 | - https://pipedapi-libre.kavin.rocks 1459 | - https://pipedapi.adminforge.de 1460 | 1461 | - name: piped.music 1462 | engine: piped 1463 | network: piped 1464 | shortcut: ppdm 1465 | categories: music 1466 | piped_filter: music_songs 1467 | timeout: 3.0 1468 | 1469 | - name: piratebay 1470 | engine: piratebay 1471 | shortcut: tpb 1472 | # You may need to change this URL to a proxy if piratebay is blocked in your 1473 | # country 1474 | url: https://thepiratebay.org/ 1475 | timeout: 3.0 1476 | 1477 | - name: pixiv 1478 | shortcut: pv 1479 | engine: pixiv 1480 | disabled: true 1481 | inactive: true 1482 | pixiv_image_proxies: 1483 | - https://pximg.example.org 1484 | # A proxy is required to load the images. Hosting an image proxy server 1485 | # for Pixiv: 1486 | # --> https://pixivfe.pages.dev/hosting-image-proxy-server/ 1487 | # Proxies from public instances. Ask the public instances owners if they 1488 | # agree to receive traffic from SearXNG! 1489 | # --> https://codeberg.org/VnPower/PixivFE#instances 1490 | # --> https://github.com/searxng/searxng/pull/3192#issuecomment-1941095047 1491 | # image proxy of https://pixiv.cat 1492 | # - https://i.pixiv.cat 1493 | # image proxy of https://www.pixiv.pics 1494 | # - https://pximg.cocomi.eu.org 1495 | # image proxy of https://pixivfe.exozy.me 1496 | # - https://pximg.exozy.me 1497 | # image proxy of https://pixivfe.ducks.party 1498 | # - https://pixiv.ducks.party 1499 | # image proxy of https://pixiv.perennialte.ch 1500 | # - https://pximg.perennialte.ch 1501 | 1502 | - name: podcastindex 1503 | engine: podcastindex 1504 | shortcut: podcast 1505 | 1506 | # Required dependency: psychopg2 1507 | # - name: postgresql 1508 | # engine: postgresql 1509 | # database: postgres 1510 | # username: postgres 1511 | # password: postgres 1512 | # limit: 10 1513 | # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' 1514 | # shortcut : psql 1515 | 1516 | - name: presearch 1517 | engine: presearch 1518 | search_type: search 1519 | categories: [general, web] 1520 | shortcut: ps 1521 | timeout: 4.0 1522 | disabled: true 1523 | 1524 | - name: presearch images 1525 | engine: presearch 1526 | network: presearch 1527 | search_type: images 1528 | categories: [images, web] 1529 | timeout: 4.0 1530 | shortcut: psimg 1531 | disabled: true 1532 | 1533 | - name: presearch videos 1534 | engine: presearch 1535 | network: presearch 1536 | search_type: videos 1537 | categories: [general, web] 1538 | timeout: 4.0 1539 | shortcut: psvid 1540 | disabled: true 1541 | 1542 | - name: presearch news 1543 | engine: presearch 1544 | network: presearch 1545 | search_type: news 1546 | categories: [news, web] 1547 | timeout: 4.0 1548 | shortcut: psnews 1549 | disabled: true 1550 | 1551 | - name: pub.dev 1552 | engine: xpath 1553 | shortcut: pd 1554 | search_url: https://pub.dev/packages?q={query}&page={pageno} 1555 | paging: true 1556 | results_xpath: //div[contains(@class,"packages-item")] 1557 | url_xpath: ./div/h3/a/@href 1558 | title_xpath: ./div/h3/a 1559 | content_xpath: ./div/div/div[contains(@class,"packages-description")]/span 1560 | categories: [packages, it] 1561 | timeout: 3.0 1562 | disabled: true 1563 | first_page_num: 1 1564 | about: 1565 | website: https://pub.dev/ 1566 | official_api_documentation: https://pub.dev/help/api 1567 | use_official_api: false 1568 | require_api_key: false 1569 | results: HTML 1570 | 1571 | - name: public domain image archive 1572 | engine: public_domain_image_archive 1573 | shortcut: pdia 1574 | 1575 | - name: pubmed 1576 | engine: pubmed 1577 | shortcut: pub 1578 | timeout: 3.0 1579 | 1580 | - name: pypi 1581 | shortcut: pypi 1582 | engine: pypi 1583 | 1584 | - name: qwant 1585 | qwant_categ: web 1586 | engine: qwant 1587 | shortcut: qw 1588 | categories: [general, web] 1589 | additional_tests: 1590 | rosebud: *test_rosebud 1591 | 1592 | - name: qwant news 1593 | qwant_categ: news 1594 | engine: qwant 1595 | shortcut: qwn 1596 | categories: news 1597 | network: qwant 1598 | 1599 | - name: qwant images 1600 | qwant_categ: images 1601 | engine: qwant 1602 | shortcut: qwi 1603 | categories: [images, web] 1604 | network: qwant 1605 | 1606 | - name: qwant videos 1607 | qwant_categ: videos 1608 | engine: qwant 1609 | shortcut: qwv 1610 | categories: [videos, web] 1611 | network: qwant 1612 | 1613 | # - name: library 1614 | # engine: recoll 1615 | # shortcut: lib 1616 | # base_url: 'https://recoll.example.org/' 1617 | # search_dir: '' 1618 | # mount_prefix: /export 1619 | # dl_prefix: 'https://download.example.org' 1620 | # timeout: 30.0 1621 | # categories: files 1622 | # disabled: true 1623 | 1624 | # - name: recoll library reference 1625 | # engine: recoll 1626 | # base_url: 'https://recoll.example.org/' 1627 | # search_dir: reference 1628 | # mount_prefix: /export 1629 | # dl_prefix: 'https://download.example.org' 1630 | # shortcut: libr 1631 | # timeout: 30.0 1632 | # categories: files 1633 | # disabled: true 1634 | 1635 | - name: radio browser 1636 | engine: radio_browser 1637 | shortcut: rb 1638 | 1639 | - name: reddit 1640 | engine: reddit 1641 | shortcut: re 1642 | page_size: 25 1643 | disabled: true 1644 | 1645 | - name: right dao 1646 | engine: xpath 1647 | paging: true 1648 | page_size: 12 1649 | search_url: https://rightdao.com/search?q={query}&start={pageno} 1650 | results_xpath: //div[contains(@class, "description")] 1651 | url_xpath: ../div[contains(@class, "title")]/a/@href 1652 | title_xpath: ../div[contains(@class, "title")] 1653 | content_xpath: . 1654 | categories: general 1655 | shortcut: rd 1656 | disabled: true 1657 | about: 1658 | website: https://rightdao.com/ 1659 | use_official_api: false 1660 | require_api_key: false 1661 | results: HTML 1662 | 1663 | - name: rottentomatoes 1664 | engine: rottentomatoes 1665 | shortcut: rt 1666 | disabled: true 1667 | 1668 | # Required dependency: redis 1669 | # - name: myredis 1670 | # shortcut : rds 1671 | # engine: redis_server 1672 | # exact_match_only: false 1673 | # host: '127.0.0.1' 1674 | # port: 6379 1675 | # enable_http: true 1676 | # password: '' 1677 | # db: 0 1678 | 1679 | # tmp suspended: bad certificate 1680 | # - name: scanr structures 1681 | # shortcut: scs 1682 | # engine: scanr_structures 1683 | # disabled: true 1684 | 1685 | - name: searchmysite 1686 | engine: xpath 1687 | shortcut: sms 1688 | categories: general 1689 | paging: true 1690 | search_url: https://searchmysite.net/search/?q={query}&page={pageno} 1691 | results_xpath: //div[contains(@class,'search-result')] 1692 | url_xpath: .//a[contains(@class,'result-link')]/@href 1693 | title_xpath: .//span[contains(@class,'result-title-txt')]/text() 1694 | content_xpath: ./p[@id='result-hightlight'] 1695 | disabled: true 1696 | about: 1697 | website: https://searchmysite.net 1698 | 1699 | - name: sepiasearch 1700 | engine: sepiasearch 1701 | shortcut: sep 1702 | 1703 | - name: soundcloud 1704 | engine: soundcloud 1705 | shortcut: sc 1706 | 1707 | - name: stackoverflow 1708 | engine: stackexchange 1709 | shortcut: st 1710 | api_site: "stackoverflow" 1711 | categories: [it, q&a] 1712 | 1713 | - name: askubuntu 1714 | engine: stackexchange 1715 | shortcut: ubuntu 1716 | api_site: "askubuntu" 1717 | categories: [it, q&a] 1718 | 1719 | - name: superuser 1720 | engine: stackexchange 1721 | shortcut: su 1722 | api_site: "superuser" 1723 | categories: [it, q&a] 1724 | 1725 | - name: discuss.python 1726 | engine: discourse 1727 | shortcut: dpy 1728 | base_url: "https://discuss.python.org" 1729 | categories: [it, q&a] 1730 | disabled: true 1731 | 1732 | - name: caddy.community 1733 | engine: discourse 1734 | shortcut: caddy 1735 | base_url: "https://caddy.community" 1736 | categories: [it, q&a] 1737 | disabled: true 1738 | 1739 | - name: pi-hole.community 1740 | engine: discourse 1741 | shortcut: pi 1742 | categories: [it, q&a] 1743 | base_url: "https://discourse.pi-hole.net" 1744 | disabled: true 1745 | 1746 | - name: searchcode code 1747 | engine: searchcode_code 1748 | shortcut: scc 1749 | disabled: true 1750 | 1751 | # - name: searx 1752 | # engine: searx_engine 1753 | # shortcut: se 1754 | # instance_urls : 1755 | # - http://127.0.0.1:8888/ 1756 | # - ... 1757 | # disabled: true 1758 | 1759 | - name: semantic scholar 1760 | engine: semantic_scholar 1761 | disabled: true 1762 | shortcut: se 1763 | 1764 | # Spotify needs API credentials 1765 | # - name: spotify 1766 | # engine: spotify 1767 | # shortcut: stf 1768 | # api_client_id: ******* 1769 | # api_client_secret: ******* 1770 | 1771 | # - name: solr 1772 | # engine: solr 1773 | # shortcut: slr 1774 | # base_url: http://localhost:8983 1775 | # collection: collection_name 1776 | # sort: '' # sorting: asc or desc 1777 | # field_list: '' # comma separated list of field names to display on the UI 1778 | # default_fields: '' # default field to query 1779 | # query_fields: '' # query fields 1780 | # enable_http: true 1781 | 1782 | # - name: springer nature 1783 | # engine: springer 1784 | # # get your API key from: https://dev.springernature.com/signup 1785 | # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" 1786 | # api_key: 'unset' 1787 | # shortcut: springer 1788 | # timeout: 15.0 1789 | 1790 | - name: startpage 1791 | engine: startpage 1792 | shortcut: sp 1793 | timeout: 6.0 1794 | disabled: true 1795 | additional_tests: 1796 | rosebud: *test_rosebud 1797 | 1798 | - name: tokyotoshokan 1799 | engine: tokyotoshokan 1800 | shortcut: tt 1801 | timeout: 6.0 1802 | disabled: true 1803 | 1804 | - name: solidtorrents 1805 | engine: solidtorrents 1806 | shortcut: solid 1807 | timeout: 4.0 1808 | base_url: 1809 | - https://solidtorrents.to 1810 | - https://bitsearch.to 1811 | 1812 | # For this demo of the sqlite engine download: 1813 | # https://liste.mediathekview.de/filmliste-v2.db.bz2 1814 | # and unpack into searx/data/filmliste-v2.db 1815 | # Query to test: "!demo concert" 1816 | # 1817 | # - name: demo 1818 | # engine: sqlite 1819 | # shortcut: demo 1820 | # categories: general 1821 | # result_template: default.html 1822 | # database: searx/data/filmliste-v2.db 1823 | # query_str: >- 1824 | # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, 1825 | # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, 1826 | # description AS content 1827 | # FROM film 1828 | # WHERE title LIKE :wildcard OR description LIKE :wildcard 1829 | # ORDER BY duration DESC 1830 | 1831 | - name: tagesschau 1832 | engine: tagesschau 1833 | # when set to false, display URLs from Tagesschau, and not the actual source 1834 | # (e.g. NDR, WDR, SWR, HR, ...) 1835 | use_source_url: true 1836 | shortcut: ts 1837 | disabled: true 1838 | 1839 | - name: tmdb 1840 | engine: xpath 1841 | paging: true 1842 | categories: movies 1843 | search_url: https://www.themoviedb.org/search?page={pageno}&query={query} 1844 | results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] 1845 | url_xpath: .//div[contains(@class,"poster")]/a/@href 1846 | thumbnail_xpath: .//img/@src 1847 | title_xpath: .//div[contains(@class,"title")]//h2 1848 | content_xpath: .//div[contains(@class,"overview")] 1849 | shortcut: tm 1850 | disabled: true 1851 | 1852 | # Requires Tor 1853 | - name: torch 1854 | engine: xpath 1855 | paging: true 1856 | search_url: http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and 1857 | results_xpath: //table//tr 1858 | url_xpath: ./td[2]/a 1859 | title_xpath: ./td[2]/b 1860 | content_xpath: ./td[2]/small 1861 | categories: onions 1862 | enable_http: true 1863 | shortcut: tch 1864 | 1865 | # torznab engine lets you query any torznab compatible indexer. Using this 1866 | # engine in combination with Jackett opens the possibility to query a lot of 1867 | # public and private indexers directly from SearXNG. More details at: 1868 | # https://docs.searxng.org/dev/engines/online/torznab.html 1869 | # 1870 | # - name: Torznab EZTV 1871 | # engine: torznab 1872 | # shortcut: eztv 1873 | # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab 1874 | # enable_http: true # if using localhost 1875 | # api_key: xxxxxxxxxxxxxxx 1876 | # show_magnet_links: true 1877 | # show_torrent_files: false 1878 | # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories 1879 | # torznab_categories: # optional 1880 | # - 2000 1881 | # - 5000 1882 | 1883 | # tmp suspended - too slow, too many errors 1884 | # - name: urbandictionary 1885 | # engine : xpath 1886 | # search_url : https://www.urbandictionary.com/define.php?term={query} 1887 | # url_xpath : //*[@class="word"]/@href 1888 | # title_xpath : //*[@class="def-header"] 1889 | # content_xpath: //*[@class="meaning"] 1890 | # shortcut: ud 1891 | 1892 | - name: unsplash 1893 | engine: unsplash 1894 | shortcut: us 1895 | 1896 | - name: yandex 1897 | engine: yandex 1898 | categories: general 1899 | search_type: web 1900 | shortcut: yd 1901 | disabled: true 1902 | inactive: true 1903 | 1904 | - name: yandex images 1905 | engine: yandex 1906 | categories: images 1907 | search_type: images 1908 | shortcut: ydi 1909 | disabled: true 1910 | inactive: true 1911 | 1912 | - name: yandex music 1913 | engine: yandex_music 1914 | shortcut: ydm 1915 | disabled: true 1916 | # https://yandex.com/support/music/access.html 1917 | inactive: true 1918 | 1919 | - name: yahoo 1920 | engine: yahoo 1921 | shortcut: yh 1922 | disabled: true 1923 | 1924 | - name: yahoo news 1925 | engine: yahoo_news 1926 | shortcut: yhn 1927 | 1928 | - name: youtube 1929 | shortcut: yt 1930 | # You can use the engine using the official stable API, but you need an API 1931 | # key See: https://console.developers.google.com/project 1932 | # 1933 | # engine: youtube_api 1934 | # api_key: 'apikey' # required! 1935 | # 1936 | # Or you can use the html non-stable engine, activated by default 1937 | engine: youtube_noapi 1938 | 1939 | - name: dailymotion 1940 | engine: dailymotion 1941 | shortcut: dm 1942 | 1943 | - name: vimeo 1944 | engine: vimeo 1945 | shortcut: vm 1946 | 1947 | - name: wiby 1948 | engine: json_engine 1949 | paging: true 1950 | search_url: https://wiby.me/json/?q={query}&p={pageno} 1951 | url_query: URL 1952 | title_query: Title 1953 | content_query: Snippet 1954 | categories: [general, web] 1955 | shortcut: wib 1956 | disabled: true 1957 | about: 1958 | website: https://wiby.me/ 1959 | 1960 | - name: wikibooks 1961 | engine: mediawiki 1962 | weight: 0.5 1963 | shortcut: wb 1964 | categories: [general, wikimedia] 1965 | base_url: "https://{language}.wikibooks.org/" 1966 | search_type: text 1967 | disabled: true 1968 | about: 1969 | website: https://www.wikibooks.org/ 1970 | wikidata_id: Q367 1971 | 1972 | - name: wikinews 1973 | engine: mediawiki 1974 | shortcut: wn 1975 | categories: [news, wikimedia] 1976 | base_url: "https://{language}.wikinews.org/" 1977 | search_type: text 1978 | srsort: create_timestamp_desc 1979 | about: 1980 | website: https://www.wikinews.org/ 1981 | wikidata_id: Q964 1982 | 1983 | - name: wikiquote 1984 | engine: mediawiki 1985 | weight: 0.5 1986 | shortcut: wq 1987 | categories: [general, wikimedia] 1988 | base_url: "https://{language}.wikiquote.org/" 1989 | search_type: text 1990 | disabled: true 1991 | additional_tests: 1992 | rosebud: *test_rosebud 1993 | about: 1994 | website: https://www.wikiquote.org/ 1995 | wikidata_id: Q369 1996 | 1997 | - name: wikisource 1998 | engine: mediawiki 1999 | weight: 0.5 2000 | shortcut: ws 2001 | categories: [general, wikimedia] 2002 | base_url: "https://{language}.wikisource.org/" 2003 | search_type: text 2004 | disabled: true 2005 | about: 2006 | website: https://www.wikisource.org/ 2007 | wikidata_id: Q263 2008 | 2009 | - name: wikispecies 2010 | engine: mediawiki 2011 | shortcut: wsp 2012 | categories: [general, science, wikimedia] 2013 | base_url: "https://species.wikimedia.org/" 2014 | search_type: text 2015 | disabled: true 2016 | about: 2017 | website: https://species.wikimedia.org/ 2018 | wikidata_id: Q13679 2019 | tests: 2020 | wikispecies: 2021 | matrix: 2022 | query: "Campbell, L.I. et al. 2011: MicroRNAs" 2023 | lang: en 2024 | result_container: 2025 | - not_empty 2026 | - ["one_title_contains", "Tardigrada"] 2027 | test: 2028 | - unique_results 2029 | 2030 | - name: wiktionary 2031 | engine: mediawiki 2032 | shortcut: wt 2033 | categories: [dictionaries, wikimedia] 2034 | base_url: "https://{language}.wiktionary.org/" 2035 | search_type: text 2036 | about: 2037 | website: https://www.wiktionary.org/ 2038 | wikidata_id: Q151 2039 | 2040 | - name: wikiversity 2041 | engine: mediawiki 2042 | weight: 0.5 2043 | shortcut: wv 2044 | categories: [general, wikimedia] 2045 | base_url: "https://{language}.wikiversity.org/" 2046 | search_type: text 2047 | disabled: true 2048 | about: 2049 | website: https://www.wikiversity.org/ 2050 | wikidata_id: Q370 2051 | 2052 | - name: wikivoyage 2053 | engine: mediawiki 2054 | weight: 0.5 2055 | shortcut: wy 2056 | categories: [general, wikimedia] 2057 | base_url: "https://{language}.wikivoyage.org/" 2058 | search_type: text 2059 | disabled: true 2060 | about: 2061 | website: https://www.wikivoyage.org/ 2062 | wikidata_id: Q373 2063 | 2064 | - name: wikicommons.images 2065 | engine: wikicommons 2066 | shortcut: wc 2067 | categories: images 2068 | search_type: images 2069 | number_of_results: 10 2070 | 2071 | - name: wikicommons.videos 2072 | engine: wikicommons 2073 | shortcut: wcv 2074 | categories: videos 2075 | search_type: videos 2076 | number_of_results: 10 2077 | 2078 | - name: wikicommons.audio 2079 | engine: wikicommons 2080 | shortcut: wca 2081 | categories: music 2082 | search_type: audio 2083 | number_of_results: 10 2084 | 2085 | - name: wikicommons.files 2086 | engine: wikicommons 2087 | shortcut: wcf 2088 | categories: files 2089 | search_type: files 2090 | number_of_results: 10 2091 | 2092 | - name: wolframalpha 2093 | shortcut: wa 2094 | # You can use the engine using the official stable API, but you need an API 2095 | # key. See: https://products.wolframalpha.com/api/ 2096 | # 2097 | # engine: wolframalpha_api 2098 | # api_key: '' 2099 | # 2100 | # Or you can use the html non-stable engine, activated by default 2101 | engine: wolframalpha_noapi 2102 | timeout: 6.0 2103 | categories: general 2104 | disabled: true 2105 | 2106 | - name: dictzone 2107 | engine: dictzone 2108 | shortcut: dc 2109 | 2110 | - name: mymemory translated 2111 | engine: translated 2112 | shortcut: tl 2113 | timeout: 5.0 2114 | # You can use without an API key, but you are limited to 1000 words/day 2115 | # See: https://mymemory.translated.net/doc/usagelimits.php 2116 | # api_key: '' 2117 | 2118 | # Required dependency: mysql-connector-python 2119 | # - name: mysql 2120 | # engine: mysql_server 2121 | # database: mydatabase 2122 | # username: user 2123 | # password: pass 2124 | # limit: 10 2125 | # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' 2126 | # shortcut: mysql 2127 | 2128 | # Required dependency: mariadb 2129 | # - name: mariadb 2130 | # engine: mariadb_server 2131 | # database: mydatabase 2132 | # username: user 2133 | # password: pass 2134 | # limit: 10 2135 | # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' 2136 | # shortcut: mdb 2137 | 2138 | - name: 1337x 2139 | engine: 1337x 2140 | shortcut: 1337x 2141 | disabled: true 2142 | 2143 | - name: duden 2144 | engine: duden 2145 | shortcut: du 2146 | disabled: true 2147 | 2148 | - name: seznam 2149 | shortcut: szn 2150 | engine: seznam 2151 | disabled: true 2152 | 2153 | # - name: deepl 2154 | # engine: deepl 2155 | # shortcut: dpl 2156 | # # You can use the engine using the official stable API, but you need an API key 2157 | # # See: https://www.deepl.com/pro-api?cta=header-pro-api 2158 | # api_key: '' # required! 2159 | # timeout: 5.0 2160 | # disabled: true 2161 | 2162 | - name: mojeek 2163 | shortcut: mjk 2164 | engine: mojeek 2165 | categories: [general, web] 2166 | disabled: true 2167 | 2168 | - name: mojeek images 2169 | shortcut: mjkimg 2170 | engine: mojeek 2171 | categories: [images, web] 2172 | search_type: images 2173 | paging: false 2174 | disabled: true 2175 | 2176 | - name: mojeek news 2177 | shortcut: mjknews 2178 | engine: mojeek 2179 | categories: [news, web] 2180 | search_type: news 2181 | paging: false 2182 | disabled: true 2183 | 2184 | - name: moviepilot 2185 | engine: moviepilot 2186 | shortcut: mp 2187 | disabled: true 2188 | 2189 | - name: naver 2190 | shortcut: nvr 2191 | categories: [general, web] 2192 | engine: xpath 2193 | paging: true 2194 | search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} 2195 | url_xpath: //a[@class="link_tit"]/@href 2196 | title_xpath: //a[@class="link_tit"] 2197 | content_xpath: //div[@class="total_dsc_wrap"]/a 2198 | first_page_num: 1 2199 | page_size: 10 2200 | disabled: true 2201 | about: 2202 | website: https://www.naver.com/ 2203 | wikidata_id: Q485639 2204 | official_api_documentation: https://developers.naver.com/docs/nmt/examples/ 2205 | use_official_api: false 2206 | require_api_key: false 2207 | results: HTML 2208 | language: ko 2209 | 2210 | - name: rubygems 2211 | shortcut: rbg 2212 | engine: xpath 2213 | paging: true 2214 | search_url: https://rubygems.org/search?page={pageno}&query={query} 2215 | results_xpath: /html/body/main/div/a[@class="gems__gem"] 2216 | url_xpath: ./@href 2217 | title_xpath: ./span/h2 2218 | content_xpath: ./span/p 2219 | suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a 2220 | first_page_num: 1 2221 | categories: [it, packages] 2222 | disabled: true 2223 | about: 2224 | website: https://rubygems.org/ 2225 | wikidata_id: Q1853420 2226 | official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ 2227 | use_official_api: false 2228 | require_api_key: false 2229 | results: HTML 2230 | 2231 | - name: peertube 2232 | engine: peertube 2233 | shortcut: ptb 2234 | paging: true 2235 | # alternatives see: https://instances.joinpeertube.org/instances 2236 | # base_url: https://tube.4aem.com 2237 | categories: videos 2238 | disabled: true 2239 | timeout: 6.0 2240 | 2241 | - name: mediathekviewweb 2242 | engine: mediathekviewweb 2243 | shortcut: mvw 2244 | disabled: true 2245 | 2246 | - name: yacy 2247 | # https://docs.searxng.org/dev/engines/online/yacy.html 2248 | engine: yacy 2249 | categories: general 2250 | search_type: text 2251 | base_url: 2252 | - https://yacy.searchlab.eu 2253 | # see https://github.com/searxng/searxng/pull/3631#issuecomment-2240903027 2254 | # - https://search.kyun.li 2255 | # - https://yacy.securecomcorp.eu 2256 | # - https://yacy.myserv.ca 2257 | # - https://yacy.nsupdate.info 2258 | # - https://yacy.electroncash.de 2259 | shortcut: ya 2260 | disabled: true 2261 | # if you aren't using HTTPS for your local yacy instance disable https 2262 | # enable_http: false 2263 | search_mode: "global" 2264 | # timeout can be reduced in 'local' search mode 2265 | timeout: 5.0 2266 | 2267 | - name: yacy images 2268 | engine: yacy 2269 | network: yacy 2270 | categories: images 2271 | search_type: image 2272 | shortcut: yai 2273 | disabled: true 2274 | # timeout can be reduced in 'local' search mode 2275 | timeout: 5.0 2276 | 2277 | - name: rumble 2278 | engine: rumble 2279 | shortcut: ru 2280 | base_url: https://rumble.com/ 2281 | paging: true 2282 | categories: videos 2283 | disabled: true 2284 | 2285 | - name: livespace 2286 | engine: livespace 2287 | shortcut: ls 2288 | categories: videos 2289 | disabled: true 2290 | timeout: 5.0 2291 | 2292 | - name: wordnik 2293 | engine: wordnik 2294 | shortcut: def 2295 | categories: [dictionaries] 2296 | timeout: 5.0 2297 | 2298 | - name: woxikon.de synonyme 2299 | engine: xpath 2300 | shortcut: woxi 2301 | categories: [dictionaries] 2302 | timeout: 5.0 2303 | disabled: true 2304 | search_url: https://synonyme.woxikon.de/synonyme/{query}.php 2305 | url_xpath: //div[@class="upper-synonyms"]/a/@href 2306 | content_xpath: //div[@class="synonyms-list-group"] 2307 | title_xpath: //div[@class="upper-synonyms"]/a 2308 | no_result_for_http_status: [404] 2309 | about: 2310 | website: https://www.woxikon.de/ 2311 | wikidata_id: # No Wikidata ID 2312 | use_official_api: false 2313 | require_api_key: false 2314 | results: HTML 2315 | language: de 2316 | 2317 | - name: seekr news 2318 | engine: seekr 2319 | shortcut: senews 2320 | categories: news 2321 | seekr_category: news 2322 | disabled: true 2323 | 2324 | - name: seekr images 2325 | engine: seekr 2326 | network: seekr news 2327 | shortcut: seimg 2328 | categories: images 2329 | seekr_category: images 2330 | disabled: true 2331 | 2332 | - name: seekr videos 2333 | engine: seekr 2334 | network: seekr news 2335 | shortcut: sevid 2336 | categories: videos 2337 | seekr_category: videos 2338 | disabled: true 2339 | 2340 | - name: stract 2341 | engine: stract 2342 | shortcut: str 2343 | disabled: true 2344 | 2345 | - name: svgrepo 2346 | engine: svgrepo 2347 | shortcut: svg 2348 | timeout: 10.0 2349 | disabled: true 2350 | 2351 | - name: tootfinder 2352 | engine: tootfinder 2353 | shortcut: toot 2354 | 2355 | - name: voidlinux 2356 | engine: voidlinux 2357 | shortcut: void 2358 | disabled: true 2359 | 2360 | - name: wallhaven 2361 | engine: wallhaven 2362 | # api_key: abcdefghijklmnopqrstuvwxyz 2363 | shortcut: wh 2364 | 2365 | # wikimini: online encyclopedia for children 2366 | # The fulltext and title parameter is necessary for Wikimini because 2367 | # sometimes it will not show the results and redirect instead 2368 | - name: wikimini 2369 | engine: xpath 2370 | shortcut: wkmn 2371 | search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search 2372 | url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href 2373 | title_xpath: //li//div[@class="mw-search-result-heading"]/a 2374 | content_xpath: //li/div[@class="searchresult"] 2375 | categories: general 2376 | disabled: true 2377 | about: 2378 | website: https://wikimini.org/ 2379 | wikidata_id: Q3568032 2380 | use_official_api: false 2381 | require_api_key: false 2382 | results: HTML 2383 | language: fr 2384 | 2385 | - name: wttr.in 2386 | engine: wttr 2387 | shortcut: wttr 2388 | timeout: 9.0 2389 | 2390 | - name: yummly 2391 | engine: yummly 2392 | shortcut: yum 2393 | disabled: true 2394 | 2395 | - name: brave 2396 | engine: brave 2397 | shortcut: br 2398 | time_range_support: true 2399 | paging: true 2400 | categories: [general, web] 2401 | brave_category: search 2402 | # brave_spellcheck: true 2403 | 2404 | - name: brave.images 2405 | engine: brave 2406 | network: brave 2407 | shortcut: brimg 2408 | categories: [images, web] 2409 | brave_category: images 2410 | 2411 | - name: brave.videos 2412 | engine: brave 2413 | network: brave 2414 | shortcut: brvid 2415 | categories: [videos, web] 2416 | brave_category: videos 2417 | 2418 | - name: brave.news 2419 | engine: brave 2420 | network: brave 2421 | shortcut: brnews 2422 | categories: news 2423 | brave_category: news 2424 | 2425 | # - name: brave.goggles 2426 | # engine: brave 2427 | # network: brave 2428 | # shortcut: brgog 2429 | # time_range_support: true 2430 | # paging: true 2431 | # categories: [general, web] 2432 | # brave_category: goggles 2433 | # Goggles: # required! This should be a URL ending in .goggle 2434 | 2435 | - name: lib.rs 2436 | shortcut: lrs 2437 | engine: lib_rs 2438 | disabled: true 2439 | 2440 | - name: sourcehut 2441 | shortcut: srht 2442 | engine: xpath 2443 | paging: true 2444 | search_url: https://sr.ht/projects?page={pageno}&search={query} 2445 | results_xpath: (//div[@class="event-list"])[1]/div[@class="event"] 2446 | url_xpath: ./h4/a[2]/@href 2447 | title_xpath: ./h4/a[2] 2448 | content_xpath: ./p 2449 | first_page_num: 1 2450 | categories: [it, repos] 2451 | disabled: true 2452 | about: 2453 | website: https://sr.ht 2454 | wikidata_id: Q78514485 2455 | official_api_documentation: https://man.sr.ht/ 2456 | use_official_api: false 2457 | require_api_key: false 2458 | results: HTML 2459 | 2460 | - name: goo 2461 | shortcut: goo 2462 | engine: xpath 2463 | paging: true 2464 | search_url: https://search.goo.ne.jp/web.jsp?MT={query}&FR={pageno}0 2465 | url_xpath: //div[@class="result"]/p[@class='title fsL1']/a/@href 2466 | title_xpath: //div[@class="result"]/p[@class='title fsL1']/a 2467 | content_xpath: //p[contains(@class,'url fsM')]/following-sibling::p 2468 | first_page_num: 0 2469 | categories: [general, web] 2470 | disabled: true 2471 | timeout: 4.0 2472 | about: 2473 | website: https://search.goo.ne.jp 2474 | wikidata_id: Q249044 2475 | use_official_api: false 2476 | require_api_key: false 2477 | results: HTML 2478 | language: ja 2479 | 2480 | - name: bt4g 2481 | engine: bt4g 2482 | shortcut: bt4g 2483 | 2484 | - name: pkg.go.dev 2485 | engine: pkg_go_dev 2486 | shortcut: pgo 2487 | disabled: true 2488 | 2489 | # Doku engine lets you access to any Doku wiki instance: 2490 | # A public one or a privete/corporate one. 2491 | # - name: ubuntuwiki 2492 | # engine: doku 2493 | # shortcut: uw 2494 | # base_url: 'https://doc.ubuntu-fr.org' 2495 | 2496 | # Be careful when enabling this engine if you are 2497 | # running a public instance. Do not expose any sensitive 2498 | # information. You can restrict access by configuring a list 2499 | # of access tokens under tokens. 2500 | # - name: git grep 2501 | # engine: command 2502 | # command: ['git', 'grep', '{{QUERY}}'] 2503 | # shortcut: gg 2504 | # tokens: [] 2505 | # disabled: true 2506 | # delimiter: 2507 | # chars: ':' 2508 | # keys: ['filepath', 'code'] 2509 | 2510 | # Be careful when enabling this engine if you are 2511 | # running a public instance. Do not expose any sensitive 2512 | # information. You can restrict access by configuring a list 2513 | # of access tokens under tokens. 2514 | # - name: locate 2515 | # engine: command 2516 | # command: ['locate', '{{QUERY}}'] 2517 | # shortcut: loc 2518 | # tokens: [] 2519 | # disabled: true 2520 | # delimiter: 2521 | # chars: ' ' 2522 | # keys: ['line'] 2523 | 2524 | # Be careful when enabling this engine if you are 2525 | # running a public instance. Do not expose any sensitive 2526 | # information. You can restrict access by configuring a list 2527 | # of access tokens under tokens. 2528 | # - name: find 2529 | # engine: command 2530 | # command: ['find', '.', '-name', '{{QUERY}}'] 2531 | # query_type: path 2532 | # shortcut: fnd 2533 | # tokens: [] 2534 | # disabled: true 2535 | # delimiter: 2536 | # chars: ' ' 2537 | # keys: ['line'] 2538 | 2539 | # Be careful when enabling this engine if you are 2540 | # running a public instance. Do not expose any sensitive 2541 | # information. You can restrict access by configuring a list 2542 | # of access tokens under tokens. 2543 | # - name: pattern search in files 2544 | # engine: command 2545 | # command: ['fgrep', '{{QUERY}}'] 2546 | # shortcut: fgr 2547 | # tokens: [] 2548 | # disabled: true 2549 | # delimiter: 2550 | # chars: ' ' 2551 | # keys: ['line'] 2552 | 2553 | # Be careful when enabling this engine if you are 2554 | # running a public instance. Do not expose any sensitive 2555 | # information. You can restrict access by configuring a list 2556 | # of access tokens under tokens. 2557 | # - name: regex search in files 2558 | # engine: command 2559 | # command: ['grep', '{{QUERY}}'] 2560 | # shortcut: gr 2561 | # tokens: [] 2562 | # disabled: true 2563 | # delimiter: 2564 | # chars: ' ' 2565 | # keys: ['line'] 2566 | 2567 | doi_resolvers: 2568 | oadoi.org: "https://oadoi.org/" 2569 | doi.org: "https://doi.org/" 2570 | doai.io: "https://dissem.in/" 2571 | sci-hub.se: "https://sci-hub.se/" 2572 | sci-hub.st: "https://sci-hub.st/" 2573 | sci-hub.ru: "https://sci-hub.ru/" 2574 | 2575 | default_doi_resolver: "oadoi.org" 2576 | -------------------------------------------------------------------------------- /conf/searxng/uwsgi.ini.example: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | # Who will run the code 3 | uid = searxng 4 | gid = searxng 5 | 6 | # Number of workers (usually CPU count) 7 | # default value: %k (= number of CPU core, see Dockerfile) 8 | workers = %k 9 | 10 | # Number of threads per worker 11 | # default value: 4 (see Dockerfile) 12 | threads = 4 13 | 14 | # The right granted on the created socket 15 | chmod-socket = 666 16 | 17 | # Plugin to use and interpreter config 18 | single-interpreter = true 19 | master = true 20 | plugin = python3 21 | lazy-apps = true 22 | enable-threads = 4 23 | 24 | # Module to import 25 | module = searx.webapp 26 | 27 | # Virtualenv and python path 28 | pythonpath = /usr/local/searxng/ 29 | chdir = /usr/local/searxng/searx/ 30 | 31 | # automatically set processes name to something meaningful 32 | auto-procname = true 33 | 34 | # Disable request logging for privacy 35 | disable-logging = true 36 | log-5xx = true 37 | 38 | # Set the max size of a request (request-body excluded) 39 | buffer-size = 8192 40 | 41 | # No keep alive 42 | # See https://github.com/searx/searx-docker/issues/24 43 | add-header = Connection: close 44 | 45 | # Follow SIGTERM convention 46 | # See https://github.com/searxng/searxng/issues/3427 47 | die-on-term 48 | 49 | # uwsgi serves the static files 50 | static-map = /static=/usr/local/searxng/searx/static 51 | # expires set to one day 52 | static-expires = /* 1 53 | static-gzip-all = True 54 | offload-threads = 4 55 | -------------------------------------------------------------------------------- /docs/service-architecture-diagram.md: -------------------------------------------------------------------------------- 1 | # Service Architecture 2 | 3 | ```mermaid 4 | graph 5 | subgraph Visitor 6 | browser[Browser] 7 | end 8 | 9 | subgraph Cloudflare 10 | customdomain[Domain Services] 11 | zerotrusttunnel[Zero Trust Services] 12 | end 13 | 14 | %% Cloudflare 15 | browser -- 16 | HTTP/SSL Termination 17 | and 18 | Domain Routing 19 | --> customdomain -- 20 | Route domain 21 | traffic 22 | --> zerotrusttunnel 23 | 24 | subgraph Docker 25 | cloudflared[Cloudflared] 26 | 27 | zerotrusttunnel -- 28 | Ingress Tunnel 29 | to Cluster 30 | --> cloudflared 31 | 32 | subgraph Web Services 33 | nginx[Nginx] 34 | openwebui[Open WebUI] 35 | end 36 | 37 | cloudflared -- "nginx:80" 38 | HTTP Requests 39 | --> nginx 40 | 41 | nginx -- "example.com/" 42 | Route HTTP requests 43 | to OWUI uvicorn instance 44 | --> openwebui 45 | 46 | nginx -- "example.com/redis" 47 | Redis Insight 48 | Interface 49 | --> redis 50 | 51 | nginx -- "example.com/searxng" 52 | Authenticated Anonymous 53 | Search Interface 54 | --> searxng 55 | 56 | subgraph Authentication Services 57 | auth[Authentication] 58 | end 59 | 60 | nginx -- "auth:9090" 61 | Validate Authentication 62 | Bearer JWT 63 | --> auth 64 | 65 | subgraph Speech Services 66 | edgetts[EdgeTTS] 67 | end 68 | 69 | openwebui -- "edgetts:5050" 70 | Speech Synthesis 71 | for Web Interface 72 | --> edgetts 73 | 74 | subgraph Search Services 75 | searxng[SearXNG] 76 | end 77 | 78 | openwebui -- "searxng:8080" 79 | Anonymous searching 80 | platform for web interface 81 | --> searxng 82 | 83 | subgraph LLM Services 84 | ollama[Ollama] 85 | end 86 | 87 | openwebui -- ""ollama:11434 88 | logic requests 89 | --> ollama 90 | 91 | subgraph Document Services 92 | docling[Docling] 93 | end 94 | 95 | openwebui -- "docling:5001" 96 | Document Parsing 97 | --> docling 98 | 99 | subgraph Document Services 100 | tika[Tika] 101 | end 102 | 103 | openwebui -- "tika:9998" 104 | Document Parsing 105 | --> tika 106 | 107 | subgraph MCP Services 108 | mcposerver[mcposerver] 109 | end 110 | 111 | openwebui -- "mcposerver:8000" 112 | tools, resources, prompts 113 | samplings, roots 114 | --> mcposerver 115 | 116 | subgraph Persistence Service 117 | db[PostgreSQL/PGVector] 118 | redis[Redis] 119 | end 120 | 121 | openwebui -- 122 | Configuration, 123 | Vector (RAG), and 124 | General Storage 125 | --> db 126 | 127 | searxng -- 128 | Persistence Storage 129 | --> redis 130 | 131 | subgraph Utility Services 132 | watchtower[Watchtower 133 | _automatically manages 134 | container updates_ 135 | ] 136 | pipelines[Pipelines 137 | _allows additional 138 | automation_ 139 | ] 140 | end 141 | end 142 | 143 | subgraph Microsoft Microsoft Edge 144 | microsofonlinesservice[Microsoft Text-To-Speech Service] 145 | end 146 | 147 | edgetts -- 148 | Client Requests 149 | to External Service 150 | Provider 151 | --> microsofonlinesservice 152 | ``` 153 | -------------------------------------------------------------------------------- /env/auth.example: -------------------------------------------------------------------------------- 1 | GIN_MODE=release 2 | WEBUI_SECRET_KEY=CHANGE_BEFORE_GOING_LIVE 3 | -------------------------------------------------------------------------------- /env/cloudflared.example: -------------------------------------------------------------------------------- 1 | TUNNEL_TOKEN=add-your-cloudflare-tunnel-token-here 2 | -------------------------------------------------------------------------------- /env/db.example: -------------------------------------------------------------------------------- 1 | POSTGRES_DB=openwebui 2 | POSTGRES_USER=postgres 3 | POSTGRES_PASSWORD=postgres 4 | -------------------------------------------------------------------------------- /env/docling.example: -------------------------------------------------------------------------------- 1 | DOCLING_SERVE_ENABLE_UI=true 2 | -------------------------------------------------------------------------------- /env/edgetts.example: -------------------------------------------------------------------------------- 1 | DEFAULT_VOICE=en-US-EmmaMultilingualNeural 2 | DEFAULT_RESPONSE_FORMAT=mp3 3 | DEFAULT_SPEED=1.0 4 | -------------------------------------------------------------------------------- /env/mcposerver.example: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/env/mcposerver.example -------------------------------------------------------------------------------- /env/ollama.example: -------------------------------------------------------------------------------- 1 | OLLAMA_DEBUG=0 2 | -------------------------------------------------------------------------------- /env/openwebui.example: -------------------------------------------------------------------------------- 1 | ANONYMIZED_TELEMETRY=false 2 | AUDIO_TTS_API_KEY=your_api_key_here 3 | AUDIO_TTS_ENGINE=openai 4 | AUDIO_TTS_MODEL=tts-1-hd 5 | AUDIO_TTS_OPENAI_API_BASE_URL=http://edgetts:5050/v1 6 | AUDIO_TTS_OPENAI_API_KEY=your_api_key_here 7 | AUDIO_TTS_VOICE=en-US-EmmaMultilingualNeural 8 | CONTENT_EXTRACTION_ENGINE=docling 9 | DATABASE_URL="postgresql://postgres:postgres@db:5432/openwebui" 10 | DOCLING_SERVER_URL=http://docling:5001 11 | ENABLE_EVALUATION_ARENA_MODELS=false 12 | ENABLE_IMAGE_GENERATION=false 13 | ENABLE_OLLAMA_API=true 14 | ENABLE_OPENAI_API=false 15 | ENABLE_RAG_WEB_SEARCH=true 16 | ENABLE_WEB_SEARCH=true 17 | ENV=dev 18 | GLOBAL_LOG_LEVEL=info 19 | OLLAMA_BASE_URLS=http://ollama:11434 20 | PDF_EXTRACT_IMAGES=true 21 | PGVECTOR_DB_URL=postgresql://postgres:postgres@db:5432/openwebui 22 | RAG_EMBEDDING_ENGINE=ollama 23 | RAG_EMBEDDING_MODEL=nomic-embed-text:latest 24 | RAG_OLLAMA_BASE_URL=http://ollama:11434 25 | RAG_TEXT_SPLITTER=token 26 | RAG_WEB_SEARCH_ENGINE=searxng 27 | RAG_WEB_SEARCH_RESULT_COUNT=6 28 | RAG_WEB_SEARCH_CONCURRENT_REQUESTS=10 29 | SEARXNG_QUERY_URL=http://searxng:8080/search?q= 30 | TIKA_SERVER_URL=http://tika:9998 31 | TOOL_SERVER_CONNECTIONS=["http://mcposerver:8000/time", "http://mcposerver:8000/postgres"] 32 | USE_CUDA_DOCKER=true 33 | VECTOR_DB=pgvector 34 | WEB_SEARCH_ENGINE=searxng 35 | WEBUI_SECRET_KEY=CHANGE_BEFORE_GOING_LIVE 36 | WEBUI_URL=https:// 37 | -------------------------------------------------------------------------------- /env/redis.example: -------------------------------------------------------------------------------- 1 | # REDIS_ARGS="--requirepass sider" 2 | RI_PROXY_PATH=redis 3 | -------------------------------------------------------------------------------- /env/searxng.example: -------------------------------------------------------------------------------- 1 | #SEARXNG_HOST=localhost:8080/ 2 | SEARXNG_REDIS_URL=redis://redis:6379/1 3 | SEARXNG_SECRET=YOUR-SECRET-KEY 4 | #SEARXNG_BASE_URL=https:///searxng 5 | -------------------------------------------------------------------------------- /env/tika.example: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/env/tika.example -------------------------------------------------------------------------------- /env/watchtower.example: -------------------------------------------------------------------------------- 1 | # https://containrrr.dev/shoutrrr/v0.8/services/discord/ 2 | WATCHTOWER_NOTIFICATION_URL="discord://@" 3 | -------------------------------------------------------------------------------- /images/alert-original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/alert-original.png -------------------------------------------------------------------------------- /images/cloudflare-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/cloudflare-account.png -------------------------------------------------------------------------------- /images/cloudflare-connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/cloudflare-connector.png -------------------------------------------------------------------------------- /images/cloudflare-signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/cloudflare-signup.png -------------------------------------------------------------------------------- /images/cloudflare-tunnel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/cloudflare-tunnel.png -------------------------------------------------------------------------------- /images/owui-settings-tools-general-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/owui-settings-tools-general-dialog.png -------------------------------------------------------------------------------- /images/owui-settings-tools-general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamobservable/open-webui-starter/77b8c72be32b90363bcab291c0d07ddead9eaaa1/images/owui-settings-tools-general.png --------------------------------------------------------------------------------