11 Commits

Author SHA1 Message Date
alexbelgium
41f76f0d29 fix: auto-fix linting issues 2025-11-23 00:35:42 +00:00
github-actions
e65858ced9 GitHub bot: changelog 2025-11-22 15:56:15 +00:00
Alexandre
8d3c7967cc Merge pull request #2224 from alexbelgium/codex/fix-meilisearch-exit-code-127-issue
Align Meilisearch option naming with HA conventions
2025-11-22 15:51:57 +00:00
Alexandre
8ee008a7f4 Align Meilisearch option naming with HA conventions 2025-11-22 15:50:58 +00:00
Alexandre
d7d9eab569 Merge pull request #2223 from mausland/patch-1
Fix Scrutiny config example: Add required 'env_vars'
2025-11-22 15:44:47 +00:00
Michael Auslander
b2e379e096 Fix Scrutiny config example: Add required 'env_vars'
Added clarification on env_vars

The current example causes a 'Missing option env_vars' error on save. Added env_vars: [] to fix validation.
2025-11-22 10:39:46 -05:00
Alexandre
e4225fc3c7 Update version format in config.yaml 2025-11-22 15:37:55 +00:00
github-actions
61952516b0 GitHub bot: changelog 2025-11-22 14:04:17 +00:00
Alexandre
f49c75b756 Hide warnings
Update config.yaml handling
2025-11-22 14:01:30 +00:00
Alexandre
ebc9b59caa Update config.yaml handling 2025-11-22 14:00:26 +00:00
Alexandre
654ee3b5e9 Update config.yaml 2025-11-22 13:45:04 +00:00
58 changed files with 327 additions and 324 deletions

View File

@@ -72,8 +72,8 @@ if [[ "$CONFIGSOURCE" != *".yaml" ]]; then
exit 1 exit 1
fi fi
# Permissions # Permissions only if the config file already exists
if [[ "$CONFIGSOURCE" == *".yaml" ]]; then if [[ "$CONFIGSOURCE" == *".yaml" ]] && [ -f "$CONFIGSOURCE" ]; then
echo "Setting permissions for the config.yaml directory" echo "Setting permissions for the config.yaml directory"
mkdir -p "$(dirname "${CONFIGSOURCE}")" mkdir -p "$(dirname "${CONFIGSOURCE}")"
chmod -R 755 "$(dirname "${CONFIGSOURCE}")" 2> /dev/null chmod -R 755 "$(dirname "${CONFIGSOURCE}")" 2> /dev/null
@@ -83,6 +83,24 @@ fi
# LOAD CONFIG.YAML # # LOAD CONFIG.YAML #
#################### ####################
# Exit if the config file is absent
if [ ! -f "$CONFIGSOURCE" ]; then
exit 0
fi
# Check if there are lines to read
cp "$CONFIGSOURCE" /tempenv
sed -i '/^#/d' /tempenv
sed -i '/^[[:space:]]*$/d' /tempenv
sed -i '/^$/d' /tempenv
echo "" >> /tempenv
# Exit if empty
if [ ! -s /tempenv ]; then
rm /tempenv
exit 0
fi
echo "" echo ""
bashio::log.green "Load environment variables from $CONFIGSOURCE if existing" bashio::log.green "Load environment variables from $CONFIGSOURCE if existing"
if [[ "$CONFIGSOURCE" == "/config"* ]]; then if [[ "$CONFIGSOURCE" == "/config"* ]]; then
@@ -95,35 +113,6 @@ bashio::log.notice "This script is used to export custom environment variables a
bashio::log.warning "This methodology is deprecated, please convert your Environment variables to the addon options env_vars. Instructions can be found here : https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2" bashio::log.warning "This methodology is deprecated, please convert your Environment variables to the addon options env_vars. Instructions can be found here : https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2"
echo "" echo ""
# Check if config file is there, or create one from template
if [ ! -f "$CONFIGSOURCE" ]; then
echo "... no config file, creating one from template. Please customize the file in $CONFIGSOURCE before restarting."
# Create folder
mkdir -p "$(dirname "${CONFIGSOURCE}")"
# Placing template in config
if [ -f /templates/config.yaml ]; then
# Use available template
cp /templates/config.yaml "$(dirname "${CONFIGSOURCE}")"
else
# Download template
TEMPLATESOURCE="https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/config.template"
curl -f -L -s -S "$TEMPLATESOURCE" --output "$CONFIGSOURCE"
fi
fi
# Check if there are lines to read
cp "$CONFIGSOURCE" /tempenv
sed -i '/^#/d' /tempenv
sed -i '/^[[:space:]]*$/d' /tempenv
sed -i '/^$/d' /tempenv
echo "" >> /tempenv
# Exit if empty
if [ ! -s /tempenv ]; then
bashio::log.green "... no env variables found, exiting"
exit 0
fi
# Check if yaml is valid # Check if yaml is valid
EXIT_CODE=0 EXIT_CODE=0
yamllint -d relaxed /tempenv &> ERROR || EXIT_CODE=$? yamllint -d relaxed /tempenv &> ERROR || EXIT_CODE=$?

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable", "aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable" "amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/autobrr/autobrr:latest", "aarch64": "ghcr.io/autobrr/autobrr:latest",
"amd64": "ghcr.io/autobrr/autobrr:latest" "amd64": "ghcr.io/autobrr/autobrr:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest", "aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest" "amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest" "amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
} }
} }

