From fde295b84bb322c2cc9b12dbffd1affac00f20ec Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Fri, 17 Mar 2023 09:34:39 +0100 Subject: [PATCH] Initial build https://github.com/alexbelgium/hassio-addons/issues/581 --- autobrr/CHANGELOG.md | 1 + autobrr/Dockerfile | 145 ++++ autobrr/README.md | 67 ++ autobrr/apparmor.txt | 66 ++ autobrr/build.json | 10 + autobrr/config.json | 90 +++ autobrr/icon.png | Bin 0 -> 15103 bytes autobrr/logo.png | Bin 0 -> 15103 bytes autobrr/rootfs/etc/cont-init.d/20-folders.sh | 13 + .../etc/cont-init.d/32-nginx_ingress.sh | 15 + autobrr/rootfs/etc/nginx/includes/mime.types | 96 +++ .../etc/nginx/includes/proxy_params.conf | 16 + .../rootfs/etc/nginx/includes/resolver.conf | 1 + .../etc/nginx/includes/server_params.conf | 6 + .../rootfs/etc/nginx/includes/ssl_params.conf | 9 + .../rootfs/etc/nginx/includes/upstream.conf | 3 + autobrr/rootfs/etc/nginx/nginx.conf | 57 ++ autobrr/rootfs/etc/nginx/servers/ingress.conf | 29 + autobrr/rootfs/etc/services.d/nginx/finish | 8 + autobrr/rootfs/etc/services.d/nginx/run | 29 + autobrr/translations/en.yaml | 659 ++++++++++++++++++ autobrr/updater.json | 8 + 22 files changed, 1328 insertions(+) create mode 100644 autobrr/CHANGELOG.md create mode 100644 autobrr/Dockerfile create mode 100644 autobrr/README.md create mode 100644 autobrr/apparmor.txt create mode 100644 autobrr/build.json create mode 100644 autobrr/config.json create mode 100644 autobrr/icon.png create mode 100644 autobrr/logo.png create mode 100644 autobrr/rootfs/etc/cont-init.d/20-folders.sh create mode 100644 autobrr/rootfs/etc/cont-init.d/32-nginx_ingress.sh create mode 100644 autobrr/rootfs/etc/nginx/includes/mime.types create mode 100644 autobrr/rootfs/etc/nginx/includes/proxy_params.conf create mode 100644 autobrr/rootfs/etc/nginx/includes/resolver.conf create mode 100644 autobrr/rootfs/etc/nginx/includes/server_params.conf create mode 100644 autobrr/rootfs/etc/nginx/includes/ssl_params.conf create mode 100644 autobrr/rootfs/etc/nginx/includes/upstream.conf create mode 100644 autobrr/rootfs/etc/nginx/nginx.conf create mode 100644 autobrr/rootfs/etc/nginx/servers/ingress.conf create mode 100644 autobrr/rootfs/etc/services.d/nginx/finish create mode 100644 autobrr/rootfs/etc/services.d/nginx/run create mode 100644 autobrr/translations/en.yaml create mode 100644 autobrr/updater.json diff --git a/autobrr/CHANGELOG.md b/autobrr/CHANGELOG.md new file mode 100644 index 000000000..8d414fa40 --- /dev/null +++ b/autobrr/CHANGELOG.md @@ -0,0 +1 @@ +- First version diff --git a/autobrr/Dockerfile b/autobrr/Dockerfile new file mode 100644 index 000000000..0939afa7b --- /dev/null +++ b/autobrr/Dockerfile @@ -0,0 +1,145 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="test" +FROM ${BUILD_FROM} + +################## +# 2 Modify Image # +################## + +# Set S6 wait time +ENV S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_SERVICES_GRACETIME=0 + +# Global LSIO modifications +ARG CONFIGLOCATION="/config/addons_config/autobrr" +# hadolint ignore=SC2015, SC2013, SC2086 +RUN \ + # Avoid custom-init.d duplications + for file in $(grep -sril 'Potential tampering with custom' /etc/cont-init.d /etc/services.d /etc/s6-overlay/s6-rc.d); do rm -f $file; done \ + \ + # Create new config folder if needed + && for file in $(grep -srl "PUID" /etc/cont-init.d /etc/s6-overlay/s6-rc.d); do sed -i "1a mkdir -p $CONFIGLOCATION" $file; done \ + \ + # Allow UID and GID setting + && for file in $(grep -srl "PUID" /etc/cont-init.d /etc/s6-overlay/s6-rc.d); do sed -i 's/bash/bashio/g' $file && sed -i '1a PUID="$(if bashio::config.has_value "PUID"; then bashio::config "PUID"; else echo "0"; fi)"' $file && sed -i '1a PGID="$(if bashio::config.has_value "PGID"; then bashio::config "PGID"; else echo "0"; fi)"' $file; done \ + \ + # Correct config location + && for file in $(grep -Esril "/config[ '\"/]|/config\$" /etc /defaults); do sed -Ei "s=(/config)+(/| |$|\"|\')=$CONFIGLOCATION\2=g" $file; done \ + \ + # Avoid chmod /config + && for file in /etc/services.d/*/* /etc/cont-init.d/* /etc/s6-overlay/s6-rc.d/*/*;do if [ -f $file ] && [[ ! -z $(awk '/chown.*abc:abc.*\\/,/.*\/config( |$)/{print FILENAME}' $file) ]] ; then sed -i "s|/config$|/data|g" $file; fi ;done \ + \ + # Docker mods addition + #&& if [ -f /docker-mods ]; then sed -i 's|bash|bashio|g' /docker-mods && sed -i "1a if bashio::config.has_value \"DOCKER_MODS\"; then DOCKER_MODS=\$(bashio::config \"DOCKER_MODS\"); fi" /docker-mods; fi \ + \ + # Replace lsiown if not found + && if [ ! -f /usr/bin/lsiown ]; then for file in $(grep -sril "lsiown" /etc); do sed -i "s|lsiown|chown|g" $file; done; fi + +################## +# 3 Install apps # +################## + +# Add rootfs +COPY rootfs/ / + +# Corrects permissions for s6 v3 +RUN if [ -d /etc/cont-init.d ]; then chmod -R 755 /etc/cont-init.d; fi && \ + if [ -d /etc/services.d ]; then chmod -R 755 /etc/services.d; fi && \ + if [ -f /entrypoint.sh ]; then chmod 755 /entrypoint.sh; fi + +# Modules +ARG MODULES="00-banner.sh 01-custom_script.sh 90-disable_ingress.sh 92-local_mounts.sh 92-smb_mounts.sh" + +# Automatic modules download +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates >/dev/null || true \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d + +# Manual apps +ENV PACKAGES="jq \ + curl \ + cifs-utils \ + keyutils nginx" + +# Automatic apps & bashio +# hadolint ignore=SC2015 +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh + +################ +# 4 Entrypoint # +################ + +#RUN chmod 777 /entrypoint.sh +#WORKDIR / +#ENTRYPOINT [ "/usr/bin/env" ] +#CMD [ "/entrypoint.sh" ] +#SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} + +################# +# 6 Healthcheck # +################# + +ENV HEALTH_PORT="7474" \ + HEALTH_URL="" +HEALTHCHECK \ + --interval=5s \ + --retries=5 \ + --start-period=30s \ + --timeout=25s \ + CMD curl --fail "http://127.0.0.1:${HEALTH_PORT}${HEALTH_URL}" &>/dev/null || exit 1 diff --git a/autobrr/README.md b/autobrr/README.md new file mode 100644 index 000000000..a2d0c2cee --- /dev/null +++ b/autobrr/README.md @@ -0,0 +1,67 @@ +# Home assistant add-on: Autobrrf + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +![Version](https://img.shields.io/badge/dynamic/json?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fautobrr%2Fconfig.json) +![Ingress](https://img.shields.io/badge/dynamic/json?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fautobrr%2Fconfig.json) +![Arch](https://img.shields.io/badge/dynamic/json?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fautobrr%2Fconfig.json) + +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade) +[![GitHub Super-Linter](https://github.com/alexbelgium/hassio-addons/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Builder](https://github.com/alexbelgium/hassio-addons/workflows/Builder/badge.svg)](https://github.com/alexbelgium/hassio-addons/actions/workflows/builder.yaml) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://git-lister.onrender.com/api/stars/alexbelgium/hassio-addons?limit=30)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +--- + +[Autobrr](https://autobrr.com/) autobrr is the modern download automation tool for torrents. With inspiration and ideas from tools like trackarr, autodl-irssi and flexget we built one tool that can do it all, and then some. + +This addon is based on the docker image https://github.com/autobrr/autobrr + +## Installation + +--- + +The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on. + +1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Set the add-on options to your preferences +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Open the webUI and adapt the software options + +## Configuration + +--- + +Webui can be found at . +The default username/password : described in the startup log. +Configurations can be done through the app webUI, except for the following options + +```yaml +PGID: user +GPID: user +TZ: timezone +localdisks: sda1 #put the hardware name of your drive to mount separated by commas, or its label. ex. sda1, sdb1, MYNAS... +networkdisks: "//SERVER/SHARE" # optional, list of smb servers to mount, separated by commas +cifsusername: "username" # optional, smb username, same for all smb shares +cifspassword: "password" # optional, smb password +WEBUI_USERNAME: webui username +WEBUI_PASSWORD: password +``` + +## Support + +Create an issue on github + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/autobrr/apparmor.txt b/autobrr/apparmor.txt new file mode 100644 index 000000000..ad452921c --- /dev/null +++ b/autobrr/apparmor.txt @@ -0,0 +1,66 @@ +#include + +profile autobrr_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + network unix dgram, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /init ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /run/{,**} rwk, + /dev/tty rw, + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/fuse mrwkl, + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/nvme0 mrwkl, + /dev/nvme1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/autobrr/build.json b/autobrr/build.json new file mode 100644 index 000000000..13364e3cc --- /dev/null +++ b/autobrr/build.json @@ -0,0 +1,10 @@ +{ + "build_from": { + "aarch64": "ghcr.io/autobrr/autobrr:latest", + "amd64": "ghcr.io/autobrr/autobrr:latest", + "armv7": "ghcr.io/autobrr/autobrr:latest" + }, + "codenotary": { + "signer": "alexandrep.github@gmail.com" + } +} diff --git a/autobrr/config.json b/autobrr/config.json new file mode 100644 index 000000000..be7444617 --- /dev/null +++ b/autobrr/config.json @@ -0,0 +1,90 @@ +{ + "arch": [ + "aarch64", + "amd64", + "armv7" + ], + "codenotary": "alexandrep.github@gmail.com", + "description": "Automation for downloads", + "devices": [ + "/dev/sda", + "/dev/sdb", + "/dev/sdc", + "/dev/sdd", + "/dev/sde", + "/dev/sdf", + "/dev/sdg", + "/dev/nvme", + "/dev/nvme0n1p1", + "/dev/nvme0n1p2", + "/dev/mmcblk", + "/dev/fuse", + "/dev/sda1", + "/dev/sdb1", + "/dev/sdc1", + "/dev/sdd1", + "/dev/sde1", + "/dev/sdf1", + "/dev/sdg1", + "/dev/sda2", + "/dev/sdb2", + "/dev/sdc2", + "/dev/sdd2", + "/dev/sde2", + "/dev/sdf2", + "/dev/sdg2", + "/dev/sda3", + "/dev/sdb3", + "/dev/sda4", + "/dev/sdb4", + "/dev/nvme0", + "/dev/nvme1", + "/dev/nvme2" + ], + "environment": { + "PGID": "0", + "PUID": "0", + "WEBUI_PORT": "7474", + "BASE_DOCKER_DATA_PATH": "/data/autobrr" + }, + "ingress": true, + "ingress_entry": "hassioautobrr", + "init": false, + "map": [ + "config:rw", + "share:rw", + "media:rw", + "ssl" + ], + "name": "Autobrr", + "options": { + "PGID": 0, + "PUID": 0, + "WEBUI_USERNAME": "admin", + }, + "panel_icon": "mdi:television-classic", + "ports": { + "7474/tcp": 7474 + }, + "ports_description": { + "7474/tcp": "web interface" + }, + "privileged": [ + "SYS_ADMIN", + "DAC_READ_SEARCH" + ], + "schema": { + "PGID": "int", + "PUID": "int", + "TZ": "str?", + "cifspassword": "str?", + "cifsusername": "str?", + "localdisks": "str?", + "networkdisks": "str?", + "WEBUI_USERNAME": "str", + "WEBUI_PASSWORD": "str" + }, + "slug": "autobrr", + "url": "https://github.com/alexbelgium/hassio-addons/tree/master/autobrr", + "version": "test" +} diff --git a/autobrr/icon.png b/autobrr/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2af06d21a4d95d15e0162b5e70826953e18868 GIT binary patch literal 15103 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

