├── .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**
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 |
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 |
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 |
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 |
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 |
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
--------------------------------------------------------------------------------