View File

@@ -112,6 +112,7 @@ def automatic_mqtt_publish(file, detection, path):
mqttc.publish(mqtt_topic, json_bird, 1) mqttc.publish(mqtt_topic, json_bird, 1)
log.info("Posted to MQTT: ok") log.info("Posted to MQTT: ok")
# Create MQTT client using legacy callback API when available for # Create MQTT client using legacy callback API when available for
# compatibility with paho-mqtt >= 2.0 # compatibility with paho-mqtt >= 2.0
callback_api = getattr(mqtt, "CallbackAPIVersion", None) callback_api = getattr(mqtt, "CallbackAPIVersion", None)

0
emby/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest", "aarch64": "m4dm4rtig4n/myelectricaldata:latest",
"amd64": "m4dm4rtig4n/myelectricaldata:latest" "amd64": "m4dm4rtig4n/myelectricaldata:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev", "aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev" "amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "filebrowser/filebrowser:s6", "aarch64": "filebrowser/filebrowser:s6",
"amd64": "filebrowser/filebrowser:s6" "amd64": "filebrowser/filebrowser:s6"
} }
} }

View File

@@ -1,3 +1,5 @@
## 2.3.1-2 (22-11-2025)
- Minor bugs fixed
## 2.3.1 (22-11-2025) ## 2.3.1 (22-11-2025)
- Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases) - Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases)

View File

@@ -141,6 +141,6 @@ slug: immich
udev: true udev: true
url: https://github.com/alexbelgium/hassio-addons url: https://github.com/alexbelgium/hassio-addons
usb: true usb: true
version: "2.3.1" version: 2.3.1-2
video: true video: true
webui: http://[HOST]:[PORT:8080] webui: http://[HOST]:[PORT:8080]

View File

@@ -1,3 +1,5 @@
## 2.3.1-2 (22-11-2025)
- Minor bugs fixed
## 2.3.1 (22-11-2025) ## 2.3.1 (22-11-2025)
- Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases) - Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases)

View File

@@ -3,9 +3,7 @@ arch:
- amd64 - amd64
backup_exclude: backup_exclude:
- "**/machine-learning/*" - "**/machine-learning/*"
description: description: Self-hosted photo and video backup solution directly from your mobile phone
Self-hosted photo and video backup solution directly from your mobile
phone
devices: devices:
- /dev/dri - /dev/dri
- /dev/dxg - /dev/dxg
@@ -141,6 +139,6 @@ slug: immich_noml
udev: true udev: true
url: https://github.com/alexbelgium/hassio-addons url: https://github.com/alexbelgium/hassio-addons
usb: true usb: true
version: "2.3.1" version: 2.3.1-2
video: true video: true
webui: http://[HOST]:[PORT:8080] webui: http://[HOST]:[PORT:8080]

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "troglobit/inadyn:latest", "aarch64": "troglobit/inadyn:latest",
"amd64": "troglobit/inadyn:latest" "amd64": "troglobit/inadyn:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest", "aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jackett:amd64-latest" "amd64": "lscr.io/linuxserver/jackett:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest", "aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest" "amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
} }
} }

