From 08029b9e37ceda66926a18ff8d04de499457e098 Mon Sep 17 00:00:00 2001 From: alexbelgium Date: Tue, 11 Aug 2026 18:30:36 +0200 Subject: [PATCH] fix(komga): restore add-on reverted by a transient ghcr login failure The amd64 builder job failed at docker login (denied: denied) before any build step ran, which tripped revert-on-failure. Re-running the same commit unchanged succeeded and both arch images are published. Co-Authored-By: Claude Opus 5 --- komga/CHANGELOG.md | 6 + komga/Dockerfile | 121 ++++++++++++++++++ komga/README.md | 69 ++++++++++ komga/build.json | 6 + komga/config.yaml | 104 +++++++++++++++ komga/icon.png | Bin 0 -> 8137 bytes komga/logo.png | Bin 0 -> 43731 bytes .../etc/cont-init.d/20-config_location.sh | 15 +++ .../etc/cont-init.d/32-nginx_ingress.sh | 17 +++ komga/rootfs/etc/nginx/includes/mime.types | 96 ++++++++++++++ komga/rootfs/etc/nginx/includes/resolver.conf | 1 + komga/rootfs/etc/nginx/nginx.conf | 56 ++++++++ komga/rootfs/etc/nginx/servers/ingress.conf | 60 +++++++++ komga/rootfs/etc/services.d/komga/run | 17 +++ komga/rootfs/etc/services.d/nginx/run | 13 ++ komga/updater.json | 9 ++ 16 files changed, 590 insertions(+) create mode 100644 komga/CHANGELOG.md create mode 100644 komga/Dockerfile create mode 100644 komga/README.md create mode 100644 komga/build.json create mode 100644 komga/config.yaml create mode 100644 komga/icon.png create mode 100644 komga/logo.png create mode 100755 komga/rootfs/etc/cont-init.d/20-config_location.sh create mode 100755 komga/rootfs/etc/cont-init.d/32-nginx_ingress.sh create mode 100644 komga/rootfs/etc/nginx/includes/mime.types create mode 100644 komga/rootfs/etc/nginx/includes/resolver.conf create mode 100644 komga/rootfs/etc/nginx/nginx.conf create mode 100644 komga/rootfs/etc/nginx/servers/ingress.conf create mode 100755 komga/rootfs/etc/services.d/komga/run create mode 100755 komga/rootfs/etc/services.d/nginx/run create mode 100644 komga/updater.json diff --git a/komga/CHANGELOG.md b/komga/CHANGELOG.md new file mode 100644 index 0000000000..9d205b8cdf --- /dev/null +++ b/komga/CHANGELOG.md @@ -0,0 +1,6 @@ +## 1.26.1 (2026-08-11) + +- Initial release, based on gotson/komga ([changelog](https://github.com/gotson/komga/releases)) +- Ingress support : Komga is served on the `/komga` servlet context path, nginx prefixes it back with the ingress entry +- Supports local disks and SMB network shares for libraries (`localdisks` / `networkdisks` options) +- Supports extra environment variables via the `env_vars` option, see the [documentation](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2) diff --git a/komga/Dockerfile b/komga/Dockerfile new file mode 100644 index 0000000000..93e5e90562 --- /dev/null +++ b/komga/Dockerfile @@ -0,0 +1,121 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="1.26.1" +FROM ${BUILD_FROM} +ENV BASHIO_VERSION=0.14.3 + +################## +# 2 Modify Image # +################## + +# No S6_* tuning here : the upstream image ships no s6-overlay, so the vars the +# other addons set would be read by nobody + +# Komga is served from a fixed servlet context path. Ingress strips its own +# prefix before forwarding, and Komga renders absolute asset urls, so nginx +# needs a stable subpath to prefix back. See rootfs/etc/nginx/servers/ingress.conf +ENV SERVER_SERVLET_CONTEXTPATH="/komga" + +################## +# 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 00-local_mounts.sh 00-smb_mounts.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 is a plain jre image without s6-overlay, so ha_entrypoint +# runs as pid 1 : it executes /etc/cont-init.d, then supervises /etc/services.d +COPY ha_entrypoint.sh /ha_entrypoint.sh +RUN chmod 777 /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 # +################# + +# Komga is a jvm app, first boot builds the database : leave it time to settle +ENV HEALTH_PORT="25600" \ + HEALTH_URL="/komga/" +HEALTHCHECK \ + --interval=30s \ + --retries=5 \ + --start-period=180s \ + --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/komga/README.md b/komga/README.md new file mode 100644 index 0000000000..89dc8fe8ab --- /dev/null +++ b/komga/README.md @@ -0,0 +1,69 @@ +# Home Assistant Add-on: Komga + +Free and open source comics/mangas media server. + +[Komga](https://komga.org) organizes your comics, mangas, BDs, magazines and ebooks, serves them +through a web reader, and exposes OPDS, Kobo sync and a REST API for third-party readers +(Tachiyomi/Mihon, Panels, Chunky, ...). + +## About + +- Browse and read CBZ, CBR, PDF and EPUB files from any browser +- Import metadata, edit series/books, build collections and read lists +- Multi-user, with per-user library restrictions and age ratings +- OPDS v1/v2, Kobo sync, and a documented REST API + +## Installation + +1. Add this repository to Home Assistant. +2. Install the **Komga** add-on. +3. Start the add-on and open it from the sidebar (ingress), or on port `25600` at + `http://homeassistant:25600/komga`. +4. Create the initial user account when the web interface asks for it. +5. Add a library pointing at your comics, for example `/media/comics` or `/share/comics`. + +The first start takes longer than usual: Komga is a JVM application and builds its database and +search index on first boot. + +## Configuration + +| Option | Description | +|--------|-------------| +| `PUID` / `PGID` | Ownership applied to the add-on configuration directory. Defaults to `0` (root). | +| `TZ` | Timezone, e.g. `Europe/Paris`. | +| `localdisks` | Local disks to mount, e.g. `sda1` or a disk label. | +| `networkdisks` | SMB shares to mount, e.g. `//192.168.1.2/comics`. Mounted under `/mnt`. | +| `cifsusername` / `cifspassword` / `cifsdomain` | Credentials for the SMB shares. | +| `smbv1` | Allow the legacy SMBv1 protocol. | +| `env_vars` | Extra environment variables passed to Komga. See the [wiki](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2). | + +Most Komga settings can be passed through `env_vars` using the upstream naming, see the +[Komga configuration options](https://komga.org/docs/installation/configuration/). A common one: + +- `JAVA_TOOL_OPTIONS` = `-Xmx1g` — cap the JVM heap on small machines. + +`SERVER_SERVLET_CONTEXTPATH` and `SERVER_PORT` are reserved by the add-on: ingress is built +around the `/komga` path on port 25600, and overriding either breaks the sidebar panel. + +## Ingress and URLs + +Komga is served from the `/komga` subpath so that it works behind Home Assistant ingress: + +- from the Home Assistant sidebar: ingress, no extra setup +- directly: `http://homeassistant:25600/komga` + +External clients — OPDS readers, Kobo sync, Tachiyomi/Mihon, Panels — must use the direct +`http://homeassistant:25600/komga` url. Ingress is browser-session based, so those clients cannot +authenticate through it. + + +## Data + +Komga's database, logs and search index are stored in the add-on configuration directory +(`/addon_configs/xxx-komga`), so they survive add-on updates. Libraries stay where you put them, +under `/media`, `/share` or a mounted disk. + +## Support + +- [Komga upstream project](https://github.com/gotson/komga) +- [Add-on repository issues](https://github.com/alexbelgium/hassio-addons/issues) diff --git a/komga/build.json b/komga/build.json new file mode 100644 index 0000000000..492bb31e52 --- /dev/null +++ b/komga/build.json @@ -0,0 +1,6 @@ +{ + "build_from": { + "aarch64": "gotson/komga:1.26.1", + "amd64": "gotson/komga:1.26.1" + } +} diff --git a/komga/config.yaml b/komga/config.yaml new file mode 100644 index 0000000000..4c4bb0a0d2 --- /dev/null +++ b/komga/config.yaml @@ -0,0 +1,104 @@ +arch: + - aarch64 + - amd64 +description: Free and open source comics/mangas media server +devices: + - /dev/dri + - /dev/dri/card0 + - /dev/dri/card1 + - /dev/dri/renderD128 + - /dev/vchiq + - /dev/video10 + - /dev/video11 + - /dev/video12 + - /dev/video13 + - /dev/video14 + - /dev/video15 + - /dev/video16 + - /dev/ttyUSB0 + - /dev/sda + - /dev/sdb + - /dev/sdc + - /dev/sdd + - /dev/sde + - /dev/sdf + - /dev/sdg + - /dev/nvme + - /dev/nvme0 + - /dev/nvme0n1 + - /dev/nvme0n1p1 + - /dev/nvme0n1p2 + - /dev/nvme0n1p3 + - /dev/nvme1n1 + - /dev/nvme1n1p1 + - /dev/nvme1n1p2 + - /dev/nvme1n1p3 + - /dev/nvme2n1 + - /dev/nvme2n1p1 + - /dev/nvme2n1p2 + - /dev/nvme2n3p3 + - /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/sda5 + - /dev/sda6 + - /dev/sda7 + - /dev/sda8 + - /dev/nvme0 + - /dev/nvme1 + - /dev/nvme2 +image: ghcr.io/alexbelgium/komga-{arch} +ingress: true +ingress_entry: komga +init: false +map: + - addon_config:rw + - media:rw + - share:rw +name: Komga +options: + env_vars: [] + PGID: 0 + PUID: 0 +panel_icon: mdi:book-open-page-variant +ports: + 25600/tcp: 25600 +ports_description: + 25600/tcp: Web interface (path /komga) +privileged: + - SYS_ADMIN + - DAC_READ_SEARCH +schema: + env_vars: + - name: match(^[A-Za-z0-9_]+$) + value: str? + PGID: int + PUID: int + TZ: str? + cifsdomain: str? + cifspassword: str? + cifsusername: str? + localdisks: str? + networkdisks: str? + smbv1: bool? +slug: komga +udev: true +url: https://github.com/alexbelgium/hassio-addons/tree/master/komga +version: "1.26.1" diff --git a/komga/icon.png b/komga/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..11d12f77d4e702f737f11d361aa755cdd39a5bfc GIT binary patch literal 8137 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%0AF&pfxdz~4K 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 i#%{tvjCz5lAZU}83bp@GJPlX^q@kj#{NbVX^Zx/ and forwards it + # as / , but Komga only answers below its servlet context path (/komga), so + # bounce the panel there. absolute_redirect off keeps the Location relative + # to the HA host instead of nginx's own listen address. + location = / { + absolute_redirect off; + return 302 %%ingress_entry%%/komga/; + } + + location / { + add_header Access-Control-Allow-Origin *; + proxy_connect_timeout 30m; + proxy_send_timeout 30m; + proxy_read_timeout 30m; + proxy_pass http://127.0.0.1:25600; + + # Komga pushes live events over SSE (/komga/sse/v1/events), which must + # not be buffered or the UI stops refreshing until the buffer fills + proxy_buffering off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + # Spring redirects /komga to /komga/ ; the Location it produces is + # absolute against the upstream address, so rewrite it back onto the + # ingress path (the second rule covers an already relative Location). + absolute_redirect off; + proxy_redirect http://127.0.0.1:25600/ %%ingress_entry%%/; + proxy_redirect / %%ingress_entry%%/; + + # Komga renders its index page with Thymeleaf @{...} link expressions, + # so every asset url and window.resourceBaseUrl carry the context path + # (/komga). Ingress strips its own prefix before forwarding, so the + # browser needs that prefix added back. Only text/html is rewritten + # (the nginx default for sub_filter_types) : the SPA derives its api + # origin and router base from resourceBaseUrl at runtime, so json + # responses and book pages stream through untouched. + proxy_set_header Accept-Encoding ""; + sub_filter_once off; + sub_filter "/komga" "%%ingress_entry%%/komga"; + + # The epub/divina reader fetches a Readium manifest whose links Komga + # builds with ServletUriComponentsBuilder.fromCurrentContextPath(), so + # they are fully absolute against the upstream address nginx talks to + # (http://127.0.0.1:25600/komga). Rewriting them to a root relative + # ingress path also fixes the scheme : Home Assistant may be served over + # https, and an absolute http:// link would be blocked as mixed content. + # Only the json/xml document types are added here, so book pages are + # never scanned. + sub_filter "http://127.0.0.1:25600/komga" "%%ingress_entry%%/komga"; + sub_filter_types application/json application/webpub+json + application/divina+json application/opds+json + application/atom+xml; + } +} diff --git a/komga/rootfs/etc/services.d/komga/run b/komga/rootfs/etc/services.d/komga/run new file mode 100755 index 0000000000..f6b24430da --- /dev/null +++ b/komga/rootfs/etc/services.d/komga/run @@ -0,0 +1,17 @@ +#!/usr/bin/with-contenv bashio +# shellcheck shell=bash +set -e +# ============================================================================== + +# Same invocation as the upstream image entrypoint (gotson/komga), which is +# replaced by ha_entrypoint.sh so that cont-init.d and nginx can run too. +# SERVER_SERVLET_CONTEXTPATH is set in the Dockerfile, see ingress.conf. + +bashio::log.info "Starting Komga (served on the /komga path, see the addon documentation)" + +cd /app +exec java \ + -Dspring.profiles.include=docker \ + --enable-native-access=ALL-UNNAMED \ + -jar application.jar \ + --spring.config.additional-location=file:/config/ diff --git a/komga/rootfs/etc/services.d/nginx/run b/komga/rootfs/etc/services.d/nginx/run new file mode 100755 index 0000000000..19698e7666 --- /dev/null +++ b/komga/rootfs/etc/services.d/nginx/run @@ -0,0 +1,13 @@ +#!/usr/bin/with-contenv bashio +# shellcheck shell=bash +set -e +# ============================================================================== + +# Wait for komga to become available. First boot builds the database, so leave +# it a wide margin before nginx starts answering ingress requests. +# Non fatal : bashio and bashio-standalone disagree on the argument order, and +# a failed wait must not keep nginx (hence ingress) down. +bashio::net.wait_for 25600 localhost 900 || true + +bashio::log.info "Starting NGinx..." +exec nginx diff --git a/komga/updater.json b/komga/updater.json new file mode 100644 index 0000000000..cc8e4340fa --- /dev/null +++ b/komga/updater.json @@ -0,0 +1,9 @@ +{ + "github_beta": "false", + "last_update": "2026-08-11", + "repository": "alexbelgium/hassio-addons", + "slug": "komga", + "source": "github", + "upstream_repo": "gotson/komga", + "upstream_version": "1.26.1" +}