mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-10-18 05:59:24 +02:00
Compare commits
23 Commits
agent/clau
...
b987aebf0f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b987aebf0f | ||
|
|
0949047d64 | ||
|
|
96cdde5f49 | ||
|
|
3424435e13 | ||
|
|
1d764ec744 | ||
|
|
b1d8dad9da | ||
|
|
b68b44c991 | ||
|
|
43d3a71487 | ||
|
|
c424d844eb | ||
|
|
b14b066f55 | ||
|
|
6320fa2af3 | ||
|
|
e1fa043900 | ||
|
|
082fbbadd2 | ||
|
|
e686528ebf | ||
|
|
44bb5e3574 | ||
|
|
25ad2920a8 | ||
|
|
ea2659054f | ||
|
|
45b3be0b6f | ||
|
|
6dcb180a49 | ||
|
|
87c9b60be0 | ||
|
|
82ac7957c8 | ||
|
|
f0d20d77fa | ||
|
|
988cecb122 |
@@ -19,7 +19,7 @@ slug="${slug#*_}"
|
||||
if [ ! -f /config/configuration.yaml ] && [ ! -f /config/configuration.json ]; then
|
||||
# New config location
|
||||
CONFIGLOCATION="/config"
|
||||
CONFIGFILEBROWSER="/addon_configs/${HOSTNAME/-/_}/config.yaml"
|
||||
CONFIGFILEBROWSER="/app_configs/${HOSTNAME/-/_}/config.yaml"
|
||||
else
|
||||
# Legacy config location
|
||||
CONFIGLOCATION="/config/addons_config/${slug}"
|
||||
|
||||
@@ -174,7 +174,7 @@ slug="${slug#*_}"
|
||||
# Check type of config folder
|
||||
if [ ! -f /config/configuration.yaml ] && [ ! -f /config/configuration.json ]; then
|
||||
CONFIGLOCATION="/config"
|
||||
CONFIGFILEBROWSER="/addon_configs/${HOSTNAME/-/_}/$slug.sh"
|
||||
CONFIGFILEBROWSER="/app_configs/${HOSTNAME/-/_}/$slug.sh"
|
||||
else
|
||||
CONFIGLOCATION="/config/addons_autoscripts"
|
||||
CONFIGFILEBROWSER="/homeassistant/addons_autoscripts/$slug.sh"
|
||||
|
||||
@@ -70,7 +70,7 @@ version: "X.Y.Z" # upstream version (format varies; see Versioning sect
|
||||
ingress: true/false
|
||||
ingress_port: 8000
|
||||
map:
|
||||
- addon_config:rw # /addon_configs/<hostname>/
|
||||
- app_config:rw # /app_configs/<hostname>/
|
||||
- share:rw
|
||||
- media:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
## 2026.08 (2026-08-01)
|
||||
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Addon versions written in config.yaml now always comply with Home Assistant versioning: an upstream tag Home Assistant cannot order (`version-bf9e0b4f`, `ubuntu-2026-06-01`, ...) or would sort as older (`1.2.3-2`, `1.2.3+4`) no longer lands in config.yaml. The addon number is incremented instead, while the raw upstream tag stays in updater.json so the same release is never published twice
|
||||
- Pre-release markers become a version section, `5.0.0b5` is published as `5.0.0.5`
|
||||
- A tag Home Assistant cannot order keeps every number it carries, `v26.2-ls256` is published as `v26.2.256`
|
||||
@@ -31,7 +32,7 @@
|
||||
|
||||
## 3.19
|
||||
|
||||
- New HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- New HA config logic implemented. Files are now located in the addon config file, that can be accessed from the app_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- Feat : if there is no releases in a github repo, check if there is a valid package and get the highest tag https://github.com/alexbelgium/hassio-addons/issues/1168
|
||||
- Feat : github_exclude applies to dockerhub
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ verbose: "false"
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **Environment variables**: Use the add-on `env_vars` option and see [Add Environment Variables to your Addon](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon) for details.
|
||||
|
||||
@@ -8,7 +8,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/addons_updater-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
name: Repository Updater
|
||||
options:
|
||||
date_iso8601: true
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.0.3 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from lklynet/aurral (changelog : https://github.com/lklynet/aurral/releases)
|
||||
|
||||
## 2.0.2 (2026-08-01)
|
||||
|
||||
@@ -21,7 +21,7 @@ ports_description:
|
||||
webui: http://[HOST]:[PORT:3001]
|
||||
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- share:rw
|
||||
- media:rw
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
- The Home Assistant project has deprecated support for the armv7, armhf and i386 architectures. Support wil be fully dropped in the upcoming Home Assistant 2025.12 release
|
||||
|
||||
## 0.10.1-hafix4 (2025-11-18)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Minor bugs fixed
|
||||
## 0.10.1-hafix3 (2025-11-18)
|
||||
- Added support for configuring extra environment variables via the `env_vars` option alongside config.yaml.
|
||||
@@ -21,7 +22,7 @@
|
||||
## 0.9.5 (2024-04-27)
|
||||
- Update to latest version from ckulka/baikal-docker (changelog : https://github.com/ckulka/baikal-docker/releases)
|
||||
## 0.9.4-3 (2024-04-26)
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/baikal to a folder only accessible from my Filebrowser addon called /addon_configs/something-baikal. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/baikal to a folder only accessible from my Filebrowser addon called /app_configs/something-baikal. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
|
||||
## 0.9.4-2 (2024-01-14)
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ Configurations can be done through the app webUI, except for the following optio
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **Environment variables**: See [Add Environment Variables to your Addon](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon)
|
||||
|
||||
@@ -66,7 +66,7 @@ devices:
|
||||
- /dev/nvme2
|
||||
image: ghcr.io/alexbelgium/baikal-{arch}
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
- share:rw
|
||||
- ssl:ro
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
## 2026.02.28 (28-02-2026)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Minor bugs fixed
|
||||
## 2026.02.25-2 (25-02-2026)
|
||||
- Minor bugs fixed
|
||||
|
||||
@@ -86,7 +86,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -64,7 +64,7 @@ ingress: true
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
## 1.6.0.2 (2026-07-27)
|
||||
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Fix base_url sed patterns rewriting *every* `base_url` key in Bazarr's config.yaml (radarr.base_url, sonarr.base_url, and any other configured integration), instead of only Bazarr's own under `general:`. This silently broke the Radarr/Sonarr connections inside Bazarr on every addon restart when ingress was enabled
|
||||
|
||||
## 1.6.0.1 (2026-07-27)
|
||||
@@ -26,7 +27,7 @@
|
||||
- Update to latest version from linuxserver/docker-bazarr (changelog : https://github.com/linuxserver/docker-bazarr/releases)
|
||||
|
||||
## 1.5.4-1 (2026-01-08)
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/addons_config/bazarr to a folder only accessible from my Filebrowser addon called /addon_configs/xxx-bazarr. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/addons_config/bazarr to a folder only accessible from my Filebrowser addon called /app_configs/xxx-bazarr. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
|
||||
## 1.5.4 (2026-01-08)
|
||||
- Update to latest version from linuxserver/docker-bazarr (changelog : https://github.com/linuxserver/docker-bazarr/releases)
|
||||
|
||||
@@ -76,7 +76,7 @@ ingress: true
|
||||
ingress_entry: bazarr
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
- share:rw
|
||||
- media:rw
|
||||
|
||||
@@ -23,7 +23,7 @@ fi
|
||||
slug=bazarr
|
||||
|
||||
if [ -d "/homeassistant/addons_config/$slug" ]; then
|
||||
echo "Migrating /homeassistant/addons_config/$slug to /addon_configs/xxx-$slug"
|
||||
echo "Migrating /homeassistant/addons_config/$slug to /app_configs/xxx-$slug"
|
||||
cp -rnf /homeassistant/addons_config/"$slug"/. /config/ || true
|
||||
mv /homeassistant/addons_config/"$slug" /homeassistant/addons_config/"$slug"_migrated
|
||||
fi
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
## 20260729.1 (2026-08-01)
|
||||
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Version renamed from `source-20260729.1`, which Home Assistant could not order and therefore could not reliably offer as an update: every number of the previous version is kept, as a section of its own. The addon itself and the upstream version it tracks are unchanged
|
||||
|
||||
## source-20260729.1 (29-07-2026)
|
||||
|
||||
@@ -25,7 +25,7 @@ MQTT password : Ri5ahV1aipeiw0aelerooteixai5ohtoeNg6oo3mo0thi5te0phiezuge4Phoore
|
||||
MQTT broker : tcp://core-mosquitto:1883
|
||||
---
|
||||
|
||||
Edit this section of config.yaml found in addon_configs/db21ed7f_birdnet-go/:
|
||||
Edit this section of config.yaml found in app_configs/db21ed7f_birdnet-go/:
|
||||
mqtt:
|
||||
enabled: true # true to enable MQTT
|
||||
broker: tcp://core-mosquitto:1883 # MQTT (tcp://host:port)
|
||||
|
||||
@@ -82,7 +82,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -80,7 +80,7 @@ ingress_entry: "ui/dashboard"
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
name: Birdnet-go (customized and built from source)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 20260716 (2026-07-16)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from tphakala/birdnet-go (changelog : https://github.com/tphakala/birdnet-go/releases)
|
||||
|
||||
## 20260712 (2026-07-13)
|
||||
|
||||
@@ -25,7 +25,7 @@ MQTT password : Ri5ahV1aipeiw0aelerooteixai5ohtoeNg6oo3mo0thi5te0phiezuge4Phoore
|
||||
MQTT broker : tcp://core-mosquitto:1883
|
||||
---
|
||||
|
||||
Edit this section of config.yaml found in addon_configs/db21ed7f_birdnet-go/:
|
||||
Edit this section of config.yaml found in app_configs/db21ed7f_birdnet-go/:
|
||||
mqtt:
|
||||
enabled: true # true to enable MQTT
|
||||
broker: tcp://core-mosquitto:1883 # MQTT (tcp://host:port)
|
||||
|
||||
@@ -79,7 +79,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -81,7 +81,7 @@ ingress_entry: "ui/dashboard"
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
name: Birdnet-go
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
## 2026.07.10-2 (10-07-2026)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Minor bugs fixed
|
||||
## 2026.07.10 (10-07-2026)
|
||||
- Initial release: BirdNET-Pi add-on based on the zach7036/BirdNET-Pi-Enhanced-Version fork
|
||||
|
||||
@@ -93,7 +93,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -61,7 +61,7 @@ image: ghcr.io/alexbelgium/birdnet-pi-zach-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
## 2026.08.02 (02-08-2026)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Fix: ingress returned "502 Bad Gateway" because Caddy never listened on :8082. `91-nginx_ingress.sh` hooked the ingress site into `update_caddyfile.sh` with a sed anchored on `sudo caddy fmt --overwrite`, but 2026.07.10-1 strips `sudo` from every BirdNET-Pi script at build time, so the anchor stopped matching. `update_caddyfile.sh` then rewrote the Caddyfile from scratch just before Caddy started, dropping the ingress site
|
||||
- Fix: `caddy_ingress.sh` no longer appends a second `:8082` block when it runs twice (a duplicate site address makes Caddy refuse to start)
|
||||
- Fix: `02-caddy.sh` re-adds the ingress site if it is missing from the Caddyfile just before starting Caddy
|
||||
## 2026.07.22 (22-07-2026)
|
||||
- Fix: health-check the WebUI port (8081) instead of port 80, so the standalone Docker container no longer reports "unhealthy" when ssl=false
|
||||
- Fix: health-check now probes https when ssl is enabled, and no longer silently reports "healthy" regardless of the actual result (the previous check's `&>` redirection is a bash-ism that dash, the image's /bin/sh, parses as background + no-op, discarding curl's exit status)
|
||||
@@ -148,7 +153,7 @@
|
||||
- [ALL] Fix non-avx2 cpu support
|
||||
|
||||
## 2025.02.23 (2025-02-16)
|
||||
- WARNING 2025.02.14/16 was buggy. If you installed it you need to restore a backup or delete manually your /addon_configs/xxx-birdnet-pi/birdnet.conf file and recreate it
|
||||
- WARNING 2025.02.14/16 was buggy. If you installed it you need to restore a backup or delete manually your /app_configs/xxx-birdnet-pi/birdnet.conf file and recreate it
|
||||
- Allow usage as a standalone container (thanks @gotschi) https://github.com/mcguirepr89/BirdNET-Pi/issues/211#issuecomment-2650095952
|
||||
- Corrected a bug preventing to create db
|
||||
- Corrected a bug to ensure the the most up-to-date birdnet.conf on fresh start
|
||||
|
||||
@@ -93,7 +93,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -61,7 +61,7 @@ image: ghcr.io/alexbelgium/birdnet-pi-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
@@ -116,5 +116,5 @@ tmpfs: true
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pi
|
||||
usb: true
|
||||
version: 2026.07.22
|
||||
version: 2026.08.02
|
||||
video: true
|
||||
|
||||
@@ -25,5 +25,24 @@ export TZ="${TZ_VALUE:-Etc/UTC}"
|
||||
# Update caddyfile with password
|
||||
"$HOME"/BirdNET-Pi/scripts/update_caddyfile.sh &> /dev/null || true
|
||||
|
||||
# update_caddyfile.sh rewrites the Caddyfile from scratch. 91-nginx_ingress.sh
|
||||
# hooks the ingress site back into it, but if that hook ever fails to apply,
|
||||
# caddy would start without a :8082 listener and ingress would answer 502.
|
||||
# 91-nginx_ingress.sh writes /ingress_url when ingress is on and removes it when
|
||||
# it is off, so this is a no-op in standalone mode.
|
||||
# Require the Caddyfile to exist: if it is missing something went badly wrong
|
||||
# earlier, and caddy failing on a missing config is easier to diagnose than an
|
||||
# ingress-only Caddyfile conjured up here.
|
||||
if [[ -f /ingress_url ]] && [[ -f /etc/caddy/Caddyfile ]] \
|
||||
&& ! grep -qE '^[[:space:]]*:8082[[:space:]]*\{' /etc/caddy/Caddyfile 2> /dev/null; then
|
||||
echo "Ingress site missing from the Caddyfile, re-adding it"
|
||||
if ! /helpers/caddy_ingress.sh; then
|
||||
# Start caddy anyway: ingress stays broken, but direct access on 8081
|
||||
# keeps working. Exiting here would only make s6 restart this service in
|
||||
# a loop and take the WebUI down completely.
|
||||
echo "Failed to re-add the ingress site, the ingress panel will return 502" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Starting service: caddy"
|
||||
exec /usr/bin/caddy run --config /etc/caddy/Caddyfile
|
||||
|
||||
@@ -26,6 +26,10 @@ ingress_entry=$(bashio::addon.ingress_entry)
|
||||
if [[ "$ingress_entry" != "/api"* ]]; then
|
||||
bashio::log.info "Ingress entry is not set, exiting configuration."
|
||||
sed -i "1a sleep infinity" /custom-services.d/02-nginx.sh
|
||||
# This script re-runs from /etc/scripts-init on an add-on restart, so drop
|
||||
# any marker left by an earlier run: it is what 02-caddy.sh reads to decide
|
||||
# whether the ingress site belongs in the Caddyfile.
|
||||
rm -f /ingress_url
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -68,9 +72,23 @@ sed -i "s|localhost|localhost:8082|g" "$HOME/BirdNET-Pi/scripts/utils/notificati
|
||||
|
||||
# Update the Caddyfile if update script exists
|
||||
caddy_update_script="$HOME/BirdNET-Pi/scripts/update_caddyfile.sh"
|
||||
if [ -f "$caddy_update_script" ]; then
|
||||
sed -i "/sudo caddy fmt --overwrite/i /helpers/caddy_ingress.sh" "$caddy_update_script"
|
||||
else
|
||||
if [ ! -f "$caddy_update_script" ]; then
|
||||
bashio::log.error "Caddy update script not found: $caddy_update_script"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# update_caddyfile.sh rewrites /etc/caddy/Caddyfile from scratch, which drops
|
||||
# the ingress site added just above. 02-caddy.sh runs it right before starting
|
||||
# caddy, so the hook below has to re-add the site from inside that script, just
|
||||
# before it formats and reloads the config.
|
||||
# The anchor must not require "sudo": the Dockerfile strips it from every
|
||||
# BirdNET-Pi script at build time, so the shipped line is "caddy fmt --overwrite".
|
||||
if ! grep -qF "/helpers/caddy_ingress.sh" "$caddy_update_script"; then
|
||||
sed -i -E "/^[[:space:]]*(sudo[[:space:]]+)?caddy[[:space:]]+fmt[[:space:]]+--overwrite/i /helpers/caddy_ingress.sh" "$caddy_update_script"
|
||||
fi
|
||||
|
||||
# sed is silent when the anchor is missing; make sure the hook is really there
|
||||
if ! grep -qF "/helpers/caddy_ingress.sh" "$caddy_update_script"; then
|
||||
bashio::log.warning "Could not anchor the ingress site in $caddy_update_script, appending it instead"
|
||||
printf '\n/helpers/caddy_ingress.sh\n' >> "$caddy_update_script"
|
||||
fi
|
||||
|
||||
@@ -6,6 +6,13 @@ set +u
|
||||
# shellcheck disable=SC1091
|
||||
source /etc/birdnet/birdnet.conf
|
||||
|
||||
# Nothing to do if the ingress site is already there. This script runs both from
|
||||
# cont-init and from update_caddyfile.sh, and a duplicate ":8082" site address
|
||||
# makes caddy refuse to start.
|
||||
if grep -qE '^[[:space:]]*:8082[[:space:]]*\{' /etc/caddy/Caddyfile 2> /dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create ingress configuration for Caddyfile
|
||||
cat << EOF >> /etc/caddy/Caddyfile
|
||||
:8082 {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 0.8.5 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from Suncuss/BirdNET-PiPy (changelog : https://github.com/Suncuss/BirdNET-PiPy/releases)
|
||||
|
||||
## 0.8.4 (2026-07-13)
|
||||
|
||||
@@ -47,7 +47,7 @@ This add-on supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This add-on supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This add-on supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -67,7 +67,7 @@ ingress: true
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- ssl:rw
|
||||
- share:rw
|
||||
name: BirdNET-PiPy
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 1.93.129-ls119 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)
|
||||
|
||||
## 1.92.144-ls117 (2026-07-25)
|
||||
|
||||
@@ -26,7 +26,7 @@ image: ghcr.io/alexbelgium/brave-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2026.08.01.1 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)
|
||||
- Upstream tag : version-e2e1ec9c
|
||||
## 2026.08.01 (2026-08-01)
|
||||
|
||||
@@ -26,7 +26,7 @@ image: ghcr.io/alexbelgium/chromium-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.55.2 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from browserless/chrome (changelog : https://github.com/browserless/chrome/releases)
|
||||
|
||||
## 2.55.0 (2026-07-16)
|
||||
|
||||
@@ -50,7 +50,7 @@ TIMEOUT: 60000
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -69,7 +69,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/browserless_chrome-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
name: Browserless Chromium
|
||||
options:
|
||||
env_vars: []
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 9.12.0 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from linuxserver/docker-calibre (changelog : https://github.com/linuxserver/docker-calibre/releases)
|
||||
|
||||
## 9.11.0 (2026-07-04)
|
||||
@@ -217,7 +218,7 @@
|
||||
|
||||
- Update to latest version from linuxserver/docker-calibre
|
||||
- BREAKING CHANGE : please relink your library according to https://github.com/alexbelgium/hassio-addons/issues/1154#issuecomment-1879182729
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre to a folder only accessible from my Filebrowser addon called /addon_configs/something-calibre. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1154
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre to a folder only accessible from my Filebrowser addon called /app_configs/something-calibre. This prevents the add-on from modifying your Home Assistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see [the Home Assistant documentation](https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/) and [issue #1154](https://github.com/alexbelgium/hassio-addons/issues/1154).
|
||||
|
||||
## 7.2.0 (2023-12-16)
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -78,7 +78,7 @@ init: false
|
||||
map:
|
||||
- media:rw
|
||||
- share:rw
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
- ssl
|
||||
name: Calibre
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 0.6.26-2 (2026-04-06)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Fix: Install calibre (calibredb) at build time to fix 500 error when downloading books
|
||||
|
||||
## 0.6.26 (2026-02-07)
|
||||
@@ -10,7 +11,7 @@
|
||||
- Update to latest version from linuxserver/docker-calibre-web (changelog : https://github.com/linuxserver/docker-calibre-web/releases)
|
||||
## 0.6.24-10 (2025-05-28)
|
||||
- Fix migration script
|
||||
- Allow access to Calibre folder through /addon_configs/xxx-Calibre
|
||||
- Allow access to Calibre folder through /app_configs/xxx-Calibre
|
||||
|
||||
## 0.6.24 (2024-11-23)
|
||||
- Update to latest version from linuxserver/docker-calibre-web (changelog : https://github.com/linuxserver/docker-calibre-web/releases)
|
||||
@@ -26,7 +27,7 @@
|
||||
- Minor bugs fixed
|
||||
## 0.6.21-5 (2024-01-12)
|
||||
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre-web to a folder only accessible from my Filebrowser addon called /addon_configs/something-calibre-web. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1177
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre-web to a folder only accessible from my Filebrowser addon called /app_configs/something-calibre-web. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1177
|
||||
|
||||
## 0.6.21-2 (2023-11-05)
|
||||
|
||||
|
||||
@@ -77,8 +77,8 @@ image: ghcr.io/alexbelgium/calibre_web-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- all_addon_configs:rw
|
||||
- app_config:rw
|
||||
- all_app_configs:rw
|
||||
- homeassistant_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
## 1.38 (02-08-2026)
|
||||
|
||||
- Reduce Claude Desktop add-on RAM use in three places without removing Headroom, RTK, TokenSave, Cowork, Dispatch, or the streamed desktop. Headroom's heavy HTTP proxy is no longer started at container boot: a standard-library TCP gate stays on port 8787, starts the real proxy on the first request, and stops it after 15 minutes without traffic (`HEADROOM_IDLE_TIMEOUT_SECONDS` remains overridable through `env_vars`). This releases the proxy's Python, ONNX Runtime, tokenizer, and Kompress model allocations while the add-on is idle; a later request starts a clean backend transparently.
|
||||
- Prevent Headroom from loading a second Kompress model inside every Claude Desktop/Claude Code MCP process. The add-on now intercepts `headroom mcp serve` with a lightweight adapter that retains upstream MCP retrieval/statistics behavior but delegates `headroom_compress` to the shared proxy's loopback `/v1/compress` endpoint. The MCP process explicitly disables local Kompress and never imports `headroom.compress`, so only the proxy backend can own the ML runtime.
|
||||
- Remove the add-on-wide `tmpfs: true` mount and undo the shared Selkies script's `/tmp/cache` redirection for this add-on. Electron/Chromium, Mesa, and application caches now live under the selected persistent home (`$HOME/.cache`) as reclaimable filesystem cache instead of RAM-backed cgroup shmem. Runtime sockets and XDG runtime state remain under `/run`.
|
||||
|
||||
## 2026.08.02 (02-08-2026)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Minor bugs fixed
|
||||
|
||||
## ubunturesolute-version-3a10bef7 (2026-08-01)
|
||||
- Update to latest version from linuxserver/docker-baseimage-selkies (changelog : https://github.com/linuxserver/docker-baseimage-selkies/releases)
|
||||
|
||||
@@ -61,7 +61,7 @@ magic link into the in-session Chromium (not a phone).
|
||||
- Add-on Configuration → `additional_apps: chromium`, restart (installed by
|
||||
`rootfs/etc/cont-init.d/80-configuration.sh`).
|
||||
- Add the two `xdg-settings`/`xdg-mime` commands to the custom script
|
||||
`/addon_configs/db21ed7f_claude-desktop/claude_desktop.sh` (the image ships no standalone
|
||||
`/app_configs/db21ed7f_claude-desktop/claude_desktop.sh` (the image ships no standalone
|
||||
terminal).
|
||||
|
||||
---
|
||||
|
||||
@@ -34,7 +34,7 @@ hassio_role: manager
|
||||
homeassistant_api: true
|
||||
auth_api: true
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- share:rw
|
||||
- media:rw
|
||||
- ssl
|
||||
@@ -121,5 +121,5 @@ schema:
|
||||
slug: claude_desktop
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
version: "1.38"
|
||||
version: "2026.08.02"
|
||||
video: true
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
set -e
|
||||
|
||||
# 20-folders.sh is shared with the Webtop add-ons and historically redirects
|
||||
# XDG_CACHE_HOME to /tmp/cache. This Claude-specific follow-up runs before the
|
||||
# graphical longruns and moves general application caches back under the
|
||||
# persistent home. Removing config.yaml's `tmpfs: true` then ensures Chromium,
|
||||
# Electron, Mesa and other cache pages are reclaimable filesystem cache instead
|
||||
# of permanently charged cgroup shmem.
|
||||
LOCATION="$(getent passwd abc 2> /dev/null | cut -d: -f6 || true)"
|
||||
if [ -z "$LOCATION" ] || [ "$LOCATION" = "/" ]; then
|
||||
bashio::log.warning "Unable to resolve abc home; leaving XDG cache configuration unchanged"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
CACHE_DIR="$LOCATION/.cache"
|
||||
if [ -L "$CACHE_DIR" ]; then
|
||||
rm -f "$CACHE_DIR"
|
||||
fi
|
||||
mkdir -p "$CACHE_DIR"
|
||||
chown "$(id -u abc):$(id -g abc)" "$CACHE_DIR"
|
||||
chmod 700 "$CACHE_DIR"
|
||||
|
||||
CACHE_DIR="$CACHE_DIR" LOCATION="$LOCATION" python3 - <<'PY'
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
cache = os.environ["CACHE_DIR"]
|
||||
quoted = cache.replace("\\", "\\\\").replace('"', '\\"')
|
||||
replacement = f'export XDG_CACHE_HOME="{quoted}"'
|
||||
|
||||
for path in Path("/etc/s6-overlay/s6-rc.d").glob("*/run"):
|
||||
try:
|
||||
text = path.read_text()
|
||||
except (OSError, UnicodeDecodeError):
|
||||
continue
|
||||
updated = re.sub(r"^export XDG_CACHE_HOME=.*$", replacement, text, flags=re.MULTILINE)
|
||||
if updated != text:
|
||||
path.write_text(updated)
|
||||
|
||||
bashrc = Path(os.environ["LOCATION"]) / ".bashrc"
|
||||
if bashrc.exists():
|
||||
text = bashrc.read_text()
|
||||
updated = re.sub(r"^export XDG_CACHE_HOME=.*$", replacement, text, flags=re.MULTILINE)
|
||||
if updated != text:
|
||||
bashrc.write_text(updated)
|
||||
PY
|
||||
|
||||
S6_ENVDIR="/run/s6/container_environment"
|
||||
mkdir -p "$S6_ENVDIR"
|
||||
printf '%s' "$CACHE_DIR" > "$S6_ENVDIR/XDG_CACHE_HOME"
|
||||
|
||||
# Safe here: no graphical longrun has started yet, and the former directory was
|
||||
# only a boot-created target for the now-removed persistent-home symlink.
|
||||
rm -rf /tmp/cache
|
||||
bashio::log.info "Application cache moved from RAM-backed /tmp to $CACHE_DIR"
|
||||
@@ -1,59 +0,0 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
set -e
|
||||
|
||||
# Keep every existing Headroom CLI command unchanged, but intercept the MCP
|
||||
# server entrypoint so it uses the add-on's single-runtime adapter. The real
|
||||
# binary is intentionally outside /usr/local/bin; writing the wrapper there
|
||||
# makes it the command 82-claude_tools.sh registers in Claude Desktop/Code.
|
||||
REAL_HEADROOM=""
|
||||
for candidate in /usr/bin/headroom /lsiopy/bin/headroom; do
|
||||
if [ -x "$candidate" ]; then
|
||||
REAL_HEADROOM="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$REAL_HEADROOM" ]; then
|
||||
bashio::log.warning "Headroom executable was not found; MCP adapter wrapper was not installed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# The adapter intentionally uses a small, stable subset of the upstream MCP
|
||||
# server. Since Headroom is installed unpinned at image build time, verify that
|
||||
# subset before replacing the command. A future incompatible Headroom release
|
||||
# therefore keeps its native MCP server instead of breaking Claude startup.
|
||||
if ! /lsiopy/bin/python3 - <<'PY'
|
||||
from headroom.ccr.mcp_server import HeadroomMCPServer
|
||||
|
||||
for name in ("run_stdio", "cleanup", "_compress_content"):
|
||||
if not callable(getattr(HeadroomMCPServer, name, None)):
|
||||
raise SystemExit(f"HeadroomMCPServer.{name} is unavailable")
|
||||
PY
|
||||
then
|
||||
bashio::log.warning "Installed Headroom is incompatible with the single-runtime MCP adapter; preserving the native MCP server"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
wrapper="$(mktemp /usr/local/bin/.headroom-wrapper.XXXXXX)"
|
||||
cleanup() {
|
||||
rm -f "$wrapper"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
cat > "$wrapper" <<EOF
|
||||
#!/bin/sh
|
||||
REAL_HEADROOM="$REAL_HEADROOM"
|
||||
if [ "\${1:-}" = "mcp" ] && [ "\${2:-}" = "serve" ]; then
|
||||
shift 2
|
||||
unset HF_HOME
|
||||
export HEADROOM_DISABLE_KOMPRESS=1
|
||||
exec /lsiopy/bin/python3 /usr/local/bin/headroom-mcp-proxy.py "\$@"
|
||||
fi
|
||||
exec "\$REAL_HEADROOM" "\$@"
|
||||
EOF
|
||||
chmod 0755 "$wrapper"
|
||||
mv -f "$wrapper" /usr/local/bin/headroom
|
||||
trap - EXIT
|
||||
|
||||
bashio::log.info "Headroom MCP compression is delegated to the shared lazy proxy runtime"
|
||||
@@ -1,43 +1,32 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# Headroom optimization proxy — lazy backend for Claude Desktop MCP and Claude Code.
|
||||
# Headroom optimization proxy — local backend for Claude Desktop MCP and Claude Code.
|
||||
declare port=8787
|
||||
declare backend_port=8789
|
||||
declare host=127.0.0.1
|
||||
|
||||
# The dashboard is unauthenticated. Keep the gate container-local by default and
|
||||
# bind all interfaces only when the user explicitly opts in and maps port 8787.
|
||||
# The dashboard is unauthenticated. Keep it container-local by default and bind all
|
||||
# interfaces only when the user explicitly opts in and maps port 8787.
|
||||
if bashio::config.true 'expose_headroom_dashboard'; then
|
||||
host=0.0.0.0
|
||||
fi
|
||||
|
||||
if bashio::config.true 'install_headroom'; then
|
||||
real_headroom=""
|
||||
for candidate in /usr/bin/headroom /lsiopy/bin/headroom; do
|
||||
if [ -x "$candidate" ]; then
|
||||
real_headroom="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -n "$real_headroom" ]; then
|
||||
# Keep model artifacts persistent, but do not import Headroom or load the
|
||||
# model in this longrun. The standard-library gate starts the real proxy
|
||||
# on the first request and terminates it after the idle timeout, releasing
|
||||
# Python/ONNX/model allocations. HEADROOM_IDLE_TIMEOUT_SECONDS is
|
||||
# overridable through env_vars; 900 seconds is the default.
|
||||
export HF_HOME="${HOME}/.headroom/hf"
|
||||
mkdir -p "$HF_HOME" "${HOME}/.headroom"
|
||||
chown abc:abc "${HOME}/.headroom" "$HF_HOME" 2> /dev/null || true
|
||||
bashio::log.info "svc-headroom: starting lazy gate on ${host}:${port} (backend ${backend_port}, idle timeout ${HEADROOM_IDLE_TIMEOUT_SECONDS:-900}s)"
|
||||
exec s6-setuidgid abc env \
|
||||
HEADROOM_REAL_BIN="$real_headroom" \
|
||||
HEADROOM_GATE_HOST="$host" \
|
||||
HEADROOM_GATE_PORT="$port" \
|
||||
HEADROOM_BACKEND_HOST=127.0.0.1 \
|
||||
HEADROOM_BACKEND_PORT="$backend_port" \
|
||||
HEADROOM_IDLE_TIMEOUT_SECONDS="${HEADROOM_IDLE_TIMEOUT_SECONDS:-900}" \
|
||||
HF_HOME="$HF_HOME" \
|
||||
/lsiopy/bin/python3 /usr/local/bin/headroom-proxy-gate.py
|
||||
fi
|
||||
if bashio::config.true 'install_headroom' && command -v headroom > /dev/null 2>&1; then
|
||||
# Kompress (the ONNX compression engine) needs its model in the local HF cache: the
|
||||
# proxy's startup preload is deliberately cache-only, and the default HF cache lands
|
||||
# under ~/.cache, which the add-on points at tmpfs (/tmp/cache) — wiped on every
|
||||
# restart. Without a warm persistent cache the proxy ran forever in "deferred" mode
|
||||
# and recorded zero compression savings. Point the cache at persistent storage;
|
||||
# nothing else is needed here — the proxy's own request path already downloads a
|
||||
# missing model in the background on first use (ensure_background_load) and passes
|
||||
# requests through uncompressed until it lands, so this self-heals within a couple of
|
||||
# requests on the first boot and loads instantly (eager preload) on every boot after.
|
||||
# A synchronous pre-warm was tried here and removed: it blocked the port bind for up
|
||||
# to the download's duration, which left the settings-managed ANTHROPIC_BASE_URL
|
||||
# (see 82-claude_tools.sh) pointing at a proxy that wasn't listening yet.
|
||||
export HF_HOME="${HOME}/.headroom/hf"
|
||||
mkdir -p "$HF_HOME"
|
||||
chown abc:abc "$HF_HOME" 2> /dev/null || true
|
||||
bashio::log.info "svc-headroom: starting local Headroom proxy on ${host}:${port}"
|
||||
exec s6-setuidgid abc headroom proxy --host "${host}" --port "${port}" --code-aware
|
||||
fi
|
||||
|
||||
bashio::log.info "svc-headroom: install_headroom disabled or headroom not found; idling"
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
#!/lsiopy/bin/python3
|
||||
"""Run Headroom MCP with compression delegated to the single proxy backend.
|
||||
|
||||
Upstream Headroom MCP normally performs ``headroom_compress`` in its own
|
||||
process. That imports the compression pipeline and can load a second copy of the
|
||||
Kompress ONNX model in addition to the HTTP proxy. This adapter preserves the
|
||||
upstream MCP protocol and retrieve/stats implementations, but replaces only its
|
||||
local compression method with a call to the proxy's loopback-only
|
||||
``/v1/compress`` endpoint.
|
||||
|
||||
The proxy gate starts the heavy backend on this first request and later unloads
|
||||
it after the configured idle timeout. The MCP process therefore remains a
|
||||
lightweight protocol bridge and never imports ``headroom.compress``.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from types import MethodType
|
||||
from typing import Any
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(description="Headroom MCP single-runtime adapter")
|
||||
parser.add_argument(
|
||||
"--proxy-url",
|
||||
default=os.environ.get("HEADROOM_PROXY_URL", "http://127.0.0.1:8787"),
|
||||
)
|
||||
parser.add_argument("--transport", default="stdio")
|
||||
parser.add_argument("--host", default="127.0.0.1")
|
||||
parser.add_argument("--port", type=int, default=8788)
|
||||
parser.add_argument("--path", default="/mcp")
|
||||
parser.add_argument("--debug", action="store_true")
|
||||
parser.add_argument("--direct", action="store_true")
|
||||
args, unknown = parser.parse_known_args()
|
||||
if unknown:
|
||||
print(f"headroom-mcp-proxy: ignoring unsupported arguments: {unknown}", file=sys.stderr)
|
||||
if args.transport.lower() != "stdio":
|
||||
parser.error("only stdio transport is supported by the add-on adapter")
|
||||
return args
|
||||
|
||||
|
||||
def _number(data: dict[str, Any], key: str) -> int:
|
||||
value = data.get(key, 0)
|
||||
try:
|
||||
return int(value)
|
||||
except (TypeError, ValueError):
|
||||
return 0
|
||||
|
||||
|
||||
def make_proxy_compressor(proxy_url: str):
|
||||
endpoint = f"{proxy_url.rstrip('/')}/v1/compress"
|
||||
model = os.environ.get("HEADROOM_MCP_MODEL", "claude-sonnet-4-5-20250929")
|
||||
|
||||
def compress_via_proxy(_self, content: str) -> dict[str, Any]:
|
||||
# Imported here, not at module import, so MCP startup stays small. httpx is
|
||||
# already a dependency of Headroom's MCP server for retrieve/stats.
|
||||
import httpx
|
||||
|
||||
response = httpx.post(
|
||||
endpoint,
|
||||
json={
|
||||
"messages": [{"role": "tool", "content": content}],
|
||||
"model": model,
|
||||
},
|
||||
timeout=httpx.Timeout(180.0, connect=75.0),
|
||||
)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
if not isinstance(data, dict):
|
||||
raise RuntimeError("Headroom proxy returned a non-object compression response")
|
||||
|
||||
messages = data.get("messages")
|
||||
compressed: Any = content
|
||||
if isinstance(messages, list) and messages:
|
||||
last = messages[-1]
|
||||
if isinstance(last, dict) and "content" in last:
|
||||
compressed = last["content"]
|
||||
if not isinstance(compressed, str):
|
||||
compressed = json.dumps(compressed, ensure_ascii=False)
|
||||
|
||||
hashes = data.get("ccr_hashes")
|
||||
hash_key = next((item for item in hashes if isinstance(item, str)), None) if isinstance(hashes, list) else None
|
||||
before = _number(data, "tokens_before")
|
||||
after = _number(data, "tokens_after")
|
||||
saved = _number(data, "tokens_saved")
|
||||
if saved <= 0:
|
||||
saved = max(0, before - after)
|
||||
savings_percent = round(saved / before * 100, 1) if before > 0 else 0.0
|
||||
transforms = data.get("transforms_applied")
|
||||
if not isinstance(transforms, list):
|
||||
transforms = []
|
||||
|
||||
note = "Compression was executed by the shared Headroom proxy runtime."
|
||||
if hash_key:
|
||||
note += (
|
||||
f" Original stored with hash={hash_key}. "
|
||||
"Use mcp__headroom__headroom_retrieve to recover it."
|
||||
)
|
||||
return {
|
||||
"compressed": compressed,
|
||||
"hash": hash_key,
|
||||
"original_tokens": before,
|
||||
"compressed_tokens": after,
|
||||
"tokens_saved": saved,
|
||||
"savings_percent": savings_percent,
|
||||
"transforms": transforms,
|
||||
"note": note,
|
||||
}
|
||||
|
||||
return compress_via_proxy
|
||||
|
||||
|
||||
async def run() -> None:
|
||||
args = parse_args()
|
||||
|
||||
# Defense in depth. The adapter never calls the local compressor, but keep
|
||||
# the MCP process explicitly unable to initialize Kompress if upstream code
|
||||
# changes or an unrelated import probes the compression pipeline.
|
||||
os.environ.pop("HF_HOME", None)
|
||||
os.environ["HEADROOM_DISABLE_KOMPRESS"] = "1"
|
||||
os.environ["HEADROOM_PROXY_URL"] = args.proxy_url
|
||||
|
||||
from headroom.ccr.mcp_server import HeadroomMCPServer
|
||||
|
||||
server = HeadroomMCPServer(proxy_url=args.proxy_url, check_proxy=True)
|
||||
server._compress_content = MethodType(make_proxy_compressor(args.proxy_url), server)
|
||||
try:
|
||||
await server.run_stdio()
|
||||
finally:
|
||||
await server.cleanup()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
asyncio.run(run())
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
@@ -1,388 +0,0 @@
|
||||
#!/lsiopy/bin/python3
|
||||
"""Lazy TCP gate for the Headroom HTTP proxy.
|
||||
|
||||
The gate remains resident on the public Headroom port while the heavy Headroom
|
||||
proxy (and its optional ONNX Kompress model) is started only for real traffic.
|
||||
After an idle period the backend process is terminated, releasing its Python,
|
||||
ONNX and model allocations. The next connection starts a fresh backend.
|
||||
|
||||
Only the Python standard library is imported here deliberately: the idle path
|
||||
must not import Headroom, ONNX Runtime, transformers or the MCP SDK.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import contextlib
|
||||
import json
|
||||
import os
|
||||
import signal
|
||||
import socket
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def _int_env(name: str, default: int, minimum: int = 1) -> int:
|
||||
try:
|
||||
value = int(os.environ.get(name, str(default)))
|
||||
except (TypeError, ValueError):
|
||||
value = default
|
||||
return max(minimum, value)
|
||||
|
||||
|
||||
GATE_HOST = os.environ.get("HEADROOM_GATE_HOST", "127.0.0.1")
|
||||
GATE_PORT = _int_env("HEADROOM_GATE_PORT", 8787)
|
||||
BACKEND_HOST = os.environ.get("HEADROOM_BACKEND_HOST", "127.0.0.1")
|
||||
BACKEND_PORT = _int_env("HEADROOM_BACKEND_PORT", 8789)
|
||||
HEADROOM_BIN = os.environ.get("HEADROOM_REAL_BIN", "/usr/bin/headroom")
|
||||
IDLE_TIMEOUT = _int_env("HEADROOM_IDLE_TIMEOUT_SECONDS", 900)
|
||||
START_TIMEOUT = _int_env("HEADROOM_START_TIMEOUT_SECONDS", 60)
|
||||
STOP_TIMEOUT = _int_env("HEADROOM_STOP_TIMEOUT_SECONDS", 10)
|
||||
HF_HOME = os.environ.get("HF_HOME", str(Path.home() / ".headroom/hf"))
|
||||
MAX_HEADER_BYTES = 128 * 1024
|
||||
COPY_CHUNK = 64 * 1024
|
||||
|
||||
|
||||
def log(message: str) -> None:
|
||||
stamp = time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
print(f"[{stamp}] headroom-gate: {message}", file=sys.stderr, flush=True)
|
||||
|
||||
|
||||
class BackendUnavailable(RuntimeError):
|
||||
pass
|
||||
|
||||
|
||||
class ProxyGate:
|
||||
def __init__(self) -> None:
|
||||
self._lock = asyncio.Lock()
|
||||
self._process: asyncio.subprocess.Process | None = None
|
||||
self._last_activity = time.monotonic()
|
||||
self._active_connections = 0
|
||||
self._stopping = False
|
||||
self._watch_task: asyncio.Task[None] | None = None
|
||||
|
||||
@property
|
||||
def state(self) -> str:
|
||||
process = self._process
|
||||
if process is None:
|
||||
return "dormant"
|
||||
if process.returncode is None:
|
||||
return "running"
|
||||
return "stopped"
|
||||
|
||||
def touch(self) -> None:
|
||||
self._last_activity = time.monotonic()
|
||||
|
||||
async def _backend_healthy(self) -> bool:
|
||||
for path in ("/livez", "/health"):
|
||||
try:
|
||||
reader, writer = await asyncio.wait_for(
|
||||
asyncio.open_connection(BACKEND_HOST, BACKEND_PORT), timeout=1.0
|
||||
)
|
||||
request = (
|
||||
f"GET {path} HTTP/1.1\r\n"
|
||||
f"Host: {BACKEND_HOST}:{BACKEND_PORT}\r\n"
|
||||
"Connection: close\r\n\r\n"
|
||||
).encode()
|
||||
writer.write(request)
|
||||
await writer.drain()
|
||||
line = await asyncio.wait_for(reader.readline(), timeout=1.0)
|
||||
writer.close()
|
||||
with contextlib.suppress(Exception):
|
||||
await writer.wait_closed()
|
||||
if line.startswith(b"HTTP/") and b" 2" in line[:16]:
|
||||
return True
|
||||
except (OSError, asyncio.TimeoutError):
|
||||
continue
|
||||
return False
|
||||
|
||||
async def ensure_backend(self) -> None:
|
||||
if await self._backend_healthy():
|
||||
self.touch()
|
||||
return
|
||||
|
||||
async with self._lock:
|
||||
if await self._backend_healthy():
|
||||
self.touch()
|
||||
return
|
||||
|
||||
process = self._process
|
||||
if process is not None and process.returncode is None:
|
||||
await self._wait_until_healthy()
|
||||
self.touch()
|
||||
return
|
||||
|
||||
if not os.path.isfile(HEADROOM_BIN) or not os.access(HEADROOM_BIN, os.X_OK):
|
||||
raise BackendUnavailable(f"Headroom executable is unavailable: {HEADROOM_BIN}")
|
||||
|
||||
Path(HF_HOME).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
environment = os.environ.copy()
|
||||
environment.update(
|
||||
{
|
||||
"HF_HOME": HF_HOME,
|
||||
"HEADROOM_PROXY_GATE": "1",
|
||||
}
|
||||
)
|
||||
command = [
|
||||
HEADROOM_BIN,
|
||||
"proxy",
|
||||
"--host",
|
||||
BACKEND_HOST,
|
||||
"--port",
|
||||
str(BACKEND_PORT),
|
||||
"--code-aware",
|
||||
]
|
||||
log(f"starting backend on {BACKEND_HOST}:{BACKEND_PORT}")
|
||||
try:
|
||||
self._process = await asyncio.create_subprocess_exec(
|
||||
*command,
|
||||
env=environment,
|
||||
start_new_session=True,
|
||||
)
|
||||
except Exception as exc:
|
||||
self._process = None
|
||||
raise BackendUnavailable(f"unable to start Headroom: {exc}") from exc
|
||||
|
||||
self._watch_task = asyncio.create_task(self._watch_backend(self._process))
|
||||
try:
|
||||
await self._wait_until_healthy()
|
||||
except Exception:
|
||||
await self._terminate_backend_locked("startup failure")
|
||||
raise
|
||||
self.touch()
|
||||
|
||||
async def _wait_until_healthy(self) -> None:
|
||||
deadline = time.monotonic() + START_TIMEOUT
|
||||
while time.monotonic() < deadline:
|
||||
process = self._process
|
||||
if process is not None and process.returncode is not None:
|
||||
raise BackendUnavailable(
|
||||
f"Headroom exited during startup with status {process.returncode}; "
|
||||
"see the add-on log"
|
||||
)
|
||||
if await self._backend_healthy():
|
||||
log("backend is ready")
|
||||
return
|
||||
await asyncio.sleep(0.25)
|
||||
raise BackendUnavailable(
|
||||
f"Headroom did not become ready within {START_TIMEOUT}s; see the add-on log"
|
||||
)
|
||||
|
||||
async def _watch_backend(self, process: asyncio.subprocess.Process) -> None:
|
||||
returncode = await process.wait()
|
||||
async with self._lock:
|
||||
was_current = self._process is process
|
||||
if was_current:
|
||||
self._process = None
|
||||
if not self._stopping and was_current:
|
||||
log(f"backend exited with status {returncode}")
|
||||
|
||||
async def stop_backend(self, reason: str) -> None:
|
||||
async with self._lock:
|
||||
await self._terminate_backend_locked(reason)
|
||||
|
||||
async def _terminate_backend_locked(self, reason: str) -> None:
|
||||
process = self._process
|
||||
if process is None:
|
||||
return
|
||||
if process.returncode is not None:
|
||||
self._process = None
|
||||
return
|
||||
|
||||
log(f"stopping backend ({reason})")
|
||||
try:
|
||||
os.killpg(process.pid, signal.SIGTERM)
|
||||
except ProcessLookupError:
|
||||
pass
|
||||
try:
|
||||
await asyncio.wait_for(process.wait(), timeout=STOP_TIMEOUT)
|
||||
except asyncio.TimeoutError:
|
||||
log("backend did not stop after SIGTERM; sending SIGKILL")
|
||||
with contextlib.suppress(ProcessLookupError):
|
||||
os.killpg(process.pid, signal.SIGKILL)
|
||||
with contextlib.suppress(Exception):
|
||||
await process.wait()
|
||||
self._process = None
|
||||
|
||||
async def idle_monitor(self) -> None:
|
||||
interval = max(5, min(30, IDLE_TIMEOUT // 4))
|
||||
while not self._stopping:
|
||||
await asyncio.sleep(interval)
|
||||
process = self._process
|
||||
idle_for = time.monotonic() - self._last_activity
|
||||
if (
|
||||
process is not None
|
||||
and process.returncode is None
|
||||
and idle_for >= IDLE_TIMEOUT
|
||||
):
|
||||
await self.stop_backend(f"idle for {int(idle_for)}s")
|
||||
|
||||
def status_payload(self) -> bytes:
|
||||
process = self._process
|
||||
payload = {
|
||||
"status": self.state,
|
||||
"backend_pid": process.pid if process is not None and process.returncode is None else None,
|
||||
"active_connections": self._active_connections,
|
||||
"idle_seconds": round(time.monotonic() - self._last_activity, 1),
|
||||
"idle_timeout_seconds": IDLE_TIMEOUT,
|
||||
"backend": f"{BACKEND_HOST}:{BACKEND_PORT}",
|
||||
}
|
||||
body = json.dumps(payload, separators=(",", ":")).encode()
|
||||
return (
|
||||
b"HTTP/1.1 200 OK\r\n"
|
||||
b"Content-Type: application/json\r\n"
|
||||
+ f"Content-Length: {len(body)}\r\n".encode()
|
||||
+ b"Connection: close\r\n\r\n"
|
||||
+ body
|
||||
)
|
||||
|
||||
async def handle_client(
|
||||
self,
|
||||
client_reader: asyncio.StreamReader,
|
||||
client_writer: asyncio.StreamWriter,
|
||||
) -> None:
|
||||
self._active_connections += 1
|
||||
real_traffic = False
|
||||
peer = client_writer.get_extra_info("peername")
|
||||
try:
|
||||
try:
|
||||
initial = await asyncio.wait_for(
|
||||
client_reader.readuntil(b"\r\n\r\n"), timeout=15.0
|
||||
)
|
||||
except (
|
||||
asyncio.IncompleteReadError,
|
||||
asyncio.LimitOverrunError,
|
||||
asyncio.TimeoutError,
|
||||
):
|
||||
return
|
||||
if len(initial) > MAX_HEADER_BYTES:
|
||||
await self._send_error(client_writer, 431, "request headers too large")
|
||||
return
|
||||
|
||||
first_line = initial.split(b"\r\n", 1)[0]
|
||||
parts = first_line.split(b" ")
|
||||
target = parts[1].split(b"?", 1)[0] if len(parts) >= 2 else b""
|
||||
if target == b"/gate/status":
|
||||
client_writer.write(self.status_payload())
|
||||
await client_writer.drain()
|
||||
return
|
||||
|
||||
real_traffic = True
|
||||
self.touch()
|
||||
try:
|
||||
await self.ensure_backend()
|
||||
backend_reader, backend_writer = await asyncio.wait_for(
|
||||
asyncio.open_connection(BACKEND_HOST, BACKEND_PORT), timeout=5.0
|
||||
)
|
||||
except (BackendUnavailable, OSError, asyncio.TimeoutError) as exc:
|
||||
log(f"backend unavailable for {peer}: {exc}")
|
||||
await self._send_error(client_writer, 503, str(exc))
|
||||
return
|
||||
|
||||
backend_writer.write(initial)
|
||||
await backend_writer.drain()
|
||||
self.touch()
|
||||
|
||||
upstream = asyncio.create_task(self._pipe(client_reader, backend_writer))
|
||||
downstream = asyncio.create_task(self._pipe(backend_reader, client_writer))
|
||||
done, pending = await asyncio.wait(
|
||||
{upstream, downstream}, return_when=asyncio.FIRST_COMPLETED
|
||||
)
|
||||
for task in pending:
|
||||
task.cancel()
|
||||
for task in done | pending:
|
||||
with contextlib.suppress(
|
||||
asyncio.CancelledError,
|
||||
ConnectionError,
|
||||
OSError,
|
||||
):
|
||||
await task
|
||||
backend_writer.close()
|
||||
with contextlib.suppress(Exception):
|
||||
await backend_writer.wait_closed()
|
||||
finally:
|
||||
self._active_connections = max(0, self._active_connections - 1)
|
||||
if real_traffic:
|
||||
self.touch()
|
||||
client_writer.close()
|
||||
with contextlib.suppress(Exception):
|
||||
await client_writer.wait_closed()
|
||||
|
||||
async def _pipe(
|
||||
self,
|
||||
reader: asyncio.StreamReader,
|
||||
writer: asyncio.StreamWriter,
|
||||
) -> None:
|
||||
while True:
|
||||
data = await reader.read(COPY_CHUNK)
|
||||
if not data:
|
||||
with contextlib.suppress(Exception):
|
||||
writer.write_eof()
|
||||
return
|
||||
writer.write(data)
|
||||
await writer.drain()
|
||||
self.touch()
|
||||
|
||||
@staticmethod
|
||||
async def _send_error(
|
||||
writer: asyncio.StreamWriter,
|
||||
status: int,
|
||||
detail: str,
|
||||
) -> None:
|
||||
reason = (
|
||||
"Service Unavailable"
|
||||
if status == 503
|
||||
else "Request Header Fields Too Large"
|
||||
)
|
||||
body = json.dumps({"error": detail}).encode()
|
||||
response = (
|
||||
f"HTTP/1.1 {status} {reason}\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
f"Content-Length: {len(body)}\r\n"
|
||||
"Connection: close\r\n\r\n"
|
||||
).encode() + body
|
||||
writer.write(response)
|
||||
with contextlib.suppress(Exception):
|
||||
await writer.drain()
|
||||
|
||||
async def shutdown(self) -> None:
|
||||
self._stopping = True
|
||||
await self.stop_backend("gate shutdown")
|
||||
|
||||
|
||||
async def async_main() -> None:
|
||||
gate = ProxyGate()
|
||||
loop = asyncio.get_running_loop()
|
||||
stop_event = asyncio.Event()
|
||||
for sig in (signal.SIGTERM, signal.SIGINT):
|
||||
with contextlib.suppress(NotImplementedError):
|
||||
loop.add_signal_handler(sig, stop_event.set)
|
||||
|
||||
server = await asyncio.start_server(
|
||||
gate.handle_client,
|
||||
GATE_HOST,
|
||||
GATE_PORT,
|
||||
limit=MAX_HEADER_BYTES + 1,
|
||||
family=socket.AF_INET,
|
||||
)
|
||||
addresses = ", ".join(str(sock.getsockname()) for sock in server.sockets or [])
|
||||
log(
|
||||
f"listening on {addresses}; backend is lazy and stops after {IDLE_TIMEOUT}s idle; "
|
||||
"status endpoint: /gate/status"
|
||||
)
|
||||
monitor = asyncio.create_task(gate.idle_monitor())
|
||||
async with server:
|
||||
await stop_event.wait()
|
||||
monitor.cancel()
|
||||
with contextlib.suppress(asyncio.CancelledError):
|
||||
await monitor
|
||||
await gate.shutdown()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
asyncio.run(async_main())
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.10.2 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from Cleanuparr/Cleanuparr (changelog : https://github.com/Cleanuparr/Cleanuparr/releases)
|
||||
|
||||
## 2.9.16 (2026-07-11)
|
||||
|
||||
@@ -63,7 +63,7 @@ COPY bashio-standalone.sh /usr/local/lib/bashio-standalone.sh
|
||||
RUN chmod 0755 /usr/local/lib/bashio-standalone.sh
|
||||
|
||||
# Bypass the original /entrypoint.sh (which mounts /config as VOLUME).
|
||||
# Our wrapper symlinks /app/config → HA addon_config and starts ./Cleanuparr directly.
|
||||
# Our wrapper symlinks /app/config → the /config app_config mount and starts ./Cleanuparr directly.
|
||||
ENTRYPOINT ["/ha_entrypoint.sh"]
|
||||
CMD ["./Cleanuparr"]
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ ingress_stream: true
|
||||
init: false
|
||||
panel_icon: mdi:movie-search
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
name: Cleanuparr
|
||||
options:
|
||||
env_vars: []
|
||||
|
||||
@@ -5,7 +5,7 @@ set -e
|
||||
###############################################################################
|
||||
# Home Assistant Addon entrypoint for Cleanuparr
|
||||
# The .NET app uses /app/config as its data directory.
|
||||
# We symlink /app/config → /addon_configs/cleanuparr (HA persistent storage)
|
||||
# We symlink /app/config → /config (HA persistent app_config storage)
|
||||
# and start ./Cleanuparr directly, bypassing the original /entrypoint.sh
|
||||
# which would trigger the /config Docker VOLUME mount.
|
||||
###############################################################################
|
||||
@@ -26,7 +26,7 @@ if [ -d /etc/cont-init.d ]; then
|
||||
fi
|
||||
|
||||
# ─── Setup persistent data directory ─────────────────────────────────────────
|
||||
HA_DATA_DIR="/addon_configs/cleanuparr"
|
||||
HA_DATA_DIR="/config"
|
||||
echo "[Cleanuparr] Setting up data directory: $HA_DATA_DIR"
|
||||
mkdir -p "$HA_DATA_DIR"
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 19.19.1 (2026-06-17)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from coderaiser/cloudcmd (changelog : https://github.com/coderaiser/cloudcmd/releases)
|
||||
|
||||
## 19.19.0 (2026-05-30)
|
||||
@@ -225,7 +226,7 @@
|
||||
## 16.17.7-3 (2023-11-19)
|
||||
|
||||
- Minor bugs fixed
|
||||
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my cloudcommander or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the app_configs folder from my cloudcommander or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- Homeassistant config accessible in /homeassistant folder ; all addons config in /addons_config ; this addon config in /config
|
||||
|
||||
## 16.17.7-2 (2023-10-30)
|
||||
|
||||
@@ -69,8 +69,8 @@ image: ghcr.io/alexbelgium/cloudcommander-{arch}
|
||||
ingress: true
|
||||
ingress_stream: true
|
||||
map:
|
||||
- addon_config:rw
|
||||
- all_addon_configs:rw
|
||||
- app_config:rw
|
||||
- all_app_configs:rw
|
||||
- homeassistant_config:rw
|
||||
- ssl:rw
|
||||
- share:rw
|
||||
|
||||
@@ -35,7 +35,7 @@ fi
|
||||
# Create symlinks with legacy folders
|
||||
if [ -d /homeassistant/addons_config ]; then
|
||||
ln -s /homeassistant/addons_config /config
|
||||
find /addon_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*cloudcommander*" -exec ln -s {} /config/addons_config/ \;
|
||||
find /app_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*cloudcommander*" -exec ln -s {} /config/addons_config/ \;
|
||||
fi
|
||||
if [ -d /homeassistant/addons_autoscripts ]; then
|
||||
ln -s /homeassistant/addons_autoscripts /config
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.2.5 (2026-08-02)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)
|
||||
|
||||
## 2.2.4 (2026-08-01)
|
||||
|
||||
@@ -91,7 +91,7 @@ cifsdomain: "WORKGROUP"
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -65,7 +65,7 @@ image: ghcr.io/alexbelgium/codex-{arch}
|
||||
ingress: true
|
||||
ingress_stream: true
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
name: Codex
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 26.04.2.4.1 (2026-07-26)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Rebuild on a Debian base: upstream turned collabora/code into a distroless image with no shell, which broke the addon build entirely. collabora/code stays the tracked upstream image in build.json, but is now a build stage whose payload is copied onto ghcr.io/hassio-addons/debian-base, and the addon ships its own launcher in place of the removed /start-collabora-online.sh
|
||||
- build.json names the architecture explicitly again (`collabora/code:latest-amd64` and `collabora/code:latest-arm64`). The builder never passes `--platform`, so the tag is the only thing that decides which binaries land in the addon
|
||||
- Restore the file capabilities on `coolforkit-caps` and `coolmount`. The official image carries them as extended attributes, which `COPY --from` does not transfer, and without them Collabora starts but cannot open any document
|
||||
|
||||
@@ -138,7 +138,7 @@ The two hostnames have different roles, and swapping them is the most common cau
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -8,7 +8,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/collabora-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- ssl:ro
|
||||
name: Collabora
|
||||
options:
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
## 1.3 (2024-03-11)
|
||||
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Minor bugs fixed
|
||||
## 1.1 (2024-03-09)
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ hassio_api: true
|
||||
homeassistant_api: true
|
||||
image: ghcr.io/alexbelgium/comixed-{arch}
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
name: Comixed
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 4.9.5.0 (2026-05-19)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
|
||||
|
||||
## 4.9.3.0 (2026-01-10)
|
||||
@@ -14,7 +15,7 @@
|
||||
## 4.8.11.0-2 (2025-08-02)
|
||||
- Minor bugs fixed
|
||||
## 4.8.11.0 (2025-04-22)
|
||||
- WARNING : migration of config to addon_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
|
||||
- WARNING : migration of config to app_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
|
||||
|
||||
## 4.9.0.48 (2025-04-19)
|
||||
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
|
||||
|
||||
@@ -79,7 +79,7 @@ ingress_port: 0
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- share:rw
|
||||
- media:rw
|
||||
- ssl:rw
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 4.10.0.22 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
|
||||
|
||||
## 4.10.0.21 (2026-08-01)
|
||||
@@ -154,7 +155,7 @@
|
||||
## 4.9.0.50 (2025-04-26)
|
||||
|
||||
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
|
||||
- WARNING : migration of config to addon_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
|
||||
- WARNING : migration of config to app_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
|
||||
|
||||
## 4.9.0.48 (2025-04-19)
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ ingress_port: 0
|
||||
ingress_stream: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
- share:rw
|
||||
- media:rw
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 4.4.23 (2026-06-11)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from ente-io/ente (changelog : https://github.com/ente-io/ente/releases)
|
||||
## 1.7.24 (2026-06-05)
|
||||
- Update to latest version from ente-io/ente (changelog : https://github.com/ente-io/ente/releases)
|
||||
|
||||
@@ -79,7 +79,7 @@ TZ: "America/New_York"
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -76,7 +76,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/ente-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
name: Ente
|
||||
options:
|
||||
env_vars: []
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.63.23 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from filebrowser/filebrowser (changelog : https://github.com/filebrowser/filebrowser/releases)
|
||||
## 2.63.18.5 (26-07-2026)
|
||||
- Fixed healthcheck log spam when ssl is enabled (#2881)
|
||||
@@ -241,8 +242,8 @@
|
||||
|
||||
## 2.23.0_reverted5 (2023-11-21)
|
||||
|
||||
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- Homeassistant config accessible in /homeassistant folder ; all addons config in /addons_config ; this addon config in /config
|
||||
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the add-on config folder, which was exposed through the legacy /addon_configs path in the Filebrowser and Cloud Commander add-ons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- Home Assistant config accessible in /homeassistant; all add-on config in the legacy /addon_configs path; this add-on config in /config
|
||||
|
||||
## 2.23.0_reverted (2023-09-29)
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -81,9 +81,9 @@ ingress_entry: files
|
||||
ingress_port: 8071
|
||||
ingress_stream: true
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- all_addon_configs:rw
|
||||
- all_app_configs:rw
|
||||
- homeassistant_config:rw
|
||||
- addons:rw
|
||||
- backup:rw
|
||||
|
||||
@@ -35,7 +35,7 @@ fi
|
||||
# Create symlinks with legacy folders
|
||||
if [ -d /homeassistant/addons_config ]; then
|
||||
ln -s /homeassistant/addons_config /config
|
||||
find /addon_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*filebrowser*" -exec ln -s {} /config/addons_config/ \;
|
||||
find /app_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*filebrowser*" -exec ln -s {} /config/addons_config/ \;
|
||||
fi
|
||||
if [ -d /homeassistant/addons_autoscripts ]; then
|
||||
ln -s /homeassistant/addons_autoscripts /config
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 1.5.0 (2026-07-22)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from gtsteffaniak/filebrowser (changelog : https://github.com/gtsteffaniak/filebrowser/releases)
|
||||
## 1.4.0-2 (16-07-2026)
|
||||
- Minor bugs fixed
|
||||
|
||||
@@ -85,7 +85,7 @@ This addon supports mounting both local drives and remote SMB shares:
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-add-ons
|
||||
|
||||
@@ -82,9 +82,9 @@ ingress: true
|
||||
ingress_port: 8071
|
||||
ingress_stream: true
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- media:rw
|
||||
- all_addon_configs:rw
|
||||
- all_app_configs:rw
|
||||
- homeassistant_config:rw
|
||||
- addons:rw
|
||||
- backup:rw
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 2.3.4 (2026-07-04)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from firefly-iii/data-importer (changelog : https://github.com/firefly-iii/data-importer/releases)
|
||||
## 2.3.2-5 (28-05-2026)
|
||||
- Fix cron jobs not running (wrong shebang, missing env vars, broken crontab)
|
||||
@@ -193,7 +194,7 @@
|
||||
|
||||
## 1.4.5-2 (2024-03-28)
|
||||
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/fireflyiii_date_importer in a folder only accessible from my Filebrowser addon called /addon_configs/db21ed7f_fireflyiii_date_importer. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/fireflyiii_date_importer in a folder only accessible from my Filebrowser addon called /app_configs/db21ed7f_fireflyiii_date_importer. This prevents the add-on from modifying your Home Assistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
|
||||
|
||||
## 1.4.5 (2024-03-23)
|
||||
|
||||
|
||||
@@ -78,11 +78,11 @@ silent: false
|
||||
|
||||
### File Locations
|
||||
|
||||
- **Configurations**: `/addon_configs/xxx-fireflyiii_data_importer/configurations/`
|
||||
- **Configurations**: `/app_configs/xxx-fireflyiii_data_importer/configurations/`
|
||||
- Store import configuration files here
|
||||
- See: https://docs.firefly-iii.org/data-importer/help/config/
|
||||
|
||||
- **Import Files**: `/addon_configs/xxx-fireflyiii_data_importer/import_files/`
|
||||
- **Import Files**: `/app_configs/xxx-fireflyiii_data_importer/import_files/`
|
||||
- Place CSV files here for automatic importing
|
||||
- See: https://docs.firefly-iii.org/data-importer/usage/command_line/
|
||||
|
||||
@@ -95,7 +95,7 @@ silent: false
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -69,7 +69,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/fireflyiii_data_importer-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
## 2.0.1 (2026-07-17)
|
||||
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Aligned the pull-request build context with the production builder by copying
|
||||
the shared Home Assistant helper scripts before building the add-on.
|
||||
- Fixed aarch64 and amd64 PR validation failing on unresolved Dockerfile
|
||||
|
||||
@@ -66,7 +66,7 @@ scheduler. Set `SCHEDULER_HOURS` in `config.env` to control the interval.
|
||||
|
||||
The add-on keeps its configuration in `CONFIG_LOCATION`, which defaults to
|
||||
`/config/config.env`. From Home Assistant this is stored in the add-on's
|
||||
private `addon_configs` directory and can be edited with a compatible file
|
||||
private `app_configs` directory and can be edited with a compatible file
|
||||
browser add-on.
|
||||
|
||||
A template is created on first start. Common examples are:
|
||||
|
||||
@@ -70,7 +70,7 @@ environment:
|
||||
image: ghcr.io/alexbelgium/free_games_claimer-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- homeassistant_config:rw
|
||||
name: Free Games Claimer
|
||||
options:
|
||||
|
||||
@@ -5,7 +5,7 @@ slug="free_games_claimer"
|
||||
if [ -f "/homeassistant/addons_config/$slug/config.yaml" ] && [ ! -f "/homeassistant/addons_config/$slug/migrated" ]; then
|
||||
bashio::log.warning "Migrating config.yaml"
|
||||
mv "/homeassistant/addons_config/$slug"/* /config/ || true
|
||||
echo "Migrated to internal config folder accessible at /addon_configs/xxx-$slug" > "/homeassistant/addons_config/$slug/migrated"
|
||||
echo "Migrated to internal config folder accessible at /app_configs/xxx-$slug" > "/homeassistant/addons_config/$slug/migrated"
|
||||
fi
|
||||
|
||||
if [ -f "/homeassistant/addons_autoscripts/$slug.sh" ]; then
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 1.27.1 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from go-gitea/gitea (changelog : https://github.com/go-gitea/gitea/releases)
|
||||
|
||||
## 1.27.0 (2026-07-22)
|
||||
@@ -13,7 +14,7 @@
|
||||
- Minor bugs fixed
|
||||
|
||||
## 1.26.2-2 (2026-06-19)
|
||||
- Expose app.ini in the addon_config folder so users can edit it directly via the HA file editor
|
||||
- Expose app.ini in the app_config folder so users can edit it directly via the HA file editor
|
||||
|
||||
## 1.26.2-1 (2026-06-19)
|
||||
- Fix SSH authentication failing with `chroot("/var/empty"): Operation not permitted [preauth]` by allowing `capability sys_chroot` in the AppArmor profile, which sshd needs for privilege-separation (#2653)
|
||||
|
||||
@@ -63,16 +63,16 @@ ROOT_URL: "http://homeassistant.local:3000"
|
||||
|
||||
### Direct app.ini Access
|
||||
|
||||
The Gitea `app.ini` configuration file is exposed in the add-on's config folder (`/addon_configs/gitea/app.ini` on the host), making it directly editable via the HA file editor or Studio Code add-on.
|
||||
The Gitea `app.ini` configuration file is exposed in the add-on's config folder (`/app_configs/gitea/app.ini` on the host), making it directly editable via the HA file editor or Studio Code add-on.
|
||||
|
||||
- **On first run**: complete the Gitea setup wizard, then restart the add-on. The generated `app.ini` will be copied to the addon_config folder automatically.
|
||||
- **On subsequent runs**: edit `/addon_configs/gitea/app.ini` directly for any Gitea setting not covered by the options above. The add-on options (SSL, DOMAIN, ROOT_URL, APP_NAME) are still applied on top of your file each restart.
|
||||
- **On first run**: complete the Gitea setup wizard, then restart the add-on. The generated `app.ini` will be copied to the app_config folder automatically.
|
||||
- **On subsequent runs**: edit `/app_configs/gitea/app.ini` directly for any Gitea setting not covered by the options above. The add-on options (SSL, DOMAIN, ROOT_URL, APP_NAME) are still applied on top of your file each restart.
|
||||
|
||||
See the [Gitea configuration cheat sheet](https://docs.gitea.com/administration/config-cheat-sheet) for all available options.
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -67,7 +67,7 @@ devices:
|
||||
image: ghcr.io/alexbelgium/gitea-{arch}
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- app_config:rw
|
||||
- share:rw
|
||||
- ssl:rw
|
||||
name: Gitea
|
||||
|
||||
@@ -14,17 +14,17 @@ mkdir -p /data/gitea/conf
|
||||
# case where Gitea's atomic SaveTo replaces the symlink with the completed config.
|
||||
# Always overwrite /config/app.ini so the installed settings are never discarded.
|
||||
if [ -f "/data/gitea/conf/app.ini" ] && [ ! -L "/data/gitea/conf/app.ini" ]; then
|
||||
bashio::log.info "Moving app.ini to addon_config folder for direct access"
|
||||
bashio::log.info "Moving app.ini to app_config folder for direct access"
|
||||
cp /data/gitea/conf/app.ini /config/app.ini
|
||||
rm /data/gitea/conf/app.ini
|
||||
fi
|
||||
|
||||
# Symlink /data/gitea/conf/app.ini -> /config/app.ini so the file is visible in the
|
||||
# addon_config folder (accessible via the HA file editor). When Gitea's first-run
|
||||
# app_config folder (accessible via the HA file editor). When Gitea's first-run
|
||||
# wizard writes the config it lands in /config/app.ini via this symlink.
|
||||
if [ ! -L "/data/gitea/conf/app.ini" ]; then
|
||||
ln -s /config/app.ini /data/gitea/conf/app.ini
|
||||
bashio::log.info "app.ini is now accessible in your addon_config folder"
|
||||
bashio::log.info "app.ini is now accessible in your app_config folder"
|
||||
fi
|
||||
|
||||
for file in /config/app.ini /etc/templates/app.ini; do
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
## 26.7.1 (2026-08-01)
|
||||
- Migrate deprecated Home Assistant map names to their app equivalents.
|
||||
- Update to latest version from gramps-project/gramps-web (changelog : https://github.com/gramps-project/gramps-web/releases)
|
||||
|
||||
## 26.7.0 (2026-07-22)
|
||||
|
||||
@@ -94,7 +94,7 @@ GRAMPSWEB_DEFAULT_FROM_EMAIL: "gramps@example.com"
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
This addon supports custom scripts and environment variables through the `app_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
@@ -83,7 +83,7 @@ options:
|
||||
keyfile: privkey.pem
|
||||
ssl: false
|
||||
map:
|
||||
- type: addon_config
|
||||
- type: app_config
|
||||
read_only: false
|
||||
- type: ssl
|
||||
read_only: true
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user