0
jellyfin/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest" "amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
} }
} }

View File

@@ -1,3 +1,9 @@
## v5.0_beta5-6 (17-11-2025)
- Rename the Meilisearch configuration option to `meilisearch_key` and align schema/options with Home Assistant add-on best practices.
## v5.0_beta5-5 (16-11-2025)
- Add a configurable `MEILISEARCH_KEY` option so the bundled Meilisearch can be secured (or left blank to disable auth) without relying on custom env vars.
## v5.0_beta5-4 (15-11-2025) ## v5.0_beta5-4 (15-11-2025)
- Increment version for rebuilt add-on - Increment version for rebuilt add-on
## v5.0_beta5-3 (15-11-2025) ## v5.0_beta5-3 (15-11-2025)

View File

@@ -105,7 +105,7 @@ Configure SMTP settings to enable:
This addon supports custom scripts and environment variables through the `addon_config` mapping: This addon supports custom scripts and environment variables through the `addon_config` mapping:
- **Meilisearch full-text search**: The addon ships with an embedded [Meilisearch](https://www.meilisearch.com/) service that Monica uses by default. The search API listens on `http://127.0.0.1:7700` inside the container. Override `MEILISEARCH_URL` via `env_vars` if you prefer an external Meilisearch instance—the init script will detect that and skip starting the bundled daemon. You can further tweak Meilisearch by defining extra environment variables through the `env_vars` option if needed. - **Meilisearch full-text search**: The addon ships with an embedded [Meilisearch](https://www.meilisearch.com/) service that Monica uses by default. The search API listens on `http://127.0.0.1:7700` inside the container. Override `MEILISEARCH_URL` via `env_vars` if you prefer an external Meilisearch instance—the init script will detect that and skip starting the bundled daemon. You can further tweak Meilisearch by defining extra environment variables through the `env_vars` option if needed. To secure (or disable) Meilisearch authentication without custom env vars, set the `meilisearch_key` add-on option; the init script will pass it to both Monica and the bundled Meilisearch instance.
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons) - **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. - **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.

View File

@@ -70,12 +70,13 @@ environment:
SCOUT_DRIVER: meilisearch SCOUT_DRIVER: meilisearch
SCOUT_QUEUE: "false" SCOUT_QUEUE: "false"
MEILISEARCH_URL: http://127.0.0.1:7700 MEILISEARCH_URL: http://127.0.0.1:7700
MEILISEARCH_KEY: "" MEILISEARCH_KEY: "{{meilisearch_key}}"
image: ghcr.io/alexbelgium/monica-{arch} image: ghcr.io/alexbelgium/monica-{arch}
init: false init: false
options: options:
env_vars: [] env_vars: []
database: sqlite database: sqlite
meilisearch_key: ""
map: map:
- type: addon_config - type: addon_config
read_only: false read_only: false
@@ -95,6 +96,7 @@ schema:
DB_PASSWORD: str? DB_PASSWORD: str?
DB_PORT: int? DB_PORT: int?
DB_USERNAME: str? DB_USERNAME: str?
meilisearch_key: password?
MAIL_MAILER: str? MAIL_MAILER: str?
MAIL_HOST: str? MAIL_HOST: str?
MAIL_PORT: str? MAIL_PORT: str?
@@ -107,5 +109,5 @@ services:
- mysql:want - mysql:want
slug: monica slug: monica
url: https://github.com/alexbelgium/hassio-addons/tree/master/monica url: https://github.com/alexbelgium/hassio-addons/tree/master/monica
version: v5.0_beta5-4 version: v5.0_beta5-6
webui: "[PROTO:ssl]://[HOST]:[PORT:80]" webui: "[PROTO:ssl]://[HOST]:[PORT:80]"

View File

