From 2423e1498b47e177b070bd05e293a4a1afeda042 Mon Sep 17 00:00:00 2001 From: alexbelgium Date: Tue, 13 Oct 2026 15:19:46 +0200 Subject: [PATCH] feat(degoog): new add-on for the Degoog search aggregator (#3116) Degoog mounts every route, and builds every url, under DEGOOG_BASE_URL. The add-on sets that to its ingress entry, so ingress works with no url rewriting beyond the one script tag upstream emits without its base path (/public/t.js in render.tsx). A bundled nginx fronts both the ingress port and the direct port 4444 and puts the stripped entry back, so http://homeassistant:4444/search?q=%s works as a browser search engine. Structure follows comicarr: the upstream image is plain alpine/bun with no s6-overlay, so ha_entrypoint runs as pid 1 and supervises the app and nginx. Data lives in /config (addon_config), the equivalent of upstream's ./data:/app/data volume. Co-Authored-By: Claude Opus 5.5 --- degoog/CHANGELOG.md | 3 + degoog/Dockerfile | 119 ++++++++++++++++++ degoog/README.md | 68 ++++++++++ degoog/apparmor.txt | 66 ++++++++++ degoog/build.json | 6 + degoog/config.yaml | 32 +++++ degoog/icon.png | Bin 0 -> 8188 bytes degoog/logo.png | Bin 0 -> 17321 bytes .../etc/cont-init.d/20-config_location.sh | 19 +++ .../etc/cont-init.d/32-nginx_ingress.sh | 17 +++ degoog/rootfs/etc/nginx/includes/mime.types | 96 ++++++++++++++ .../rootfs/etc/nginx/includes/resolver.conf | 1 + degoog/rootfs/etc/nginx/nginx.conf | 56 +++++++++ degoog/rootfs/etc/nginx/servers/ingress.conf | 50 ++++++++ degoog/rootfs/etc/services.d/degoog/run | 19 +++ degoog/rootfs/etc/services.d/nginx/run | 7 ++ degoog/updater.json | 10 ++ 17 files changed, 569 insertions(+) create mode 100644 degoog/CHANGELOG.md create mode 100644 degoog/Dockerfile create mode 100644 degoog/README.md create mode 100644 degoog/apparmor.txt create mode 100644 degoog/build.json create mode 100644 degoog/config.yaml create mode 100644 degoog/icon.png create mode 100644 degoog/logo.png create mode 100755 degoog/rootfs/etc/cont-init.d/20-config_location.sh create mode 100755 degoog/rootfs/etc/cont-init.d/32-nginx_ingress.sh create mode 100644 degoog/rootfs/etc/nginx/includes/mime.types create mode 100644 degoog/rootfs/etc/nginx/includes/resolver.conf create mode 100644 degoog/rootfs/etc/nginx/nginx.conf create mode 100644 degoog/rootfs/etc/nginx/servers/ingress.conf create mode 100755 degoog/rootfs/etc/services.d/degoog/run create mode 100755 degoog/rootfs/etc/services.d/nginx/run create mode 100644 degoog/updater.json diff --git a/degoog/CHANGELOG.md b/degoog/CHANGELOG.md new file mode 100644 index 0000000000..4335584728 --- /dev/null +++ b/degoog/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.1.0 (2026-10-13) +- Initial release, based on upstream degoog-org/degoog 1.1.0 (changelog : https://github.com/degoog-org/degoog/releases) +- Home Assistant ingress support, and direct access on port 4444, through a bundled nginx reverse proxy diff --git a/degoog/Dockerfile b/degoog/Dockerfile new file mode 100644 index 0000000000..76db647d59 --- /dev/null +++ b/degoog/Dockerfile @@ -0,0 +1,119 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="1.1.0" +FROM ghcr.io/degoog-org/degoog:${BUILD_UPSTREAM} + +################## +# 2 Modify Image # +################## + +USER root + +# No S6_* tuning here : the upstream image is a plain oven/bun alpine image with +# no s6-overlay, so the vars the other addons set would be read by nobody + +################## +# 3 Install apps # +################## + +# Add rootfs +# Absolute paths on purpose : the upstream image sets WORKDIR /app, so +# the relative "find ." used by the other addons would miss /etc entirely +COPY rootfs/ / +RUN find /etc/cont-init.d /etc/services.d -type f \( -name "*.sh" -o -name "run" \) -print -exec chmod +x {} \; + +# Uses /bin for compatibility purposes +# hadolint ignore=DL4005 +RUN if [ ! -f /bin/sh ] && [ -f /usr/bin/sh ]; then ln -s /usr/bin/sh /bin/sh; fi && \ + if [ ! -f /bin/bash ] && [ -f /usr/bin/bash ]; then ln -s /usr/bin/bash /bin/bash; fi + +# Modules +ARG MODULES="00-banner.sh 00-global_var.sh 01-custom_script.sh" + +# Automatic modules download +COPY ha_automodules.sh /ha_automodules.sh +RUN chmod 744 /ha_automodules.sh && /ha_automodules.sh "$MODULES" && rm /ha_automodules.sh + +# Manual apps +ENV PACKAGES="nginx" + +# Automatic apps & bashio +COPY ha_autoapps.sh /ha_autoapps.sh +RUN chmod 744 /ha_autoapps.sh && /ha_autoapps.sh "$PACKAGES" && rm /ha_autoapps.sh + +################ +# 4 Entrypoint # +################ + +# The upstream image ships no s6-overlay, so ha_entrypoint runs as pid 1 : it +# executes /etc/cont-init.d, then supervises /etc/services.d. The upstream +# /entrypoint.sh is still what services.d/degoog/run starts the app with. +COPY ha_entrypoint.sh /ha_entrypoint.sh +RUN chmod 0755 /ha_entrypoint.sh +ENTRYPOINT ["/ha_entrypoint.sh"] + +# Install bashio +COPY bashio-standalone.sh /usr/local/lib/bashio-standalone.sh +RUN chmod 0755 /usr/local/lib/bashio-standalone.sh + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +ENV BUILD_VERSION="${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 # +################# + +# Goes through nginx on the direct port, which maps / onto the app's base path, +# so one probe covers both processes +ENV HEALTH_PORT="4444" \ + HEALTH_URL="/readyz" +HEALTHCHECK \ + --interval=30s \ + --retries=5 \ + --start-period=90s \ + --timeout=25s \ + CMD curl -A "HealthCheck: Docker/1.0" -s -f "http://127.0.0.1:${HEALTH_PORT}${HEALTH_URL}" >/dev/null 2>&1 || exit 1 diff --git a/degoog/README.md b/degoog/README.md new file mode 100644 index 0000000000..2d0e035b75 --- /dev/null +++ b/degoog/README.md @@ -0,0 +1,68 @@ +# Home Assistant Add-on: Degoog + +Self-hosted search aggregator: one query, results from many search engines, with themes and a +plugin store. + +[Degoog](https://github.com/degoog-org/degoog) works like SearXNG: it sends your search to the +engines you pick and merges what they return. Engines, plugins, themes and autocomplete +providers are installed from its built-in store. + +## About + +- Results from many engines at once, merged into one page +- Engines, plugins, themes and transports installed from git-based store repositories +- Bangs, shortcuts, autocomplete and an optional local result indexer +- Works as your browser's default search engine (OpenSearch) + +## Installation + +1. Add this repository to Home Assistant. +2. Install the **Degoog** add-on. +3. Set `DEGOOG_SETTINGS_PASSWORDS` (see below), then start the add-on. +4. Open it from the sidebar (ingress), or at `http://homeassistant:4444`. +5. Go to **Settings → Store** and install at least one search engine: a fresh install has none, + so searches return no web results until you do. + +## Configuration + +| Option | Description | +|--------|-------------| +| `DEGOOG_SETTINGS_PASSWORDS` | Password for the settings and admin pages. Several passwords can be given, comma separated. If empty, Degoog generates a new one-off password at every start and prints it in the add-on log. | +| `PUID` / `PGID` | User Degoog runs as, and owner of its data directory. Defaults to `0` (root). | +| `TZ` | Timezone, e.g. `Europe/Paris`. | +| `env_vars` | Extra environment variables passed to Degoog, e.g. `DEGOOG_PUBLIC_INSTANCE` or `DEGOOG_I18N`. See the [upstream list](https://degoog-org.github.io/docs/environment-variables.html) and the [wiki](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2). | + +The add-on sets `DEGOOG_BASE_URL`, `DEGOOG_DATA_DIR`, `DEGOOG_PORT` and `DEGOOG_BIND_ADDRESS` +itself, because ingress, the direct port and the health check are built around them: setting +them in `env_vars` has no effect. + +## Ingress, direct access and search-engine use + +Degoog serves every page under a base path. The add-on sets that base path to the Home Assistant +ingress path, so ingress needs no rewriting, and the bundled nginx maps port `4444` onto the same +path. As a result, pages opened on port `4444` show an address such as +`http://homeassistant:4444/api/hassio_ingress//search?q=...`. That is expected, and the +short form keeps working too. + +To use Degoog as your browser's search engine, use the direct port, not the Home Assistant +sidebar url, for example `http://homeassistant:4444/search?q=%s`. Ingress urls only work inside +a logged-in Home Assistant session. + +Behind nginx every client appears to Degoog as `127.0.0.1`, so its per-IP rate limits apply to +all users together. Its bot trap never bans private addresses, so this cannot lock you out. If +you put the add-on behind your own reverse proxy and want per-client limits, add +`DEGOOG_DISTRUST_PROXY=0` in `env_vars`. Degoog then trusts the `X-Forwarded-For` header, which +clients can forge, so only do this when port `4444` is reachable only through your proxy. + +## Data + +Settings, installed extensions and the index database live in `/config` inside the add-on. +Home Assistant maps that to this add-on's own configuration directory, +`/addon_configs/_degoog`, and it is included in add-on backups. It is the +equivalent of the upstream `./data:/app/data` compose volume, so the contents of an existing +`data` folder can be copied in as is. + +## Support + +- [Degoog upstream project](https://github.com/degoog-org/degoog) +- [Add-on repository issues](https://github.com/alexbelgium/hassio-addons/issues) diff --git a/degoog/apparmor.txt b/degoog/apparmor.txt new file mode 100644 index 0000000000..6c002a3975 --- /dev/null +++ b/degoog/apparmor.txt @@ -0,0 +1,66 @@ + +#include + +profile degoog_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability chown, + capability dac_override, + capability fowner, + capability setgid, + capability setuid, + capability sys_chroot, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + network unix dgram, + + +# Entrypoint stack + /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 explicit allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/degoog/build.json b/degoog/build.json new file mode 100644 index 0000000000..eafcfd12ad --- /dev/null +++ b/degoog/build.json @@ -0,0 +1,6 @@ +{ + "build_from": { + "aarch64": "ghcr.io/degoog-org/degoog:latest", + "amd64": "ghcr.io/degoog-org/degoog:latest" + } +} diff --git a/degoog/config.yaml b/degoog/config.yaml new file mode 100644 index 0000000000..29963499e9 --- /dev/null +++ b/degoog/config.yaml @@ -0,0 +1,32 @@ +arch: + - aarch64 + - amd64 +description: + Search aggregator that queries many engines at once, with themes and a + plugin store +image: ghcr.io/alexbelgium/degoog-{arch} +ingress: true +init: false +map: + - addon_config:rw +name: Degoog +options: + env_vars: [] + PGID: 0 + PUID: 0 +panel_icon: mdi:magnify +ports: + 4444/tcp: 4444 +ports_description: + 4444/tcp: Web interface +schema: + DEGOOG_SETTINGS_PASSWORDS: password? + env_vars: + - name: match(^[A-Za-z0-9_]+$) + value: str? + PGID: int + PUID: int + TZ: str? +slug: degoog +url: https://github.com/alexbelgium/hassio-addons/tree/master/degoog +version: "1.1.0" diff --git a/degoog/icon.png b/degoog/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..424f4c002723dc2ba6a5d2dcba8da417033d48c9 GIT binary patch literal 8188 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 literal 0 HcmV?d00001 diff --git a/degoog/logo.png b/degoog/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..83235bc57ac43153097bf820f53b99ced6be2072 GIT binary patch literal 17321 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 /etc/timezone +fi diff --git a/degoog/rootfs/etc/cont-init.d/32-nginx_ingress.sh b/degoog/rootfs/etc/cont-init.d/32-nginx_ingress.sh new file mode 100755 index 0000000000..175e665b40 --- /dev/null +++ b/degoog/rootfs/etc/cont-init.d/32-nginx_ingress.sh @@ -0,0 +1,17 @@ +#!/usr/bin/with-contenv bashio +# shellcheck shell=bash +set -e + +################# +# NGINX SETTING # +################# +declare ingress_interface +declare ingress_port +declare ingress_entry + +ingress_port=$(bashio::addon.ingress_port) +ingress_interface=$(bashio::addon.ip_address) +ingress_entry=$(bashio::addon.ingress_entry) +sed -i "s/%%port%%/${ingress_port}/g" /etc/nginx/servers/ingress.conf +sed -i "s/%%interface%%/${ingress_interface}/g" /etc/nginx/servers/ingress.conf +sed -i "s|%%ingress_entry%%|${ingress_entry}|g" /etc/nginx/servers/ingress.conf diff --git a/degoog/rootfs/etc/nginx/includes/mime.types b/degoog/rootfs/etc/nginx/includes/mime.types new file mode 100644 index 0000000000..7c7cdef2d1 --- /dev/null +++ b/degoog/rootfs/etc/nginx/includes/mime.types @@ -0,0 +1,96 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/degoog/rootfs/etc/nginx/includes/resolver.conf b/degoog/rootfs/etc/nginx/includes/resolver.conf new file mode 100644 index 0000000000..70f4982b9b --- /dev/null +++ b/degoog/rootfs/etc/nginx/includes/resolver.conf @@ -0,0 +1 @@ +resolver 127.0.0.11 ipv6=off; diff --git a/degoog/rootfs/etc/nginx/nginx.conf b/degoog/rootfs/etc/nginx/nginx.conf new file mode 100644 index 0000000000..2ffda7816e --- /dev/null +++ b/degoog/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,56 @@ + +# Run nginx in foreground. +daemon off; + +# This is run inside Docker. +user root; + +# Pid storage location. +pid /var/run/nginx.pid; + +# Set number of worker processes. +worker_processes 1; + +# Enables the use of JIT for regular expressions to speed-up their processing. +pcre_jit on; + +# Write error log to Hass.io add-on log. +error_log /proc/1/fd/1 error; + +# Load allowed environment vars +env HASSIO_TOKEN; + +# Load dynamic modules. +include /etc/nginx/modules-enabled/*.conf; + +# Max num of simultaneous connections by a worker process. +events { + worker_connections 512; +} + +http { + include /etc/nginx/includes/mime.types; + + log_format hassio '[$time_local] $status ' + '$http_x_forwarded_for($remote_addr) ' + '$request ($http_user_agent)'; + + access_log /proc/1/fd/1 hassio; + client_max_body_size 4G; + default_type application/octet-stream; + gzip on; + keepalive_timeout 65; + sendfile on; + server_tokens off; + tcp_nodelay on; + tcp_nopush on; + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + include /etc/nginx/includes/resolver.conf; + + include /etc/nginx/servers/*.conf; +} diff --git a/degoog/rootfs/etc/nginx/servers/ingress.conf b/degoog/rootfs/etc/nginx/servers/ingress.conf new file mode 100644 index 0000000000..aff23347b6 --- /dev/null +++ b/degoog/rootfs/etc/nginx/servers/ingress.conf @@ -0,0 +1,50 @@ +server { + # Ingress, and the direct port. Both are served the same way : Degoog runs + # with its base path set to the ingress entry (services.d/degoog/run), and + # Home Assistant strips that entry before forwarding, so it is put back here. + listen %%interface%%:%%port%% default_server; + listen 4444 default_server; + + client_max_body_size 0; + + proxy_http_version 1.1; + proxy_set_header Host $http_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; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + # Search results are sent to the page as server-sent events + proxy_buffering off; + proxy_read_timeout 30m; + proxy_send_timeout 30m; + + # The one url upstream builds without its base path + # (src/server/routes/pages/render.tsx) + proxy_set_header Accept-Encoding ""; + sub_filter 'src="/public/t.js' 'src="%%ingress_entry%%/public/t.js'; + + # Degoog answers / with a redirect to the slashless , which + # Home Assistant does not route : ask for the slashless form directly. + location = / { + proxy_pass http://127.0.0.1:4445%%ingress_entry%%; + } + + # Links in the pages already carry the entry ; only the direct port sees + # them, since ingress strips it. No trailing slash, so the bare entry + # (the target of Degoog's own trailing-slash redirect) matches too. + location %%ingress_entry%% { + proxy_pass http://127.0.0.1:4445; + } + + # Transport websockets are the only routes upstream mounts outside its base + # path (src/server/index.ts) + location /ws/ { + proxy_pass http://127.0.0.1:4445; + } + + location / { + proxy_pass http://127.0.0.1:4445%%ingress_entry%%/; + } +} diff --git a/degoog/rootfs/etc/services.d/degoog/run b/degoog/rootfs/etc/services.d/degoog/run new file mode 100755 index 0000000000..4c90413e34 --- /dev/null +++ b/degoog/rootfs/etc/services.d/degoog/run @@ -0,0 +1,19 @@ +#!/usr/bin/with-contenv bashio +# shellcheck shell=bash +set -e +# ============================================================================== + +# Every route Degoog serves, and every url it generates, lives under +# DEGOOG_BASE_URL. Setting it to the ingress entry makes the pages correct under +# ingress as they are ; nginx maps the direct port onto the same path. +# The port and bind address are forced because nginx and the healthcheck are +# built around them. +DEGOOG_BASE_URL="$(bashio::addon.ingress_entry)" +export DEGOOG_BASE_URL +export DEGOOG_DATA_DIR=/config +export DEGOOG_PORT=4445 +export DEGOOG_BIND_ADDRESS=127.0.0.1 + +bashio::log.info "Starting Degoog..." +cd /app +exec /entrypoint.sh diff --git a/degoog/rootfs/etc/services.d/nginx/run b/degoog/rootfs/etc/services.d/nginx/run new file mode 100755 index 0000000000..b2de121e94 --- /dev/null +++ b/degoog/rootfs/etc/services.d/nginx/run @@ -0,0 +1,7 @@ +#!/usr/bin/with-contenv bashio +# shellcheck shell=bash +set -e +# ============================================================================== + +bashio::log.info "Starting NGinx..." +exec nginx diff --git a/degoog/updater.json b/degoog/updater.json new file mode 100644 index 0000000000..80cfa45c95 --- /dev/null +++ b/degoog/updater.json @@ -0,0 +1,10 @@ +{ + "github_beta": "false", + "github_fulltag": false, + "last_update": "2026-10-13", + "repository": "alexbelgium/hassio-addons", + "slug": "degoog", + "source": "github", + "upstream_repo": "degoog-org/degoog", + "upstream_version": "1.1.0" +}