mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-01-11 10:21:02 +01:00
Compare commits
11 Commits
6ec48b7493
...
create-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41f76f0d29 | ||
|
|
e65858ced9 | ||
|
|
8d3c7967cc | ||
|
|
8ee008a7f4 | ||
|
|
d7d9eab569 | ||
|
|
b2e379e096 | ||
|
|
e4225fc3c7 | ||
|
|
61952516b0 | ||
|
|
f49c75b756 | ||
|
|
ebc9b59caa | ||
|
|
654ee3b5e9 |
@@ -72,8 +72,8 @@ if [[ "$CONFIGSOURCE" != *".yaml" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Permissions
|
||||
if [[ "$CONFIGSOURCE" == *".yaml" ]]; then
|
||||
# Permissions only if the config file already exists
|
||||
if [[ "$CONFIGSOURCE" == *".yaml" ]] && [ -f "$CONFIGSOURCE" ]; then
|
||||
echo "Setting permissions for the config.yaml directory"
|
||||
mkdir -p "$(dirname "${CONFIGSOURCE}")"
|
||||
chmod -R 755 "$(dirname "${CONFIGSOURCE}")" 2> /dev/null
|
||||
@@ -83,6 +83,24 @@ fi
|
||||
# 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 ""
|
||||
bashio::log.green "Load environment variables from $CONFIGSOURCE if existing"
|
||||
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"
|
||||
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
|
||||
EXIT_CODE=0
|
||||
yamllint -d relaxed /tempenv &> ERROR || EXIT_CODE=$?
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
|
||||
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
|
||||
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/autobrr/autobrr:latest",
|
||||
"amd64": "ghcr.io/autobrr/autobrr:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/autobrr/autobrr:latest",
|
||||
"amd64": "ghcr.io/autobrr/autobrr:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
|
||||
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
|
||||
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@ def automatic_mqtt_publish(file, detection, path):
|
||||
mqttc.publish(mqtt_topic, json_bird, 1)
|
||||
log.info("Posted to MQTT: ok")
|
||||
|
||||
|
||||
# Create MQTT client using legacy callback API when available for
|
||||
# compatibility with paho-mqtt >= 2.0
|
||||
callback_api = getattr(mqtt, "CallbackAPIVersion", None)
|
||||
|
||||
0
emby/rootfs/etc/services.d/nginx/run
Normal file → Executable file
0
emby/rootfs/etc/services.d/nginx/run
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "m4dm4rtig4n/myelectricaldata:latest",
|
||||
"amd64": "m4dm4rtig4n/myelectricaldata:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "m4dm4rtig4n/myelectricaldata:latest",
|
||||
"amd64": "m4dm4rtig4n/myelectricaldata:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
|
||||
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
|
||||
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "filebrowser/filebrowser:s6",
|
||||
"amd64": "filebrowser/filebrowser:s6"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "filebrowser/filebrowser:s6",
|
||||
"amd64": "filebrowser/filebrowser:s6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
## 2.3.1-2 (22-11-2025)
|
||||
- Minor bugs fixed
|
||||
|
||||
## 2.3.1 (22-11-2025)
|
||||
- Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases)
|
||||
|
||||
@@ -141,6 +141,6 @@ slug: immich
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
usb: true
|
||||
version: "2.3.1"
|
||||
version: 2.3.1-2
|
||||
video: true
|
||||
webui: http://[HOST]:[PORT:8080]
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
## 2.3.1-2 (22-11-2025)
|
||||
- Minor bugs fixed
|
||||
|
||||
## 2.3.1 (22-11-2025)
|
||||
- Update to latest version from imagegenius/docker-immich (changelog : https://github.com/imagegenius/docker-immich/releases)
|
||||
|
||||
@@ -3,9 +3,7 @@ arch:
|
||||
- amd64
|
||||
backup_exclude:
|
||||
- "**/machine-learning/*"
|
||||
description:
|
||||
Self-hosted photo and video backup solution directly from your mobile
|
||||
phone
|
||||
description: Self-hosted photo and video backup solution directly from your mobile phone
|
||||
devices:
|
||||
- /dev/dri
|
||||
- /dev/dxg
|
||||
@@ -141,6 +139,6 @@ slug: immich_noml
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
usb: true
|
||||
version: "2.3.1"
|
||||
version: 2.3.1-2
|
||||
video: true
|
||||
webui: http://[HOST]:[PORT:8080]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "troglobit/inadyn:latest",
|
||||
"amd64": "troglobit/inadyn:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "troglobit/inadyn:latest",
|
||||
"amd64": "troglobit/inadyn:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/jackett:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/jackett:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
0
jellyfin/rootfs/etc/services.d/nginx/run
Normal file → Executable file
0
jellyfin/rootfs/etc/services.d/nginx/run
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
- Increment version for rebuilt add-on
|
||||
## v5.0_beta5-3 (15-11-2025)
|
||||
|
||||
@@ -105,7 +105,7 @@ Configure SMTP settings to enable:
|
||||
|
||||
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)
|
||||
- **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.
|
||||
|
||||
|
||||
@@ -70,12 +70,13 @@ environment:
|
||||
SCOUT_DRIVER: meilisearch
|
||||
SCOUT_QUEUE: "false"
|
||||
MEILISEARCH_URL: http://127.0.0.1:7700
|
||||
MEILISEARCH_KEY: ""
|
||||
MEILISEARCH_KEY: "{{meilisearch_key}}"
|
||||
image: ghcr.io/alexbelgium/monica-{arch}
|
||||
init: false
|
||||
options:
|
||||
env_vars: []
|
||||
database: sqlite
|
||||
meilisearch_key: ""
|
||||
map:
|
||||
- type: addon_config
|
||||
read_only: false
|
||||
@@ -95,6 +96,7 @@ schema:
|
||||
DB_PASSWORD: str?
|
||||
DB_PORT: int?
|
||||
DB_USERNAME: str?
|
||||
meilisearch_key: password?
|
||||
MAIL_MAILER: str?
|
||||
MAIL_HOST: str?
|
||||
MAIL_PORT: str?
|
||||
@@ -107,5 +109,5 @@ services:
|
||||
- mysql:want
|
||||
slug: 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]"
|
||||
|
||||
@@ -143,7 +143,9 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
|
||||
MEILISEARCH_DB_PATH="/data/meilisearch"
|
||||
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_NO_ANALYTICS="${MEILI_NO_ANALYTICS:-true}"
|
||||
|
||||
@@ -164,7 +166,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
|
||||
bashio::log.error "${message}"
|
||||
|
||||
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"
|
||||
fi
|
||||
else
|
||||
@@ -179,7 +181,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
|
||||
}
|
||||
|
||||
meilisearch_ensure_running() {
|
||||
if kill -0 "${MEILISEARCH_PID}" 2>/dev/null; then
|
||||
if kill -0 "${MEILISEARCH_PID}" 2> /dev/null; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -199,12 +201,12 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
|
||||
}
|
||||
|
||||
MEILISEARCH_CMD=(
|
||||
env \
|
||||
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}" \
|
||||
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}" \
|
||||
meilisearch \
|
||||
--http-addr "${MEILISEARCH_ADDR}" \
|
||||
--db-path "${MEILISEARCH_DB_PATH}"
|
||||
env
|
||||
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}"
|
||||
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}"
|
||||
meilisearch
|
||||
--http-addr "${MEILISEARCH_ADDR}"
|
||||
--db-path "${MEILISEARCH_DB_PATH}"
|
||||
)
|
||||
|
||||
if [ -n "${MEILISEARCH_ENV_KEY}" ]; then
|
||||
@@ -216,7 +218,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
|
||||
|
||||
bashio::log.info "Waiting for Meilisearch TCP socket"
|
||||
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
|
||||
fi
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/jokob-sk/netalertx:latest",
|
||||
"amd64": "ghcr.io/jokob-sk/netalertx:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/jokob-sk/netalertx:latest",
|
||||
"amd64": "ghcr.io/jokob-sk/netalertx:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
0
nzbget/rootfs/etc/services.d/nginx/run
Normal file → Executable file
0
nzbget/rootfs/etc/services.d/nginx/run
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/ombi:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/ombi:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "organizr/organizr:linux-arm64",
|
||||
"amd64": "organizr/organizr:linux-amd64"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "organizr/organizr:linux-arm64",
|
||||
"amd64": "organizr/organizr:linux-amd64"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/plex:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/plex:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"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"
|
||||
}
|
||||
"build_from": {
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ if [ -z "${wireguard_config:-}" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
dos2unix "${wireguard_config}" >/dev/null 2>&1 || true
|
||||
dos2unix "${wireguard_config}" > /dev/null 2>&1 || true
|
||||
|
||||
interface_name="$(basename "${wireguard_config}" .conf)"
|
||||
if [[ -z "${interface_name}" ]]; then
|
||||
@@ -60,7 +60,7 @@ fi
|
||||
wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf"
|
||||
|
||||
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.'
|
||||
|
||||
echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config"
|
||||
|
||||
20
qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run
Normal file → Executable file
20
qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run
Normal file → Executable file
@@ -29,11 +29,11 @@ else
|
||||
fi
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}."
|
||||
@@ -44,12 +44,12 @@ else
|
||||
mkdir -p "${legacy_bin_dir}"
|
||||
|
||||
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}"
|
||||
fi
|
||||
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}"
|
||||
bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.'
|
||||
}
|
||||
@@ -67,8 +67,8 @@ else
|
||||
fi
|
||||
|
||||
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
|
||||
wg-quick down "${config_path}" >/dev/null 2>&1 || true
|
||||
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
|
||||
_wireguard_prepare_iptables_legacy
|
||||
output=$(wg-quick up "${config_path}" 2>&1)
|
||||
status=$?
|
||||
@@ -87,7 +87,7 @@ else
|
||||
|
||||
ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
|
||||
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
|
||||
if [[ "${line}" =~ ^Endpoint ]]; then
|
||||
@@ -109,7 +109,7 @@ else
|
||||
fi
|
||||
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
|
||||
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."
|
||||
|
||||
# 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.'
|
||||
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.'
|
||||
fi
|
||||
else
|
||||
|
||||
8
qbittorrent/rootfs/etc/services.d/nginx/run
Normal file → Executable file
8
qbittorrent/rootfs/etc/services.d/nginx/run
Normal file → Executable file
@@ -38,7 +38,7 @@ get_ip_info() {
|
||||
# Outputs: "<ip> <country>" on success
|
||||
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}."
|
||||
return 1
|
||||
fi
|
||||
@@ -173,7 +173,7 @@ trap '
|
||||
# Monitoring loop
|
||||
while true; do
|
||||
# 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."
|
||||
exit 1
|
||||
fi
|
||||
@@ -193,8 +193,8 @@ while true; do
|
||||
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 "Stopping nginx and exiting so the supervisor can restart the add-on."
|
||||
kill "${nginx_pid}" 2>/dev/null || true
|
||||
wait "${nginx_pid}" 2>/dev/null || true
|
||||
kill "${nginx_pid}" 2> /dev/null || true
|
||||
wait "${nginx_pid}" 2> /dev/null || true
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
0
qbittorrent/rootfs/etc/services.d/timer/run
Normal file → Executable file
0
qbittorrent/rootfs/etc/services.d/timer/run
Normal file → Executable file
@@ -7,80 +7,80 @@ BACKUP_FILE="${STATE_DIR}/resolv.conf.backup"
|
||||
mkdir -p "${STATE_DIR}"
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
exit 0
|
||||
exit 0
|
||||
fi
|
||||
|
||||
command="$1"
|
||||
shift || true
|
||||
|
||||
restore_backup() {
|
||||
if [ -f "${BACKUP_FILE}" ]; then
|
||||
cat "${BACKUP_FILE}" > /etc/resolv.conf
|
||||
fi
|
||||
if [ -f "${BACKUP_FILE}" ]; then
|
||||
cat "${BACKUP_FILE}" >/etc/resolv.conf
|
||||
fi
|
||||
}
|
||||
|
||||
apply_dns() {
|
||||
iface="$1"
|
||||
shift || true
|
||||
iface="$1"
|
||||
shift || true
|
||||
|
||||
# Skip optional arguments such as -m <metric> or -x
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
-m|-p|-w)
|
||||
shift 2 || true
|
||||
;;
|
||||
-x|-y|-Z)
|
||||
shift 1 || true
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# Skip optional arguments such as -m <metric> or -x
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
-m | -p | -w)
|
||||
shift 2 || true
|
||||
;;
|
||||
-x | -y | -Z)
|
||||
shift 1 || true
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
tmp_file="${STATE_DIR}/${iface}.conf"
|
||||
cat > "${tmp_file}"
|
||||
tmp_file="${STATE_DIR}/${iface}.conf"
|
||||
cat >"${tmp_file}"
|
||||
|
||||
if [ ! -f "${BACKUP_FILE}" ]; then
|
||||
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
|
||||
fi
|
||||
if [ ! -f "${BACKUP_FILE}" ]; then
|
||||
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
{
|
||||
echo "# Generated by WireGuard add-on resolvconf shim"
|
||||
cat "${tmp_file}"
|
||||
} > /etc/resolv.conf
|
||||
{
|
||||
echo "# Generated by WireGuard add-on resolvconf shim"
|
||||
cat "${tmp_file}"
|
||||
} >/etc/resolv.conf
|
||||
}
|
||||
|
||||
case "${command}" in
|
||||
-a)
|
||||
if [ "$#" -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
apply_dns "$@"
|
||||
;;
|
||||
-d)
|
||||
if [ "$#" -gt 0 ]; then
|
||||
rm -f "${STATE_DIR}/$1.conf"
|
||||
fi
|
||||
restore_backup
|
||||
;;
|
||||
-u)
|
||||
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
|
||||
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
|
||||
{
|
||||
echo "# Generated by WireGuard add-on resolvconf shim"
|
||||
cat "${latest_conf}"
|
||||
} > /etc/resolv.conf
|
||||
else
|
||||
restore_backup
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Treat other commands as successful no-ops to remain compatible with wg-quick.
|
||||
exit 0
|
||||
;;
|
||||
-a)
|
||||
if [ "$#" -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
apply_dns "$@"
|
||||
;;
|
||||
-d)
|
||||
if [ "$#" -gt 0 ]; then
|
||||
rm -f "${STATE_DIR}/$1.conf"
|
||||
fi
|
||||
restore_backup
|
||||
;;
|
||||
-u)
|
||||
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
|
||||
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
|
||||
{
|
||||
echo "# Generated by WireGuard add-on resolvconf shim"
|
||||
cat "${latest_conf}"
|
||||
} >/etc/resolv.conf
|
||||
else
|
||||
restore_backup
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Treat other commands as successful no-ops to remain compatible with wg-quick.
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -3,68 +3,68 @@ set -euo pipefail
|
||||
|
||||
REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore"
|
||||
if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then
|
||||
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
|
||||
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
|
||||
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
|
||||
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
|
||||
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
RULES_FILE="$(mktemp)"
|
||||
cat > "${RULES_FILE}"
|
||||
cat >"${RULES_FILE}"
|
||||
|
||||
ipv6_unavailable() {
|
||||
local message="$1"
|
||||
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && 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 =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
|
||||
return 1
|
||||
local message="$1"
|
||||
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && 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 =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
# First attempt with the original ruleset
|
||||
output=""
|
||||
if output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
|
||||
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
|
||||
exit 0
|
||||
if output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
|
||||
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
status=$?
|
||||
|
||||
# Retry without comment matches if the kernel is missing the comment module
|
||||
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=""
|
||||
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' "Original error: ${output}" >&2
|
||||
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
|
||||
exit 0
|
||||
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' "Original error: ${output}" >&2
|
||||
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
retry_status=$?
|
||||
|
||||
# Final fallback: try legacy backend if available
|
||||
legacy_output=""
|
||||
for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do
|
||||
if [[ -x "${legacy}" ]]; then
|
||||
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
|
||||
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
|
||||
printf '%s\n' "Original error: ${output}" >&2
|
||||
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
if [[ -x "${legacy}" ]]; then
|
||||
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
|
||||
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
|
||||
printf '%s\n' "Original error: ${output}" >&2
|
||||
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
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' "Original error: ${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
|
||||
exit 0
|
||||
printf '%s\n' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2
|
||||
printf '%s\n' "Original error: ${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
|
||||
exit 0
|
||||
fi
|
||||
|
||||
printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2
|
||||
|
||||
@@ -3,47 +3,47 @@ set -euo pipefail
|
||||
|
||||
REAL_IPTABLES_RESTORE="/sbin/iptables-restore"
|
||||
if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then
|
||||
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
|
||||
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
|
||||
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
|
||||
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
|
||||
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
RULES_FILE="$(mktemp)"
|
||||
cat > "${RULES_FILE}"
|
||||
cat >"${RULES_FILE}"
|
||||
|
||||
# First attempt with the original ruleset
|
||||
if output="$(${REAL_IPTABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
|
||||
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
|
||||
exit 0
|
||||
if output="$(${REAL_IPTABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
|
||||
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
status=$?
|
||||
|
||||
# Retry without comment matches if the kernel is missing the comment module
|
||||
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
|
||||
printf '%s\n' "iptables-restore failed with comment matches; reapplied without comments." >&2
|
||||
printf '%s\n' "Original error: ${output}" >&2
|
||||
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
|
||||
exit 0
|
||||
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' "Original error: ${output}" >&2
|
||||
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
retry_status=$?
|
||||
|
||||
# Final fallback: try legacy backend if available
|
||||
for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do
|
||||
if [[ -x "${legacy}" ]]; then
|
||||
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
|
||||
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
|
||||
printf '%s\n' "Original error: ${output}" >&2
|
||||
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
if [[ -x "${legacy}" ]]; then
|
||||
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
|
||||
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
|
||||
printf '%s\n' "Original error: ${output}" >&2
|
||||
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2
|
||||
|
||||
@@ -3,15 +3,15 @@ set -euo pipefail
|
||||
|
||||
REAL_SYSCTL="/sbin/sysctl"
|
||||
if [[ ! -x "${REAL_SYSCTL}" ]]; then
|
||||
REAL_SYSCTL="/usr/sbin/sysctl"
|
||||
REAL_SYSCTL="/usr/sbin/sysctl"
|
||||
fi
|
||||
|
||||
if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then
|
||||
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
|
||||
exit 0
|
||||
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exec "${REAL_SYSCTL}" "$@"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/radarr:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/radarr:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
0
readarr/rootfs/etc/services.d/nginx/run
Normal file → Executable file
0
readarr/rootfs/etc/services.d/nginx/run
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "thomst08/requestrr:arm64-latest",
|
||||
"amd64": "thomst08/requestrr:linux-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "thomst08/requestrr:arm64-latest",
|
||||
"amd64": "thomst08/requestrr:linux-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
```yaml
|
||||
env_vars: [] # Required field, leave empty if unused
|
||||
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
|
||||
TZ: timezone
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "franchetti/seafile-arm:latest",
|
||||
"amd64": "franchetti/seafile-arm:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "franchetti/seafile-arm:latest",
|
||||
"amd64": "franchetti/seafile-arm:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/signalk/signalk-server:latest",
|
||||
"amd64": "ghcr.io/signalk/signalk-server:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/signalk/signalk-server:latest",
|
||||
"amd64": "ghcr.io/signalk/signalk-server:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
|
||||
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
|
||||
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
|
||||
"amd64": "ghcr.io/gabe565/castsponsorskip:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
|
||||
"amd64": "ghcr.io/gabe565/castsponsorskip:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
|
||||
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
|
||||
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base:17.2.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base:17.2.0"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "ghcr.io/hassio-addons/base:17.2.0",
|
||||
"amd64": "ghcr.io/hassio-addons/base:17.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/transmission:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/transmission:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "haugene/transmission-openvpn:latest",
|
||||
"amd64": "haugene/transmission-openvpn:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "haugene/transmission-openvpn:latest",
|
||||
"amd64": "haugene/transmission-openvpn:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "senexcrenshaw/xteve:latest",
|
||||
"amd64": "senexcrenshaw/xteve:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "senexcrenshaw/xteve:latest",
|
||||
"amd64": "senexcrenshaw/xteve:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/code-server:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/code-server:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user