@@ -143,7 +143,9 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
MEILISEARCH_DB_PATH="/data/meilisearch" MEILISEARCH_DB_PATH="/data/meilisearch"
mkdir -p "${MEILISEARCH_DB_PATH}" mkdir -p "${MEILISEARCH_DB_PATH}"
MEILISEARCH_ENV_KEY="${MEILISEARCH_KEY:-}" MEILISEARCH_ENV_KEY="$(bashio::config 'meilisearch_key')"
MEILISEARCH_KEY="${MEILISEARCH_ENV_KEY}"
export MEILISEARCH_KEY
MEILISEARCH_ENVIRONMENT="${MEILI_ENV:-production}" MEILISEARCH_ENVIRONMENT="${MEILI_ENV:-production}"
MEILISEARCH_NO_ANALYTICS="${MEILI_NO_ANALYTICS:-true}" MEILISEARCH_NO_ANALYTICS="${MEILI_NO_ANALYTICS:-true}"
@@ -164,7 +166,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.error "${message}" bashio::log.error "${message}"
if [ -n "${S6_SVSCANCTL_BIN}" ]; then if [ -n "${S6_SVSCANCTL_BIN}" ]; then
if ! "${S6_SVSCANCTL_BIN}" -t "${S6_SUPERVISED_DIR}" 2>/dev/null; then if ! "${S6_SVSCANCTL_BIN}" -t "${S6_SUPERVISED_DIR}" 2> /dev/null; then
bashio::log.error "Unable to signal s6-svscanctl to stop services" bashio::log.error "Unable to signal s6-svscanctl to stop services"
fi fi
else else
@@ -179,7 +181,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
} }
meilisearch_ensure_running() { meilisearch_ensure_running() {
if kill -0 "${MEILISEARCH_PID}" 2>/dev/null; then if kill -0 "${MEILISEARCH_PID}" 2> /dev/null; then
return 0 return 0
fi fi
@@ -199,12 +201,12 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
} }
MEILISEARCH_CMD=( MEILISEARCH_CMD=(
env \ env
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}" \ MEILI_ENV="${MEILISEARCH_ENVIRONMENT}"
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}" \ MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}"
meilisearch \ meilisearch
--http-addr "${MEILISEARCH_ADDR}" \ --http-addr "${MEILISEARCH_ADDR}"
--db-path "${MEILISEARCH_DB_PATH}" --db-path "${MEILISEARCH_DB_PATH}"
) )
if [ -n "${MEILISEARCH_ENV_KEY}" ]; then if [ -n "${MEILISEARCH_ENV_KEY}" ]; then
@@ -216,7 +218,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.info "Waiting for Meilisearch TCP socket" bashio::log.info "Waiting for Meilisearch TCP socket"
for attempt in $(seq 1 30); do for attempt in $(seq 1 30); do
if bash -c "cat < /dev/null > /dev/tcp/${MEILISEARCH_HOST}/${MEILISEARCH_PORT}" 2>/dev/null; then if bash -c "cat < /dev/null > /dev/tcp/${MEILISEARCH_HOST}/${MEILISEARCH_PORT}" 2> /dev/null; then
break break
fi fi

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest", "aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest" "amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/jokob-sk/netalertx:latest", "aarch64": "ghcr.io/jokob-sk/netalertx:latest",
"amd64": "ghcr.io/jokob-sk/netalertx:latest" "amd64": "ghcr.io/jokob-sk/netalertx:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest", "aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest" "amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
} }
} }

0
nzbget/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest", "aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
"amd64": "lscr.io/linuxserver/ombi:amd64-latest" "amd64": "lscr.io/linuxserver/ombi:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "organizr/organizr:linux-arm64", "aarch64": "organizr/organizr:linux-arm64",
"amd64": "organizr/organizr:linux-amd64" "amd64": "organizr/organizr:linux-amd64"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest", "aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest" "amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest", "aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex:amd64-latest" "amd64": "lscr.io/linuxserver/plex:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0", "aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0" "amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0", "aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0" "amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0", "aarch64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0",
"amd64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0" "amd64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0"
} }
} }

View File

@@ -50,7 +50,7 @@ if [ -z "${wireguard_config:-}" ]; then
fi fi
fi fi
dos2unix "${wireguard_config}" >/dev/null 2>&1 || true dos2unix "${wireguard_config}" > /dev/null 2>&1 || true
interface_name="$(basename "${wireguard_config}" .conf)" interface_name="$(basename "${wireguard_config}" .conf)"
if [[ -z "${interface_name}" ]]; then if [[ -z "${interface_name}" ]]; then
@@ -60,7 +60,7 @@ fi
wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf" wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf"
cp "${wireguard_config}" "${wireguard_runtime_config}" cp "${wireguard_config}" "${wireguard_runtime_config}"
chmod 600 "${wireguard_runtime_config}" 2>/dev/null || true chmod 600 "${wireguard_runtime_config}" 2> /dev/null || true
bashio::log.info 'Prepared WireGuard runtime configuration for initial connection attempt.' bashio::log.info 'Prepared WireGuard runtime configuration for initial connection attempt.'
echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config" echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config"

