Compare commits

...

12 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
3f991edcd7 fix(birdnet-pipy): wait for API (port 5002) before starting nginx to prevent 502 on ingress
Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/4e3f8d6e-aa60-49f1-9091-ec6eee21af29

Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com>
2026-04-23 12:28:56 +00:00
Alexandre
6b0341b4b2 Merge pull request #2668 from alexbelgium/copilot/fix-starting-custom-scripts
bazarr: fix startup crash due to missing leading slash in base_url
2026-04-22 10:31:46 +02:00
Alexandre
ca049de86e Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-04-22 10:31:37 +02:00
copilot-swe-agent[bot]
2df2b816dc Fix Bazarr crash: add leading slash to base_url for Flask blueprint registration
Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/a216cbc7-6136-4c7c-abbd-7028912b409d

Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com>
2026-04-22 06:44:59 +00:00
Alexandre
7c36d91199 Merge pull request #2667 from alexbelgium/copilot/fix-claude-md-documentation
docs(CLAUDE.md): fix three inaccuracies in agent guidance
2026-04-22 07:27:01 +02:00
copilot-swe-agent[bot]
f07859fbbb fix(CLAUDE.md): updater.json is required for automatic updates
Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/51a8903c-c610-43ec-95e7-642cc98a58ea

Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com>
2026-04-22 05:26:29 +00:00
copilot-swe-agent[bot]
30e78aaa70 fix(CLAUDE.md): fix five more inaccuracies found in full doc review
Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/003d19bf-c9aa-4a9e-b600-a45c60434177

Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com>
2026-04-22 05:21:09 +00:00
copilot-swe-agent[bot]
749426fe0d fix(CLAUDE.md): correct directory structure, env passthrough, and versioning docs
Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/997a500a-0574-48ef-867c-d16ea5129e64

Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com>
2026-04-22 04:42:24 +00:00
github-actions
d8f32d838e GitHub bot: changelog [nobuild] 2026-04-21 20:48:45 +00:00
Alexandre
614ff9cd78 Update version to 3.2.0 in config.yaml 2026-04-21 22:46:54 +02:00
Alexandre
07b8c5548d Merge pull request #2666 from alexbelgium/claude/add-claude-documentation-f7y02
Add CLAUDE.md with codebase structure and development guidelines
2026-04-21 22:30:57 +02:00
Claude
f3b0d4e9cc Add CLAUDE.md with codebase structure and development guidelines
Documents add-on directory layout, Dockerfile conventions, shared .templates/ scripts, config.yaml schema, versioning format, CI/CD workflows, linting rules, and PR requirements for AI-assisted development.

https://claude.ai/code/session_01VyLJYfeHAyp539nWJhupiQ
2026-04-21 20:01:23 +00:00
9 changed files with 170 additions and 9 deletions

148
CLAUDE.md Normal file
View File

