diff --git a/maintainerr/Dockerfile b/maintainerr/Dockerfile index 4cfc72cb6..1816b23af 100644 --- a/maintainerr/Dockerfile +++ b/maintainerr/Dockerfile @@ -64,7 +64,12 @@ COPY --from=ha_tools /out/ / # Add rootfs COPY rootfs/ / RUN chmod +x /entrypoint.sh \ - && find /etc/cont-init.d /etc/cont-finish.d -type f -name "*.sh" -exec chmod +x {} \; 2>/dev/null || true + && find /etc/cont-init.d /etc/cont-finish.d -type f -name "*.sh" -exec chmod +x {} \; 2>/dev/null || true \ + && set -- /entrypoint.sh; \ + [ -d /opt/app ] && set -- "$@" /opt/app; \ + [ -d /etc/cont-init.d ] && set -- "$@" /etc/cont-init.d; \ + [ -d /etc/cont-finish.d ] && set -- "$@" /etc/cont-finish.d; \ + find "$@" -type f \( -name "*.js" -o -name "*.ts" -o -name "*.json" -o -name "*.sh" -o -name "*.yml" -o -name "*.yaml" -o -name "*.env" -o -name "*.conf" -o -name "*.cfg" \) -exec grep -l "/opt/data" {} + 2>/dev/null | xargs -r sed -i 's|/opt/data|/config/data|g' # Install bashio standalone RUN BASHIO_VERSION="0.14.3" && \ diff --git a/maintainerr/rootfs/ha_entrypoint.sh b/maintainerr/rootfs/ha_entrypoint.sh index 2acfa8067..7521aa1aa 100755 --- a/maintainerr/rootfs/ha_entrypoint.sh +++ b/maintainerr/rootfs/ha_entrypoint.sh @@ -18,35 +18,22 @@ if [ -d /etc/cont-init.d ]; then fi # ─── Setup persistent data directory ───────────────────────────────────────── -# The upstream app hardcodes /opt/data for its database and logs -# (typeOrmConfig.ts → /opt/data/maintainerr.sqlite, logs → /opt/data/logs/). -# /opt/data is declared as a Docker VOLUME in the upstream image, which is NOT -# persistent across addon updates/reinstalls in HA. -# Redirect /opt/data → /config (persistent via addon_config:rw) with a symlink. +# The upstream app hardcodes /opt/data for its database and logs. +# The Dockerfile rewrites all /opt/data references to /config/data at build time. +# At runtime we copy any seed data from /opt/data to /config/data (persistent +# via addon_config:rw) without overwriting existing files. DATA_DIR="/config/data" echo "[Maintainerr] Setting up data directory: $DATA_DIR" -mkdir -p "$DATA_DIR" -mkdir -p "$DATA_DIR"/logs -chmod -R 777 "$DATA_DIR" -chown -R node:node "$DATA_DIR" +mkdir -p "$DATA_DIR" "$DATA_DIR/logs" -# Preserve any seed data from the Docker volume before replacing it. -# /opt/data is a Docker VOLUME mount and cannot be removed, so instead of -# replacing the directory with a symlink, we symlink each item inside it. -if [ -d /opt/data ] && [ ! -L /opt/data ]; then +# Copy any seed/existing data from /opt/data to /config/data (don't overwrite) +if [ -d /opt/data ] && [ "$(ls -A /opt/data 2>/dev/null)" ]; then + echo "[Maintainerr] Copying existing files from /opt/data to $DATA_DIR..." cp -rn /opt/data/. "$DATA_DIR/" 2>/dev/null || true - # Remove contents inside /opt/data (the directory itself stays) - rm -rf /opt/data/* fi -# Create symlinks for each item in $DATA_DIR inside /opt/data -for item in "$DATA_DIR"/*; do - [ -e "$item" ] || continue - name="$(basename "$item")" - ln -sfn "$item" "/opt/data/$name" -done - -# Only chown on first run to avoid slow startup on large directories +# Apply permissions/ownership once so copied files are also covered +chmod -R 777 "$DATA_DIR" if [ ! -f "$DATA_DIR/.initialized" ]; then chown -R node:node "$DATA_DIR" touch "$DATA_DIR/.initialized"