View File

@@ -29,11 +29,11 @@ else
fi fi
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")" wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")"
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2>/dev/null || echo 'wg0')" wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2> /dev/null || echo 'wg0')"
if ip link show "${wireguard_interface}" &> /dev/null; then if ip link show "${wireguard_interface}" &> /dev/null; then
bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Attempting to reset it." bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Attempting to reset it."
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true wg-quick down "${wireguard_config}" > /dev/null 2>&1 || true
fi fi
bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}." bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}."
@@ -44,12 +44,12 @@ else
mkdir -p "${legacy_bin_dir}" mkdir -p "${legacy_bin_dir}"
for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do
if command -v "${cmd}-legacy" >/dev/null 2>&1; then if command -v "${cmd}-legacy" > /dev/null 2>&1; then
ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}" ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}"
fi fi
done done
chmod 700 "${legacy_bin_dir}" 2>/dev/null || true chmod 700 "${legacy_bin_dir}" 2> /dev/null || true
export PATH="${legacy_bin_dir}:${PATH}" export PATH="${legacy_bin_dir}:${PATH}"
bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.' bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.'
} }
@@ -67,8 +67,8 @@ else
fi fi
if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then
if command -v iptables-legacy >/dev/null 2>&1 || command -v ip6tables-legacy >/dev/null 2>&1; then if command -v iptables-legacy > /dev/null 2>&1 || command -v ip6tables-legacy > /dev/null 2>&1; then
wg-quick down "${config_path}" >/dev/null 2>&1 || true wg-quick down "${config_path}" > /dev/null 2>&1 || true
_wireguard_prepare_iptables_legacy _wireguard_prepare_iptables_legacy
output=$(wg-quick up "${config_path}" 2>&1) output=$(wg-quick up "${config_path}" 2>&1)
status=$? status=$?
@@ -87,7 +87,7 @@ else
ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf" ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
echo -n > "${ipv4_config}" echo -n > "${ipv4_config}"
chmod 600 "${ipv4_config}" 2>/dev/null || true chmod 600 "${ipv4_config}" 2> /dev/null || true
while IFS= read -r line; do while IFS= read -r line; do
if [[ "${line}" =~ ^Endpoint ]]; then if [[ "${line}" =~ ^Endpoint ]]; then
@@ -109,7 +109,7 @@ else
fi fi
done < "${wireguard_config}" done < "${wireguard_config}"
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true wg-quick down "${wireguard_config}" > /dev/null 2>&1 || true
if ! _wireguard_up_with_iptables_fallback "${ipv4_config}"; then if ! _wireguard_up_with_iptables_fallback "${ipv4_config}"; then
bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.' bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.'
@@ -129,9 +129,9 @@ else
bashio::log.info "WireGuard interface ${wireguard_interface} is up." bashio::log.info "WireGuard interface ${wireguard_interface} is up."
# Refresh DNS resolver configuration if resolvconf is present # Refresh DNS resolver configuration if resolvconf is present
if command -v resolvconf >/dev/null 2>&1; then if command -v resolvconf > /dev/null 2>&1; then
bashio::log.info 'Refreshing DNS resolver configuration via resolvconf -u.' bashio::log.info 'Refreshing DNS resolver configuration via resolvconf -u.'
if ! resolvconf -u >/dev/null 2>&1; then if ! resolvconf -u > /dev/null 2>&1; then
bashio::log.warning 'resolvconf -u failed. DNS configuration may not have been updated.' bashio::log.warning 'resolvconf -u failed. DNS configuration may not have been updated.'
fi fi
else else

8
qbittorrent/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

