├── .gitignore ├── .github └── FUNDING.yml ├── conduit └── wellknown.conf ├── nitter.conf ├── .env ├── rules.json ├── README.md ├── docker-compose.yml └── settings.yml /.gitignore: -------------------------------------------------------------------------------- 1 | letsencrypt/ -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: ['https://sethforprivacy.com/about/#donations'] 4 | -------------------------------------------------------------------------------- /conduit/wellknown.conf: -------------------------------------------------------------------------------- 1 | server { 2 | server_name .; 3 | listen 80 default_server; 4 | 5 | location /.well-known/matrix/server { 6 | return 200 '{"m.server": ".:443"}'; 7 | add_header Content-Type application/json; 8 | } 9 | 10 | location /.well-known/matrix/client { 11 | return 200 '{"m.homeserver": {"base_url": "https://."}}'; 12 | add_header Content-Type application/json; 13 | add_header "Access-Control-Allow-Origin" *; 14 | } 15 | 16 | location / { 17 | return 404; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /nitter.conf: -------------------------------------------------------------------------------- 1 | [Server] 2 | address = "0.0.0.0" 3 | port = 8080 4 | https = true # disable to enable cookies when not using https 5 | staticDir = "./public" 6 | title = "nitter" 7 | hostname = "nitter.mydomain.com" 8 | 9 | [Cache] 10 | listMinutes = 240 # how long to cache list info (not the tweets, so keep it high) 11 | rssMinutes = 10 # how long to cache rss queries 12 | redisHost = "redis" 13 | redisPort = 6379 14 | redisConnections = 20 # connection pool size 15 | redisMaxConnections = 30 16 | # max, new connections are opened when none are available, but if the pool size 17 | # goes above this, they're closed when released. don't worry about this unless 18 | # you receive tons of requests per second 19 | 20 | [Config] 21 | hmacKey = "#o3rFHAA#%du@7" # random key for cryptographic signing of video urls 22 | base64Media = false # use base64 encoding for proxied media urls 23 | tokenCount = 10 24 | # minimum amount of usable tokens. tokens are used to authorize API requests, 25 | # but they expire after ~1 hour, and have a limit of 187 requests. 26 | # the limit gets reset every 15 minutes, and the pool is filled up so there's 27 | # always at least $tokenCount usable tokens. again, only increase this if 28 | # you receive major bursts all the time 29 | 30 | # Change default preferences here, see src/prefs_impl.nim for a complete list 31 | [Preferences] 32 | theme = "Nitter" 33 | replaceTwitter = "nitter.mydomain.com" 34 | replaceYouTube = "yotter.mydomain.com" 35 | replaceInstagram = "" 36 | proxyVideos = true 37 | hlsPlayback = false 38 | infiniteScroll = false 39 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # Nextcloud Variables 2 | NEXTCLOUD_HOSTNAME=nextcloud.mydomain.com 3 | NEXTCLOUD_ADMIN_USER= 4 | NEXTCLOUD_ADMIN_PASSWORD= 5 | POSTGRES_PASSWORD= 6 | 7 | # Wallabag Variables 8 | WALLABAG_HOSTNAME=wallabag.mydomain.com 9 | WALLABAG_DB_ROOT_PASS= 10 | WALLABAG_DB_PASS= 11 | WALLABAG_URL=https://wallabag.mydomain.com 12 | 13 | # Teddit Variables 14 | TEDDIT_HOSTNAME=teddit.mydomain.com 15 | 16 | # Nitter Variables 17 | NITTER_HOSTNAME=nitter.mydomain.com 18 | 19 | # Traefik Variables 20 | TRAEFIK_HOSTNAME=traefik.mydomain.com 21 | 22 | # Privatebin Variables 23 | PRIVATEBIN_HOSTNAME=paste.mydomain.com 24 | 25 | # Monero explorer variables 26 | EXPLORER_HOSTNAME=explorer.mydomain.com 27 | 28 | # Let's Encrypt Variables 29 | LE_EMAIL_ADDRESS= 30 | 31 | # SearXNG 32 | 33 | SEARX_HOSTNAME=searx.mydomain.com 34 | SEARX_COMMAND=-f 35 | MORTY_KEY=ReplaceWithARealKey! 36 | 37 | # P2Pool 38 | YOUR_WALLET_ADDRESS= 39 | 40 | # Monero 41 | MONERO_HOSTNAME=node.mydomain.com 42 | 43 | # LibreTranslate 44 | TRANSLATE_HOSTNAME=translate.mydomain.com 45 | 46 | # Cryptpad 47 | PAD_HOSTNAME=pad.mydomain.com 48 | 49 | # Uptime-kuma 50 | STATUS_HOSTNAME=status.mydomain.com 51 | 52 | # Invidious 53 | INVIDIOUS_HOSTNAME=invidious.mydomain.com 54 | POSTGRES_PW= 55 | 56 | # Wordpress 57 | WORDPRESS_HOSTNAME=blog.mydomain.com 58 | WP_DB_PW=CgdbRX8NAuGHJ79B 59 | WP_MYSQL_PW=CgdbRX8NAuGHJ79B 60 | WP_MYSQL_ROOT_PW=CgdbRX8NAuGHJ79B 61 | 62 | # Bitwarden 63 | BITWARDEN_HOSTNAME=bit.mydomain.com 64 | 65 | # Send 66 | SEND_HOSTNAME=send.mydomain.com 67 | 68 | # Conduit 69 | CONDUIT_HOSTNAME=matrix.mydomain.com 70 | 71 | # Jellyfin 72 | JELLYFIN_HOSTNAME=jellyfin.mydomain.com 73 | -------------------------------------------------------------------------------- /rules.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "searx.space", 4 | "filters": ["Header:X-Forwarded-For=nslookup(check.searx.space)"], 5 | "stop": true, 6 | "actions": [{ "name": "log"}] 7 | }, 8 | { 9 | "name": "IP limit, all paths", 10 | "interval": 3, 11 | "limit": 25, 12 | "aggregations": ["Header:X-Forwarded-For"], 13 | "actions": [ 14 | {"name": "block", 15 | "params": {"message": "Rate limit exceeded, try again later."}} 16 | ] 17 | }, 18 | { 19 | "name": "useragent limit, all paths", 20 | "interval": 30, 21 | "limit": 200, 22 | "aggregations": ["Header:X-Forwarded-For", "Header:User-Agent"], 23 | "stop": true, 24 | "actions": [ 25 | {"name": "block", 26 | "params": {"message": "Rate limit exceeded, try again later."}} 27 | ] 28 | }, 29 | { 30 | "name": "search request", 31 | "filters": ["Param:q", "Path=^(/|/search)$"], 32 | "subrules": [ 33 | { 34 | "name": "allow Firefox Android (issue #48 and #60)", 35 | "filters": [ 36 | "Param:q=^1$", 37 | "Header:User-Agent=(^MozacFetch/[0-9]{2,3}.[0-9].[0-9]+$|^Mozilla/5.0 \\(Android [0-9]{1,2}(.[0-9]{1,2}.[0-9]{1,2})?; Mobile; rv:[0-9]{2,3}.[0-9]\\) Gecko/[0-9]{2,3}.[0-9] Firefox/[0-9]{2,3}.[0-9]$)" 38 | ], 39 | "stop": true, 40 | "actions": [{"name": "log"}] 41 | }, 42 | { 43 | "name": "robot agent forbidden", 44 | "limit": 0, 45 | "stop": true, 46 | "filters": ["Header:User-Agent=([Cc][Uu][Rr][Ll]|[wW]get|Scrapy|splash|JavaFX|FeedFetcher|python-requests|Go-http-client|Java|Jakarta|okhttp|HttpClient|Jersey|Python|libwww-perl|Ruby|SynHttpClient|UniversalFeedParser)"], 47 | "actions": [ 48 | {"name": "block", 49 | "params": {"message": "Rate limit exceeded"}} 50 | ] 51 | }, 52 | { 53 | "name": "bot forbidden", 54 | "limit": 0, 55 | "stop": true, 56 | "filters": ["Header:User-Agent=(Googlebot|GoogleImageProxy|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT|Sogou|Abonti|Pixray|Spinn3r|SemrushBot|Exabot|ZmEu|BLEXBot|bitlybot)"], 57 | "actions": [ 58 | {"name": "block", 59 | "params": {"message": "Rate limit exceeded"}} 60 | ] 61 | }, 62 | { 63 | "name": "block missing accept-language", 64 | "filters": ["!Header:Accept-Language"], 65 | "limit": 0, 66 | "stop": true, 67 | "actions": [ 68 | {"name": "block", 69 | "params": {"message": "Rate limit exceeded"}} 70 | ] 71 | }, 72 | { 73 | "name": "block Connection:close", 74 | "filters": ["Header:Connection=close"], 75 | "limit": 0, 76 | "stop": true, 77 | "actions": [ 78 | {"name": "block", 79 | "params": {"message": "Rate limit exceeded"}} 80 | ] 81 | }, 82 | { 83 | "name": "block no gzip support", 84 | "filters": ["!Header:Accept-Encoding=(^gzip$|^gzip[;,]|[; ]gzip$|[; ]gzip[;,])"], 85 | "limit": 0, 86 | "stop": true, 87 | "actions": [ 88 | {"name": "block", 89 | "params": {"message": "Rate limit exceeded"}} 90 | ] 91 | }, 92 | { 93 | "name": "block no deflate support", 94 | "filters": ["!Header:Accept-Encoding=(^deflate$|^deflate[;,]|[; ]deflate$|[; ]deflate[;,])"], 95 | "limit": 0, 96 | "stop": true, 97 | "actions": [ 98 | {"name": "block", 99 | "params": {"message": "Rate limit exceeded"}} 100 | ] 101 | }, 102 | { 103 | "name": "block accept everything", 104 | "filters": ["!Header:Accept=text/html"], 105 | "limit": 0, 106 | "stop": true, 107 | "actions": [ 108 | {"name": "block", 109 | "params": {"message": "Rate limit exceeded"}} 110 | ] 111 | }, 112 | { 113 | "name": "rss/json limit", 114 | "interval": 3600, 115 | "limit": 4, 116 | "stop": true, 117 | "filters": ["Param:format=(csv|json|rss)"], 118 | "aggregations": ["Header:X-Forwarded-For"], 119 | "actions": [ 120 | {"name": "block", 121 | "params": {"message": "Rate limit exceeded, try again later."}} 122 | ] 123 | }, 124 | { 125 | "name": "IP limit", 126 | "interval": 3, 127 | "limit": 3, 128 | "aggregations": ["Header:X-Forwarded-For"], 129 | "actions": [ 130 | {"name": "block", 131 | "params": {"message": "Rate limit exceeded, try again later."}} 132 | ] 133 | }, 134 | { 135 | "name": "IP and useragent limit", 136 | "interval": 600, 137 | "limit": 60, 138 | "stop": true, 139 | "aggregations": ["Header:X-Forwarded-For", "Header:User-Agent"], 140 | "actions": [ 141 | {"name": "block", 142 | "params": {"message": "Rate limit exceeded, try again later."}} 143 | ] 144 | } 145 | ] 146 | } 147 | ] 148 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # self-hosted-services 2 | 3 | This repository contains everything you need to start self-hosting a core set of privacy-preserving services that I have found helpful, all run via a common [Docker Compose](https://docs.docker.com/compose/) configuration using [Let's Encrypt](https://letsencrypt.org/) for SSL certificates. 4 | 5 | ***NOTE: I am in the process of migrating all apps here to [meienberger/runtipi](https://github.com/meienberger/runtipi), as that is a much better overall solution for this type of project. Once done I will archive this repo and direct all users to that. You can follow the porting process here: https://github.com/meienberger/runtipi-appstore/pulls/sethforprivacy*** 6 | 7 | ## Requirements 8 | 9 | * [Git](https://git-scm.com/downloads) 10 | * [Docker Engine](https://docs.docker.com/engine/install/) 11 | * [Docker Compose](https://docs.docker.com/compose/install/) 12 | * Ports `80/tcp`, `443/tcp`, `18080/tcp`, `18083/tcp`, `3333/tcp`, `37889/tcp`, and `18089/tcp` exposed/forwarded to the host 13 | * DNS entries for your top-level domain and each desired sub-domain 14 | 15 | ## Included Services 16 | 17 | * [Nextcloud](https://github.com/nextcloud/server) 18 | * A self-hosted server for hosting files, photos, backups, contacts, calendars, and much more 19 | * [Uptime-kuma](https://github.com/louislam/uptime-kuma) 20 | * It is a self-hosted monitoring tool like "Uptime Robot" 21 | * [Libretranslate](https://github.com/LibreTranslate/LibreTranslate) 22 | * Free and Open Source Machine Translation API, entirely self-hosted 23 | * [SearXNG](https://github.com/searxng/searxng) 24 | * a privacy-respecting, hackable metasearch engine 25 | * [Send](https://github.com/timvisee/send) 26 | * a fork of Mozillas's Firefox Send, which was an encrypted file sharing tool 27 | * [Wordpress](https://github.com/WordPress/WordPress) 28 | * WordPress is a free and open-source content management system (Website Builder) 29 | * [Cryptpad](https://github.com/xwiki-labs/cryptpad) 30 | * CryptPad is a collaboration suite that is end-to-end-encrypted and open-source 31 | * [P2Pool](https://github.com/SChernykh/p2pool) 32 | * Decentralized pool for Monero mining 33 | * [Invidious](https://github.com/iv-org/invidious) 34 | * Invidious is an alternative front-end to YouTube 35 | * [Monero](https://github.com/sethforprivacy/simple-monerod-docker) 36 | * A self-sovereign, private-by-default, digital cash 37 | * This service runs a pruned Monero node, allowing you to connect your own Monero wallet(s) directly to your own node 38 | * [Nitter](https://github.com/zedeus/nitter) 39 | * A privacy-preserving Twitter front-end 40 | * [PrivateBin](https://privatebin.info/) 41 | * A privacy-preserving and encrypted-by-default pastebin 42 | * [Teddit](https://codeberg.org/teddit/teddit) 43 | * A privacy-preserving Reddit front-end 44 | * [Wallabag](https://github.com/wallabag/wallabag) 45 | * A privacy-preserving article reader in the vein of Pocket 46 | * [Monero blockchain explorer](https://github.com/moneroexamples/onion-monero-blockchain-explorer) 47 | * A self-hosted Monero blockchain explorer 48 | * [Conduit](https://conduit.rs) 49 | * A self-hosted Matrix homeserver written in Rust 50 | * [Jellyfin](https://github.com/jellyfin/jellyfin) 51 | * A software media system with no strings attached, no premium licenses or features, and no hidden agendas 52 | 53 | *NOTE: If you do not want to run one of the services above simply comment out or delete the relevant service section from `docker-compose.yml`.* 54 | 55 | ## How does it work? 56 | 57 | This repo relies on Docker Compose to configure and run all of the above services, leveraging Traefik to automatically expose each service, [request and maintain](https://doc.traefik.io/traefik/user-guides/docker-compose/acme-tls/) Let's Encrypt certificates for SSL, and handle all proxying. 58 | 59 | ## Starting the Services 60 | 61 | You will need to clone this repository to the host you want running these services first: 62 | 63 | ```bash 64 | git clone https://github.com/sethforprivacy/self-hosted-services.git 65 | cd self-hosted-services 66 | ``` 67 | 68 | Once cloned, set the necessary passwords and desired sub-domains in the `.env` file (*PLEASE DO NOT COPY THE FOLLOWING CONFIG, CHANGE THE PASSWORDS AND HOSTNAMES APPROPRIATELY IN YOUR LOCAL `.env` FILE*): 69 | 70 | ```ini 71 | # Nextcloud Variables 72 | NEXTCLOUD_HOSTNAME=nextcloud.mydomain.com 73 | NEXTCLOUD_ADMIN_USER= 74 | NEXTCLOUD_ADMIN_PASSWORD= 75 | POSTGRES_PASSWORD= 76 | 77 | # Wallabag Variables 78 | WALLABAG_HOSTNAME=wallabag.mydomain.com 79 | WALLABAG_DB_ROOT_PASS= 80 | WALLABAG_DB_PASS= 81 | WALLABAG_URL=https://wallabag.mydomain.com 82 | 83 | # Teddit Variables 84 | TEDDIT_HOSTNAME=teddit.mydomain.com 85 | 86 | # Nitter Variables 87 | NITTER_HOSTNAME=nitter.mydomain.com 88 | 89 | # Traefik Variables 90 | TRAEFIK_HOSTNAME=traefik.mydomain.com 91 | 92 | # Heimdall Variables 93 | DASHBOARD_HOSTNAME=dashboard.mydomain.com 94 | DASHBOARD_TZ=America/New York 95 | 96 | # Privatebin Variables 97 | PRIVATEBIN_HOSTNAME=paste.mydomain.com 98 | 99 | # Monero explorer variables 100 | EXPLORER_HOSTNAME=explorer.mydomain.com 101 | 102 | # Let's Encrypt Variables 103 | LE_EMAIL_ADDRESS=myemail@pm.me 104 | ``` 105 | 106 | Note that all hostnames used must already have DNS entries configured with your domain provider in order for certificate generation to function properly. 107 | 108 | Edit the Nitter configuration file: 109 | 110 | * Nitter 111 | * Replace the `hostname`, `replaceTwitter`, and `replaceYouTube` values with the relevant hostnames 112 | 113 | * SearXNG 114 | * Generate MORTY_KEY `sed -i "s|ReplaceWithARealKey\!|$(openssl rand -base64 33)|g" settings.yml .env` 115 | * go into the settings.yml file and replace the searx.mydomain.com at the bottom of the file with your domain. 116 | 117 | * P2Pool 118 | * Hugepages are very important for optimal mining performance. You need to enable them first using the following commands: 119 | ``` bash 120 | sudo sysctl vm.nr_hugepages=3072 121 | sudo bash -c "echo vm.nr_hugepages=3072 >> /etc/sysctl.conf" 122 | ``` 123 | Note: If your VPS or Server does not have enough RAM you can reduce it by using 1168 instead of 3072 124 | 125 | * Conduit 126 | * Start by planning out your setup. If you are willing to dedicate the domain you want to use as the handle: 127 | * @user:domain.tld, then just set that in Conduit_Hostname in .env and in conduit/wellknown.conf as the whole . part 128 | * If you wish to have a website, or other stuff on that domain instead, then you will need to dive-in some way or another. 129 | * Let's say you're okay with having the handle look like @user:subdomain.domain.tld, then just set that in the files mentioned above. 130 | * If you wish, to have the domain in the handle, and in use at the same time, you will need to dive into the docker-compose.yml itself 131 | * and set the line with comment: `#Change to root domain if desired` to the root domain, otherwise keep the subdomain everywhere else 132 | * Set up redirect on the route `https://domain.tld/.well-known/matrix/*` to `https://subdomain.domain.tld/.well-known/matrix/:splat` 133 | * At least this setup was tested. Feel free to come up with easier ways to this setup. 134 | * Otherwise if you get stuck, leave an issue, someone will surely help out. 135 | 136 | Start-up the services with Docker Compose: 137 | 138 | * `docker-compose up -d` 139 | 140 | ## Tor Support 141 | 142 | Currently Monero, P2Pool, Nitter, SearXNG, Invidious, Libretranslate, and Teddit get default Tor support, but I will likely expand that in the future. To list Onion services, simply run: 143 | 144 | * `docker exec -ti tor onions` 145 | 146 | ## Updates 147 | 148 | Automatic updates are provided by the [Watchtower](https://containrrr.dev/watchtower/) container that watches and updates base images of services when available. It will automatically search for, download, and migrate your services to updated images whenever available. 149 | 150 | ## Logging 151 | 152 | If you find yourself in need of viewing logs for a given service, simply run the following to tail all logs: 153 | 154 | ```bash 155 | docker-compose logs --follow 156 | ``` 157 | 158 | To view the logs of a single service, run: 159 | 160 | ```bash 161 | docker-compose logs --follow 162 | ``` 163 | 164 | i.e.: 165 | 166 | ```bash 167 | docker-compose logs --follow monerod 168 | ``` 169 | 170 | ## Getting Started 171 | 172 | As this simply helps you get these services running, using each service is outside of the scope of this project. However, below are some links for getting started with each: 173 | 174 | * [Nextcloud](https://docs.nextcloud.com/server/21/user_manual/en/) 175 | * [Monero](https://sethforprivacy.com/guides/run-a-monero-node/#sending-commands-to-your-node) 176 | * [Nitter](https://nitter.net/about) 177 | * [PrivateBin](https://privatebin.info/) 178 | * [Teddit](https://codeberg.org/teddit/teddit) 179 | * [Wallabag](https://www.wallabag.it/en/features) 180 | * [Invidious](https://docs.invidious.io/) 181 | * [P2Pool](https://github.com/SChernykh/p2pool) 182 | * [CryptPad](https://docs.cryptpad.fr/en/index.html) 183 | * [WordPress](https://wordpress.org/support/) 184 | * [Send](https://github.com/timvisee/send/tree/master/docs) 185 | * [Uptime-kuma](https://github.com/louislam/uptime-kuma/wiki/) 186 | * [SearXNG](https://searxng.github.io/searxng/) 187 | * [Libretranslate](https://github.com/LibreTranslate/LibreTranslate) 188 | * [Conduit](https://gitlab.com/famedly/conduit#how-can-i-deploy-my-own) 189 | * [Jellyfin](https://jellyfin.org/docs) 190 | 191 | ## Donations 192 | 193 | If you decide to run this and use these services, please don't forget to donate to those people making these services a reality! 194 | 195 | * [Monero](https://ccs.getmonero.org/funding-required/) 196 | * [Nitter](https://github.com/zedeus/nitter#nitter) 197 | * [Teddit](https://codeberg.org/teddit/teddit#teddit) 198 | * [Wallabag](https://liberapay.com/wallabag/donate) 199 | * [Invidious](https://github.com/iv-org/invidious#donate) 200 | * [P2Pool](https://github.com/SChernykh/p2pool#donations) 201 | * [CryptPad](https://github.com/xwiki-labs/cryptpad) 202 | * [WordPress](https://wordpressfoundation.org/donate/) 203 | * [Uptime-kuma](https://opencollective.com/uptime-kuma) 204 | * [SearXNG](https://www.searx.me/static/donate.html) 205 | * [Conduit](https://conduit.rs/#donate) 206 | * [Jellyfin](https://opencollective.com/jellyfin) 207 | 208 | ## Additional Resources 209 | 210 | * [Docker Compose documentation](https://docs.docker.com/compose/) 211 | 212 | ## Additional Credits 213 | 214 | * https://github.com/cmehay/docker-tor-hidden-service 215 | * This Docker container makes it incredibly easy to expose Tor Hidden Services of other running containers 216 | * https://github.com/containrrr/watchtower 217 | * Watchtower automates updating base images for other running containers 218 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | traefik: 4 | image: "traefik:v2.6.2" 5 | container_name: "traefik" 6 | restart: unless-stopped 7 | command: 8 | - "--providers.docker=true" 9 | - "--providers.docker.exposedbydefault=false" 10 | - "--entrypoints.websecure.address=:443" 11 | - "--entrypoints.web.address=:80" 12 | - "--entrypoints.web.http.redirections.entrypoint.to=websecure" 13 | - "--entrypoints.web.http.redirections.entrypoint.scheme=https" 14 | - "--certificatesresolvers.selfhostedservices.acme.tlschallenge=true" 15 | - "--certificatesresolvers.selfhostedservices.acme.email=${LE_EMAIL_ADDRESS}" 16 | - "--certificatesresolvers.selfhostedservices.acme.storage=/letsencrypt/acme.json" 17 | ports: 18 | - "80:80" 19 | - "443:443" 20 | volumes: 21 | - "./letsencrypt:/letsencrypt" 22 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 23 | 24 | uptime-kuma: 25 | image: louislam/uptime-kuma:1 26 | container_name: uptime-kuma 27 | restart: always 28 | volumes: 29 | - uptime-kuma:/app/data 30 | labels: 31 | - "traefik.enable=true" 32 | - "traefik.http.routers.status.rule=Host(`${STATUS_HOSTNAME}`)" 33 | - "traefik.http.routers.status.entrypoints=websecure" 34 | - "traefik.http.routers.status.tls.certresolver=selfhostedservices" 35 | 36 | libretranslate: 37 | image: libretranslate/libretranslate:latest 38 | restart: unless-stopped 39 | container_name: libretranslate 40 | labels: 41 | - "traefik.enable=true" 42 | - "traefik.http.routers.translate.rule=Host(`${TRANSLATE_HOSTNAME}`)" 43 | - "traefik.http.routers.translate.entrypoints=websecure" 44 | - "traefik.http.routers.translate.tls.certresolver=selfhostedservices" 45 | - "traefik.http.services.translate.loadbalancer.server.port=5000" 46 | 47 | bitwarden: 48 | image: vaultwarden/server:latest 49 | container_name: bitwarden 50 | restart: unless-stopped 51 | volumes: 52 | - bitwarden-data:/data 53 | labels: 54 | - "traefik.enable=true" 55 | - "traefik.http.routers.bitwarden.entrypoints=websecure" 56 | - "traefik.http.routers.bitwarden.rule=Host(`${BITWARDEN_HOSTNAME}`)" 57 | - "traefik.http.routers.bitwarden.tls.certresolver=selfhostedservices" 58 | 59 | db: 60 | image: mysql:5.7 61 | volumes: 62 | - db_data:/var/lib/mysql 63 | restart: always 64 | environment: 65 | MYSQL_ROOT_PASSWORD: ${WP_MYSQL_ROOT_PW} 66 | MYSQL_DATABASE: wordpress 67 | MYSQL_USER: wordpress 68 | MYSQL_PASSWORD: ${WP_MYSQL_PW} 69 | 70 | wordpress: 71 | depends_on: 72 | - db 73 | image: wordpress:latest 74 | volumes: 75 | - wordpress_data:/var/www/html 76 | restart: always 77 | environment: 78 | WORDPRESS_DB_HOST: db:3306 79 | WORDPRESS_DB_USER: wordpress 80 | WORDPRESS_DB_PASSWORD: ${WP_DB_PW} 81 | WORDPRESS_DB_NAME: wordpress 82 | labels: 83 | - "traefik.enable=true" 84 | - "traefik.http.routers.blog.rule=Host(`${WORDPRESS_HOSTNAME}`)" 85 | - "traefik.http.routers.blog.entrypoints=websecure" 86 | - "traefik.http.routers.blog.tls.certresolver=selfhostedservices" 87 | 88 | filtron: 89 | container_name: filtron 90 | image: dalf/filtron 91 | restart: always 92 | command: -listen 0.0.0.0:4040 -api 0.0.0.0:4041 -target searx:8080 93 | volumes: 94 | - ./rules.json:/etc/filtron/rules.json:rw 95 | logging: 96 | driver: none 97 | read_only: true 98 | cap_drop: 99 | - ALL 100 | labels: 101 | - "traefik.enable=true" 102 | - "traefik.http.routers.filtron.rule=Host(`${SEARX_HOSTNAME}`)" 103 | - "traefik.http.routers.filtron.tls.certresolver=selfhostedservices" 104 | - "traefik.http.routers.filtron.entrypoints=websecure" 105 | - "traefik.http.services.filtron.loadbalancer.server.port=4040" 106 | 107 | searx: 108 | container_name: searx 109 | image: searxng/searxng:latest 110 | restart: always 111 | command: ${SEARX_COMMAND:-} 112 | volumes: 113 | - ./settings.yml:/etc/searxng/settings.yml:rw 114 | logging: 115 | driver: none 116 | expose: 117 | - 8080 118 | environment: 119 | - BIND_ADDRESS=0.0.0.0:8080 120 | - BASE_URL=https://${SEARX_HOSTNAME}/ 121 | - MORTY_URL=https://${SEARX_HOSTNAME}/morty/ 122 | - MORTY_KEY=${MORTY_KEY} 123 | cap_drop: 124 | - ALL 125 | cap_add: 126 | - CHOWN 127 | - SETGID 128 | - SETUID 129 | - DAC_OVERRIDE 130 | 131 | morty: 132 | container_name: morty 133 | image: dalf/morty 134 | restart: always 135 | command: -timeout 6 -ipv6 136 | environment: 137 | - MORTY_KEY=${MORTY_KEY} 138 | - MORTY_ADDRESS=0.0.0.0:3030 139 | labels: 140 | - "traefik.enable=true" 141 | - "traefik.http.routers.morty.rule=Host(`${SEARX_HOSTNAME}`) && PathPrefix(`/morty`)" 142 | - "traefik.http.routers.morty.tls.certresolver=selfhostedservices" 143 | - "traefik.http.routers.morty.entrypoints=websecure" 144 | - "traefik.http.services.morty.loadbalancer.server.port=3030" 145 | 146 | cryptpad: 147 | image: promasu/cryptpad:nginx 148 | container_name: cryptpad 149 | restart: unless-stopped 150 | environment: 151 | - CPAD_MAIN_DOMAIN=${PAD_HOSTNAME} 152 | - CPAD_SANDBOX_DOMAIN=${PAD_HOSTNAME}/sandbox 153 | # Traefik can't use HTTP2 to communicate with cryptpat_websocket 154 | # A workaroung is disabling HTTP2 in Nginx 155 | - CPAD_HTTP2_DISABLE=true 156 | 157 | ulimits: 158 | nofile: 159 | soft: 1000000 160 | hard: 1000000 161 | 162 | volumes: 163 | - cryptpad-blob:/cryptpad/blob 164 | - cryptpad-block:/cryptpad/block 165 | - cryptpad-customize:/cryptpad/customize 166 | - cryptpad-data:/cryptpad/data 167 | - cryptpad-datastores:/cryptpad/datastore 168 | - ./data/config.js:/cryptpad/config/config.js 169 | 170 | labels: 171 | - "traefik.enable=true" 172 | - "traefik.http.routers.pad.rule=Host(`${PAD_HOSTNAME}`)" 173 | - "traefik.http.routers.pad.entrypoints=websecure" 174 | - "traefik.http.routers.pad.tls.certresolver=selfhostedservices" 175 | 176 | monerod: 177 | image: sethsimmons/simple-monerod:latest 178 | restart: unless-stopped 179 | container_name: monerod 180 | volumes: 181 | - bitmonero:/home/monero/.bitmonero 182 | ports: 183 | - 18080:18080 184 | - 18089:18089 185 | - 18083:18083 186 | command: >- 187 | --rpc-restricted-bind-ip=0.0.0.0 188 | --rpc-restricted-bind-port=18089 189 | --public-node 190 | --no-igd 191 | --enable-dns-blocklist 192 | --prune-blockchain 193 | --zmq-pub=tcp://0.0.0.0:18083 194 | labels: 195 | - "traefik.enable=true" 196 | - "traefik.http.routers.monero.rule=Host(`${MONERO_HOSTNAME}`)" 197 | - "traefik.http.routers.monero.entrypoints=websecure" 198 | - "traefik.http.routers.monero.tls.certresolver=selfhostedservices" 199 | - "traefik.http.services.monero.loadbalancer.server.port=18089" 200 | 201 | p2pool: 202 | image: sethsimmons/p2pool:latest 203 | restart: unless-stopped 204 | container_name: p2pool 205 | tty: true 206 | stdin_open: true 207 | volumes: 208 | - p2pool-data:/home/p2pool 209 | - /dev/hugepages:/dev/hugepages:rw 210 | ports: 211 | - 3333:3333 212 | - 37889:37889 213 | command: >- 214 | --wallet "${YOUR_WALLET_ADDRESS}" 215 | --stratum 0.0.0.0:3333 216 | --p2p 0.0.0.0:37889 217 | --loglevel 0 218 | --addpeers 65.21.227.114:37889,node.sethforprivacy.com:37889 219 | --host monerod 220 | --rpc-port 18089 221 | 222 | postgres: 223 | image: postgres:10 224 | restart: always 225 | volumes: 226 | - postgresdata:/var/lib/postgresql/data 227 | environment: 228 | POSTGRES_DB: invidious 229 | POSTGRES_USER: kemal 230 | POSTGRES_PASSWORD: ${POSTGRES_PW} 231 | healthcheck: 232 | test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] 233 | 234 | invidious: 235 | image: quay.io/invidious/invidious:latest 236 | restart: always 237 | depends_on: 238 | - postgres 239 | labels: 240 | - "traefik.enable=true" 241 | - "traefik.http.routers.invidious.rule=Host(`${INVIDIOUS_HOSTNAME}`)" 242 | - "traefik.http.routers.invidious.entrypoints=websecure" 243 | - "traefik.http.routers.invidious.tls.certresolver=selfhostedservices" 244 | - "traefik.http.services.invidious.loadbalancer.server.port=3000" 245 | environment: 246 | INVIDIOUS_CONFIG: | 247 | db: 248 | dbname: invidious 249 | user: kemal 250 | password: ${POSTGRES_PW} 251 | host: postgres 252 | port: 5432 253 | 254 | wallabag: 255 | image: wallabag/wallabag:latest 256 | container_name: wallabag 257 | restart: unless-stopped 258 | environment: 259 | - MYSQL_ROOT_PASSWORD=${WALLABAG_DB_ROOT_PASS} 260 | - SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql 261 | - SYMFONY__ENV__DATABASE_HOST=wallabag_db 262 | - SYMFONY__ENV__DATABASE_PORT=3306 263 | - SYMFONY__ENV__DATABASE_NAME=wallabag 264 | - SYMFONY__ENV__DATABASE_USER=wallabag 265 | - SYMFONY__ENV__DATABASE_PASSWORD=${WALLABAG_DB_PASS} 266 | - SYMFONY__ENV__DATABASE_CHARSET=utf8mb4 267 | - SYMFONY__ENV__MAILER_HOST=127.0.0.1 268 | - SYMFONY__ENV__MAILER_USER=~ 269 | - SYMFONY__ENV__MAILER_PASSWORD=~ 270 | - SYMFONY__ENV__FROM_EMAIL=wallabag@example.com 271 | - SYMFONY__ENV__DOMAIN_NAME=${WALLABAG_URL} 272 | - SYMFONY__ENV__SERVER_NAME="Seth's Wallabag Instance" 273 | volumes: 274 | - wallabag:/var/www/wallabag/web/assets/images 275 | healthcheck: 276 | test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"] 277 | interval: 1m 278 | timeout: 3s 279 | depends_on: 280 | - wallabag_db 281 | - redis 282 | labels: 283 | - "traefik.enable=true" 284 | - "traefik.http.routers.wallabag.rule=Host(`${WALLABAG_HOSTNAME}`)" 285 | - "traefik.http.routers.wallabag.entrypoints=websecure" 286 | - "traefik.http.routers.wallabag.tls.certresolver=selfhostedservices" 287 | 288 | wallabag_db: 289 | image: mariadb:latest 290 | container_name: wallabag_db 291 | restart: unless-stopped 292 | environment: 293 | - MYSQL_ROOT_PASSWORD=${WALLABAG_DB_ROOT_PASS} 294 | volumes: 295 | - wallabag_db:/var/lib/mysql 296 | healthcheck: 297 | test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] 298 | interval: 1s 299 | timeout: 3s 300 | retries: 30 301 | 302 | nitter: 303 | volumes: 304 | - ./nitter.conf:/src/nitter.conf 305 | image: zedeus/nitter:latest 306 | restart: unless-stopped 307 | container_name: nitter 308 | healthcheck: 309 | test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost:8080"] 310 | interval: 1m 311 | timeout: 3s 312 | depends_on: 313 | - redis 314 | labels: 315 | - "traefik.enable=true" 316 | - "traefik.http.routers.nitter.rule=Host(`${NITTER_HOSTNAME}`)" 317 | - "traefik.http.services.nitter.loadbalancer.server.port=8080" 318 | - "traefik.http.routers.nitter.entrypoints=websecure" 319 | - "traefik.http.routers.nitter.tls.certresolver=selfhostedservices" 320 | 321 | teddit: 322 | image: teddit/teddit:latest 323 | container_name: teddit 324 | restart: unless-stopped 325 | environment: 326 | - REDIS_HOST=redis 327 | - DOMAIN=${TEDDIT_HOSTNAME} 328 | - THEME=dark 329 | - HTTPS_ENABLED=false 330 | - REDIRECT_HTTP_TO_HTTPS=false 331 | - REDIRECT_WWW=false 332 | healthcheck: 333 | test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost:8080/about"] 334 | interval: 1m 335 | timeout: 3s 336 | depends_on: 337 | - redis 338 | labels: 339 | - "traefik.enable=true" 340 | - "traefik.http.routers.teddit.rule=Host(`${TEDDIT_HOSTNAME}`)" 341 | - "traefik.http.services.teddit.loadbalancer.server.port=8080" 342 | - "traefik.http.routers.teddit.entrypoints=websecure" 343 | - "traefik.http.routers.teddit.tls.certresolver=selfhostedservices" 344 | 345 | nextcloud: 346 | image: nextcloud:apache 347 | container_name: nextcloud 348 | restart: unless-stopped 349 | volumes: 350 | - nextcloud:/var/www/html 351 | environment: 352 | - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER} 353 | - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD} 354 | - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_HOSTNAME} 355 | - TRUSTED_PROXIES=172.16.0.0/12 356 | - OVERWRITEHOST=${NEXTCLOUD_HOSTNAME} 357 | - OVERWRITEPROTOCOL=https 358 | - POSTGRES_HOST=nextcloud_db 359 | - POSTGRES_USER=nextcloud 360 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 361 | - POSTGRES_DB=nextcloud 362 | - REDIS_HOST=redis 363 | depends_on: 364 | - nextcloud_db 365 | - redis 366 | labels: 367 | - "traefik.enable=true" 368 | - "traefik.http.middlewares.nextcloud.headers.browserXSSFilter=true" 369 | - "traefik.http.middlewares.nextcloud.headers.contentTypeNosniff=true" 370 | - "traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true" 371 | - "traefik.http.middlewares.nextcloud.headers.stsPreload=true" 372 | - "traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011" 373 | - "traefik.http.middlewares.nextcloud_redirect.redirectregex.permanent=true" 374 | - "traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav" 375 | - "traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=https://$${1}/remote.php/dav/" 376 | - "traefik.http.routers.nextcloud.entrypoints=websecure" 377 | - "traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect,nextcloud-https" 378 | - "traefik.http.routers.nextcloud.rule=Host(`${NEXTCLOUD_HOSTNAME}`)" 379 | - "traefik.http.routers.nextcloud.tls.certresolver=selfhostedservices" 380 | - "traefik.http.services.nextcloud.loadbalancer.server.port=80" 381 | - "traefik.http.middlewares.nextcloud.headers.customRequestHeaders.X-Forwarded-Proto=https" 382 | - "traefik.http.middlewares.nextcloud-https.redirectscheme.scheme=https" 383 | - "traefik.http.routers.nextcloud-http.entrypoints=web" 384 | - "traefik.http.routers.nextcloud-http.rule=Host(`${NEXTCLOUD_HOSTNAME}`)" 385 | - "traefik.http.routers.nextcloud-http.middlewares=nextcloud-https@docker" 386 | 387 | nextcloud_db: 388 | image: postgres:alpine 389 | container_name: nextcloud_db 390 | restart: unless-stopped 391 | volumes: 392 | - nextcloud_db:/var/lib/postgresql/data 393 | environment: 394 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 395 | - POSTGRES_DB=nextcloud 396 | - POSTGRES_USER=nextcloud 397 | healthcheck: 398 | test: ["CMD-SHELL", "pg_isready -U nextcloud"] 399 | interval: 10s 400 | timeout: 5s 401 | retries: 5 402 | 403 | nextcloud_cron: 404 | image: nextcloud:apache 405 | restart: unless-stopped 406 | volumes: 407 | - nextcloud:/var/www/html 408 | entrypoint: /cron.sh 409 | 410 | privatebin: 411 | image: privatebin/nginx-fpm-alpine:latest 412 | container_name: privatebin 413 | restart: unless-stopped 414 | volumes: 415 | - privatebin-data:/srv/data 416 | labels: 417 | - "traefik.enable=true" 418 | - "traefik.http.routers.privatebin.rule=Host(`${PRIVATEBIN_HOSTNAME}`)" 419 | - "traefik.http.services.privatebin.loadbalancer.server.port=8080" 420 | - "traefik.http.routers.privatebin.entrypoints=websecure" 421 | - "traefik.http.routers.privatebin.tls.certresolver=selfhostedservices" 422 | 423 | send: 424 | image: registry.gitlab.com/timvisee/send:latest 425 | container_name: send 426 | restart: unless-stopped 427 | labels: 428 | - "traefik.enable=true" 429 | - "traefik.http.routers.send.rule=Host(`${SEND_HOSTNAME}`)" 430 | - "traefik.http.routers.send.entrypoints=websecure" 431 | - "traefik.http.routers.send.tls.certresolver=selfhostedservices" 432 | - "traefik.http.services.send.loadbalancer.server.port=1443" 433 | 434 | environment: 435 | - NODE_ENV=production 436 | # Networking 437 | - VIRTUAL_HOST=${SEND_HOSTNAME} 438 | - VIRTUAL_PORT=443 439 | - BASE_URL=https://${SEND_HOSTNAME} 440 | # Redis 441 | - REDIS_HOST=redis 442 | # Storage Limit 443 | - MAX_FILE_SIZE=2147483648 444 | 445 | explorer: 446 | image: vdo1138/xmrblocks:latest 447 | container_name: explorer 448 | restart: unless-stopped 449 | volumes: 450 | - bitmonero:/home/monero/.bitmonero 451 | command: ["./xmrblocks --enable-json-api --enable-autorefresh-option --enable-emission-monitor --daemon-url=monerod:18089 --enable-pusher"] 452 | depends_on: 453 | - monerod 454 | labels: 455 | - "traefik.enable=true" 456 | - "traefik.http.routers.explorer.rule=Host(`${EXPLORER_HOSTNAME}`)" 457 | - "traefik.http.services.explorer.loadbalancer.server.port=8081" 458 | - "traefik.http.routers.explorer.entrypoints=websecure" 459 | - "traefik.http.routers.explorer.tls.certresolver=selfhostedservices" 460 | 461 | tor: 462 | image: goldy/tor-hidden-service:latest 463 | container_name: tor 464 | restart: unless-stopped 465 | links: 466 | - monerod 467 | - nitter 468 | - teddit 469 | - libretranslate 470 | - searx 471 | - invidious 472 | - p2pool 473 | - privatebin 474 | - explorer 475 | environment: 476 | MONEROD_TOR_SERVICE_HOSTS: 18089:monerod:18089 477 | MONEROD_TOR_SERVICE_VERSION: '3' 478 | NITTER_TOR_SERVICE_HOSTS: 80:nitter:8080 479 | NITTER_TOR_SERVICE_VERSION: '3' 480 | TEDDIT_TOR_SERVICE_HOSTS: 80:teddit:8080 481 | TEDDIT_TOR_SERVICE_VERSION: '3' 482 | LIBRETRANSLATE_TOR_SERVICE_HOSTS: 80:LIBRETRANSLATE:5000 483 | LIBRETRANSLATE_TOR_SERVICE_VERSION: '3' 484 | SEARX_TOR_SERVICE_HOSTS: 80:SEARX:8080 485 | SEARX_TOR_SERVICE_VERSION: '3' 486 | P2POOL_TOR_SERVICE_HOSTS: 80:P2POOL:3333 487 | P2POOL_TOR_SERVICE_VERSION: '3' 488 | INVIDIOUS_TOR_SERVICE_HOSTS: 80:INVIDIOUS:3000 489 | INVIDIOUS_TOR_SERVICE_VERSION: '3' 490 | PASTE_TOR_SERVICE_HOSTS: 80:privatebin:8080 491 | PASTE_TOR_SERVICE_VERSION: '3' 492 | EXPLORER_TOR_SERVICE_HOSTS: 80:explorer:8081 493 | EXPLORER_TOR_SERVICE_VERSION: '3' 494 | 495 | TOR_ENABLE_VANGUARDS: 'true' 496 | 497 | VANGUARDS_EXTRA_OPTIONS: | 498 | [Global] 499 | enable_cbtverify = True 500 | loglevel = INFO 501 | volumes: 502 | - tor-keys:/var/lib/tor/hidden_service/ 503 | 504 | conduit: 505 | image: matrixconduit/matrix-conduit:latest 506 | restart: unless-stopped 507 | user: root 508 | volumes: 509 | - conduit-data:/var/lib/matrix-conduit/ 510 | environment: 511 | CONDUIT_SERVER_NAME: ${CONDUIT_HOSTNAME} #Change to root domain if desired 512 | CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/ 513 | CONDUIT_DATABASE_BACKEND: rocksdb 514 | CONDUIT_PORT: 6167 515 | CONDUIT_MAX_REQUEST_SIZE: 20_000_000 # in bytes, ~20 MB 516 | CONDUIT_ALLOW_REGISTRATION: 'true' 517 | CONDUIT_ALLOW_FEDERATION: 'true' 518 | CONDUIT_TRUSTED_SERVERS: '["matrix.org"]' 519 | CONDUIT_ADDRESS: 0.0.0.0 520 | CONDUIT_CONFIG: '' 521 | labels: 522 | - "traefik.enable=true" 523 | - "traefik.http.routers.conduit.rule=Host(`${CONDUIT_HOSTNAME}`)" 524 | - "traefik.http.routers.conduit.tls=true" 525 | - "traefik.http.routers.conduit.tls.certresolver=selfhostedservices" 526 | - "traefik.http.routers.conduit.middlewares=cors-headers@docker" 527 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*" 528 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization" 529 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS" 530 | 531 | well-known: 532 | image: nginx:latest 533 | restart: unless-stopped 534 | volumes: 535 | - ./conduit/wellknown.conf:/etc/nginx/conf.d/matrix.conf 536 | labels: 537 | - "traefik.enable=true" 538 | - "traefik.http.routers.wellknown.rule=Host(`${CONDUIT_HOSTNAME}`) && PathPrefix(`/.well-known/matrix`)" 539 | - "traefik.http.routers.wellknown.tls=true" 540 | - "traefik.http.routers.wellknown.tls.certresolver=selfhostedservices" 541 | - "traefik.http.routers.wellknown.middlewares=cors-headers@docker" 542 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*" 543 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization" 544 | - "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS" 545 | 546 | redis: 547 | image: redis:alpine 548 | container_name: redis 549 | restart: unless-stopped 550 | volumes: 551 | - redis-data:/var/lib/redis 552 | - send_redis-data:/data 553 | healthcheck: 554 | test: ["CMD", "redis-cli", "ping"] 555 | interval: 1s 556 | timeout: 3s 557 | retries: 30 558 | 559 | jellyfin: 560 | image: jellyfin/jellyfin 561 | container_name: jellyfin 562 | restart: "unless-stopped" 563 | volumes: 564 | - jellyfin-data:/config 565 | - jellyfin-data:/cache 566 | - :/movies:ro 567 | devices: 568 | - /dev/dri/renderD128:/dev/dri/renderD128 569 | - /dev/dri/card0:/dev/dri/card0 570 | environment: 571 | - JELLYFIN_PublishedServerUrl=https://${JELLYFIN_HOSTNAME} 572 | labels: 573 | - "traefik.enable=true" 574 | - "traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOSTNAME}`)" 575 | - "traefik.http.routers.jellyfin.entrypoints=websecure" 576 | - "traefik.http.routers.jellyfin.tls.certresolver=selfhostedservices" 577 | - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" 578 | 579 | watchtower: 580 | image: containrrr/watchtower:latest 581 | container_name: watchtower 582 | restart: unless-stopped 583 | volumes: 584 | - "/var/run/docker.sock:/var/run/docker.sock" 585 | 586 | volumes: 587 | bitmonero: 588 | redis-data: 589 | nextcloud: 590 | nextcloud_db: 591 | wallabag: 592 | wallabag_db: 593 | tor-keys: 594 | privatebin-data: 595 | uptime-kuma: 596 | p2pool-data: 597 | postgresdata: 598 | db_data: 599 | wordpress_data: 600 | cryptpad-blob: 601 | cryptpad-block: 602 | cryptpad-customize: 603 | cryptpad-data: 604 | cryptpad-datastores: 605 | send_redis-data: 606 | bitwarden-data: 607 | data-redis: 608 | conduit-data: 609 | jellyfin-data: 610 | -------------------------------------------------------------------------------- /settings.yml: -------------------------------------------------------------------------------- 1 | general: 2 | # Debug mode, only for development 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: https://docs.searxng.org/donate.html 11 | # mailto:contact@example.com 12 | contact_url: false 13 | # record stats 14 | enable_metrics: true 15 | 16 | brand: 17 | new_issue_url: https://github.com/searxng/searxng/issues/new 18 | docs_url: https://docs.searxng.org/ 19 | public_instances: https://searx.space 20 | wiki_url: https://github.com/searxng/searxng/wiki 21 | issue_url: https://github.com/searxng/searxng/issues 22 | 23 | search: 24 | # Filter results. 0: None, 1: Moderate, 2: Strict 25 | safe_search: 0 26 | # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", 27 | # "seznam", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off 28 | # by default. 29 | autocomplete: "" 30 | # minimun characters to type before autocompleter starts 31 | autocomplete_min: 4 32 | # Default search language - leave blank to detect from browser information or 33 | # use codes from 'languages.py' 34 | default_lang: "" 35 | # Available languages 36 | # languages: 37 | # - all 38 | # - en 39 | # - en-US 40 | # - de 41 | # - it-IT 42 | # - fr 43 | # - fr-BE 44 | # ban time in seconds after engine errors 45 | ban_time_on_fail: 5 46 | # max ban time in seconds after engine errors 47 | max_ban_time_on_fail: 120 48 | # remove format to deny access, use lower case. 49 | # formats: [html, csv, json, rss] 50 | formats: 51 | - html 52 | 53 | server: 54 | # If you change port, bind_address or base_url don't forget to rebuild 55 | # instance's enviroment (make buildenv) 56 | port: 8888 57 | bind_address: "127.0.0.1" 58 | base_url: false # Possible values: false or "https://example.org/location". 59 | limiter: false # rate limit the number of request on the instance, block some bots 60 | 61 | # If your instance owns a /etc/searxng/settings.yml file, then set the following 62 | # values there. 63 | 64 | secret_key: "ultrasecretkey" # change this! 65 | # Proxying image results through searx 66 | image_proxy: false 67 | # 1.0 and 1.1 are supported 68 | http_protocol_version: "1.0" 69 | # POST queries are more secure as they don't show up in history but may cause 70 | # problems when using Firefox containers 71 | method: "POST" 72 | default_http_headers: 73 | X-Content-Type-Options: nosniff 74 | X-XSS-Protection: 1; mode=block 75 | X-Download-Options: noopen 76 | X-Robots-Tag: noindex, nofollow 77 | Referrer-Policy: no-referrer 78 | 79 | redis: 80 | # https://redis-py.readthedocs.io/en/stable/connections.html#redis.client.Redis.from_url 81 | url: unix:///usr/local/searxng-redis/run/redis.sock?db=0 82 | 83 | ui: 84 | # Custom static path - leave it blank if you didn't change 85 | static_path: "" 86 | static_use_hash: false 87 | # Custom templates path - leave it blank if you didn't change 88 | templates_path: "" 89 | # query_in_title: When true, the result page's titles contains the query 90 | # it decreases the privacy, since the browser can records the page titles. 91 | query_in_title: false 92 | # ui theme 93 | default_theme: simple 94 | # center the results ? 95 | center_aligment: false 96 | # Default interface locale - leave blank to detect from browser information or 97 | # use codes from the 'locales' config section 98 | default_locale: "" 99 | # Open result links in a new tab by default 100 | # results_on_new_tab: false 101 | theme_args: 102 | # style of simple theme: auto, light, dark 103 | simple_style: auto 104 | 105 | # Lock arbitrary settings on the preferences page. To find the ID of the user 106 | # setting you want to lock, check the ID of the form on the page "preferences". 107 | # 108 | # preferences: 109 | # lock: 110 | # - language 111 | # - autocomplete 112 | # - method 113 | # - query_in_title 114 | 115 | # searx supports result proxification using an external service: 116 | # https://github.com/asciimoo/morty uncomment below section if you have running 117 | # morty proxy the key is base64 encoded (keep the !!binary notation) 118 | # Note: since commit af77ec3, morty accepts a base64 encoded key. 119 | # 120 | # result_proxy: 121 | # url: http://127.0.0.1:3000/ 122 | # key: !!binary "your_morty_proxy_key" 123 | # # [true|false] enable the "proxy" button next to each result 124 | # proxify_results: true 125 | 126 | # communication with search engines 127 | # 128 | outgoing: 129 | # default timeout in seconds, can be override by engine 130 | request_timeout: 3.0 131 | # the maximum timeout in seconds 132 | # max_request_timeout: 10.0 133 | # suffix of searx_useragent, could contain informations like an email address 134 | # to the administrator 135 | useragent_suffix: "" 136 | # The maximum number of concurrent connections that may be established. 137 | pool_connections: 100 138 | # Allow the connection pool to maintain keep-alive connections below this 139 | # point. 140 | pool_maxsize: 20 141 | # See https://www.python-httpx.org/http2/ 142 | enable_http2: true 143 | # uncomment below section if you want to use a proxyq see: SOCKS proxies 144 | # https://2.python-requests.org/en/latest/user/advanced/#proxies 145 | # are also supported: see 146 | # https://2.python-requests.org/en/latest/user/advanced/#socks 147 | # 148 | # proxies: 149 | # all://: 150 | # - http://proxy1:8080 151 | # - http://proxy2:8080 152 | # 153 | # using_tor_proxy: true 154 | # 155 | # Extra seconds to add in order to account for the time taken by the proxy 156 | # 157 | # extra_proxy_timeout: 10.0 158 | # 159 | # uncomment below section only if you have more than one network interface 160 | # which can be the source of outgoing search requests 161 | # 162 | # source_ips: 163 | # - 1.1.1.1 164 | # - 1.1.1.2 165 | # - fe80::/126 166 | 167 | # External plugin configuration, for more details see 168 | # https://docs.searxng.org/dev/plugins.html 169 | # 170 | # plugins: 171 | # - plugin1 172 | # - plugin2 173 | # - ... 174 | 175 | # Comment or un-comment plugin to activate / deactivate by default. 176 | # 177 | # enabled_plugins: 178 | # # these plugins are enabled if nothing is configured .. 179 | # - 'Hash plugin' 180 | # - 'Search on category select' 181 | # - 'Self Informations' 182 | # - 'Tracker URL remover' 183 | # - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy 184 | # # these plugins are disabled if nothing is configured .. 185 | # - 'Hostname replace' # see hostname_replace configuration below 186 | # - 'Open Access DOI rewrite' 187 | # - 'Vim-like hotkeys' 188 | 189 | # Configuration of the "Hostname replace" plugin: 190 | # 191 | # hostname_replace: 192 | # '(.*\.)?youtube\.com$': 'invidious.example.com' 193 | # '(.*\.)?youtu\.be$': 'invidious.example.com' 194 | # '(.*\.)?youtube-noocookie\.com$': 'yotter.example.com' 195 | # '(.*\.)?reddit\.com$': 'teddit.example.com' 196 | # '(.*\.)?redd\.it$': 'teddit.example.com' 197 | # '(www\.)?twitter\.com$': 'nitter.example.com' 198 | # # to remove matching host names from result list, set value to false 199 | # 'spam\.example\.com': false 200 | 201 | checker: 202 | # disable checker when in debug mode 203 | off_when_debug: true 204 | 205 | # use "scheduling: false" to disable scheduling 206 | # scheduling: interval or int 207 | 208 | # to activate the scheduler: 209 | # * uncomment "scheduling" section 210 | # * add "cache2 = name=searxcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" 211 | # to your uwsgi.ini 212 | 213 | # scheduling: 214 | # start_after: [300, 1800] # delay to start the first run of the checker 215 | # every: [86400, 90000] # how often the checker runs 216 | 217 | # additional tests: only for the YAML anchors (see the engines section) 218 | # 219 | additional_tests: 220 | rosebud: &test_rosebud 221 | matrix: 222 | query: rosebud 223 | lang: en 224 | result_container: 225 | - not_empty 226 | - ['one_title_contains', 'citizen kane'] 227 | test: 228 | - unique_results 229 | 230 | android: &test_android 231 | matrix: 232 | query: ['android'] 233 | lang: ['en', 'de', 'fr', 'zh-CN'] 234 | result_container: 235 | - not_empty 236 | - ['one_title_contains', 'google'] 237 | test: 238 | - unique_results 239 | 240 | # tests: only for the YAML anchors (see the engines section) 241 | tests: 242 | infobox: &tests_infobox 243 | infobox: 244 | matrix: 245 | query: ["linux", "new york", "bbc"] 246 | result_container: 247 | - has_infobox 248 | 249 | categories_as_tabs: 250 | general: 251 | images: 252 | videos: 253 | news: 254 | map: 255 | music: 256 | it: 257 | science: 258 | files: 259 | social media: 260 | 261 | engines: 262 | - name: apk mirror 263 | engine: apkmirror 264 | timeout: 4.0 265 | shortcut: apkm 266 | disabled: true 267 | 268 | # Requires Tor 269 | - name: ahmia 270 | engine: ahmia 271 | categories: onions 272 | enable_http: true 273 | shortcut: ah 274 | 275 | - name: arch linux wiki 276 | engine: archlinux 277 | shortcut: al 278 | 279 | - name: archive is 280 | engine: xpath 281 | search_url: https://archive.is/search/?q={query} 282 | url_xpath: (//div[@class="TEXT-BLOCK"]/a)/@href 283 | title_xpath: (//div[@class="TEXT-BLOCK"]/a) 284 | content_xpath: //div[@class="TEXT-BLOCK"]/ul/li 285 | categories: general 286 | timeout: 7.0 287 | disabled: true 288 | shortcut: ai 289 | soft_max_redirects: 1 290 | about: 291 | website: https://archive.is/ 292 | wikidata_id: Q13515725 293 | official_api_documentation: https://mementoweb.org/depot/native/archiveis/ 294 | use_official_api: false 295 | require_api_key: false 296 | results: HTML 297 | 298 | - name: artic 299 | engine: artic 300 | shortcut: arc 301 | timeout: 4.0 302 | 303 | - name: arxiv 304 | engine: arxiv 305 | shortcut: arx 306 | categories: science 307 | timeout: 4.0 308 | 309 | # tmp suspended: dh key too small 310 | # - name: base 311 | # engine: base 312 | # shortcut: bs 313 | 314 | - name: bandcamp 315 | engine: bandcamp 316 | shortcut: bc 317 | categories: music 318 | 319 | - name: wikipedia 320 | engine: wikipedia 321 | shortcut: wp 322 | base_url: 'https://{language}.wikipedia.org/' 323 | 324 | - name: bing 325 | engine: bing 326 | shortcut: bi 327 | disabled: true 328 | 329 | - name: bing images 330 | engine: bing_images 331 | shortcut: bii 332 | 333 | - name: bing news 334 | engine: bing_news 335 | shortcut: bin 336 | 337 | - name: bing videos 338 | engine: bing_videos 339 | shortcut: biv 340 | 341 | - name: bitbucket 342 | engine: xpath 343 | paging: true 344 | search_url: https://bitbucket.org/repo/all/{pageno}?name={query} 345 | url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href 346 | title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] 347 | content_xpath: //article[@class="repo-summary"]/p 348 | categories: [it, repos] 349 | timeout: 4.0 350 | disabled: true 351 | shortcut: bb 352 | about: 353 | website: https://bitbucket.org/ 354 | wikidata_id: Q2493781 355 | official_api_documentation: https://developer.atlassian.com/bitbucket 356 | use_official_api: false 357 | require_api_key: false 358 | results: HTML 359 | 360 | - name: btdigg 361 | engine: btdigg 362 | shortcut: bt 363 | 364 | - name: ccc-tv 365 | engine: xpath 366 | paging: false 367 | search_url: https://media.ccc.de/search/?q={query} 368 | url_xpath: //div[@class="caption"]/h3/a/@href 369 | title_xpath: //div[@class="caption"]/h3/a/text() 370 | content_xpath: //div[@class="caption"]/h4/@title 371 | categories: videos 372 | disabled: true 373 | shortcut: c3tv 374 | about: 375 | website: https://media.ccc.de/ 376 | wikidata_id: Q80729951 377 | official_api_documentation: https://github.com/voc/voctoweb 378 | use_official_api: false 379 | require_api_key: false 380 | results: HTML 381 | # We don't set language: de here because media.ccc.de is not just 382 | # for a German audience. It contains many English videos and many 383 | # German videos have English subtitles. 384 | 385 | - name: openverse 386 | engine: openverse 387 | categories: images 388 | shortcut: opv 389 | 390 | # - name: core.ac.uk 391 | # engine: core 392 | # categories: science 393 | # shortcut: cor 394 | # # get your API key from: https://core.ac.uk/api-keys/register/ 395 | # api_key: 'unset' 396 | 397 | - name: crossref 398 | engine: json_engine 399 | paging: true 400 | search_url: https://search.crossref.org/dois?q={query}&page={pageno} 401 | url_query: doi 402 | title_query: title 403 | title_html_to_text: true 404 | content_query: fullCitation 405 | content_html_to_text: true 406 | categories: science 407 | shortcut: cr 408 | about: 409 | website: https://www.crossref.org/ 410 | wikidata_id: Q5188229 411 | official_api_documentation: https://github.com/CrossRef/rest-api-doc 412 | use_official_api: false 413 | require_api_key: false 414 | results: JSON 415 | 416 | - name: yep 417 | engine: json_engine 418 | shortcut: yep 419 | categories: general 420 | disabled: true 421 | paging: false 422 | page_size: 10 423 | content_html_to_text: true 424 | title_html_to_text: true 425 | search_url: https://api.yep.com/fs/1/?type=web&q={query}&no_correct=false 426 | results_query: 1/results 427 | title_query: title 428 | url_query: url 429 | content_query: snippet 430 | timeout: 12.0 431 | headers: 432 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' 433 | 'Sec-Fetch-Dest': 'document' 434 | about: 435 | website: https://yep.com 436 | use_official_api: false 437 | require_api_key: false 438 | results: JSON 439 | 440 | - name: curlie 441 | engine: xpath 442 | shortcut: cl 443 | categories: general 444 | disabled: true 445 | paging: true 446 | lang_all: '' 447 | search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 448 | page_size: 20 449 | results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] 450 | url_xpath: ./div[@class="title-and-desc"]/a/@href 451 | title_xpath: ./div[@class="title-and-desc"]/a/div 452 | content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] 453 | about: 454 | website: https://curlie.org/ 455 | wikidata_id: Q60715723 456 | use_official_api: false 457 | require_api_key: false 458 | results: HTML 459 | 460 | - name: currency 461 | engine: currency_convert 462 | categories: general 463 | shortcut: cc 464 | 465 | - name: deezer 466 | engine: deezer 467 | shortcut: dz 468 | disabled: true 469 | 470 | - name: deviantart 471 | engine: deviantart 472 | shortcut: da 473 | timeout: 3.0 474 | 475 | - name: ddg definitions 476 | engine: duckduckgo_definitions 477 | shortcut: ddd 478 | weight: 2 479 | disabled: true 480 | tests: *tests_infobox 481 | 482 | # cloudflare protected 483 | # - name: digbt 484 | # engine: digbt 485 | # shortcut: dbt 486 | # timeout: 6.0 487 | # disabled: true 488 | 489 | - name: docker hub 490 | engine: docker_hub 491 | shortcut: dh 492 | categories: [it, packages] 493 | 494 | - name: erowid 495 | engine: xpath 496 | paging: true 497 | first_page_num: 0 498 | page_size: 30 499 | search_url: https://www.erowid.org/search.php?q={query}&s={pageno} 500 | url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href 501 | title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() 502 | content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] 503 | categories: [] 504 | shortcut: ew 505 | disabled: true 506 | about: 507 | website: https://www.erowid.org/ 508 | wikidata_id: Q1430691 509 | official_api_documentation: 510 | use_official_api: false 511 | require_api_key: false 512 | results: HTML 513 | 514 | # - name: elasticsearch 515 | # shortcut: es 516 | # engine: elasticsearch 517 | # base_url: http://localhost:9200 518 | # username: elastic 519 | # password: changeme 520 | # index: my-index 521 | # # available options: match, simple_query_string, term, terms, custom 522 | # query_type: match 523 | # # if query_type is set to custom, provide your query here 524 | # #custom_query_json: {"query":{"match_all": {}}} 525 | # #show_metadata: false 526 | # disabled: true 527 | 528 | - name: wikidata 529 | engine: wikidata 530 | shortcut: wd 531 | timeout: 3.0 532 | weight: 2 533 | tests: *tests_infobox 534 | 535 | - name: duckduckgo 536 | engine: duckduckgo 537 | shortcut: ddg 538 | 539 | - name: duckduckgo images 540 | engine: duckduckgo_images 541 | shortcut: ddi 542 | timeout: 3.0 543 | disabled: true 544 | 545 | - name: tineye 546 | engine: tineye 547 | shortcut: tin 548 | timeout: 9.0 549 | 550 | - name: etymonline 551 | engine: xpath 552 | paging: true 553 | search_url: https://etymonline.com/search?page={pageno}&q={query} 554 | url_xpath: //a[contains(@class, "word__name--")]/@href 555 | title_xpath: //a[contains(@class, "word__name--")] 556 | content_xpath: //section[contains(@class, "word__defination")] 557 | first_page_num: 1 558 | shortcut: et 559 | categories: [dictionaries] 560 | disabled: false 561 | about: 562 | website: https://www.etymonline.com/ 563 | wikidata_id: Q1188617 564 | official_api_documentation: 565 | use_official_api: false 566 | require_api_key: false 567 | results: HTML 568 | 569 | # - name: ebay 570 | # engine: ebay 571 | # shortcut: eb 572 | # base_url: 'https://www.ebay.com' 573 | # disabled: true 574 | # timeout: 5 575 | 576 | - name: 1x 577 | engine: www1x 578 | shortcut: 1x 579 | timeout: 3.0 580 | disabled: true 581 | 582 | - name: fdroid 583 | engine: fdroid 584 | shortcut: fd 585 | disabled: true 586 | 587 | - name: flickr 588 | categories: images 589 | shortcut: fl 590 | # You can use the engine using the official stable API, but you need an API 591 | # key, see: https://www.flickr.com/services/apps/create/ 592 | # engine: flickr 593 | # api_key: 'apikey' # required! 594 | # Or you can use the html non-stable engine, activated by default 595 | engine: flickr_noapi 596 | 597 | - name: free software directory 598 | engine: mediawiki 599 | shortcut: fsd 600 | categories: [it, software wikis] 601 | base_url: https://directory.fsf.org/ 602 | number_of_results: 5 603 | # what part of a page matches the query string: title, text, nearmatch 604 | # * title - query matches title 605 | # * text - query matches the text of page 606 | # * nearmatch - nearmatch in title 607 | search_type: title 608 | timeout: 5.0 609 | disabled: true 610 | about: 611 | website: https://directory.fsf.org/ 612 | wikidata_id: Q2470288 613 | 614 | # - name: freesound 615 | # engine: freesound 616 | # shortcut: fnd 617 | # disabled: true 618 | # timeout: 15.0 619 | # API key required, see: https://freesound.org/docs/api/overview.html 620 | # api_key: MyAPIkey 621 | 622 | - name: frinkiac 623 | engine: frinkiac 624 | shortcut: frk 625 | disabled: true 626 | 627 | - name: genius 628 | engine: genius 629 | shortcut: gen 630 | 631 | - name: gigablast 632 | engine: gigablast 633 | shortcut: gb 634 | timeout: 4.0 635 | disabled: true 636 | additional_tests: 637 | rosebud: *test_rosebud 638 | 639 | - name: gentoo 640 | engine: gentoo 641 | shortcut: ge 642 | 643 | - name: gitlab 644 | engine: json_engine 645 | paging: true 646 | search_url: https://gitlab.com/api/v4/projects?search={query}&page={pageno} 647 | url_query: web_url 648 | title_query: name_with_namespace 649 | content_query: description 650 | page_size: 20 651 | categories: [it, repos] 652 | shortcut: gl 653 | timeout: 10.0 654 | disabled: true 655 | about: 656 | website: https://about.gitlab.com/ 657 | wikidata_id: Q16639197 658 | official_api_documentation: https://docs.gitlab.com/ee/api/ 659 | use_official_api: false 660 | require_api_key: false 661 | results: JSON 662 | 663 | - name: github 664 | engine: github 665 | shortcut: gh 666 | 667 | # This a Gitea service. If you would like to use a different instance, 668 | # change codeberg.org to URL of the desired Gitea host. Or you can create a 669 | # new engine by copying this and changing the name, shortcut and search_url. 670 | 671 | - name: codeberg 672 | engine: json_engine 673 | search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10 674 | url_query: html_url 675 | title_query: name 676 | content_query: description 677 | categories: [it, repos] 678 | shortcut: cb 679 | disabled: true 680 | about: 681 | website: https://codeberg.org/ 682 | wikidata_id: 683 | official_api_documentation: https://try.gitea.io/api/swagger 684 | use_official_api: false 685 | require_api_key: false 686 | results: JSON 687 | 688 | - name: google 689 | engine: google 690 | shortcut: go 691 | # see https://docs.searxng.org/src/searx.engines.google.html#module-searx.engines.google 692 | use_mobile_ui: false 693 | # additional_tests: 694 | # android: *test_android 695 | 696 | # - name: google italian 697 | # engine: google 698 | # shortcut: goit 699 | # use_mobile_ui: false 700 | # language: it 701 | 702 | # - name: google mobile ui 703 | # engine: google 704 | # shortcut: gomui 705 | # use_mobile_ui: true 706 | 707 | - name: google images 708 | engine: google_images 709 | shortcut: goi 710 | # additional_tests: 711 | # android: *test_android 712 | # dali: 713 | # matrix: 714 | # query: ['Dali Christ'] 715 | # lang: ['en', 'de', 'fr', 'zh-CN'] 716 | # result_container: 717 | # - ['one_title_contains', 'Salvador'] 718 | 719 | - name: google news 720 | engine: google_news 721 | shortcut: gon 722 | # additional_tests: 723 | # android: *test_android 724 | 725 | - name: google videos 726 | engine: google_videos 727 | shortcut: gov 728 | # additional_tests: 729 | # android: *test_android 730 | 731 | - name: google scholar 732 | engine: google_scholar 733 | shortcut: gos 734 | 735 | - name: google play apps 736 | engine: google_play_apps 737 | shortcut: gpa 738 | disabled: true 739 | 740 | - name: google play movies 741 | engine: xpath 742 | search_url: https://play.google.com/store/search?q={query}&c=movies 743 | results_xpath: '//div[@class="ImZGtf mpg5gc"]' 744 | title_xpath: './/div[@class="RZEgze"]//div[@class="kCSSQe"]//a' 745 | url_xpath: './/div[@class="RZEgze"]//div[@class="kCSSQe"]//a/@href' 746 | content_xpath: './/div[@class="kCSSQe"]' 747 | thumbnail_xpath: './/div[@class="uzcko"]/div/span[1]//img/@data-src' 748 | categories: videos 749 | shortcut: gpm 750 | disabled: true 751 | about: 752 | website: https://play.google.com/ 753 | wikidata_id: Q79576 754 | official_api_documentation: 755 | use_official_api: false 756 | require_api_key: false 757 | results: HTML 758 | 759 | - name: gpodder 760 | engine: json_engine 761 | shortcut: gpod 762 | timeout: 4.0 763 | paging: false 764 | search_url: https://gpodder.net/search.json?q={query} 765 | url_query: url 766 | title_query: title 767 | content_query: description 768 | page_size: 19 769 | categories: music 770 | disabled: true 771 | about: 772 | website: https://gpodder.net 773 | wikidata_id: Q3093354 774 | official_api_documentation: https://gpoddernet.readthedocs.io/en/latest/api/ 775 | use_official_api: false 776 | requires_api_key: false 777 | results: JSON 778 | 779 | - name: habrahabr 780 | engine: xpath 781 | paging: true 782 | search_url: https://habrahabr.ru/search/page{pageno}/?q={query} 783 | url_xpath: //article[contains(@class, "post")]//a[@class="post__title_link"]/@href 784 | title_xpath: //article[contains(@class, "post")]//a[@class="post__title_link"] 785 | content_xpath: //article[contains(@class, "post")]//div[contains(@class, "post__text")] 786 | categories: it 787 | timeout: 4.0 788 | disabled: true 789 | shortcut: habr 790 | about: 791 | website: https://habr.com/ 792 | wikidata_id: Q4494434 793 | official_api_documentation: https://habr.com/en/docs/help/api/ 794 | use_official_api: false 795 | require_api_key: false 796 | results: HTML 797 | 798 | - name: hoogle 799 | engine: xpath 800 | paging: true 801 | search_url: https://hoogle.haskell.org/?hoogle={query}&start={pageno} 802 | results_xpath: '//div[@class="result"]' 803 | title_xpath: './/div[@class="ans"]//a' 804 | url_xpath: './/div[@class="ans"]//a/@href' 805 | content_xpath: './/div[@class="from"]' 806 | page_size: 20 807 | categories: [it, packages] 808 | shortcut: ho 809 | about: 810 | website: https://hoogle.haskell.org/ 811 | wikidata_id: Q34010 812 | official_api_documentation: https://hackage.haskell.org/api 813 | use_official_api: false 814 | require_api_key: false 815 | results: JSON 816 | 817 | - name: imdb 818 | engine: imdb 819 | shortcut: imdb 820 | timeout: 6.0 821 | disabled: true 822 | 823 | - name: ina 824 | engine: ina 825 | shortcut: in 826 | timeout: 6.0 827 | disabled: true 828 | 829 | - name: invidious 830 | engine: invidious 831 | # Instanes will be selected randomly, see https://api.invidious.io/ for 832 | # instances that are stable (good uptime) and close to you. 833 | base_url: 834 | - https://invidious.snopyta.org 835 | - https://vid.puffyan.us 836 | # - https://invidious.kavin.rocks # Error 1020 // Access denied by Cloudflare 837 | - https://invidio.xamh.de 838 | - https://inv.riverside.rocks 839 | shortcut: iv 840 | timeout: 3.0 841 | disabled: true 842 | 843 | - name: jisho 844 | engine: jisho 845 | shortcut: js 846 | timeout: 3.0 847 | disabled: true 848 | 849 | - name: kickass 850 | engine: kickass 851 | shortcut: kc 852 | timeout: 4.0 853 | disabled: true 854 | 855 | - name: library genesis 856 | engine: xpath 857 | search_url: https://libgen.fun/search.php?req={query} 858 | url_xpath: //a[contains(@href,"get.php?md5")]/@href 859 | title_xpath: //a[contains(@href,"book/")]/text()[1] 860 | content_xpath: //td/a[1][contains(@href,"=author")]/text() 861 | categories: files 862 | timeout: 7.0 863 | disabled: true 864 | shortcut: lg 865 | about: 866 | website: https://libgen.fun/ 867 | wikidata_id: Q22017206 868 | official_api_documentation: 869 | use_official_api: false 870 | require_api_key: false 871 | results: HTML 872 | 873 | - name: z-library 874 | engine: zlibrary 875 | shortcut: zlib 876 | categories: files 877 | timeout: 3.0 878 | # choose base_url, otherwise engine will do it at initialization time 879 | # base_url: https://b-ok.cc 880 | # base_url: https://de1lib.org 881 | # base_url: https://booksc.eu # does not have cover preview 882 | # base_url: https://booksc.org # does not have cover preview 883 | 884 | - name: library of congress 885 | engine: loc 886 | shortcut: loc 887 | categories: images 888 | 889 | - name: lingva 890 | engine: lingva 891 | shortcut: lv 892 | # set lingva instance in url, by default it will use the official instance 893 | # url: https://lingva.ml 894 | 895 | - name: lobste.rs 896 | engine: xpath 897 | search_url: https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance 898 | results_xpath: //li[contains(@class, "story")] 899 | url_xpath: .//a[@class="u-url"]/@href 900 | title_xpath: .//a[@class="u-url"] 901 | content_xpath: .//a[@class="domain"] 902 | categories: it 903 | shortcut: lo 904 | timeout: 5.0 905 | disabled: true 906 | about: 907 | website: https://lobste.rs/ 908 | wikidata_id: Q60762874 909 | official_api_documentation: 910 | use_official_api: false 911 | require_api_key: false 912 | results: HTML 913 | 914 | - name: azlyrics 915 | shortcut: lyrics 916 | engine: xpath 917 | timeout: 4.0 918 | disabled: true 919 | categories: [music, lyrics] 920 | paging: true 921 | search_url: https://search.azlyrics.com/search.php?q={query}&w=lyrics&p={pageno} 922 | url_xpath: //td[@class="text-left visitedlyr"]/a/@href 923 | title_xpath: //span/b/text() 924 | content_xpath: //td[@class="text-left visitedlyr"]/a/small 925 | about: 926 | website: https://azlyrics.com 927 | wikidata_id: Q66372542 928 | official_api_documentation: 929 | use_official_api: false 930 | require_api_key: false 931 | results: HTML 932 | 933 | # - name: meilisearch 934 | # engine: meilisearch 935 | # shortcut: mes 936 | # enable_http: true 937 | # base_url: http://localhost:7700 938 | # index: my-index 939 | 940 | - name: mixcloud 941 | engine: mixcloud 942 | shortcut: mc 943 | 944 | # MongoDB engine 945 | # Required dependency: pymongo 946 | # - name: mymongo 947 | # engine: mongodb 948 | # shortcut: md 949 | # exact_match_only: false 950 | # host: '127.0.0.1' 951 | # port: 27017 952 | # enable_http: true 953 | # results_per_page: 20 954 | # database: 'business' 955 | # collection: 'reviews' # name of the db collection 956 | # key: 'name' # key in the collection to search for 957 | 958 | - name: npm 959 | engine: json_engine 960 | paging: true 961 | first_page_num: 0 962 | search_url: https://api.npms.io/v2/search?q={query}&size=25&from={pageno} 963 | results_query: results 964 | url_query: package/links/npm 965 | title_query: package/name 966 | content_query: package/description 967 | page_size: 25 968 | categories: [it, packages] 969 | disabled: true 970 | timeout: 5.0 971 | shortcut: npm 972 | about: 973 | website: https://npms.io/ 974 | wikidata_id: Q7067518 975 | official_api_documentation: https://api-docs.npms.io/ 976 | use_official_api: false 977 | require_api_key: false 978 | results: JSON 979 | 980 | - name: nyaa 981 | engine: nyaa 982 | shortcut: nt 983 | disabled: true 984 | 985 | - name: mankier 986 | engine: json_engine 987 | search_url: https://www.mankier.com/api/v2/mans/?q={query} 988 | results_query: results 989 | url_query: url 990 | title_query: name 991 | content_query: description 992 | categories: it 993 | shortcut: man 994 | about: 995 | website: https://www.mankier.com/ 996 | official_api_documentation: https://www.mankier.com/api 997 | use_official_api: true 998 | require_api_key: false 999 | results: JSON 1000 | 1001 | - name: openairedatasets 1002 | engine: json_engine 1003 | paging: true 1004 | search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} 1005 | results_query: response/results/result 1006 | url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ 1007 | title_query: metadata/oaf:entity/oaf:result/title/$ 1008 | content_query: metadata/oaf:entity/oaf:result/description/$ 1009 | content_html_to_text: true 1010 | categories: science 1011 | shortcut: oad 1012 | timeout: 5.0 1013 | about: 1014 | website: https://www.openaire.eu/ 1015 | wikidata_id: Q25106053 1016 | official_api_documentation: https://api.openaire.eu/ 1017 | use_official_api: false 1018 | require_api_key: false 1019 | results: JSON 1020 | 1021 | - name: openairepublications 1022 | engine: json_engine 1023 | paging: true 1024 | search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} 1025 | results_query: response/results/result 1026 | url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ 1027 | title_query: metadata/oaf:entity/oaf:result/title/$ 1028 | content_query: metadata/oaf:entity/oaf:result/description/$ 1029 | content_html_to_text: true 1030 | categories: science 1031 | shortcut: oap 1032 | timeout: 5.0 1033 | about: 1034 | website: https://www.openaire.eu/ 1035 | wikidata_id: Q25106053 1036 | official_api_documentation: https://api.openaire.eu/ 1037 | use_official_api: false 1038 | require_api_key: false 1039 | results: JSON 1040 | 1041 | # - name: opensemanticsearch 1042 | # engine: opensemantic 1043 | # shortcut: oss 1044 | # base_url: 'http://localhost:8983/solr/opensemanticsearch/' 1045 | 1046 | - name: openstreetmap 1047 | engine: openstreetmap 1048 | shortcut: osm 1049 | 1050 | - name: openrepos 1051 | engine: xpath 1052 | paging: true 1053 | search_url: https://openrepos.net/search/node/{query}?page={pageno} 1054 | url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href 1055 | title_xpath: //li[@class="search-result"]//h3[@class="title"]/a 1056 | content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] 1057 | categories: files 1058 | timeout: 4.0 1059 | disabled: true 1060 | shortcut: or 1061 | about: 1062 | website: https://openrepos.net/ 1063 | wikidata_id: 1064 | official_api_documentation: 1065 | use_official_api: false 1066 | require_api_key: false 1067 | results: HTML 1068 | 1069 | - name: packagist 1070 | engine: json_engine 1071 | paging: true 1072 | search_url: https://packagist.org/search.json?q={query}&page={pageno} 1073 | results_query: results 1074 | url_query: url 1075 | title_query: name 1076 | content_query: description 1077 | categories: [it, packages] 1078 | disabled: true 1079 | timeout: 5.0 1080 | shortcut: pack 1081 | about: 1082 | website: https://packagist.org 1083 | wikidata_id: Q108311377 1084 | official_api_documentation: https://packagist.org/apidoc 1085 | use_official_api: true 1086 | require_api_key: false 1087 | results: JSON 1088 | 1089 | - name: pdbe 1090 | engine: pdbe 1091 | shortcut: pdb 1092 | # Hide obsolete PDB entries. Default is not to hide obsolete structures 1093 | # hide_obsolete: false 1094 | 1095 | - name: photon 1096 | engine: photon 1097 | shortcut: ph 1098 | 1099 | - name: piratebay 1100 | engine: piratebay 1101 | shortcut: tpb 1102 | # You may need to change this URL to a proxy if piratebay is blocked in your 1103 | # country 1104 | url: https://thepiratebay.org/ 1105 | timeout: 3.0 1106 | 1107 | # Required dependency: psychopg2 1108 | # - name: postgresql 1109 | # engine: postgresql 1110 | # database: postgres 1111 | # username: postgres 1112 | # password: postgres 1113 | # limit: 10 1114 | # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' 1115 | # shortcut : psql 1116 | 1117 | - name: pub.dev 1118 | engine: xpath 1119 | shortcut: pd 1120 | search_url: https://pub.dev/packages?q={query}&page={pageno} 1121 | paging: true 1122 | results_xpath: /html/body/main/div/div[@class="search-results"]/div[@class="packages"]/div 1123 | url_xpath: ./div/h3/a/@href 1124 | title_xpath: ./div/h3/a 1125 | content_xpath: ./p[@class="packages-description"] 1126 | categories: [packages, it] 1127 | timeout: 3.0 1128 | disabled: true 1129 | first_page_num: 1 1130 | about: 1131 | website: https://pub.dev/ 1132 | official_api_documentation: https://pub.dev/help/api 1133 | use_official_api: false 1134 | require_api_key: false 1135 | results: HTML 1136 | 1137 | - name: pubmed 1138 | engine: pubmed 1139 | shortcut: pub 1140 | categories: science 1141 | timeout: 3.0 1142 | 1143 | - name: pypi 1144 | shortcut: pypi 1145 | engine: xpath 1146 | paging: true 1147 | search_url: https://pypi.org/search?q={query}&page={pageno} 1148 | results_xpath: /html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"] 1149 | url_xpath: ./@href 1150 | title_xpath: ./h3/span[@class="package-snippet__name"] 1151 | content_xpath: ./p 1152 | suggestion_xpath: /html/body/main/div/div/div/form/div/div[@class="callout-block"]/p/span/a[@class="link"] 1153 | first_page_num: 1 1154 | categories: [it, packages] 1155 | about: 1156 | website: https://pypi.org 1157 | wikidata_id: Q2984686 1158 | official_api_documentation: https://warehouse.readthedocs.io/api-reference/index.html 1159 | use_official_api: false 1160 | require_api_key: false 1161 | results: HTML 1162 | 1163 | - name: qwant 1164 | engine: qwant 1165 | shortcut: qw 1166 | categories: [general, web] 1167 | disabled: false 1168 | additional_tests: 1169 | rosebud: *test_rosebud 1170 | 1171 | - name: qwant news 1172 | engine: qwant 1173 | shortcut: qwn 1174 | categories: news 1175 | disabled: false 1176 | network: qwant 1177 | 1178 | - name: qwant images 1179 | engine: qwant 1180 | shortcut: qwi 1181 | categories: [images, web] 1182 | disabled: false 1183 | network: qwant 1184 | 1185 | - name: qwant videos 1186 | engine: qwant 1187 | shortcut: qwv 1188 | categories: [videos, web] 1189 | disabled: false 1190 | network: qwant 1191 | 1192 | # - name: library 1193 | # engine: recoll 1194 | # shortcut: lib 1195 | # base_url: 'https://recoll.example.org/' 1196 | # search_dir: '' 1197 | # mount_prefix: /export 1198 | # dl_prefix: 'https://download.example.org' 1199 | # timeout: 30.0 1200 | # categories: files 1201 | # disabled: true 1202 | 1203 | # - name: recoll library reference 1204 | # engine: recoll 1205 | # base_url: 'https://recoll.example.org/' 1206 | # search_dir: reference 1207 | # mount_prefix: /export 1208 | # dl_prefix: 'https://download.example.org' 1209 | # shortcut: libr 1210 | # timeout: 30.0 1211 | # categories: files 1212 | # disabled: true 1213 | 1214 | - name: reddit 1215 | engine: reddit 1216 | shortcut: re 1217 | page_size: 25 1218 | 1219 | # Required dependency: redis 1220 | # - name: myredis 1221 | # shortcut : rds 1222 | # engine: redis_server 1223 | # exact_match_only: false 1224 | # host: '127.0.0.1' 1225 | # port: 6379 1226 | # enable_http: true 1227 | # password: '' 1228 | # db: 0 1229 | 1230 | # tmp suspended: bad certificate 1231 | # - name: scanr structures 1232 | # shortcut: scs 1233 | # engine: scanr_structures 1234 | # disabled: true 1235 | 1236 | - name: sepiasearch 1237 | engine: sepiasearch 1238 | shortcut: sep 1239 | 1240 | - name: soundcloud 1241 | engine: soundcloud 1242 | shortcut: sc 1243 | 1244 | - name: stackoverflow 1245 | engine: stackexchange 1246 | shortcut: st 1247 | api_site: 'stackoverflow' 1248 | categories: [it, q&a] 1249 | 1250 | - name: askubuntu 1251 | engine: stackexchange 1252 | shortcut: ubuntu 1253 | api_site: 'askubuntu' 1254 | categories: [it, q&a] 1255 | 1256 | - name: superuser 1257 | engine: stackexchange 1258 | shortcut: su 1259 | api_site: 'superuser' 1260 | categories: [it, q&a] 1261 | 1262 | - name: searchcode code 1263 | engine: searchcode_code 1264 | shortcut: scc 1265 | disabled: true 1266 | 1267 | - name: framalibre 1268 | engine: framalibre 1269 | shortcut: frl 1270 | disabled: true 1271 | 1272 | # - name: searx 1273 | # engine: searx_engine 1274 | # shortcut: se 1275 | # instance_urls : 1276 | # - http://127.0.0.1:8888/ 1277 | # - ... 1278 | # disabled: true 1279 | 1280 | - name: semantic scholar 1281 | engine: semantic_scholar 1282 | disabled: true 1283 | shortcut: se 1284 | categories: science 1285 | 1286 | # Spotify needs API credentials 1287 | # - name: spotify 1288 | # engine: spotify 1289 | # shortcut: stf 1290 | # api_client_id: ******* 1291 | # api_client_secret: ******* 1292 | 1293 | # - name: solr 1294 | # engine: solr 1295 | # shortcut: slr 1296 | # base_url: http://localhost:8983 1297 | # collection: collection_name 1298 | # sort: '' # sorting: asc or desc 1299 | # field_list: '' # comma separated list of field names to display on the UI 1300 | # default_fields: '' # default field to query 1301 | # query_fields: '' # query fields 1302 | # enable_http: true 1303 | 1304 | # - name: springer nature 1305 | # engine: springer 1306 | # # get your API key from: https://dev.springernature.com/signup 1307 | # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" 1308 | # api_key: 'unset' 1309 | # shortcut: springer 1310 | # categories: science 1311 | # timeout: 6.0 1312 | 1313 | - name: startpage 1314 | engine: startpage 1315 | shortcut: sp 1316 | timeout: 6.0 1317 | disabled: true 1318 | additional_tests: 1319 | rosebud: *test_rosebud 1320 | 1321 | - name: tokyotoshokan 1322 | engine: tokyotoshokan 1323 | shortcut: tt 1324 | timeout: 6.0 1325 | disabled: true 1326 | 1327 | - name: solidtorrents 1328 | engine: solidtorrents 1329 | shortcut: solid 1330 | timeout: 4.0 1331 | disabled: false 1332 | base_url: 1333 | - https://solidtorrents.net 1334 | - https://solidtorrents.eu 1335 | - https://solidtorrents.to 1336 | - https://bitsearch.to 1337 | 1338 | # For this demo of the sqlite engine download: 1339 | # https://liste.mediathekview.de/filmliste-v2.db.bz2 1340 | # and unpack into searx/data/filmliste-v2.db 1341 | # Query to test: "!demo concert" 1342 | # 1343 | # - name: demo 1344 | # engine: sqlite 1345 | # shortcut: demo 1346 | # categories: general 1347 | # result_template: default.html 1348 | # database: searx/data/filmliste-v2.db 1349 | # query_str: >- 1350 | # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, 1351 | # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, 1352 | # description AS content 1353 | # FROM film 1354 | # WHERE title LIKE :wildcard OR description LIKE :wildcard 1355 | # ORDER BY duration DESC 1356 | # disabled: false 1357 | 1358 | # Requires Tor 1359 | - name: torch 1360 | engine: xpath 1361 | paging: true 1362 | search_url: 1363 | http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and 1364 | results_xpath: //table//tr 1365 | url_xpath: ./td[2]/a 1366 | title_xpath: ./td[2]/b 1367 | content_xpath: ./td[2]/small 1368 | categories: onions 1369 | enable_http: true 1370 | shortcut: tch 1371 | 1372 | # torznab engine lets you query any torznab compatible indexer. Using this 1373 | # engine in combination with Jackett (https://github.com/Jackett/Jackett) 1374 | # opens the possibility to query a lot of public and private indexers directly 1375 | # from SearXNG. 1376 | # - name: torznab 1377 | # engine: torznab 1378 | # shortcut: trz 1379 | # base_url: http://localhost:9117/api/v2.0/indexers/all/results/torznab 1380 | # enable_http: true # if using localhost 1381 | # api_key: xxxxxxxxxxxxxxx 1382 | # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories 1383 | # torznab_categories: # optional 1384 | # - 2000 1385 | # - 5000 1386 | 1387 | # maybe in a fun category 1388 | # - name: uncyclopedia 1389 | # engine: mediawiki 1390 | # shortcut: unc 1391 | # base_url: https://uncyclopedia.wikia.com/ 1392 | # number_of_results: 5 1393 | 1394 | # tmp suspended - too slow, too many errors 1395 | # - name: urbandictionary 1396 | # engine : xpath 1397 | # search_url : https://www.urbandictionary.com/define.php?term={query} 1398 | # url_xpath : //*[@class="word"]/@href 1399 | # title_xpath : //*[@class="def-header"] 1400 | # content_xpath: //*[@class="meaning"] 1401 | # shortcut: ud 1402 | 1403 | - name: unsplash 1404 | engine: unsplash 1405 | shortcut: us 1406 | 1407 | - name: yahoo 1408 | engine: yahoo 1409 | shortcut: yh 1410 | disabled: true 1411 | 1412 | - name: yahoo news 1413 | engine: yahoo_news 1414 | shortcut: yhn 1415 | 1416 | - name: youtube 1417 | shortcut: yt 1418 | # You can use the engine using the official stable API, but you need an API 1419 | # key See: https://console.developers.google.com/project 1420 | # 1421 | # engine: youtube_api 1422 | # api_key: 'apikey' # required! 1423 | # 1424 | # Or you can use the html non-stable engine, activated by default 1425 | engine: youtube_noapi 1426 | 1427 | - name: dailymotion 1428 | engine: dailymotion 1429 | shortcut: dm 1430 | 1431 | - name: vimeo 1432 | engine: vimeo 1433 | shortcut: vm 1434 | 1435 | - name: wiby 1436 | engine: json_engine 1437 | search_url: https://wiby.me/json/?q={query} 1438 | url_query: URL 1439 | title_query: Title 1440 | content_query: Snippet 1441 | categories: [general, web] 1442 | shortcut: wib 1443 | disabled: true 1444 | about: 1445 | website: https://wiby.me/ 1446 | 1447 | - name: alexandria 1448 | engine: json_engine 1449 | shortcut: alx 1450 | categories: general 1451 | paging: true 1452 | search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} 1453 | results_query: results 1454 | title_query: title 1455 | url_query: url 1456 | content_query: snippet 1457 | timeout: 1.5 1458 | disabled: true 1459 | about: 1460 | website: https://alexandria.org/ 1461 | official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md 1462 | use_official_api: true 1463 | require_api_key: false 1464 | results: JSON 1465 | 1466 | - name: wikibooks 1467 | engine: mediawiki 1468 | shortcut: wb 1469 | categories: general 1470 | base_url: "https://{language}.wikibooks.org/" 1471 | number_of_results: 5 1472 | search_type: text 1473 | disabled: true 1474 | about: 1475 | website: https://www.wikibooks.org/ 1476 | wikidata_id: Q367 1477 | 1478 | - name: wikinews 1479 | engine: mediawiki 1480 | shortcut: wn 1481 | categories: news 1482 | base_url: "https://{language}.wikinews.org/" 1483 | number_of_results: 5 1484 | search_type: text 1485 | disabled: true 1486 | about: 1487 | website: https://www.wikinews.org/ 1488 | wikidata_id: Q964 1489 | 1490 | - name: wikiquote 1491 | engine: mediawiki 1492 | shortcut: wq 1493 | categories: general 1494 | base_url: "https://{language}.wikiquote.org/" 1495 | number_of_results: 5 1496 | search_type: text 1497 | disabled: true 1498 | additional_tests: 1499 | rosebud: *test_rosebud 1500 | about: 1501 | website: https://www.wikiquote.org/ 1502 | wikidata_id: Q369 1503 | 1504 | - name: wikisource 1505 | engine: mediawiki 1506 | shortcut: ws 1507 | categories: general 1508 | base_url: "https://{language}.wikisource.org/" 1509 | number_of_results: 5 1510 | search_type: text 1511 | disabled: true 1512 | about: 1513 | website: https://www.wikisource.org/ 1514 | wikidata_id: Q263 1515 | 1516 | - name: wiktionary 1517 | engine: mediawiki 1518 | shortcut: wt 1519 | categories: [dictionaries] 1520 | base_url: "https://{language}.wiktionary.org/" 1521 | number_of_results: 5 1522 | search_type: text 1523 | disabled: false 1524 | about: 1525 | website: https://www.wiktionary.org/ 1526 | wikidata_id: Q151 1527 | 1528 | - name: wikiversity 1529 | engine: mediawiki 1530 | shortcut: wv 1531 | categories: general 1532 | base_url: "https://{language}.wikiversity.org/" 1533 | number_of_results: 5 1534 | search_type: text 1535 | disabled: true 1536 | about: 1537 | website: https://www.wikiversity.org/ 1538 | wikidata_id: Q370 1539 | 1540 | - name: wikivoyage 1541 | engine: mediawiki 1542 | shortcut: wy 1543 | categories: general 1544 | base_url: "https://{language}.wikivoyage.org/" 1545 | number_of_results: 5 1546 | search_type: text 1547 | disabled: true 1548 | about: 1549 | website: https://www.wikivoyage.org/ 1550 | wikidata_id: Q373 1551 | 1552 | - name: wolframalpha 1553 | shortcut: wa 1554 | # You can use the engine using the official stable API, but you need an API 1555 | # key. See: https://products.wolframalpha.com/api/ 1556 | # 1557 | # engine: wolframalpha_api 1558 | # api_key: '' 1559 | # 1560 | # Or you can use the html non-stable engine, activated by default 1561 | engine: wolframalpha_noapi 1562 | timeout: 6.0 1563 | categories: [] 1564 | 1565 | - name: dictzone 1566 | engine: dictzone 1567 | shortcut: dc 1568 | 1569 | - name: mymemory translated 1570 | engine: translated 1571 | shortcut: tl 1572 | timeout: 5.0 1573 | disabled: false 1574 | # You can use without an API key, but you are limited to 1000 words/day 1575 | # See: https://mymemory.translated.net/doc/usagelimits.php 1576 | # api_key: '' 1577 | 1578 | # Required dependency: mysql-connector-python 1579 | # - name: mysql 1580 | # engine: mysql_server 1581 | # database: mydatabase 1582 | # username: user 1583 | # password: pass 1584 | # limit: 10 1585 | # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' 1586 | # shortcut: mysql 1587 | 1588 | - name: 1337x 1589 | engine: 1337x 1590 | shortcut: 1337x 1591 | disabled: true 1592 | 1593 | - name: duden 1594 | engine: duden 1595 | shortcut: du 1596 | disabled: true 1597 | 1598 | - name: seznam 1599 | shortcut: szn 1600 | engine: seznam 1601 | disabled: true 1602 | 1603 | - name: mojeek 1604 | shortcut: mjk 1605 | engine: xpath 1606 | paging: true 1607 | categories: [general, web] 1608 | search_url: https://www.mojeek.com/search?q={query}&s={pageno} 1609 | results_xpath: //a[@class="ob"] 1610 | url_xpath: ./@href 1611 | title_xpath: ./h2 1612 | content_xpath: ../p[@class="s"] 1613 | suggestion_xpath: /html/body//div[@class="top-info"]/p[@class="top-info spell"]/a 1614 | first_page_num: 0 1615 | page_size: 10 1616 | disabled: true 1617 | about: 1618 | website: https://www.mojeek.com/ 1619 | wikidata_id: Q60747299 1620 | official_api_documentation: https://www.mojeek.com/services/api.html/ 1621 | use_official_api: false 1622 | require_api_key: false 1623 | results: HTML 1624 | 1625 | - name: naver 1626 | shortcut: nvr 1627 | categories: [general, web] 1628 | engine: xpath 1629 | paging: true 1630 | search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} 1631 | url_xpath: //a[@class="link_tit"]/@href 1632 | title_xpath: //a[@class="link_tit"] 1633 | content_xpath: //a[@class="total_dsc"]/div 1634 | first_page_num: 1 1635 | page_size: 10 1636 | disabled: true 1637 | about: 1638 | website: https://www.naver.com/ 1639 | wikidata_id: Q485639 1640 | official_api_documentation: https://developers.naver.com/docs/nmt/examples/ 1641 | use_official_api: false 1642 | require_api_key: false 1643 | results: HTML 1644 | language: ko 1645 | 1646 | - name: rubygems 1647 | shortcut: rbg 1648 | engine: xpath 1649 | paging: true 1650 | search_url: https://rubygems.org/search?page={pageno}&query={query} 1651 | results_xpath: /html/body/main/div/a[@class="gems__gem"] 1652 | url_xpath: ./@href 1653 | title_xpath: ./span/h2 1654 | content_xpath: ./span/p 1655 | suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a 1656 | first_page_num: 1 1657 | categories: [it, packages] 1658 | disabled: true 1659 | about: 1660 | website: https://rubygems.org/ 1661 | wikidata_id: Q1853420 1662 | official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ 1663 | use_official_api: false 1664 | require_api_key: false 1665 | results: HTML 1666 | 1667 | - name: peertube 1668 | engine: peertube 1669 | shortcut: ptb 1670 | paging: true 1671 | # https://instances.joinpeertube.org/instances 1672 | base_url: https://peertube.biz/ 1673 | # base_url: https://tube.tardis.world/ 1674 | categories: videos 1675 | disabled: true 1676 | timeout: 6.0 1677 | 1678 | - name: mediathekviewweb 1679 | engine: mediathekviewweb 1680 | shortcut: mvw 1681 | disabled: true 1682 | 1683 | # - name: yacy 1684 | # engine: yacy 1685 | # shortcut: ya 1686 | # base_url: http://localhost:8090 1687 | # required if you aren't using HTTPS for your local yacy instance' 1688 | # enable_http: true 1689 | # number_of_results: 5 1690 | # timeout: 3.0 1691 | 1692 | - name: rumble 1693 | engine: rumble 1694 | shortcut: ru 1695 | base_url: https://rumble.com/ 1696 | paging: true 1697 | categories: videos 1698 | disabled: true 1699 | 1700 | - name: wordnik 1701 | engine: wordnik 1702 | shortcut: def 1703 | base_url: https://www.wordnik.com/ 1704 | categories: [dictionaries] 1705 | timeout: 5.0 1706 | disabled: false 1707 | 1708 | - name: woxikon.de synonyme 1709 | engine: xpath 1710 | shortcut: woxi 1711 | categories: [dictionaries] 1712 | timeout: 5.0 1713 | disabled: true 1714 | search_url: https://synonyme.woxikon.de/synonyme/{query}.php 1715 | url_xpath: //div[@class="upper-synonyms"]/a/@href 1716 | content_xpath: //div[@class="synonyms-list-group"] 1717 | title_xpath: //div[@class="upper-synonyms"]/a 1718 | about: 1719 | website: https://www.woxikon.de/ 1720 | wikidata_id: # No Wikidata ID 1721 | use_official_api: false 1722 | require_api_key: false 1723 | results: HTML 1724 | language: de 1725 | 1726 | - name: słownik języka polskiego 1727 | engine: sjp 1728 | shortcut: sjp 1729 | base_url: https://sjp.pwn.pl/ 1730 | timeout: 5.0 1731 | disabled: true 1732 | 1733 | # wikimini: online encyclopedia for children 1734 | # The fulltext and title parameter is necessary for Wikimini because 1735 | # sometimes it will not show the results and redirect instead 1736 | - name: wikimini 1737 | engine: xpath 1738 | shortcut: wkmn 1739 | search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search 1740 | url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href 1741 | title_xpath: //li//div[@class="mw-search-result-heading"]/a 1742 | content_xpath: //li/div[@class="searchresult"] 1743 | categories: general 1744 | disabled: true 1745 | about: 1746 | website: https://wikimini.org/ 1747 | wikidata_id: Q3568032 1748 | use_official_api: false 1749 | require_api_key: false 1750 | results: HTML 1751 | language: fr 1752 | 1753 | - name: brave 1754 | shortcut: brave 1755 | engine: xpath 1756 | paging: true 1757 | first_page_num: 0 1758 | search_url: https://search.brave.com/search?q={query}&offset={pageno}&spellcheck=1 1759 | url_xpath: //a[@class="result-header"]/@href 1760 | title_xpath: //span[@class="snippet-title"] 1761 | content_xpath: //p[1][@class="snippet-description"] 1762 | suggestion_xpath: //div[@class="text-gray h6"]/a 1763 | categories: [general, web] 1764 | about: 1765 | website: https://brave.com/search/ 1766 | wikidata_id: Q107355971 1767 | use_official_api: false 1768 | require_api_key: false 1769 | results: HTML 1770 | 1771 | - name: petalsearch 1772 | shortcut: pts 1773 | engine: xpath 1774 | paging: true 1775 | search_url: https://petalsearch.com/search?query={query}&pn={pageno} 1776 | results_xpath: //div[@class="webpage-content"]/div[@class="title-cont"]/a 1777 | url_xpath: ./@href 1778 | title_xpath: . 1779 | content_xpath: ../../div[@class="webpage-text"] 1780 | suggestion_xpath: //div[@class="related-search-items"]/a 1781 | first_page_num: 1 1782 | disabled: true 1783 | about: 1784 | website: https://petalsearch.com/ 1785 | wikidata_id: Q104399280 1786 | use_official_api: false 1787 | require_api_key: false 1788 | results: HTML 1789 | 1790 | - name: petalsearch images 1791 | engine: petal_images 1792 | shortcut: ptsi 1793 | disabled: true 1794 | timeout: 3.0 1795 | 1796 | - name: petalsearch news 1797 | shortcut: ptsn 1798 | categories: news 1799 | engine: xpath 1800 | paging: true 1801 | search_url: https://petalsearch.com/search?channel=news&query={query}&pn={pageno} 1802 | results_xpath: //div[@class="news-container"]/div/div/div/a 1803 | url_xpath: ./@href 1804 | title_xpath: ./div 1805 | content_xpath: ../div[@class="news-text"] 1806 | thumbnail_xpath: ../../../../img/@src 1807 | first_page_num: 1 1808 | disabled: true 1809 | about: 1810 | website: https://petalsearch.com/ 1811 | wikidata_id: Q104399280 1812 | use_official_api: false 1813 | require_api_key: false 1814 | results: HTML 1815 | 1816 | # Doku engine lets you access to any Doku wiki instance: 1817 | # A public one or a privete/corporate one. 1818 | # - name: ubuntuwiki 1819 | # engine: doku 1820 | # shortcut: uw 1821 | # base_url: 'https://doc.ubuntu-fr.org' 1822 | 1823 | # Be careful when enabling this engine if you are 1824 | # running a public instance. Do not expose any sensitive 1825 | # information. You can restrict access by configuring a list 1826 | # of access tokens under tokens. 1827 | # - name: git grep 1828 | # engine: command 1829 | # command: ['git', 'grep', '{{QUERY}}'] 1830 | # shortcut: gg 1831 | # tokens: [] 1832 | # disabled: true 1833 | # delimiter: 1834 | # chars: ':' 1835 | # keys: ['filepath', 'code'] 1836 | 1837 | # Be careful when enabling this engine if you are 1838 | # running a public instance. Do not expose any sensitive 1839 | # information. You can restrict access by configuring a list 1840 | # of access tokens under tokens. 1841 | # - name: locate 1842 | # engine: command 1843 | # command: ['locate', '{{QUERY}}'] 1844 | # shortcut: loc 1845 | # tokens: [] 1846 | # disabled: true 1847 | # delimiter: 1848 | # chars: ' ' 1849 | # keys: ['line'] 1850 | 1851 | # Be careful when enabling this engine if you are 1852 | # running a public instance. Do not expose any sensitive 1853 | # information. You can restrict access by configuring a list 1854 | # of access tokens under tokens. 1855 | # - name: find 1856 | # engine: command 1857 | # command: ['find', '.', '-name', '{{QUERY}}'] 1858 | # query_type: path 1859 | # shortcut: fnd 1860 | # tokens: [] 1861 | # disabled: true 1862 | # delimiter: 1863 | # chars: ' ' 1864 | # keys: ['line'] 1865 | 1866 | # Be careful when enabling this engine if you are 1867 | # running a public instance. Do not expose any sensitive 1868 | # information. You can restrict access by configuring a list 1869 | # of access tokens under tokens. 1870 | # - name: pattern search in files 1871 | # engine: command 1872 | # command: ['fgrep', '{{QUERY}}'] 1873 | # shortcut: fgr 1874 | # tokens: [] 1875 | # disabled: true 1876 | # delimiter: 1877 | # chars: ' ' 1878 | # keys: ['line'] 1879 | 1880 | # Be careful when enabling this engine if you are 1881 | # running a public instance. Do not expose any sensitive 1882 | # information. You can restrict access by configuring a list 1883 | # of access tokens under tokens. 1884 | # - name: regex search in files 1885 | # engine: command 1886 | # command: ['grep', '{{QUERY}}'] 1887 | # shortcut: gr 1888 | # tokens: [] 1889 | # disabled: true 1890 | # delimiter: 1891 | # chars: ' ' 1892 | # keys: ['line'] 1893 | 1894 | doi_resolvers: 1895 | oadoi.org: 'https://oadoi.org/' 1896 | doi.org: 'https://doi.org/' 1897 | doai.io: 'https://dissem.in/' 1898 | sci-hub.se: 'https://sci-hub.se/' 1899 | sci-hub.do: 'https://sci-hub.do/' 1900 | scihubtw.tw: 'https://scihubtw.tw/' 1901 | sci-hub.st: 'https://sci-hub.st/' 1902 | sci-hub.bar: 'https://sci-hub.bar/' 1903 | sci-hub.it.nf: 'https://sci-hub.it.nf/' 1904 | 1905 | default_doi_resolver: 'oadoi.org' 1906 | 1907 | # Morty configuration 1908 | result_proxy: 1909 | url : https://searx.mydomain.com/morty/ 1910 | key : !!binary "ReplaceWithARealKey!" 1911 | --------------------------------------------------------------------------------