egRG4dmmIM-b>8gCx2aZe?e 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

egRG4dmmIM-b>8gCx2aZe?e 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/hassioautobrr" "$CONFIG_LOCATION" && ! bashio::config.true "ingress_disabled"; then + bashio::log.warning "BaseUrl not set properly, restarting" + sed -i "/UrlBase/d" "$CONFIG_LOCATION" + sed -i "//a \/hassioautobrr<\/UrlBase>" "$CONFIG_LOCATION" + bashio::addon.restart +fi + +bashio::log.info "Starting NGinx..." +exec nginx diff --git a/autobrr/translations/en.yaml b/autobrr/translations/en.yaml new file mode 100644 index 000000000..42d271d58 --- /dev/null +++ b/autobrr/translations/en.yaml @@ -0,0 +1,659 @@ +--- +configuration: + additional_apps: + name: additional_apps + description: Additional apps to install at boot + allow_ipv6: + name: allow_ipv6 + description: Enables ipv6 in the addon + ALLOW_SIGNUP: + name: ALLOW_SIGNUP + description: See upstream app documentation + ALLOWED_HOSTS: + name: ALLOWED_HOSTS + description: See upstream app documentation + APP_BASE_URL: + name: APP_BASE_URL + description: See upstream app documentation + APP_KEY: + name: APP_KEY + description: See upstream app documentation + APP_NAME: + name: APP_NAME + description: See upstream app documentation + append_myip: + name: append_myip + description: See upstream app documentation + auto_restart: + name: auto_restart + description: See upstream app documentation + BACKUP_PATH: + name: BACKUP_PATH + description: See upstream app documentation + base_folder: + name: base_folder + description: See upstream app documentation + BASE_URL: + name: BASE_URL + description: See upstream app documentation + base_url_portless: + name: base_url_portless + description: See upstream app documentation + certfile: + name: certfile + description: "fullchain.pem #ssl certificate, must be located in /ssl" + checkip_command: + name: checkip_command + description: See upstream app documentation + checkip_path: + name: checkip_path + description: See upstream app documentation + checkip_server: + name: checkip_server + description: See upstream app documentation + checkip_ssl: + name: checkip_ssl + description: See upstream app documentation + cifsdomain: + name: cifsdomain + description: Allow setting the domain for the smb share + cifspassword: + name: cifspassword + description: Your password to access your SMB share, same for all smb shares + cifsusername: + name: cifsusername + description: Your username to access your SMB share, same for all smb shares + claim: + name: claim + description: See upstream app documentation + CLI_ARGS: + name: CLI_ARGS + description: See upstream app documentation + COLLECTOR_API_ENDPOINT: + name: COLLECTOR_API_ENDPOINT + description: See upstream app documentation + COLLECTOR_HOST_ID: + name: COLLECTOR_HOST_ID + description: See upstream app documentation + CONFIG_LOCATION: + name: CONFIG_LOCATION + description: See upstream app documentation + CUSTOM_OPTIONS: + name: CUSTOM_OPTIONS + description: See upstream app documentation + custom_provider: + name: custom_provider + description: See upstream app documentation + customUI: + name: customUI + description: selection from list # alternative webUI can be set here + data_directory: + name: data_directory + description: See upstream app documentation + data_location: + name: data_location + description: Where do you want your data stored + database: + name: database + description: Type of database to use + DB_CLIENT: + name: DB_CLIENT + description: See upstream app documentation + DB_CONNECTION: + name: DB_CONNECTION + description: See upstream app documentation + DB_DATABASE: + name: DB_DATABASE + description: See upstream app documentation + DB_DATABASE_NAME: + name: DB_DATABASE_NAME + description: If using external postgresql + DB_HOST: + name: DB_HOST + description: See upstream app documentation + DB_HOSTNAME: + name: DB_HOSTNAME + description: If using external database + DB_PASSWORD: + name: DB_PASSWORD + description: If using external database + DB_PORT: + name: DB_PORT + description: If using external database + DB_TYPE: + name: DB_TYPE + description: See upstream app documentation + DB_USERNAME: + name: DB_USERNAME + description: If using external database + ddns_path: + name: ddns_path + description: See upstream app documentation + ddns_server: + name: ddns_server + description: See upstream app documentation + DEBUG: + name: DEBUG + description: See upstream app documentation + DISABLE_MACHINE_LEARNING: + name: DISABLE_MACHINE_LEARNING + description: See upstream app documentation + DNS_server: + name: DNS_server + description: See upstream app documentation + DOCKER_MODS: + name: DOCKER_MODS + description: See upstream app documentation + DOMAIN: + name: DOMAIN + description: See upstream app documentation + download_dir: + name: download_dir + description: See upstream app documentation + downloads_location: + name: downloads_location + description: See upstream app documentation + DROPBOX_TOKEN: + name: DROPBOX_TOKEN + description: See upstream app documentation + edge_repositories: + name: edge_repositories + description: See upstream app documentation + elasticsearch_server: + name: elasticsearch_server + description: See upstream app documentation + expose_collector: + name: expose_collector + description: See upstream app documentation + EXTENSIONS: + name: EXTENSIONS + description: See upstream app documentation + extraction_path: + name: extraction_path + description: See upstream app documentation + fake_address: + name: fake_address + description: See upstream app documentation + FG_LOG_LEVEL: + name: FG_LOG_LEVEL + description: See upstream app documentation + FG_PLUGINS: + name: FG_PLUGINS + description: See upstream app documentation + FIREFLY_III_ACCESS_TOKEN: + name: FIREFLY_III_ACCESS_TOKEN + description: See upstream app documentation + FIREFLY_III_CLIENT_ID: + name: FIREFLY_III_CLIENT_ID + description: See upstream app documentation + FIREFLY_III_URL: + name: FIREFLY_III_URL + description: See upstream app documentation + forced_update: + name: forced_update + description: See upstream app documentation + Full_Text_Search: + name: Full_Text_Search + description: See upstream app documentation + gitapi: + name: gitapi + description: See upstream app documentation + gitmail: + name: gitmail + description: See upstream app documentation + gitpass: + name: gitpass + description: See upstream app documentation + gituser: + name: gituser + description: See upstream app documentation + graphic_drivers: + name: graphic_drivers + description: See upstream app documentation + hostname: + name: hostname + description: See upstream app documentation + HTTPS_ONLY: + name: HTTPS_ONLY + description: See upstream app documentation + iface: + name: iface + description: See upstream app documentation + Images_location: + name: Images_location + description: See upstream app documentation + imaphost: + name: imaphost + description: See upstream app documentation + imappassword: + name: imappassword + description: See upstream app documentation + imapusername: + name: imapusername + description: See upstream app documentation + import_dir: + name: import_dir + description: See upstream app documentation + IMPORT_PATH: + name: IMPORT_PATH + description: See upstream app documentation + incomplete_dir: + name: incomplete_dir + description: See upstream app documentation + ingress_disabled: + name: ingress_disabled + description: Remove baseurl and disable ingress + ingress_user: + name: ingress_user + description: See upstream app documentation + INTERFACE_NAME: + name: INTERFACE_NAME + description: See upstream app documentation + iterations: + name: iterations + description: See upstream app documentation + JWT_SECRET: + name: JWT_SECRET + description: Used to sign the authentication keys for user login + KEYBOARD: + name: KEYBOARD + description: See upstream app documentation + keyfile: + name: keyfile + description: privkey.pem #sslkeyfile, must be located in /ssl + LOCAL_NETWORK: + name: LOCAL_NETWORK + description: See upstream app documentation + localdisks: + name: localdisks + description: Physical name of the partition (ex. sda1) or the share (ex. SharedFiles) to mount separated by commas (ex. sda1,sdb1,MYNAS) + log_level: + name: log_level + description: See upstream app documentation + MAILER_AUTH_PASSWORD: + name: MAILER_AUTH_PASSWORD + description: See upstream app documentation + MAILER_AUTH_USER: + name: MAILER_AUTH_USER + description: See upstream app documentation + MAILER_ENABLED: + name: MAILER_ENABLED + description: See upstream app documentation + OPENVPN_PROVIDER: + name: OPENVPN_PROVIDER + description: See upstream app documentation + OPENVPN_USERNAME: + name: OPENVPN_USERNAME + description: See upstream app documentation + ORIGINALS_PATH: + name: ORIGINALS_PATH + description: See upstream app documentation + PAPERLESS_OCR_MODE: + name: PAPERLESS_OCR_MODE + description: See upstream app documentation + PAPERLESS_URL: + name: PAPERLESS_URL + description: See upstream app documentation + pass: + name: pass + description: See upstream app documentation + password: + name: password + description: See upstream app documentation + period: + name: period + description: See upstream app documentation + PGID: + name: PGID + description: The user group ID, as described in https://docs.linuxserver.io/general/understanding-puid-and-pgid + PMM_CONFIG: + name: PMM_CONFIG + description: See upstream app documentation + PMM_NO_MISSING: + name: PMM_NO_MISSING + description: See upstream app documentation + PMM_RUN: + name: PMM_RUN + description: See upstream app documentation + PMM_TEST: + name: PMM_TEST + description: See upstream app documentation + PMM_TIME: + name: PMM_TIME + description: See upstream app documentation + POSTGRES_DATABASE: + name: POSTGRES_DATABASE + description: See upstream app documentation + POSTGRES_DB: + name: POSTGRES_DB + description: See upstream app documentation + POSTGRES_HOST: + name: POSTGRES_HOST + description: See upstream app documentation + POSTGRES_PASSWORD: + name: POSTGRES_PASSWORD + description: See upstream app documentation + POSTGRES_PORT: + name: POSTGRES_PORT + description: See upstream app documentation + POSTGRES_USER: + name: POSTGRES_USER + description: See upstream app documentation + provider: + name: provider + description: See upstream app documentation + providers: + name: providers + description: See upstream app documentation + proxied: + name: proxied + description: See upstream app documentation + PUID: + name: PUID + description: The user group ID, as described in https://docs.linuxserver.io/general/understanding-puid-and-pgid + remote_mysql_database: + name: remote_mysql_database + description: See upstream app documentation + remote_mysql_host: + name: remote_mysql_host + description: See upstream app documentation + remote_mysql_password: + name: remote_mysql_password + description: See upstream app documentation + remote_mysql_port: + name: remote_mysql_port + description: See upstream app documentation + remote_mysql_username: + name: remote_mysql_username + description: See upstream app documentation + repository: + name: repository + description: See upstream app documentation + request_size_limit: + name: request_size_limit + description: See upstream app documentation + ROOT_URL: + name: ROOT_URL + description: See upstream app documentation + ROUTER_IP: + name: ROUTER_IP + description: See upstream app documentation + rpi_video_drivers: + name: rpi_video_drivers + description: See upstream app documentation + run_duration: + name: run_duration + description: 12h #for how long should the addon run. Must be formatted as number + time unit (ex : 5s, or 2m, or 12h, or 5d...) + SavePath: + name: SavePath + description: See upstream app documentation + SEAFILE_ADMIN_EMAIL: + name: SEAFILE_ADMIN_EMAIL + description: See upstream app documentation + SEAFILE_ADMIN_PASSWORD: + name: SEAFILE_ADMIN_PASSWORD + description: See upstream app documentation + SECRET_KEY: + name: SECRET_KEY + description: See upstream app documentation + secret_token: + name: secret_token + description: See upstream app documentation + secure_ssl: + name: secure_ssl + description: See upstream app documentation + silent: + name: silent + description: "true #suppresses debug messages" + SMARTCTL_COMMAND_DEVICE_TYPE: + name: SMARTCTL_COMMAND_DEVICE_TYPE + description: See upstream app documentation + SMARTCTL_MEGARAID_DISK_NUM: + name: SMARTCTL_MEGARAID_DISK_NUM + description: See upstream app documentation + smbv1: + name: smbv1 + description: See upstream app documentation + SPECTRE_APP_ID: + name: SPECTRE_APP_ID + description: See upstream app documentation + SPECTRE_SECRET: + name: SPECTRE_SECRET + description: See upstream app documentation + ssl: + name: ssl + description: true/false. enables ssl. Need certfile and keyfile filled' + storage_dir: + name: storage_dir + description: See upstream app documentation + STORAGE_PATH: + name: STORAGE_PATH + description: See upstream app documentation + theme: + name: theme + description: See upstream app documentation + TRANSMISSION_DOWNLOAD_DIR: + name: TRANSMISSION_DOWNLOAD_DIR + description: See upstream app documentation + TRANSMISSION_HOME: + name: TRANSMISSION_HOME + description: See upstream app documentation + TRANSMISSION_INCOMPLETE_DIR: + name: TRANSMISSION_INCOMPLETE_DIR + description: See upstream app documentation + TRANSMISSION_V3_UPDATE: + name: TRANSMISSION_V3_UPDATE + description: See upstream app documentation + TRANSMISSION_WATCH_DIR: + name: TRANSMISSION_WATCH_DIR + description: See upstream app documentation + TRANSMISSION_WEB_UI: + name: TRANSMISSION_WEB_UI + description: See upstream app documentation + trusted_domains: + name: trusted_domains + description: See upstream app documentation + trusted_headers: + name: trusted_headers + description: See upstream app documentation + ttl: + name: ttl + description: See upstream app documentation + TZ: + name: TZ + description: The timezone, as described in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + ui_path: + name: ui_path + description: See upstream app documentation + Updates: + name: Updates + description: See upstream app documentation + UPLOAD_NSFW: + name: UPLOAD_NSFW + description: See upstream app documentation + URL: + name: URL + description: See upstream app documentation + use_own_certs: + name: use_own_certs + description: See upstream app documentation + user: + name: user + description: See upstream app documentation + user_agent: + name: user_agent + description: See upstream app documentation + username: + name: username + description: See upstream app documentation + verbose: + name: verbose + description: See upstream app documentation + verify_address: + name: verify_address + description: See upstream app documentation + watch_dir: + name: watch_dir + description: See upstream app documentation + watch_path: + name: watch_path + description: See upstream app documentation + WebuiPass: + name: WebuiPass + description: See upstream app documentation + whitelist: + name: whitelist + description: '"localhost,192.168.0.0/16" # list ip subnets that that can access the webui' + WHOOGLE_ALT_IG: + name: WHOOGLE_ALT_IG + description: See upstream app documentation + WHOOGLE_ALT_MD: + name: WHOOGLE_ALT_MD + description: See upstream app documentation + WHOOGLE_ALT_RD: + name: WHOOGLE_ALT_RD + description: See upstream app documentation + WHOOGLE_ALT_TL: + name: WHOOGLE_ALT_TL + description: See upstream app documentation + WHOOGLE_ALT_TW: + name: WHOOGLE_ALT_TW + description: See upstream app documentation + WHOOGLE_ALT_YT: + name: WHOOGLE_ALT_YT + description: See upstream app documentation + WHOOGLE_AUTOCOMPLETE: + name: WHOOGLE_AUTOCOMPLETE + description: See upstream app documentation + WHOOGLE_CONFIG_ALTS: + name: WHOOGLE_CONFIG_ALTS + description: See upstream app documentation + WHOOGLE_CONFIG_BLOCK: + name: WHOOGLE_CONFIG_BLOCK + description: See upstream app documentation + WHOOGLE_CONFIG_COUNTRY: + name: WHOOGLE_CONFIG_COUNTRY + description: See upstream app documentation + WHOOGLE_CONFIG_DISABLE: + name: WHOOGLE_CONFIG_DISABLE + description: See upstream app documentation + WHOOGLE_CONFIG_GET_ONLY: + name: WHOOGLE_CONFIG_GET_ONLY + description: See upstream app documentation + WHOOGLE_CONFIG_LANGUAGE: + name: WHOOGLE_CONFIG_LANGUAGE + description: See upstream app documentation + WHOOGLE_CONFIG_NEAR: + name: WHOOGLE_CONFIG_NEAR + description: See upstream app documentation + WHOOGLE_CONFIG_NEW_TAB: + name: WHOOGLE_CONFIG_NEW_TAB + description: See upstream app documentation + WHOOGLE_CONFIG_SAFE: + name: WHOOGLE_CONFIG_SAFE + description: See upstream app documentation + WHOOGLE_CONFIG_SEARCH_LANGUAGE: + name: WHOOGLE_CONFIG_SEARCH_LANGUAGE + description: See upstream app documentation + WHOOGLE_CONFIG_THEME: + name: WHOOGLE_CONFIG_THEME + description: See upstream app documentation + WHOOGLE_CONFIG_URL: + name: WHOOGLE_CONFIG_URL + description: See upstream app documentation + WHOOGLE_CONFIG_VIEW_IMAGE: + name: WHOOGLE_CONFIG_VIEW_IMAGE + description: See upstream app documentation + WHOOGLE_CSP: + name: WHOOGLE_CSP + description: See upstream app documentation + WHOOGLE_MINIMAL: + name: WHOOGLE_MINIMAL + description: See upstream app documentation + WHOOGLE_PASS: + name: WHOOGLE_PASS + description: See upstream app documentation + WHOOGLE_PROXY_LOC: + name: WHOOGLE_PROXY_LOC + description: See upstream app documentation + WHOOGLE_PROXY_PASS: + name: WHOOGLE_PROXY_PASS + description: See upstream app documentation + WHOOGLE_PROXY_TYPE: + name: WHOOGLE_PROXY_TYPE + description: See upstream app documentation + WHOOGLE_PROXY_USER: + name: WHOOGLE_PROXY_USER + description: See upstream app documentation + WHOOGLE_RESULTS_PER_PAGE: + name: WHOOGLE_RESULTS_PER_PAGE + description: See upstream app documentation + WHOOGLE_USER: + name: WHOOGLE_USER + description: See upstream app documentation + wildcard: + name: wildcard + description: See upstream app documentation" + MAILER_HOST: + name: MAILER_HOST + description: See upstream app documentation + MAILER_NOREPLY_EMAIL: + name: MAILER_NOREPLY_EMAIL + description: See upstream app documentation + MAILER_NOREPLY_NAME: + name: MAILER_NOREPLY_NAME + description: See upstream app documentation + MAILER_PORT: + name: MAILER_PORT + description: See upstream app documentation + MAILER_SECURITY: + name: MAILER_SECURITY + description: See upstream app documentation + maxmem: + name: maxmem + description: See upstream app documentation + Mode: + name: Mode + description: See upstream app documentation + mqtt_autodiscover: + name: mqtt_autodiscover + description: See upstream app documentation + networkdisks: + name: networkdisks + description: list of smb servers to mount, separated by commas (//xxx.xx.xx.xx/share) + NoAuth: + name: NoAuth + description: See upstream app documentation + NORDIGEN_ID: + name: NORDIGEN_ID + description: See upstream app documentation + NORDIGEN_KEY: + name: NORDIGEN_KEY + description: See upstream app documentation + OAUTHLIB_RELAX_TOKEN_SCOPE: + name: OAUTHLIB_RELAX_TOKEN_SCOPE + description: See upstream app documentation + OCR: + name: OCR + description: See upstream app documentation + ocrlang: + name: ocrlang + description: See upstream app documentation + openvpn_alt_mode: + name: openvpn_alt_mode + description: bind at container level and not app level + openvpn_config: + name: openvpn_config + description: for example ""config.ovpn"" # name of the file located in /config/openvpn + OPENVPN_CUSTOM_PROVIDER: + name: OPENVPN_CUSTOM_PROVIDER + description: See upstream app documentation + OPENVPN_CUSTOM_PROVIDER_OVPN_LOCATION: + name: OPENVPN_CUSTOM_PROVIDER_OVPN_LOCATION + description: See upstream app documentation + openvpn_enabled: + name: openvpn_enabled + description: See upstream app documentation + OPENVPN_PASSWORD: + name: OPENVPN_PASSWORD + description: See upstream app documentation diff --git a/autobrr/updater.json b/autobrr/updater.json new file mode 100644 index 000000000..efc2e65db --- /dev/null +++ b/autobrr/updater.json @@ -0,0 +1,8 @@ +{ + "last_update": "11-03-2023", + "repository": "alexbelgium/hassio-addons", + "slug": "autborr", + "source": "github", + "upstream_repo": "autobrr/autobrr", + "upstream_version": "test" +}