@@ -38,7 +38,7 @@ get_ip_info() {
# Outputs: "<ip> <country>" on success # Outputs: "<ip> <country>" on success
local json ip country local json ip country
if ! json="$(curl -fsS --max-time 10 "${VPN_INFO_URL}" 2>/dev/null)"; then if ! json="$(curl -fsS --max-time 10 "${VPN_INFO_URL}" 2> /dev/null)"; then
bashio::log.warning "Unable to reach VPN info service at ${VPN_INFO_URL}." bashio::log.warning "Unable to reach VPN info service at ${VPN_INFO_URL}."
return 1 return 1
fi fi
@@ -173,7 +173,7 @@ trap '
# Monitoring loop # Monitoring loop
while true; do while true; do
# If nginx died, stop this service and let s6 handle restart policy # If nginx died, stop this service and let s6 handle restart policy
if ! kill -0 "${nginx_pid}" 2>/dev/null; then if ! kill -0 "${nginx_pid}" 2> /dev/null; then
bashio::log.error "nginx process exited unexpectedly; leaving service." bashio::log.error "nginx process exited unexpectedly; leaving service."
exit 1 exit 1
fi fi
@@ -193,8 +193,8 @@ while true; do
if [[ -n "${REAL_IP}" ]] && [[ "${current_ip}" == "${REAL_IP}" ]]; then if [[ -n "${REAL_IP}" ]] && [[ "${current_ip}" == "${REAL_IP}" ]]; then
bashio::log.error "IP LEAK DETECTED: current external IP ${current_ip} matches real IP ${REAL_IP}." bashio::log.error "IP LEAK DETECTED: current external IP ${current_ip} matches real IP ${REAL_IP}."
bashio::log.error "Stopping nginx and exiting so the supervisor can restart the add-on." bashio::log.error "Stopping nginx and exiting so the supervisor can restart the add-on."
kill "${nginx_pid}" 2>/dev/null || true kill "${nginx_pid}" 2> /dev/null || true
wait "${nginx_pid}" 2>/dev/null || true wait "${nginx_pid}" 2> /dev/null || true
exit 1 exit 1
fi fi
done done

0
qbittorrent/rootfs/etc/services.d/timer/run Normal file → Executable file
View File

View File

@@ -7,80 +7,80 @@ BACKUP_FILE="${STATE_DIR}/resolv.conf.backup"
mkdir -p "${STATE_DIR}" mkdir -p "${STATE_DIR}"
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
exit 0 exit 0
fi fi
command="$1" command="$1"
shift || true shift || true
restore_backup() { restore_backup() {
if [ -f "${BACKUP_FILE}" ]; then if [ -f "${BACKUP_FILE}" ]; then
cat "${BACKUP_FILE}" > /etc/resolv.conf cat "${BACKUP_FILE}" >/etc/resolv.conf
fi fi
} }
apply_dns() { apply_dns() {
iface="$1" iface="$1"
shift || true shift || true
# Skip optional arguments such as -m <metric> or -x # Skip optional arguments such as -m <metric> or -x
while [ "$#" -gt 0 ]; do while [ "$#" -gt 0 ]; do
case "$1" in case "$1" in
-m|-p|-w) -m | -p | -w)
shift 2 || true shift 2 || true
;; ;;
-x|-y|-Z) -x | -y | -Z)
shift 1 || true shift 1 || true
;; ;;
--) --)
shift shift
break break
;; ;;
*) *)
break break
;; ;;
esac esac
done done
tmp_file="${STATE_DIR}/${iface}.conf" tmp_file="${STATE_DIR}/${iface}.conf"
cat > "${tmp_file}" cat >"${tmp_file}"
if [ ! -f "${BACKUP_FILE}" ]; then if [ ! -f "${BACKUP_FILE}" ]; then
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
fi fi
{ {
echo "# Generated by WireGuard add-on resolvconf shim" echo "# Generated by WireGuard add-on resolvconf shim"
cat "${tmp_file}" cat "${tmp_file}"
} > /etc/resolv.conf } >/etc/resolv.conf
} }
case "${command}" in case "${command}" in
-a) -a)
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
exit 0 exit 0
fi fi
apply_dns "$@" apply_dns "$@"
;; ;;
-d) -d)
if [ "$#" -gt 0 ]; then if [ "$#" -gt 0 ]; then
rm -f "${STATE_DIR}/$1.conf" rm -f "${STATE_DIR}/$1.conf"
fi fi
restore_backup restore_backup
;; ;;
-u) -u)
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)" latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
{ {
echo "# Generated by WireGuard add-on resolvconf shim" echo "# Generated by WireGuard add-on resolvconf shim"
cat "${latest_conf}" cat "${latest_conf}"
} > /etc/resolv.conf } >/etc/resolv.conf
else else
restore_backup restore_backup
fi fi
;; ;;
*) *)
# Treat other commands as successful no-ops to remain compatible with wg-quick. # Treat other commands as successful no-ops to remain compatible with wg-quick.
exit 0 exit 0
;; ;;
esac esac