@@ -0,0 +1,148 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Repository Overview
This is a Home Assistant add-on repository containing 120+ Docker-based add-ons for the Home Assistant Supervisor. Each add-on is a self-contained directory with a Dockerfile, config schema, and S6-overlay init scripts. The repository uses GitHub Actions for CI/CD, linting, and automated upstream version tracking.
## Add-On Directory Structure
Most add-ons follow this common layout, though exceptions exist (e.g. some archived add-ons use `config.json` instead of `config.yaml`, some add-ons have `build.yaml` instead of `build.json` or no build file at all, and not every add-on includes a `rootfs/` tree):
```
addon_name/
├── config.yaml # HA add-on metadata, schema, ports, maps
├── build.json # Base Docker images per architecture (may be build.yaml, or absent)
├── Dockerfile # Multi-stage build (always uses shared .templates/ scripts)
├── updater.json # Upstream release tracking; required to enable automatic updates
├── CHANGELOG.md # Required; must be updated on every PR
└── rootfs/ # Optional; absent in some add-ons
└── etc/
├── cont-init.d/ # S6-overlay init scripts (numbered, run in order)
└── services.d/ # S6-overlay supervised services (some add-ons use
# s6-overlay v3 layout at etc/s6-overlay/s6-rc.d/ instead)
```
## Dockerfile Convention
Most Dockerfiles follow this 6-section pattern (some add-ons deviate slightly, e.g. using a pinned upstream image directly instead of `ARG BUILD_FROM`):
1. **Build Image** – `ARG BUILD_FROM` + `FROM ${BUILD_FROM}`
2. **Modify Image** – S6 env vars, LSIO modifications via `ha_lsio.sh`
3. **Install Apps** – Copy `rootfs/`, download modules, install packages
4. **Entrypoint** – Set `S6_STAGE2_HOOK=/ha_entrypoint.sh`
5. **Labels** – Standard OCI + HA labels from build args
6. **Healthcheck** – curl-based check suppressed from nginx/apache logs
Shared build-time scripts are pulled from `.templates/` at build time:
- `ha_automodules.sh` – Downloads module scripts listed in `ARG MODULES=`
- `ha_autoapps.sh` – Installs packages listed in `ENV PACKAGES=`
- `ha_entrypoint.sh` – S6 stage-2 hook; launches the cont-init stack at container start
- `ha_lsio.sh` – Patches LinuxServer.io base images for HA compatibility
- `bashio-standalone.sh` – Bashio library for scripts outside Supervisor context
The `ARG MODULES=` line lists template scripts to download at build time (e.g., `00-banner.sh 01-custom_script.sh 00-smb_mounts.sh`). Commonly-used modules in `.templates/` (not exhaustive):
- `00-global_var.sh` – Initialize global env vars from HA options
- `00-local_mounts.sh` – Mount local disks (localdisks option)
- `00-smb_mounts.sh` – SMB/CIFS network mount support
- `01-config_yaml.sh` – Map HA options → app's `config.yaml`
- `01-custom_script.sh` – Run user-provided custom scripts
- `90-disable_ingress.sh` – Allow disabling HA ingress
- `90-dns_set.sh` – Configure custom DNS
- `91-universal_graphic_drivers.sh` – GPU driver detection
- `19-json_repair.sh` – Validate/repair JSON config files
## config.yaml Schema
Key fields in every add-on's `config.yaml`:
```yaml
arch: [aarch64, amd64]
image: ghcr.io/alexbelgium/{slug}-{arch}
version: "X.Y.Z" # upstream version (format varies; see Versioning section)
ingress: true/false
ingress_port: 8000
map:
- addon_config:rw # /addon_configs/<hostname>/
- share:rw
- media:rw
- ssl
schema:
env_vars: # Allows arbitrary env var passthrough
- name: match(^[A-Za-z0-9_]+$)
value: str?
PUID: int
PGID: int
TZ: str?
networkdisks: str? # SMB mounts
localdisks: str? # Local disk mounts
```
The `env_vars` schema key enables the env-var passthrough mechanism. At runtime the `00-global_var.sh` cont-init module reads `/data/options.json` and exports each key as an environment variable (writing to `/.env` and `/etc/environment`). `ha_entrypoint.sh` is the S6 stage-2 hook that launches the cont-init stack but does not itself perform the JSON-to-env conversion.
## Versioning
Add-on versions in `config.yaml` closely follow the upstream release tag and do not conform to a single fixed format. Common patterns include:
- `X.Y.Z` – plain upstream semver (e.g. `0.137.0`)
- `X.Y.Z-N` – upstream version with a local patch counter (e.g. `0.6.26-2`)
- LSIO-style tags (e.g. `1.43.1.10611-1e34174b1-ls301`)
- Date-based versions (e.g. `2026.02.28`)
- Nightly builds (e.g. `nightly-20260321-397`)
When an upstream version is bumped, update `version` in `config.yaml`. If the add-on's `Dockerfile` contains an `ARG BUILD_UPSTREAM` line, update that value too — it is the canonical place that records the upstream version at build time (it is **not** stored in `build.json`/`build.yaml`). Some add-ons do not use `BUILD_UPSTREAM` at all. The `updater.json` file tracks which upstream source/repo to monitor and records the last seen version.
## updater.json Format
```json
{
"source": "github", // github|dockerhub|pip|gitlab|bitbucket|helm_chart|...
"upstream_repo": "owner/repo",
"upstream_version": "1.2.3", // auto-populated by addons_updater
"slug": "addon_slug",
"last_update": "2025-01-01",
"github_beta": false,
"github_fulltag": false, // true = keep "v3.0.1-ls67", false = strip to "3.0.1"
"github_tagfilter": "", // require this text in release tag
"github_exclude": "", // exclude releases containing this text
"paused": false
}
```
## CI/CD Workflows
**On push to master** (`onpush_builder.yaml`): Detects changed add-ons by watching `config.*` files, then sanitizes text files (Unicode spaces → ASCII, CRLF → LF) and restores shell script permissions. Auto-commits fixes with `[nobuild]` to skip rebuild loop.
**On PR** (`onpr_check-pr.yaml`): Validates CHANGELOG.md was updated, runs HA addon-linter, and tests Docker build for all changed add-ons.
**Weekly** (`lint.yml`): Runs Super-Linter across the repo, fixes shell formatting with shfmt (4-space indent), opens PRs for automated fixes.
**Weekly** (`weekly_addons_updater`): Runs the `addons_updater` container to bump add-on versions to match upstream.
Adding `[nobuild]` anywhere in a commit message skips the builder workflow.
## Linting Rules
| Tool | Config | Key ignores |
|------|--------|------------|
| Hadolint | `.hadolint.yaml` | DL3002, DL3006-9, DL3018 (no pinning required) |
| ShellCheck | `.shellcheckrc` | SC2002 |
| Markdownlint | `.markdownlint.yaml` | MD013 (line length), MD025, MD033, MD041 |
| shfmt | (CI enforced) | 4-space indent |
## PR Requirements
1. Update `CHANGELOG.md` in every changed add-on (CI validates this).
2. Bump `version` in `config.yaml`.
3. All linting must pass (Hadolint, ShellCheck, Markdownlint, HA addon-linter).
4. Docker build must succeed for all declared architectures.
## S6-Overlay Init Script Naming
Scripts in `rootfs/etc/cont-init.d/` run in lexicographic order. Common numbering conventions (many add-ons use other prefixes too):
- `20-*` – Directory/folder setup
- `32-*` – Nginx ingress configuration (e.g. `32-nginx_ingress.sh`)
- `80-*` – Application configuration
- `90-*` – Misc pre-startup tasks (ssl, vpn, custom run)
- `99-*` – Final startup / launch

