diff --git a/bazarr/.env b/bazarr/.env new file mode 100644 index 0000000..18c48f5 --- /dev/null +++ b/bazarr/.env @@ -0,0 +1,6 @@ +BASE_URL=bazarr. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/bazarr/Dockerfile b/bazarr/Dockerfile new file mode 100644 index 0000000..c1ab672 --- /dev/null +++ b/bazarr/Dockerfile @@ -0,0 +1,32 @@ +FROM docker.io/python:3.11-slim as base +ENV DEBIAN_FRONTEND=noninteractive \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + VIRTUAL_ENV="/opt/venv" \ + PATH="/opt/venv/bin:$PATH" +WORKDIR /app/ + +FROM base as build +RUN python -m venv "$VIRTUAL_ENV" +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + unzip \ + && rm -rf /var/lib/apt/lists/* +ARG URL="https://github.com/morpheus65535/bazarr/releases/latest/download/bazarr.zip" +RUN curl -LO "$URL" \ + && unzip bazarr.zip \ + && pip install -U --no-cache-dir -r requirements.txt \ + && rm bazarr.zip + +FROM base +COPY --from=build /app/ . +COPY --from=build "$VIRTUAL_ENV" "$VIRTUAL_ENV" +COPY entrypoint.sh /usr/local/bin/ +RUN useradd -m app +VOLUME /config/ +EXPOSE 6767 +ENTRYPOINT ["entrypoint.sh"] +CMD ["python", "bazarr.py", "--no-update", "--config=/config"] diff --git a/bazarr/compose.yaml b/bazarr/compose.yaml new file mode 100644 index 0000000..4fa6425 --- /dev/null +++ b/bazarr/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/bazarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + bazarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + - $MEDIA_PATH:/data/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/bazarr/entrypoint.sh b/bazarr/entrypoint.sh new file mode 100755 index 0000000..d8d4ff3 --- /dev/null +++ b/bazarr/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ -n "$PGID" ]; then + groupmod -g "$PGID" app +fi + +if [ -n "$PUID" ]; then + usermod -u "$PUID" app +fi + +chown -R app:app /app/ /config/ + +exec su app -c "$*" diff --git a/bazarr/install_site b/bazarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/bazarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/bazarr/nginx.conf b/bazarr/nginx.conf new file mode 100644 index 0000000..c9819ff --- /dev/null +++ b/bazarr/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://bazarr:6767; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_redirect off; + proxy_http_version 1.1; + } +} diff --git a/element/.env b/element/.env new file mode 100644 index 0000000..03c3aee --- /dev/null +++ b/element/.env @@ -0,0 +1,5 @@ +BASE_URL=chat. +EMAIL= + +PUID=1000 +PGID=1000 diff --git a/element/Dockerfile b/element/Dockerfile new file mode 100644 index 0000000..6036002 --- /dev/null +++ b/element/Dockerfile @@ -0,0 +1,2 @@ +FROM docker.io/vectorim/element-web:latest +COPY config.json /app/config.json diff --git a/element/compose.yaml b/element/compose.yaml new file mode 100644 index 0000000..5002cbf --- /dev/null +++ b/element/compose.yaml @@ -0,0 +1,32 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/element.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + element: + build: . + restart: unless-stopped + user: "$PUID:$PGID" + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + +networks: + nginx: + external: true diff --git a/element/config.json b/element/config.json new file mode 100644 index 0000000..1aa2e6b --- /dev/null +++ b/element/config.json @@ -0,0 +1,10 @@ +{ + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix.maby.dev" + } + }, + "setting_defaults": { + "use_system_theme": true + } +} diff --git a/element/install_site b/element/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/element/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/element/nginx.conf b/element/nginx.conf new file mode 100644 index 0000000..cf40a35 --- /dev/null +++ b/element/nginx.conf @@ -0,0 +1,27 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://element; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Cache-Control "no-cache"; + proxy_redirect off; + } +} diff --git a/gitea/.env b/gitea/.env new file mode 100644 index 0000000..d905ad9 --- /dev/null +++ b/gitea/.env @@ -0,0 +1,9 @@ +BASE_URL=git. +EMAIL= +POSTGRES_PASSWORD= + +PUID=1000 +PGID=1000 + +POSTGRES_DB=gitea +POSTGRES_USER=gitea diff --git a/gitea/compose.yaml b/gitea/compose.yaml new file mode 100644 index 0000000..1a94b9b --- /dev/null +++ b/gitea/compose.yaml @@ -0,0 +1,58 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/gitea.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + db: + image: docker.io/postgres:15 + restart: unless-stopped + volumes: + - db:/var/lib/postgresql/data/ + environment: + - POSTGRES_DB=$POSTGRES_DB + - POSTGRES_USER=$POSTGRES_USER + - POSTGRES_PASSWORD=$POSTGRES_PASSWORD + + gitea: + image: docker.io/gitea/gitea:1.20 + restart: unless-stopped + volumes: + - data:/data/ + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + environment: + - USER_UID=$PUID + - USER_GID=$PGID + - POSTGRES_HOST=db + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=db:5432 + - GITEA__database__NAME=$POSTGRES_DB + - GITEA__database__USER=$POSTGRES_USER + - GITEA__database__PASSWD=$POSTGRES_PASSWORD + networks: + - nginx + depends_on: + - db + +volumes: + data: + db: + sites: + external: true + certs: + external: true + certbotroot: + external: true + +networks: + nginx: + external: true diff --git a/gitea/install_site b/gitea/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/gitea/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/gitea/nginx.conf b/gitea/nginx.conf new file mode 100644 index 0000000..7154374 --- /dev/null +++ b/gitea/nginx.conf @@ -0,0 +1,27 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + client_max_body_size 8G; + + location / { + proxy_pass http://gitea:3000; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/jellyfin/.env b/jellyfin/.env new file mode 100644 index 0000000..5753416 --- /dev/null +++ b/jellyfin/.env @@ -0,0 +1,6 @@ +BASE_URL=jellyfin. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/jellyfin/compose.yaml b/jellyfin/compose.yaml new file mode 100644 index 0000000..48fb185 --- /dev/null +++ b/jellyfin/compose.yaml @@ -0,0 +1,36 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/jellyfin.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + jellyfin: + image: docker.io/jellyfin/jellyfin:latest + restart: unless-stopped + user: "$PUID:$PGID" + volumes: + - config:/config/ + - $MEDIA_PATH:/media/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/jellyfin/install_site b/jellyfin/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/jellyfin/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/jellyfin/nginx.conf b/jellyfin/nginx.conf new file mode 100644 index 0000000..3d7bde7 --- /dev/null +++ b/jellyfin/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://jellyfin:8096; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/lidarr/.env b/lidarr/.env new file mode 100644 index 0000000..301dd29 --- /dev/null +++ b/lidarr/.env @@ -0,0 +1,6 @@ +BASE_URL=lidarr. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/lidarr/Dockerfile b/lidarr/Dockerfile new file mode 100644 index 0000000..3c4e4c9 --- /dev/null +++ b/lidarr/Dockerfile @@ -0,0 +1,28 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG LIDARR="http://lidarr.servarr.com/v1/update/master/updatefile?os=linux&runtime=netcore&arch=x64" +RUN curl -L "$LIDARR" | tar xz --strip-components=1 + +FROM base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + libchromaprint-tools \ + mediainfo \ + sqlite3 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/ . +COPY entrypoint.sh /usr/local/bin/ +RUN useradd -m app +VOLUME /config/ +EXPOSE 8686 +ENTRYPOINT ["entrypoint.sh"] +CMD ["./Lidarr", "-nobrowser", "-data=/config"] diff --git a/lidarr/compose.yaml b/lidarr/compose.yaml new file mode 100644 index 0000000..c0f6146 --- /dev/null +++ b/lidarr/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/lidarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + lidarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + - $MEDIA_PATH:/data/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/lidarr/entrypoint.sh b/lidarr/entrypoint.sh new file mode 100755 index 0000000..f296830 --- /dev/null +++ b/lidarr/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ -n "$PGID" ]; then + groupmod -g "$PGID" app +fi + +if [ -n "$PUID" ]; then + usermod -u "$PUID" app +fi + +chown -R app:app /config/ + +exec su app -c "$*" diff --git a/lidarr/install_site b/lidarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/lidarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/lidarr/nginx.conf b/lidarr/nginx.conf new file mode 100644 index 0000000..ada07a2 --- /dev/null +++ b/lidarr/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://lidarr:8686; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/monero/Dockerfile b/monero/Dockerfile new file mode 100644 index 0000000..4188931 --- /dev/null +++ b/monero/Dockerfile @@ -0,0 +1,26 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bzip2 \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG MONERO='https://downloads.getmonero.org/cli/linux64' +RUN curl -L "$MONERO" | tar xj --strip-components=1 + +FROM base +COPY --from=build /app/ . +RUN useradd -m app +# Generate your wallet via accessing the container and run: +# cd /wallet +# monero-wallet-cli +RUN mkdir -p /home/app/.bitmonero/ /wallet/ \ + && chown -R app:app /home/app/ /wallet/ +VOLUME /home/app/.bitmonero/ /wallet/ +EXPOSE 18080 18081 +USER app +CMD ["./monerod", "--p2p-bind-ip=0.0.0.0", "--p2p-bind-port=18080", "--rpc-bind-ip=0.0.0.0", "--rpc-bind-port=18081", "--non-interactive", "--confirm-external-bind"] diff --git a/monero/compose.yaml b/monero/compose.yaml new file mode 100644 index 0000000..fc90ec8 --- /dev/null +++ b/monero/compose.yaml @@ -0,0 +1,15 @@ +--- +services: + monero: + build: . + restart: unless-stopped + ports: + - "18080:18080" + - "18081:18081" + volumes: + - wallet:/wallet/ + - blocks:/home/monero/.bitmonero/ + +volumes: + wallet: + blocks: diff --git a/monero/install_site b/monero/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/monero/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/mullvad/Dockerfile b/mullvad/Dockerfile new file mode 100644 index 0000000..339208c --- /dev/null +++ b/mullvad/Dockerfile @@ -0,0 +1,8 @@ +FROM docker.io/debian:12-slim +WORKDIR /etc/openvpn/ +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + openvpn \ + && rm -rf /var/lib/apt/lists/* +COPY openvpn/ /etc/openvpn/ +CMD ["openvpn", "--config", "mullvad_00.conf"] diff --git a/mullvad/compose.yaml b/mullvad/compose.yaml new file mode 100644 index 0000000..b761b3d --- /dev/null +++ b/mullvad/compose.yaml @@ -0,0 +1,10 @@ +--- +services: + mullvad: + build: . + restart: unless-stopped + network_mode: host + devices: + - /dev/net/ + cap_add: + - NET_ADMIN diff --git a/mullvad/install_site b/mullvad/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/mullvad/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/mullvad/openvpn/.gitignore b/mullvad/openvpn/.gitignore new file mode 100644 index 0000000..7c9d611 --- /dev/null +++ b/mullvad/openvpn/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!README.md diff --git a/mullvad/openvpn/README.md b/mullvad/openvpn/README.md new file mode 100644 index 0000000..1286b22 --- /dev/null +++ b/mullvad/openvpn/README.md @@ -0,0 +1,2 @@ +Put your openvpn config here +https://mullvad.net/en/account/openvpn-config diff --git a/nextcloud/.env b/nextcloud/.env new file mode 100644 index 0000000..9e1386c --- /dev/null +++ b/nextcloud/.env @@ -0,0 +1,11 @@ +BASE_URL=cloud. +EMAIL= +POSTGRES_PASSWORD= +DEFAULT_PHONE_REGION=FR +MEDIA_PATH=/media + +PUID=1000 +PGID=1000 + +POSTGRES_DB=nextcloud +POSTGRES_USER=nextcloud diff --git a/nextcloud/Dockerfile b/nextcloud/Dockerfile new file mode 100644 index 0000000..c48ca26 --- /dev/null +++ b/nextcloud/Dockerfile @@ -0,0 +1,5 @@ +FROM docker.io/nextcloud:26-apache +COPY config/ /usr/src/nextcloud/config/ +COPY entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/nextcloud/compose.yaml b/nextcloud/compose.yaml new file mode 100644 index 0000000..0518fd1 --- /dev/null +++ b/nextcloud/compose.yaml @@ -0,0 +1,66 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/nextcloud.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + db: + image: docker.io/postgres:15 + restart: unless-stopped + volumes: + - db:/var/lib/postgresql/data/ + environment: + - POSTGRES_DB + - POSTGRES_USER + - POSTGRES_PASSWORD + + redis: + image: docker.io/redis:latest + restart: unless-stopped + + nextcloud: + build: . + restart: unless-stopped + volumes: + - nextcloud:/var/www/html/ + - apps:/var/www/html/custom_apps/ + - config:/var/www/html/config/ + - data:/var/www/html/data/ + - $MEDIA_PATH:/media/ + env_file: + - .env + environment: + - POSTGRES_HOST=db + - REDIS_HOST=redis + - TRUSTED_PROXIES=nextcloud + - OVERWRITEPROTOCOL=https + networks: + - nginx + depends_on: + - db + - redis + +volumes: + db: + nextcloud: + apps: + config: + data: + sites: + external: true + certs: + external: true + certbotroot: + external: true + +networks: + nginx: + external: true diff --git a/nextcloud/config/phone.config.php b/nextcloud/config/phone.config.php new file mode 100644 index 0000000..bb6c349 --- /dev/null +++ b/nextcloud/config/phone.config.php @@ -0,0 +1,5 @@ + "/sites/$f" +done + +printf "POST /containers/nginx/kill?signal=SIGHUP HTTP/1.0\r\n\n" \ + | nc -U /var/run/docker.sock diff --git a/prowlarr/.env b/prowlarr/.env new file mode 100644 index 0000000..7163369 --- /dev/null +++ b/prowlarr/.env @@ -0,0 +1,2 @@ +BASE_URL=prowlarr. +EMAIL= diff --git a/prowlarr/Dockerfile b/prowlarr/Dockerfile new file mode 100644 index 0000000..8a91f71 --- /dev/null +++ b/prowlarr/Dockerfile @@ -0,0 +1,25 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG PROWLARR="http://prowlarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=x64" +RUN curl -L "$PROWLARR" | tar xz --strip-components=1 + +FROM base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + libicu72 \ + sqlite3 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/ . +RUN useradd -m app +VOLUME /config/ +EXPOSE 9696 +CMD ["./Prowlarr", "-nobrowser", "-data=/config"] diff --git a/prowlarr/compose.yaml b/prowlarr/compose.yaml new file mode 100644 index 0000000..5c2536e --- /dev/null +++ b/prowlarr/compose.yaml @@ -0,0 +1,37 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/prowlarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + prowlarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/prowlarr/install_site b/prowlarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/prowlarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/prowlarr/nginx.conf b/prowlarr/nginx.conf new file mode 100644 index 0000000..e829b2e --- /dev/null +++ b/prowlarr/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://prowlarr:9696; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_redirect off; + proxy_http_version 1.1; + } +} diff --git a/qbittorrent/.env b/qbittorrent/.env new file mode 100644 index 0000000..b9c66ff --- /dev/null +++ b/qbittorrent/.env @@ -0,0 +1,6 @@ +BASE_URL=torrent. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/qbittorrent/compose.yaml b/qbittorrent/compose.yaml new file mode 100644 index 0000000..853d44c --- /dev/null +++ b/qbittorrent/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/qbittorrent.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + qbittorrent: + image: docker.io/qbittorrentofficial/qbittorrent-nox:latest + restart: unless-stopped + environment: + - QBT_EULA=accept + - QBT_DOWNLOADS_PATH=/data/torrents/ + volumes: + - $MEDIA_PATH/torrents/:/data/torrents/ + - config:/config + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/qbittorrent/install_site b/qbittorrent/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/qbittorrent/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/qbittorrent/nginx.conf b/qbittorrent/nginx.conf new file mode 100644 index 0000000..9f3b857 --- /dev/null +++ b/qbittorrent/nginx.conf @@ -0,0 +1,24 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://qbittorrent:8080; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-For $remote_addr; + } +} diff --git a/radarr/.env b/radarr/.env new file mode 100644 index 0000000..4784cec --- /dev/null +++ b/radarr/.env @@ -0,0 +1,6 @@ +BASE_URL=radarr. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/radarr/Dockerfile b/radarr/Dockerfile new file mode 100644 index 0000000..35b76d5 --- /dev/null +++ b/radarr/Dockerfile @@ -0,0 +1,27 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG RADARR="http://radarr.servarr.com/v1/update/master/updatefile?os=linux&runtime=netcore&arch=x64" +RUN curl -L "$RADARR" | tar xz --strip-components=1 + +FROM base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + libicu72 \ + sqlite3 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/ . +COPY entrypoint.sh /usr/local/bin/ +RUN useradd -m app +VOLUME /config/ +EXPOSE 7878 +ENTRYPOINT ["entrypoint.sh"] +CMD ["./Radarr", "-nobrowser", "-data=/config"] diff --git a/radarr/compose.yaml b/radarr/compose.yaml new file mode 100644 index 0000000..cd17d44 --- /dev/null +++ b/radarr/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/radarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + radarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + - $MEDIA_PATH:/data/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/radarr/entrypoint.sh b/radarr/entrypoint.sh new file mode 100755 index 0000000..f296830 --- /dev/null +++ b/radarr/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ -n "$PGID" ]; then + groupmod -g "$PGID" app +fi + +if [ -n "$PUID" ]; then + usermod -u "$PUID" app +fi + +chown -R app:app /config/ + +exec su app -c "$*" diff --git a/radarr/install_site b/radarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/radarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/radarr/nginx.conf b/radarr/nginx.conf new file mode 100644 index 0000000..fb0a161 --- /dev/null +++ b/radarr/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://radarr:7878; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_redirect off; + proxy_http_version 1.1; + } +} diff --git a/readarr/.env b/readarr/.env new file mode 100644 index 0000000..920f401 --- /dev/null +++ b/readarr/.env @@ -0,0 +1,6 @@ +BASE_URL=readarr. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/readarr/Dockerfile b/readarr/Dockerfile new file mode 100644 index 0000000..6263dc5 --- /dev/null +++ b/readarr/Dockerfile @@ -0,0 +1,27 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG READARR="https://readarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=x64" +RUN curl -L "$READARR" | tar xz --strip-components=1 + +FROM base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + libicu72 \ + sqlite3 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/ . +COPY entrypoint.sh /usr/local/bin/ +RUN useradd -m app +VOLUME /config/ +EXPOSE 8787 +ENTRYPOINT ["entrypoint.sh"] +CMD ["./Readarr", "-nobrowser", "-data=/config"] diff --git a/readarr/compose.yaml b/readarr/compose.yaml new file mode 100644 index 0000000..5e19feb --- /dev/null +++ b/readarr/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/readarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + readarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + - $MEDIA_PATH:/data/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/readarr/entrypoint.sh b/readarr/entrypoint.sh new file mode 100755 index 0000000..f296830 --- /dev/null +++ b/readarr/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ -n "$PGID" ]; then + groupmod -g "$PGID" app +fi + +if [ -n "$PUID" ]; then + usermod -u "$PUID" app +fi + +chown -R app:app /config/ + +exec su app -c "$*" diff --git a/readarr/install_site b/readarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/readarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/readarr/nginx.conf b/readarr/nginx.conf new file mode 100644 index 0000000..ea26f0b --- /dev/null +++ b/readarr/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://readarr:8787; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_redirect off; + proxy_http_version 1.1; + } +} diff --git a/searxng/.env b/searxng/.env new file mode 100644 index 0000000..f3c6a19 --- /dev/null +++ b/searxng/.env @@ -0,0 +1,2 @@ +BASE_URL=searx. +EMAIL= diff --git a/searxng/Dockerfile b/searxng/Dockerfile new file mode 100644 index 0000000..f1f087a --- /dev/null +++ b/searxng/Dockerfile @@ -0,0 +1,5 @@ +FROM docker.io/searxng/searxng:latest +COPY settings.yml /tmp/ +COPY entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["entrypoint.sh"] +CMD ["/sbin/tini", "--", "/usr/local/searxng/dockerfiles/docker-entrypoint.sh"] diff --git a/searxng/compose.yaml b/searxng/compose.yaml new file mode 100644 index 0000000..6265582 --- /dev/null +++ b/searxng/compose.yaml @@ -0,0 +1,42 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/searxng.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + redis: + image: docker.io/redis:latest + restart: unless-stopped + + searxng: + build: . + restart: unless-stopped + volumes: + - config:/etc/searxng/ + environment: + - REDIS_HOST=redis + networks: + - nginx + depends_on: + - redis + +volumes: + config: + sites: + external: true + certs: + external: true + certbotroot: + external: true + +networks: + nginx: + external: true diff --git a/searxng/entrypoint.sh b/searxng/entrypoint.sh new file mode 100755 index 0000000..bfb68a5 --- /dev/null +++ b/searxng/entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/sh -e + +sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" /tmp/settings.yml + +mv /tmp/settings.yml "$SEARXNG_SETTINGS_PATH" + +exec "$@" diff --git a/searxng/install_site b/searxng/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/searxng/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/searxng/nginx.conf b/searxng/nginx.conf new file mode 100644 index 0000000..8434b5f --- /dev/null +++ b/searxng/nginx.conf @@ -0,0 +1,26 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://searxng:8080; + + proxy_set_header Host $host; + proxy_set_header Connection $http_connection; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/searxng/settings.yml b/searxng/settings.yml new file mode 100644 index 0000000..e84bb01 --- /dev/null +++ b/searxng/settings.yml @@ -0,0 +1,2013 @@ +general: + # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} + debug: false + # displayed name + instance_name: "SearXNG" + # For example: https://example.com/privacy + privacypolicy_url: false + # use true to use your own donation page written in searx/info/en/donate.md + # use false to disable the donation link + donation_url: https://docs.searxng.org/donate.html + # mailto:contact@example.com + contact_url: false + # record stats + enable_metrics: true + +brand: + new_issue_url: https://github.com/searxng/searxng/issues/new + docs_url: https://docs.searxng.org/ + public_instances: https://searx.space + wiki_url: https://github.com/searxng/searxng/wiki + issue_url: https://github.com/searxng/searxng/issues + +search: + # Filter results. 0: None, 1: Moderate, 2: Strict + safe_search: 0 + # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex", + # "seznam", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off + # by default. + autocomplete: "duckduckgo" + # minimun characters to type before autocompleter starts + autocomplete_min: 4 + # Default search language - leave blank to detect from browser information or + # use codes from 'languages.py' + default_lang: "auto" + # Available languages + # languages: + # - all + # - en + # - en-US + # - de + # - it-IT + # - fr + # - fr-BE + # ban time in seconds after engine errors + ban_time_on_fail: 5 + # max ban time in seconds after engine errors + max_ban_time_on_fail: 120 + suspended_times: + # Engine suspension time after error (in seconds; set to 0 to disable) + # For error "Access denied" and "HTTP error [402, 403]" + SearxEngineAccessDenied: 86400 + # For error "CAPTCHA" + SearxEngineCaptcha: 86400 + # For error "Too many request" and "HTTP error 429" + SearxEngineTooManyRequests: 3600 + # Cloudflare CAPTCHA + cf_SearxEngineCaptcha: 1296000 + cf_SearxEngineAccessDenied: 86400 + # ReCAPTCHA + recaptcha_SearxEngineCaptcha: 604800 + + # remove format to deny access, use lower case. + # formats: [html, csv, json, rss] + formats: + - html + +server: + # If you change port, bind_address or base_url don't forget to rebuild + # instance's environment (make buildenv). Is overwritten by ${SEARXNG_PORT} + # and ${SEARXNG_BIND_ADDRESS} + port: 8888 + bind_address: "127.0.0.1" + # public URL of the instance, to ensure correct inbound links. Is overwritten + # by ${SEARXNG_URL}. + base_url: false # "http://example.com/location" + limiter: false # rate limit the number of request on the instance, block some bots + + # If your instance owns a /etc/searxng/settings.yml file, then set the following + # values there. + + secret_key: "ultrasecretkey" # Is overwritten by ${SEARXNG_SECRET} + # Proxying image results through searx + image_proxy: false + # 1.0 and 1.1 are supported + http_protocol_version: "1.0" + # POST queries are more secure as they don't show up in history but may cause + # problems when using Firefox containers + method: "GET" + default_http_headers: + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Download-Options: noopen + X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer + +redis: + # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. + # https://redis-py.readthedocs.io/en/stable/connections.html#redis.client.Redis.from_url + url: false + +ui: + # Custom static path - leave it blank if you didn't change + static_path: "" + static_use_hash: false + # Custom templates path - leave it blank if you didn't change + templates_path: "" + # query_in_title: When true, the result page's titles contains the query + # it decreases the privacy, since the browser can records the page titles. + query_in_title: true + # infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page. + infinite_scroll: false + # ui theme + default_theme: simple + # center the results ? + center_alignment: false + # URL prefix of the internet archive, don't forgett trailing slash (if needed). + # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" + # Default interface locale - leave blank to detect from browser information or + # use codes from the 'locales' config section + default_locale: "" + # Open result links in a new tab by default + # results_on_new_tab: false + theme_args: + # style of simple theme: auto, light, dark + simple_style: auto + +# Lock arbitrary settings on the preferences page. To find the ID of the user +# setting you want to lock, check the ID of the form on the page "preferences". +# +# preferences: +# lock: +# - language +# - autocomplete +# - method +# - query_in_title + +# searx supports result proxification using an external service: +# https://github.com/asciimoo/morty uncomment below section if you have running +# morty proxy the key is base64 encoded (keep the !!binary notation) +# Note: since commit af77ec3, morty accepts a base64 encoded key. +# +# result_proxy: +# url: http://127.0.0.1:3000/ +# # the key is a base64 encoded string, the YAML !!binary prefix is optional +# key: !!binary "your_morty_proxy_key" +# # [true|false] enable the "proxy" button next to each result +# proxify_results: true + +# communication with search engines +# +outgoing: + # default timeout in seconds, can be override by engine + request_timeout: 3.0 + # the maximum timeout in seconds + # max_request_timeout: 10.0 + # suffix of searx_useragent, could contain information like an email address + # to the administrator + useragent_suffix: "" + # The maximum number of concurrent connections that may be established. + pool_connections: 100 + # Allow the connection pool to maintain keep-alive connections below this + # point. + pool_maxsize: 20 + # See https://www.python-httpx.org/http2/ + enable_http2: true + # uncomment below section if you want to use a custom server certificate + # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults + # and https://www.python-httpx.org/compatibility/#ssl-configuration + # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer + # + # uncomment below section if you want to use a proxyq see: SOCKS proxies + # https://2.python-requests.org/en/latest/user/advanced/#proxies + # are also supported: see + # https://2.python-requests.org/en/latest/user/advanced/#socks + # + # proxies: + # all://: + # - http://proxy1:8080 + # - http://proxy2:8080 + # + # using_tor_proxy: true + # + # Extra seconds to add in order to account for the time taken by the proxy + # + # extra_proxy_timeout: 10.0 + # + # uncomment below section only if you have more than one network interface + # which can be the source of outgoing search requests + # + # source_ips: + # - 1.1.1.1 + # - 1.1.1.2 + # - fe80::/126 + +# External plugin configuration, for more details see +# https://docs.searxng.org/dev/plugins.html +# +# plugins: +# - plugin1 +# - plugin2 +# - ... + +# Comment or un-comment plugin to activate / deactivate by default. +# +# enabled_plugins: +# # these plugins are enabled if nothing is configured .. +# - 'Hash plugin' +# - 'Search on category select' +# - 'Self Information' +# - 'Tracker URL remover' +# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy +# # these plugins are disabled if nothing is configured .. +# - 'Hostname replace' # see hostname_replace configuration below +# - 'Open Access DOI rewrite' +# - 'Vim-like hotkeys' +# - 'Tor check plugin' +# # Read the docs before activate: auto-detection of the language could be +# # detrimental to users expectations / users can activate the plugin in the +# # preferences if they want. +# - 'Autodetect search language' + +# Configuration of the "Hostname replace" plugin: +# +# hostname_replace: +# '(.*\.)?youtube\.com$': 'invidious.example.com' +# '(.*\.)?youtu\.be$': 'invidious.example.com' +# '(.*\.)?youtube-noocookie\.com$': 'yotter.example.com' +# '(.*\.)?reddit\.com$': 'teddit.example.com' +# '(.*\.)?redd\.it$': 'teddit.example.com' +# '(www\.)?twitter\.com$': 'nitter.example.com' +# # to remove matching host names from result list, set value to false +# 'spam\.example\.com': false + +checker: + # disable checker when in debug mode + off_when_debug: true + + # use "scheduling: false" to disable scheduling + # scheduling: interval or int + + # to activate the scheduler: + # * uncomment "scheduling" section + # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" + # to your uwsgi.ini + + # scheduling: + # start_after: [300, 1800] # delay to start the first run of the checker + # every: [86400, 90000] # how often the checker runs + + # additional tests: only for the YAML anchors (see the engines section) + # + additional_tests: + rosebud: &test_rosebud + matrix: + query: rosebud + lang: en + result_container: + - not_empty + - ['one_title_contains', 'citizen kane'] + test: + - unique_results + + android: &test_android + matrix: + query: ['android'] + lang: ['en', 'de', 'fr', 'zh-CN'] + result_container: + - not_empty + - ['one_title_contains', 'google'] + test: + - unique_results + + # tests: only for the YAML anchors (see the engines section) + tests: + infobox: &tests_infobox + infobox: + matrix: + query: ["linux", "new york", "bbc"] + result_container: + - has_infobox + +categories_as_tabs: + general: + images: + videos: + news: + map: + +engines: + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + + - name: apk mirror + engine: apkmirror + timeout: 4.0 + shortcut: apkm + disabled: true + + - name: apple app store + engine: apple_app_store + shortcut: aps + disabled: true + + # Requires Tor + - name: ahmia + engine: ahmia + categories: onions + enable_http: true + shortcut: ah + + - name: arch linux wiki + engine: archlinux + shortcut: al + + - name: archive is + engine: xpath + search_url: https://archive.is/search/?q={query} + url_xpath: (//div[@class="TEXT-BLOCK"]/a)/@href + title_xpath: (//div[@class="TEXT-BLOCK"]/a) + content_xpath: //div[@class="TEXT-BLOCK"]/ul/li + categories: general + timeout: 7.0 + disabled: true + shortcut: ai + soft_max_redirects: 1 + about: + website: https://archive.is/ + wikidata_id: Q13515725 + official_api_documentation: https://mementoweb.org/depot/native/archiveis/ + use_official_api: false + require_api_key: false + results: HTML + + - name: artic + engine: artic + shortcut: arc + timeout: 4.0 + + - name: arxiv + engine: arxiv + shortcut: arx + timeout: 4.0 + + # tmp suspended: dh key too small + # - name: base + # engine: base + # shortcut: bs + + - name: bandcamp + engine: bandcamp + shortcut: bc + categories: music + + - name: wikipedia + engine: wikipedia + shortcut: wp + base_url: 'https://{language}.wikipedia.org/' + + - name: bing + engine: bing + shortcut: bi + disabled: true + + - name: bing images + engine: bing_images + shortcut: bii + disabled: true + + - name: bing news + engine: bing_news + shortcut: bin + disabled: true + + - name: bing videos + engine: bing_videos + shortcut: biv + disabled: true + + - name: bitbucket + engine: xpath + paging: true + search_url: https://bitbucket.org/repo/all/{pageno}?name={query} + url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href + title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] + content_xpath: //article[@class="repo-summary"]/p + categories: [it, repos] + timeout: 4.0 + disabled: true + shortcut: bb + about: + website: https://bitbucket.org/ + wikidata_id: Q2493781 + official_api_documentation: https://developer.atlassian.com/bitbucket + use_official_api: false + require_api_key: false + results: HTML + + - name: btdigg + engine: btdigg + shortcut: bt + + - name: ccc-tv + engine: xpath + paging: false + search_url: https://media.ccc.de/search/?q={query} + url_xpath: //div[@class="caption"]/h3/a/@href + title_xpath: //div[@class="caption"]/h3/a/text() + content_xpath: //div[@class="caption"]/h4/@title + categories: videos + disabled: true + shortcut: c3tv + about: + website: https://media.ccc.de/ + wikidata_id: Q80729951 + official_api_documentation: https://github.com/voc/voctoweb + use_official_api: false + require_api_key: false + results: HTML + # We don't set language: de here because media.ccc.de is not just + # for a German audience. It contains many English videos and many + # German videos have English subtitles. + + - name: openverse + engine: openverse + categories: images + shortcut: opv + + # - name: core.ac.uk + # engine: core + # categories: science + # shortcut: cor + # # get your API key from: https://core.ac.uk/api-keys/register/ + # api_key: 'unset' + + - name: crossref + engine: crossref + shortcut: cr + timeout: 30 + disabled: true + + - name: yep + engine: json_engine + shortcut: yep + categories: general + disabled: true + paging: false + content_html_to_text: true + title_html_to_text: true + search_url: https://api.yep.com/fs/1/?type=web&q={query}&no_correct=false&limit=100 + results_query: 1/results + title_query: title + url_query: url + content_query: snippet + about: + website: https://yep.com + use_official_api: false + require_api_key: false + results: JSON + + - name: curlie + engine: xpath + shortcut: cl + categories: general + disabled: true + paging: true + lang_all: '' + search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 + page_size: 20 + results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] + url_xpath: ./div[@class="title-and-desc"]/a/@href + title_xpath: ./div[@class="title-and-desc"]/a/div + content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] + about: + website: https://curlie.org/ + wikidata_id: Q60715723 + use_official_api: false + require_api_key: false + results: HTML + + - name: currency + engine: currency_convert + categories: general + shortcut: cc + + - name: deezer + engine: deezer + shortcut: dz + disabled: true + + - name: deviantart + engine: deviantart + shortcut: da + timeout: 3.0 + + - name: ddg definitions + engine: duckduckgo_definitions + shortcut: ddd + weight: 2 + disabled: true + tests: *tests_infobox + + # cloudflare protected + # - name: digbt + # engine: digbt + # shortcut: dbt + # timeout: 6.0 + # disabled: true + + - name: docker hub + engine: docker_hub + shortcut: dh + categories: [it, packages] + + - name: erowid + engine: xpath + paging: true + first_page_num: 0 + page_size: 30 + search_url: https://www.erowid.org/search.php?q={query}&s={pageno} + url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href + title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() + content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] + categories: [] + shortcut: ew + disabled: true + about: + website: https://www.erowid.org/ + wikidata_id: Q1430691 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: elasticsearch + # shortcut: es + # engine: elasticsearch + # base_url: http://localhost:9200 + # username: elastic + # password: changeme + # index: my-index + # # available options: match, simple_query_string, term, terms, custom + # query_type: match + # # if query_type is set to custom, provide your query here + # #custom_query_json: {"query":{"match_all": {}}} + # #show_metadata: false + # disabled: true + + - name: wikidata + engine: wikidata + shortcut: wd + timeout: 3.0 + weight: 2 + tests: *tests_infobox + disabled: true + + - name: duckduckgo + engine: duckduckgo + shortcut: ddg + + - name: duckduckgo images + engine: duckduckgo_images + shortcut: ddi + timeout: 3.0 + disabled: true + + - name: duckduckgo weather + engine: duckduckgo_weather + shortcut: ddw + disabled: true + + - name: apple maps + engine: apple_maps + shortcut: apm + disabled: true + timeout: 5.0 + + - name: emojipedia + engine: emojipedia + timeout: 4.0 + shortcut: em + disabled: true + + - name: tineye + engine: tineye + shortcut: tin + timeout: 9.0 + disabled: true + + - name: etymonline + engine: xpath + paging: true + search_url: https://etymonline.com/search?page={pageno}&q={query} + url_xpath: //a[contains(@class, "word__name--")]/@href + title_xpath: //a[contains(@class, "word__name--")] + content_xpath: //section[contains(@class, "word__defination")] + first_page_num: 1 + shortcut: et + categories: [dictionaries] + disabled: false + about: + website: https://www.etymonline.com/ + wikidata_id: Q1188617 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: ebay + # engine: ebay + # shortcut: eb + # base_url: 'https://www.ebay.com' + # disabled: true + # timeout: 5 + + - name: 1x + engine: www1x + shortcut: 1x + timeout: 3.0 + disabled: true + + - name: fdroid + engine: fdroid + shortcut: fd + disabled: true + + - name: flickr + categories: images + shortcut: fl + # You can use the engine using the official stable API, but you need an API + # key, see: https://www.flickr.com/services/apps/create/ + # engine: flickr + # api_key: 'apikey' # required! + # Or you can use the html non-stable engine, activated by default + engine: flickr_noapi + + - name: free software directory + engine: mediawiki + shortcut: fsd + categories: [it, software wikis] + base_url: https://directory.fsf.org/ + number_of_results: 5 + # what part of a page matches the query string: title, text, nearmatch + # * title - query matches title + # * text - query matches the text of page + # * nearmatch - nearmatch in title + search_type: title + timeout: 5.0 + disabled: true + about: + website: https://directory.fsf.org/ + wikidata_id: Q2470288 + + # - name: freesound + # engine: freesound + # shortcut: fnd + # disabled: true + # timeout: 15.0 + # API key required, see: https://freesound.org/docs/api/overview.html + # api_key: MyAPIkey + + - name: frinkiac + engine: frinkiac + shortcut: frk + disabled: true + + - name: genius + engine: genius + shortcut: gen + + - name: gentoo + engine: gentoo + shortcut: ge + timeout: 10.0 + + - name: gitlab + engine: json_engine + paging: true + search_url: https://gitlab.com/api/v4/projects?search={query}&page={pageno} + url_query: web_url + title_query: name_with_namespace + content_query: description + page_size: 20 + categories: [it, repos] + shortcut: gl + timeout: 10.0 + disabled: true + about: + website: https://about.gitlab.com/ + wikidata_id: Q16639197 + official_api_documentation: https://docs.gitlab.com/ee/api/ + use_official_api: false + require_api_key: false + results: JSON + + - name: github + engine: github + shortcut: gh + + # This a Gitea service. If you would like to use a different instance, + # change codeberg.org to URL of the desired Gitea host. Or you can create a + # new engine by copying this and changing the name, shortcut and search_url. + + - name: codeberg + engine: json_engine + search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10 + url_query: html_url + title_query: name + content_query: description + categories: [it, repos] + shortcut: cb + disabled: true + about: + website: https://codeberg.org/ + wikidata_id: + official_api_documentation: https://try.gitea.io/api/swagger + use_official_api: false + require_api_key: false + results: JSON + + - name: google + engine: google + shortcut: go + # additional_tests: + # android: *test_android + + - name: google images + engine: google_images + shortcut: goi + # additional_tests: + # android: *test_android + # dali: + # matrix: + # query: ['Dali Christ'] + # lang: ['en', 'de', 'fr', 'zh-CN'] + # result_container: + # - ['one_title_contains', 'Salvador'] + + - name: google news + engine: google_news + shortcut: gon + # additional_tests: + # android: *test_android + + - name: google videos + engine: google_videos + shortcut: gov + # additional_tests: + # android: *test_android + + - name: google scholar + engine: google_scholar + shortcut: gos + + - name: google play apps + engine: google_play + categories: [files, apps] + shortcut: gpa + play_categ: apps + disabled: true + + - name: google play movies + engine: google_play + categories: videos + shortcut: gpm + play_categ: movies + disabled: true + + - name: gpodder + engine: json_engine + shortcut: gpod + timeout: 4.0 + paging: false + search_url: https://gpodder.net/search.json?q={query} + url_query: url + title_query: title + content_query: description + page_size: 19 + categories: music + disabled: true + about: + website: https://gpodder.net + wikidata_id: Q3093354 + official_api_documentation: https://gpoddernet.readthedocs.io/en/latest/api/ + use_official_api: false + requires_api_key: false + results: JSON + + - name: habrahabr + engine: xpath + paging: true + search_url: https://habrahabr.ru/search/page{pageno}/?q={query} + url_xpath: //article[contains(@class, "post")]//a[@class="post__title_link"]/@href + title_xpath: //article[contains(@class, "post")]//a[@class="post__title_link"] + content_xpath: //article[contains(@class, "post")]//div[contains(@class, "post__text")] + categories: it + timeout: 4.0 + disabled: true + shortcut: habr + about: + website: https://habr.com/ + wikidata_id: Q4494434 + official_api_documentation: https://habr.com/en/docs/help/api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: hoogle + engine: xpath + paging: true + search_url: https://hoogle.haskell.org/?hoogle={query}&start={pageno} + results_xpath: '//div[@class="result"]' + title_xpath: './/div[@class="ans"]//a' + url_xpath: './/div[@class="ans"]//a/@href' + content_xpath: './/div[@class="from"]' + page_size: 20 + categories: [it, packages] + shortcut: ho + about: + website: https://hoogle.haskell.org/ + wikidata_id: Q34010 + official_api_documentation: https://hackage.haskell.org/api + use_official_api: false + require_api_key: false + results: JSON + + - name: imdb + engine: imdb + shortcut: imdb + timeout: 6.0 + disabled: true + + - name: ina + engine: ina + shortcut: in + timeout: 6.0 + disabled: true + + - name: invidious + engine: invidious + # Instanes will be selected randomly, see https://api.invidious.io/ for + # instances that are stable (good uptime) and close to you. + base_url: + - https://invidious.snopyta.org + - https://vid.puffyan.us + # - https://invidious.kavin.rocks # Error 1020 // Access denied by Cloudflare + - https://invidio.xamh.de + - https://inv.riverside.rocks + shortcut: iv + timeout: 3.0 + disabled: true + + - name: jisho + engine: jisho + shortcut: js + timeout: 3.0 + disabled: true + + - name: kickass + engine: kickass + shortcut: kc + timeout: 4.0 + disabled: true + + - name: library genesis + engine: xpath + search_url: https://libgen.fun/search.php?req={query} + url_xpath: //a[contains(@href,"get.php?md5")]/@href + title_xpath: //a[contains(@href,"book/")]/text()[1] + content_xpath: //td/a[1][contains(@href,"=author")]/text() + categories: files + timeout: 7.0 + disabled: true + shortcut: lg + about: + website: https://libgen.fun/ + wikidata_id: Q22017206 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # Disabling zlibrary due to z-lib.org domain seizure + # https://github.com/searxng/searxng/pull/1937 + # + # - name: z-library + # engine: zlibrary + # shortcut: zlib + # categories: files + # timeout: 3.0 + # # choose base_url, otherwise engine will do it at initialization time + # # base_url: https://b-ok.cc + # # base_url: https://de1lib.org + # # base_url: https://booksc.eu # does not have cover preview + # # base_url: https://booksc.org # does not have cover preview + + - name: library of congress + engine: loc + shortcut: loc + categories: images + + - name: lingva + engine: lingva + shortcut: lv + # set lingva instance in url, by default it will use the official instance + # url: https://lingva.ml + + - name: lobste.rs + engine: xpath + search_url: https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance + results_xpath: //li[contains(@class, "story")] + url_xpath: .//a[@class="u-url"]/@href + title_xpath: .//a[@class="u-url"] + content_xpath: .//a[@class="domain"] + categories: it + shortcut: lo + timeout: 5.0 + disabled: true + about: + website: https://lobste.rs/ + wikidata_id: Q60762874 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: azlyrics + shortcut: lyrics + engine: xpath + timeout: 4.0 + disabled: true + categories: [music, lyrics] + paging: true + search_url: https://search.azlyrics.com/search.php?q={query}&w=lyrics&p={pageno} + url_xpath: //td[@class="text-left visitedlyr"]/a/@href + title_xpath: //span/b/text() + content_xpath: //td[@class="text-left visitedlyr"]/a/small + about: + website: https://azlyrics.com + wikidata_id: Q66372542 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: metacpan + engine: metacpan + shortcut: cpan + disabled: true + number_of_results: 20 + + # - name: meilisearch + # engine: meilisearch + # shortcut: mes + # enable_http: true + # base_url: http://localhost:7700 + # index: my-index + + - name: mixcloud + engine: mixcloud + shortcut: mc + + # MongoDB engine + # Required dependency: pymongo + # - name: mymongo + # engine: mongodb + # shortcut: md + # exact_match_only: false + # host: '127.0.0.1' + # port: 27017 + # enable_http: true + # results_per_page: 20 + # database: 'business' + # collection: 'reviews' # name of the db collection + # key: 'name' # key in the collection to search for + + - name: npm + engine: json_engine + paging: true + first_page_num: 0 + search_url: https://api.npms.io/v2/search?q={query}&size=25&from={pageno} + results_query: results + url_query: package/links/npm + title_query: package/name + content_query: package/description + page_size: 25 + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: npm + about: + website: https://npms.io/ + wikidata_id: Q7067518 + official_api_documentation: https://api-docs.npms.io/ + use_official_api: false + require_api_key: false + results: JSON + + - name: nyaa + engine: nyaa + shortcut: nt + disabled: true + + - name: mankier + engine: json_engine + search_url: https://www.mankier.com/api/v2/mans/?q={query} + results_query: results + url_query: url + title_query: name + content_query: description + categories: it + shortcut: man + about: + website: https://www.mankier.com/ + official_api_documentation: https://www.mankier.com/api + use_official_api: true + require_api_key: false + results: JSON + + - name: openairedatasets + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: "science" + shortcut: oad + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openairepublications + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: science + shortcut: oap + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + # - name: opensemanticsearch + # engine: opensemantic + # shortcut: oss + # base_url: 'http://localhost:8983/solr/opensemanticsearch/' + + - name: openstreetmap + engine: openstreetmap + shortcut: osm + + - name: openrepos + engine: xpath + paging: true + search_url: https://openrepos.net/search/node/{query}?page={pageno} + url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href + title_xpath: //li[@class="search-result"]//h3[@class="title"]/a + content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] + categories: files + timeout: 4.0 + disabled: true + shortcut: or + about: + website: https://openrepos.net/ + wikidata_id: + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: packagist + engine: json_engine + paging: true + search_url: https://packagist.org/search.json?q={query}&page={pageno} + results_query: results + url_query: url + title_query: name + content_query: description + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: pack + about: + website: https://packagist.org + wikidata_id: Q108311377 + official_api_documentation: https://packagist.org/apidoc + use_official_api: true + require_api_key: false + results: JSON + + - name: pdbe + engine: pdbe + shortcut: pdb + # Hide obsolete PDB entries. Default is not to hide obsolete structures + # hide_obsolete: false + + - name: photon + engine: photon + shortcut: ph + + - name: piratebay + engine: piratebay + shortcut: tpb + # You may need to change this URL to a proxy if piratebay is blocked in your + # country + url: https://thepiratebay.org/ + timeout: 3.0 + + # Required dependency: psychopg2 + # - name: postgresql + # engine: postgresql + # database: postgres + # username: postgres + # password: postgres + # limit: 10 + # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' + # shortcut : psql + + - name: pub.dev + engine: xpath + shortcut: pd + search_url: https://pub.dev/packages?q={query}&page={pageno} + paging: true + results_xpath: /html/body/main/div/div[@class="search-results"]/div[@class="packages"]/div + url_xpath: ./div/h3/a/@href + title_xpath: ./div/h3/a + content_xpath: ./p[@class="packages-description"] + categories: [packages, it] + timeout: 3.0 + disabled: true + first_page_num: 1 + about: + website: https://pub.dev/ + official_api_documentation: https://pub.dev/help/api + use_official_api: false + require_api_key: false + results: HTML + + - name: pubmed + engine: pubmed + shortcut: pub + timeout: 3.0 + + - name: pypi + shortcut: pypi + engine: xpath + paging: true + search_url: https://pypi.org/search?q={query}&page={pageno} + results_xpath: /html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"] + url_xpath: ./@href + title_xpath: ./h3/span[@class="package-snippet__name"] + content_xpath: ./p + suggestion_xpath: /html/body/main/div/div/div/form/div/div[@class="callout-block"]/p/span/a[@class="link"] + first_page_num: 1 + categories: [it, packages] + about: + website: https://pypi.org + wikidata_id: Q2984686 + official_api_documentation: https://warehouse.readthedocs.io/api-reference/index.html + use_official_api: false + require_api_key: false + results: HTML + + - name: qwant + qwant_categ: web + engine: qwant + shortcut: qw + categories: [general, web] + disabled: false + additional_tests: + rosebud: *test_rosebud + + - name: qwant news + qwant_categ: news + engine: qwant + shortcut: qwn + categories: news + disabled: false + network: qwant + + - name: qwant images + qwant_categ: images + engine: qwant + shortcut: qwi + categories: [images, web] + disabled: true + network: qwant + + - name: qwant videos + qwant_categ: videos + engine: qwant + shortcut: qwv + categories: [videos, web] + disabled: true + network: qwant + + # - name: library + # engine: recoll + # shortcut: lib + # base_url: 'https://recoll.example.org/' + # search_dir: '' + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # timeout: 30.0 + # categories: files + # disabled: true + + # - name: recoll library reference + # engine: recoll + # base_url: 'https://recoll.example.org/' + # search_dir: reference + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # shortcut: libr + # timeout: 30.0 + # categories: files + # disabled: true + + - name: reddit + engine: reddit + shortcut: re + page_size: 25 + + # Required dependency: redis + # - name: myredis + # shortcut : rds + # engine: redis_server + # exact_match_only: false + # host: '127.0.0.1' + # port: 6379 + # enable_http: true + # password: '' + # db: 0 + + # tmp suspended: bad certificate + # - name: scanr structures + # shortcut: scs + # engine: scanr_structures + # disabled: true + + - name: sepiasearch + engine: sepiasearch + shortcut: sep + + - name: soundcloud + engine: soundcloud + shortcut: sc + + - name: stackoverflow + engine: stackexchange + shortcut: st + api_site: 'stackoverflow' + categories: [it, q&a] + + - name: askubuntu + engine: stackexchange + shortcut: ubuntu + api_site: 'askubuntu' + categories: [it, q&a] + + - name: superuser + engine: stackexchange + shortcut: su + api_site: 'superuser' + categories: [it, q&a] + + - name: searchcode code + engine: searchcode_code + shortcut: scc + disabled: true + + - name: framalibre + engine: framalibre + shortcut: frl + disabled: true + + # - name: searx + # engine: searx_engine + # shortcut: se + # instance_urls : + # - http://127.0.0.1:8888/ + # - ... + # disabled: true + + - name: semantic scholar + engine: semantic_scholar + disabled: true + shortcut: se + + # Spotify needs API credentials + # - name: spotify + # engine: spotify + # shortcut: stf + # api_client_id: ******* + # api_client_secret: ******* + + # - name: solr + # engine: solr + # shortcut: slr + # base_url: http://localhost:8983 + # collection: collection_name + # sort: '' # sorting: asc or desc + # field_list: '' # comma separated list of field names to display on the UI + # default_fields: '' # default field to query + # query_fields: '' # query fields + # enable_http: true + + # - name: springer nature + # engine: springer + # # get your API key from: https://dev.springernature.com/signup + # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" + # api_key: 'unset' + # shortcut: springer + # timeout: 15.0 + + - name: startpage + engine: startpage + shortcut: sp + timeout: 6.0 + disabled: true + additional_tests: + rosebud: *test_rosebud + + - name: tokyotoshokan + engine: tokyotoshokan + shortcut: tt + timeout: 6.0 + disabled: true + + - name: solidtorrents + engine: solidtorrents + shortcut: solid + timeout: 4.0 + disabled: false + base_url: + - https://solidtorrents.net + - https://solidtorrents.eu + - https://solidtorrents.to + - https://bitsearch.to + + # For this demo of the sqlite engine download: + # https://liste.mediathekview.de/filmliste-v2.db.bz2 + # and unpack into searx/data/filmliste-v2.db + # Query to test: "!demo concert" + # + # - name: demo + # engine: sqlite + # shortcut: demo + # categories: general + # result_template: default.html + # database: searx/data/filmliste-v2.db + # query_str: >- + # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, + # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, + # description AS content + # FROM film + # WHERE title LIKE :wildcard OR description LIKE :wildcard + # ORDER BY duration DESC + # disabled: false + + # Requires Tor + - name: torch + engine: xpath + paging: true + search_url: + http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and + results_xpath: //table//tr + url_xpath: ./td[2]/a + title_xpath: ./td[2]/b + content_xpath: ./td[2]/small + categories: onions + enable_http: true + shortcut: tch + + # torznab engine lets you query any torznab compatible indexer. Using this + # engine in combination with Jackett (https://github.com/Jackett/Jackett) + # opens the possibility to query a lot of public and private indexers directly + # from SearXNG. + # - name: torznab + # engine: torznab + # shortcut: trz + # base_url: http://localhost:9117/api/v2.0/indexers/all/results/torznab + # enable_http: true # if using localhost + # api_key: xxxxxxxxxxxxxxx + # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories + # torznab_categories: # optional + # - 2000 + # - 5000 + + - name: twitter + shortcut: tw + engine: twitter + disabled: true + + # maybe in a fun category + # - name: uncyclopedia + # engine: mediawiki + # shortcut: unc + # base_url: https://uncyclopedia.wikia.com/ + # number_of_results: 5 + + # tmp suspended - too slow, too many errors + # - name: urbandictionary + # engine : xpath + # search_url : https://www.urbandictionary.com/define.php?term={query} + # url_xpath : //*[@class="word"]/@href + # title_xpath : //*[@class="def-header"] + # content_xpath: //*[@class="meaning"] + # shortcut: ud + + - name: unsplash + engine: unsplash + shortcut: us + + - name: yahoo + engine: yahoo + shortcut: yh + disabled: true + + - name: yahoo news + engine: yahoo_news + shortcut: yhn + + - name: youtube + shortcut: yt + # You can use the engine using the official stable API, but you need an API + # key See: https://console.developers.google.com/project + # + # engine: youtube_api + # api_key: 'apikey' # required! + # + # Or you can use the html non-stable engine, activated by default + engine: youtube_noapi + + - name: dailymotion + engine: dailymotion + shortcut: dm + + - name: vimeo + engine: vimeo + shortcut: vm + + - name: wiby + engine: json_engine + paging: true + search_url: https://wiby.me/json/?q={query}&p={pageno} + url_query: URL + title_query: Title + content_query: Snippet + categories: [general, web] + shortcut: wib + disabled: true + about: + website: https://wiby.me/ + + - name: marginalia + engine: json_engine + shortcut: mar + categories: general + paging: false + # index: {"0": "popular", "1": "blogs", "2": "big_sites", + # "3": "default", "4": experimental"} + search_url: https://api.marginalia.nu/public/search/{query}?index=4&count=20 + results_query: results + url_query: url + title_query: title + content_query: description + timeout: 1.5 + disabled: true + about: + website: https://www.marginalia.nu/ + official_api_documentation: https://api.marginalia.nu/ + use_official_api: true + require_api_key: true + results: JSON + + - name: alexandria + engine: json_engine + shortcut: alx + categories: general + paging: true + search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} + results_query: results + title_query: title + url_query: url + content_query: snippet + timeout: 1.5 + disabled: true + about: + website: https://alexandria.org/ + official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md + use_official_api: true + require_api_key: false + results: JSON + + - name: wikibooks + engine: mediawiki + shortcut: wb + categories: general + base_url: "https://{language}.wikibooks.org/" + number_of_results: 5 + search_type: text + disabled: true + about: + website: https://www.wikibooks.org/ + wikidata_id: Q367 + + - name: wikinews + engine: mediawiki + shortcut: wn + categories: news + base_url: "https://{language}.wikinews.org/" + number_of_results: 5 + search_type: text + disabled: true + about: + website: https://www.wikinews.org/ + wikidata_id: Q964 + + - name: wikiquote + engine: mediawiki + shortcut: wq + categories: general + base_url: "https://{language}.wikiquote.org/" + number_of_results: 5 + search_type: text + disabled: true + additional_tests: + rosebud: *test_rosebud + about: + website: https://www.wikiquote.org/ + wikidata_id: Q369 + + - name: wikisource + engine: mediawiki + shortcut: ws + categories: general + base_url: "https://{language}.wikisource.org/" + number_of_results: 5 + search_type: text + disabled: true + about: + website: https://www.wikisource.org/ + wikidata_id: Q263 + + - name: wiktionary + engine: mediawiki + shortcut: wt + categories: [dictionaries] + base_url: "https://{language}.wiktionary.org/" + number_of_results: 5 + search_type: text + disabled: false + about: + website: https://www.wiktionary.org/ + wikidata_id: Q151 + + - name: wikiversity + engine: mediawiki + shortcut: wv + categories: general + base_url: "https://{language}.wikiversity.org/" + number_of_results: 5 + search_type: text + disabled: true + about: + website: https://www.wikiversity.org/ + wikidata_id: Q370 + + - name: wikivoyage + engine: mediawiki + shortcut: wy + categories: general + base_url: "https://{language}.wikivoyage.org/" + number_of_results: 5 + search_type: text + disabled: true + about: + website: https://www.wikivoyage.org/ + wikidata_id: Q373 + + - name: wolframalpha + shortcut: wa + # You can use the engine using the official stable API, but you need an API + # key. See: https://products.wolframalpha.com/api/ + # + # engine: wolframalpha_api + # api_key: '' + # + # Or you can use the html non-stable engine, activated by default + engine: wolframalpha_noapi + timeout: 6.0 + categories: [] + + - name: dictzone + engine: dictzone + shortcut: dc + + - name: mymemory translated + engine: translated + shortcut: tl + timeout: 5.0 + disabled: false + # You can use without an API key, but you are limited to 1000 words/day + # See: https://mymemory.translated.net/doc/usagelimits.php + # api_key: '' + + # Required dependency: mysql-connector-python + # - name: mysql + # engine: mysql_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mysql + + - name: 1337x + engine: 1337x + shortcut: 1337x + disabled: true + + - name: duden + engine: duden + shortcut: du + disabled: true + + - name: seznam + shortcut: szn + engine: seznam + disabled: true + + # - name: deepl + # engine: deepl + # shortcut: dpl + # # You can use the engine using the official stable API, but you need an API key + # # See: https://www.deepl.com/pro-api?cta=header-pro-api + # api_key: '' # required! + # timeout: 5.0 + # disabled: true + + - name: mojeek + shortcut: mjk + engine: xpath + paging: true + categories: [general, web] + search_url: https://www.mojeek.com/search?q={query}&s={pageno}&lang={lang}&lb={lang} + results_xpath: //ul[@class="results-standard"]/li/a[@class="ob"] + url_xpath: ./@href + title_xpath: ../h2/a + content_xpath: ..//p[@class="s"] + suggestion_xpath: //div[@class="top-info"]/p[@class="top-info spell"]/em/a + first_page_num: 0 + page_size: 10 + disabled: true + about: + website: https://www.mojeek.com/ + wikidata_id: Q60747299 + official_api_documentation: https://www.mojeek.com/services/api.html/ + use_official_api: false + require_api_key: false + results: HTML + + - name: naver + shortcut: nvr + categories: [general, web] + engine: xpath + paging: true + search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} + url_xpath: //a[@class="link_tit"]/@href + title_xpath: //a[@class="link_tit"] + content_xpath: //a[@class="total_dsc"]/div + first_page_num: 1 + page_size: 10 + disabled: true + about: + website: https://www.naver.com/ + wikidata_id: Q485639 + official_api_documentation: https://developers.naver.com/docs/nmt/examples/ + use_official_api: false + require_api_key: false + results: HTML + language: ko + + - name: rubygems + shortcut: rbg + engine: xpath + paging: true + search_url: https://rubygems.org/search?page={pageno}&query={query} + results_xpath: /html/body/main/div/a[@class="gems__gem"] + url_xpath: ./@href + title_xpath: ./span/h2 + content_xpath: ./span/p + suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a + first_page_num: 1 + categories: [it, packages] + disabled: true + about: + website: https://rubygems.org/ + wikidata_id: Q1853420 + official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: peertube + engine: peertube + shortcut: ptb + paging: true + # alternatives see: https://instances.joinpeertube.org/instances + # base_url: https://tube.4aem.com + categories: videos + disabled: true + timeout: 6.0 + + - name: mediathekviewweb + engine: mediathekviewweb + shortcut: mvw + disabled: true + + # - name: yacy + # engine: yacy + # shortcut: ya + # base_url: http://localhost:8090 + # required if you aren't using HTTPS for your local yacy instance' + # enable_http: true + # number_of_results: 5 + # timeout: 3.0 + + - name: rumble + engine: rumble + shortcut: ru + base_url: https://rumble.com/ + paging: true + categories: videos + disabled: true + + - name: wordnik + engine: wordnik + shortcut: def + base_url: https://www.wordnik.com/ + categories: [dictionaries] + timeout: 5.0 + disabled: false + + - name: woxikon.de synonyme + engine: xpath + shortcut: woxi + categories: [dictionaries] + timeout: 5.0 + disabled: true + search_url: https://synonyme.woxikon.de/synonyme/{query}.php + url_xpath: //div[@class="upper-synonyms"]/a/@href + content_xpath: //div[@class="synonyms-list-group"] + title_xpath: //div[@class="upper-synonyms"]/a + no_result_for_http_status: [404] + about: + website: https://www.woxikon.de/ + wikidata_id: # No Wikidata ID + use_official_api: false + require_api_key: false + results: HTML + language: de + + - name: sjp.pwn + engine: sjp + shortcut: sjp + base_url: https://sjp.pwn.pl/ + timeout: 5.0 + disabled: true + + # wikimini: online encyclopedia for children + # The fulltext and title parameter is necessary for Wikimini because + # sometimes it will not show the results and redirect instead + - name: wikimini + engine: xpath + shortcut: wkmn + search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search + url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href + title_xpath: //li//div[@class="mw-search-result-heading"]/a + content_xpath: //li/div[@class="searchresult"] + categories: general + disabled: true + about: + website: https://wikimini.org/ + wikidata_id: Q3568032 + use_official_api: false + require_api_key: false + results: HTML + language: fr + + - name: wttr.in + engine: wttr + shortcut: wttr + timeout: 9.0 + + - name: brave + shortcut: brave + engine: xpath + paging: true + time_range_support: true + first_page_num: 0 + time_range_url: "&tf={time_range_val}" + search_url: https://search.brave.com/search?q={query}&offset={pageno}&spellcheck=1{time_range} + url_xpath: //a[@class="result-header"]/@href + title_xpath: //span[@class="snippet-title"] + content_xpath: //p[1][@class="snippet-description"] + suggestion_xpath: //div[@class="text-gray h6"]/a + time_range_map: + day: 'pd' + week: 'pw' + month: 'pm' + year: 'py' + categories: [general, web] + disabled: true + headers: + Accept-Encoding: gzip, deflate + about: + website: https://brave.com/search/ + wikidata_id: Q107355971 + use_official_api: false + require_api_key: false + results: HTML + + - name: petalsearch + shortcut: pts + engine: xpath + paging: true + search_url: https://petalsearch.com/search?query={query}&pn={pageno} + url_xpath: //div[@class='card-source'] + title_xpath: //div[@class='title-name'] + content_xpath: //div[@class='webpage-text'] + first_page_num: 1 + disabled: true + headers: + User-Agent: Mozilla/5.0 (Linux; Android 7.0;) \ + AppleWebKit/537.36 (KHTML, like Gecko) \ + Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot) + about: + website: https://petalsearch.com/ + wikidata_id: Q104399280 + use_official_api: false + require_api_key: false + results: HTML + + - name: petalsearch images + engine: petal_images + shortcut: ptsi + disabled: true + timeout: 3.0 + + - name: lib.rs + shortcut: lrs + engine: xpath + search_url: https://lib.rs/search?q={query} + results_xpath: /html/body/main/div/ol/li/a + url_xpath: ./@href + title_xpath: ./div[@class="h"]/h4 + content_xpath: ./div[@class="h"]/p + categories: [it, packages] + disabled: true + about: + website: https://lib.rs + wikidata_id: Q113486010 + use_official_api: false + require_api_key: false + results: HTML + + - name: sourcehut + shortcut: srht + engine: xpath + paging: true + search_url: https://sr.ht/projects?page={pageno}&search={query} + results_xpath: (//div[@class="event-list"])[1]/div[@class="event"] + url_xpath: ./h4/a[2]/@href + title_xpath: ./h4/a[2] + content_xpath: ./p + first_page_num: 1 + categories: [it, repos] + disabled: true + about: + website: https://sr.ht + wikidata_id: Q78514485 + official_api_documentation: https://man.sr.ht/ + use_official_api: false + require_api_key: false + results: HTML + + - name: goo + shortcut: goo + engine: xpath + paging: true + search_url: https://search.goo.ne.jp/web.jsp?MT={query}&FR={pageno}0 + url_xpath: //div[@class="result"]/p[@class='title fsL1']/a/@href + title_xpath: //div[@class="result"]/p[@class='title fsL1']/a + content_xpath: //p[contains(@class,'url fsM')]/following-sibling::p + first_page_num: 0 + categories: [general, web] + disabled: true + timeout: 4.0 + about: + website: https://search.goo.ne.jp + wikidata_id: Q249044 + use_official_api: false + require_api_key: false + results: HTML + language: ja + +# Doku engine lets you access to any Doku wiki instance: +# A public one or a privete/corporate one. +# - name: ubuntuwiki +# engine: doku +# shortcut: uw +# base_url: 'https://doc.ubuntu-fr.org' + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: git grep +# engine: command +# command: ['git', 'grep', '{{QUERY}}'] +# shortcut: gg +# tokens: [] +# disabled: true +# delimiter: +# chars: ':' +# keys: ['filepath', 'code'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: locate +# engine: command +# command: ['locate', '{{QUERY}}'] +# shortcut: loc +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: find +# engine: command +# command: ['find', '.', '-name', '{{QUERY}}'] +# query_type: path +# shortcut: fnd +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: pattern search in files +# engine: command +# command: ['fgrep', '{{QUERY}}'] +# shortcut: fgr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: regex search in files +# engine: command +# command: ['grep', '{{QUERY}}'] +# shortcut: gr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +doi_resolvers: + oadoi.org: 'https://oadoi.org/' + doi.org: 'https://doi.org/' + doai.io: 'https://dissem.in/' + sci-hub.se: 'https://sci-hub.se/' + sci-hub.st: 'https://sci-hub.st/' + sci-hub.ru: 'https://sci-hub.ru/' + +default_doi_resolver: 'oadoi.org' diff --git a/sonarr/.env b/sonarr/.env new file mode 100644 index 0000000..ea01f80 --- /dev/null +++ b/sonarr/.env @@ -0,0 +1,6 @@ +BASE_URL=sonarr. +EMAIL= +MEDIA_PATH= + +PUID=1000 +PGID=1000 diff --git a/sonarr/Dockerfile b/sonarr/Dockerfile new file mode 100644 index 0000000..fbfe906 --- /dev/null +++ b/sonarr/Dockerfile @@ -0,0 +1,48 @@ +FROM docker.io/debian:12-slim as base +ENV DEBIAN_FRONTEND=noninteractive +WORKDIR /app/ + +FROM base as build +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* +ARG SONARR="https://services.sonarr.tv/v1/download/main/latest?version=3&os=linux" +RUN curl -L "$SONARR" | tar xz --strip-components=1 + +FROM base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + libmono-corlib4.5-cil \ + libmono-microsoft-csharp4.0-cil \ + libmono-posix4.0-cil \ + libmono-system-componentmodel-dataannotations4.0-cil \ + libmono-system-configuration-install4.0-cil \ + libmono-system-configuration4.0-cil \ + libmono-system-core4.0-cil \ + libmono-system-data-datasetextensions4.0-cil \ + libmono-system-data4.0-cil \ + libmono-system-identitymodel4.0-cil \ + libmono-system-io-compression4.0-cil \ + libmono-system-net-http4.0-cil \ + libmono-system-numerics4.0-cil \ + libmono-system-runtime-serialization4.0-cil \ + libmono-system-security4.0-cil \ + libmono-system-servicemodel4.0a-cil \ + libmono-system-serviceprocess4.0-cil \ + libmono-system-transactions4.0-cil \ + libmono-system-web4.0-cil \ + libmono-system-xml-linq4.0-cil \ + libmono-system-xml4.0-cil \ + libmono-system4.0-cil \ + mediainfo \ + mono-runtime \ + && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/ . +COPY entrypoint.sh /usr/local/bin/ +RUN useradd -m app +VOLUME /config/ +EXPOSE 8989 +ENTRYPOINT ["entrypoint.sh"] +CMD ["mono", "Sonarr.exe", "-nobrowser", "-data=/config"] diff --git a/sonarr/compose.yaml b/sonarr/compose.yaml new file mode 100644 index 0000000..07784ed --- /dev/null +++ b/sonarr/compose.yaml @@ -0,0 +1,38 @@ +--- +services: + install_site: + build: install_site + environment: + - BASE_URL + - EMAIL + volumes: + - ./nginx.conf:/web/sonarr.conf + - sites:/sites/ + - certs:/etc/letsencrypt/ + - certbotroot:/var/www/certbot/ + - /var/run/docker.sock:/var/run/docker.sock + + sonarr: + build: . + restart: unless-stopped + environment: + - PUID + - PGID + volumes: + - config:/config/ + - $MEDIA_PATH:/data/ + networks: + - nginx + +volumes: + sites: + external: true + certs: + external: true + certbotroot: + external: true + config: + +networks: + nginx: + external: true diff --git a/sonarr/entrypoint.sh b/sonarr/entrypoint.sh new file mode 100755 index 0000000..f296830 --- /dev/null +++ b/sonarr/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ -n "$PGID" ]; then + groupmod -g "$PGID" app +fi + +if [ -n "$PUID" ]; then + usermod -u "$PUID" app +fi + +chown -R app:app /config/ + +exec su app -c "$*" diff --git a/sonarr/install_site b/sonarr/install_site new file mode 120000 index 0000000..565584b --- /dev/null +++ b/sonarr/install_site @@ -0,0 +1 @@ +../nginx/install_site \ No newline at end of file diff --git a/sonarr/nginx.conf b/sonarr/nginx.conf new file mode 100644 index 0000000..b2a5ed4 --- /dev/null +++ b/sonarr/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + listen [::]:80; + server_name $BASE_URL; + + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name $BASE_URL; + + ssl_certificate /etc/letsencrypt/live/$BASE_URL/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem; + + location / { + proxy_pass http://sonarr:8989; + + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_redirect off; + proxy_http_version 1.1; + } +} diff --git a/todo b/todo new file mode 100644 index 0000000..f8ad16d --- /dev/null +++ b/todo @@ -0,0 +1,10 @@ +nginx autoreload with install_site +openvpn auto download config from mullvad? +https://docs.gitea.com/installation/install-with-docker#ssh-container-passthrough +docs +monero auto wallet creation + +- modoboa +- collabora +- bitcoin +- minecraft-server