View File

@@ -3,68 +3,68 @@ set -euo pipefail
REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore" REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore"
if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore" REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
fi fi
cleanup() { cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}" [[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}" [[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
} }
trap cleanup EXIT trap cleanup EXIT
RULES_FILE="$(mktemp)" RULES_FILE="$(mktemp)"
cat > "${RULES_FILE}" cat >"${RULES_FILE}"
ipv6_unavailable() { ipv6_unavailable() {
local message="$1" local message="$1"
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0 [[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0
[[ $message =~ address[[:space:]]family[[:space:]]not[[:space:]]supported ]] && return 0 [[ $message =~ address[[:space:]]family[[:space:]]not[[:space:]]supported ]] && return 0
[[ $message =~ can[[:punct:]]t[[:space:]]initialize[[:space:]]ip6tables[[:space:]]table ]] && return 0 [[ $message =~ can[[:punct:]]t[[:space:]]initialize[[:space:]]ip6tables[[:space:]]table ]] && return 0
[[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0 [[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
return 1 return 1
} }
# First attempt with the original ruleset # First attempt with the original ruleset
output="" output=""
if output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then if output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2 [[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0 exit 0
fi fi
status=$? status=$?
# Retry without comment matches if the kernel is missing the comment module # Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)" SANITIZED_FILE="$(mktemp)"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" > "${SANITIZED_FILE}" sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" >"${SANITIZED_FILE}"
retry_output="" retry_output=""
if retry_output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${SANITIZED_FILE}" 2>&1)"; then if retry_output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed with comment matches; reapplied without comments." >&2 printf '%s\n' "ip6tables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2 [[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0 exit 0
fi fi
retry_status=$? retry_status=$?
# Final fallback: try legacy backend if available # Final fallback: try legacy backend if available
legacy_output="" legacy_output=""
for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do
if [[ -x "${legacy}" ]]; then if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2 printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2 [[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0 exit 0
fi fi
fi fi
done done
if ipv6_unavailable "${output}" || ipv6_unavailable "${retry_output}" || ipv6_unavailable "${legacy_output}"; then if ipv6_unavailable "${output}" || ipv6_unavailable "${retry_output}" || ipv6_unavailable "${legacy_output}"; then
printf '%s\n' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2 printf '%s\n' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "Sanitized retry error: ${retry_output}" >&2 [[ -n "${retry_output}" ]] && printf '%s\n' "Sanitized retry error: ${retry_output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "Legacy backend error: ${legacy_output}" >&2 [[ -n "${legacy_output}" ]] && printf '%s\n' "Legacy backend error: ${legacy_output}" >&2
exit 0 exit 0
fi fi
printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2 printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2

View File

@@ -3,47 +3,47 @@ set -euo pipefail
REAL_IPTABLES_RESTORE="/sbin/iptables-restore" REAL_IPTABLES_RESTORE="/sbin/iptables-restore"
if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore" REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
fi fi
cleanup() { cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}" [[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}" [[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
} }
trap cleanup EXIT trap cleanup EXIT
RULES_FILE="$(mktemp)" RULES_FILE="$(mktemp)"
cat > "${RULES_FILE}" cat >"${RULES_FILE}"
# First attempt with the original ruleset # First attempt with the original ruleset
if output="$(${REAL_IPTABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then if output="$(${REAL_IPTABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2 [[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0 exit 0
fi fi
status=$? status=$?
# Retry without comment matches if the kernel is missing the comment module # Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)" SANITIZED_FILE="$(mktemp)"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" > "${SANITIZED_FILE}" sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" >"${SANITIZED_FILE}"
if retry_output="$(${REAL_IPTABLES_RESTORE} "$@" < "${SANITIZED_FILE}" 2>&1)"; then if retry_output="$(${REAL_IPTABLES_RESTORE} "$@" <"${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed with comment matches; reapplied without comments." >&2 printf '%s\n' "iptables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2 [[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0 exit 0
fi fi
retry_status=$? retry_status=$?
# Final fallback: try legacy backend if available # Final fallback: try legacy backend if available
for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do
if [[ -x "${legacy}" ]]; then if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2 printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2 [[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0 exit 0
fi fi
fi fi
done done
printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2 printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2

View File

@@ -3,15 +3,15 @@ set -euo pipefail
REAL_SYSCTL="/sbin/sysctl" REAL_SYSCTL="/sbin/sysctl"
if [[ ! -x "${REAL_SYSCTL}" ]]; then if [[ ! -x "${REAL_SYSCTL}" ]]; then
REAL_SYSCTL="/usr/sbin/sysctl" REAL_SYSCTL="/usr/sbin/sysctl"
fi fi
if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
exit 0 exit 0
fi fi
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments. # Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
exit 0 exit 0
fi fi
exec "${REAL_SYSCTL}" "$@" exec "${REAL_SYSCTL}" "$@"

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/radarr:amd64-latest" "amd64": "lscr.io/linuxserver/radarr:amd64-latest"
} }
} }

0
readarr/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "thomst08/requestrr:arm64-latest", "aarch64": "thomst08/requestrr:arm64-latest",
"amd64": "thomst08/requestrr:linux-latest" "amd64": "thomst08/requestrr:linux-latest"
} }
} }

View File

@@ -46,6 +46,7 @@ It automatically mounts all local drives.
Enable full access only if you are encountering issues. SMART access should work without full access in all other scenarios. Enable full access only if you are encountering issues. SMART access should work without full access in all other scenarios.
```yaml ```yaml
env_vars: [] # Required field, leave empty if unused
Updates: Hourly, Daily, Weekly Updates: Hourly, Daily, Weekly
Updates_custom_time : if you select "Custom" as "Updates" variable, you can define specific updates in natural language in the "Updates_custom_time" field. Example : select "Custom" as "Updates", then type a custom intervals like "5m", "2h", "1w", or "2mo" to have an update every 5 minutes, or every 2 hours, or evey week, or every 2 months Updates_custom_time : if you select "Custom" as "Updates" variable, you can define specific updates in natural language in the "Updates_custom_time" field. Example : select "Custom" as "Updates", then type a custom intervals like "5m", "2h", "1w", or "2mo" to have an update every 5 minutes, or every 2 hours, or evey week, or every 2 months
TZ: timezone TZ: timezone

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "franchetti/seafile-arm:latest", "aarch64": "franchetti/seafile-arm:latest",
"amd64": "franchetti/seafile-arm:latest" "amd64": "franchetti/seafile-arm:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/signalk/signalk-server:latest", "aarch64": "ghcr.io/signalk/signalk-server:latest",
"amd64": "ghcr.io/signalk/signalk-server:latest" "amd64": "ghcr.io/signalk/signalk-server:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop", "aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop" "amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest", "aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
"amd64": "ghcr.io/gabe565/castsponsorskip:latest" "amd64": "ghcr.io/gabe565/castsponsorskip:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded", "aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded" "amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base:17.2.0", "aarch64": "ghcr.io/hassio-addons/base:17.2.0",
"amd64": "ghcr.io/hassio-addons/base:17.2.0" "amd64": "ghcr.io/hassio-addons/base:17.2.0"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest", "aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
"amd64": "lscr.io/linuxserver/transmission:amd64-latest" "amd64": "lscr.io/linuxserver/transmission:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "haugene/transmission-openvpn:latest", "aarch64": "haugene/transmission-openvpn:latest",
"amd64": "haugene/transmission-openvpn:latest" "amd64": "haugene/transmission-openvpn:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "senexcrenshaw/xteve:latest", "aarch64": "senexcrenshaw/xteve:latest",
"amd64": "senexcrenshaw/xteve:latest" "amd64": "senexcrenshaw/xteve:latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest", "aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
"amd64": "lscr.io/linuxserver/code-server:amd64-latest" "amd64": "lscr.io/linuxserver/code-server:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest", "aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest" "amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest", "aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest" "amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
} }
} }