View File

@@ -1,5 +1,8 @@
## 1.5.6-3 (2026-04-20)
## 1.5.6-4 (2026-04-22)
- Fix Bazarr crash on startup: base_url must start with '/' for Flask blueprint registration
## 1.5.6-3
- Add Ingress support with nginx reverse proxy for sidebar integration
- Add connection_mode option (ingress_noauth/noingress_auth/ingress_auth)

View File

@@ -112,5 +112,5 @@ schema:
slug: bazarr_nas
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/bazarr
version: "1.5.6-3"
version: "1.5.6-4"
webui: "[PROTO:ssl]://[HOST]:[PORT:6767]"

View File

@@ -35,16 +35,16 @@ if [ -f "$CONFIG_LOCATION" ]; then
ingress_noauth)
bashio::log.green "Ingress is enabled, authentication is disabled"
bashio::log.yellow "WARNING : Make sure that the port is not exposed externally by your router to avoid a security risk !"
# Set base_url
sed -i "s/ base_url:.*/ base_url: $slug/" "$CONFIG_LOCATION"
# Set base_url (must start with / for Flask blueprint registration)
sed -i "s| base_url:.*| base_url: /$slug|" "$CONFIG_LOCATION"
# Disable auth
sed -i '/^auth:/,/^[^ ]/{ s/ type:.*/ type: null/ }' "$CONFIG_LOCATION"
;;
# Ingress mode, with authentication
ingress_auth)
bashio::log.green "Ingress is enabled, and external authentication is enabled"
# Set base_url
sed -i "s/ base_url:.*/ base_url: $slug/" "$CONFIG_LOCATION"
# Set base_url (must start with / for Flask blueprint registration)
sed -i "s| base_url:.*| base_url: /$slug|" "$CONFIG_LOCATION"
# Enable Bazarr auth when leaving ingress_noauth
sed -i '/^auth:/,/^[^ ]/{ s/ type:.*/ type: form/ }' "$CONFIG_LOCATION"
;;

View File

@@ -1,5 +1,8 @@
## 0.6.6 (2026-04-21)
## 0.6.6-1 (2026-04-23)
- Fix 502 Bad Gateway on ingress: nginx now waits for the API server (port 5002) to be ready before starting. Previously, nginx started immediately while the ML model was still loading, causing all API calls to fail with 502 until the model finished loading.
- Update to latest version from Suncuss/BirdNET-PiPy (changelog : https://github.com/Suncuss/BirdNET-PiPy/releases)
## 0.6.4 (2026-04-18)

View File

@@ -96,4 +96,4 @@ schema:
ssl: bool?
slug: birdnet-pipy
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pipy
version: "0.6.6"
version: "0.6.6-1"

View File

@@ -2,4 +2,9 @@
# shellcheck shell=bash
set -euo pipefail
# Wait for the API server to be ready before exposing the ingress. Without
# this, nginx starts immediately while the model is still loading (can take
# minutes), causing every frontend API call to return a 502 Bad Gateway.
bashio::net.wait_for 5002 127.0.0.1 300
nginx

View File

@@ -1,3 +1,5 @@
## 3.2.0 (21-04-2026)
- Minor bugs fixed
## 3.1.0-4 (14-04-2026)
- Minor bugs fixed
## 3.1.0-3 (14-04-2026)

View File

@@ -95,4 +95,4 @@ schema:
slug: seerr
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/seerr
version: "3.1.0-4"
version: "3.2.0"