Eigene custom-setup.sh als Lösung für SSL-Probleme beim Update von indi-allsky

Das offizielle setup.sh von indi-allsky ist funktional umfangreich und installiert die gesamte Laufzeitumgebung inklusive Webserver-Konfiguration. Für typische Installationen ist dieses Verhalten sinnvoll, führt jedoch zu Problemen, wenn eigene Apache-Einstellungen genutzt werden – insbesondere bei Let’s-Encrypt-Zertifikaten, benutzerdefinierten VirtualHosts oder spezifischen Redirect-Regeln.

Im praktischen Betrieb zeigte sich, dass setup.sh bei jedem Durchlauf die Datei /etc/apache2/sites-available/indi-allsky.conf neu generiert. Dadurch:

  • wird ein selbst signiertes SSL-Zertifikat erstellt,
  • gehen individuelle SSL-Pfad- und ServerName-Einstellungen verloren,
  • entstehen Listener-Konflikte (Ports 80/443 mehrfach belegt),
  • schlägt der Apache-Neustart am Ende des Setup-Prozesses fehl.

*** Dieser Post wurde mit einer neuen Routine am 12. Dezember 2025 aktualisiert. ***

Eine zunächst angedachte Lösung war, die Datei mittels chattr +i schreibzuschützen. Das verhindert zwar die Überschreibung, führt aber dazu, dass das Setup-Skript mit Fehlermeldungen abbricht, da die Datei nicht ersetzt werden kann. Damit war klar: Diese Methode ist in der Praxis nicht geeignet.

Die Lösung: eine eigene, stabile Setup-Routine

Um den Updateprozess verlässlich und konfliktfrei zu gestalten, wurde eine eigene Wrapper-Routine entwickelt: custom-setup.sh. Dieses Skript ruft die offizielle Setup-Routine weiterhin vollständig auf, verhindert jedoch gezielt, dass der Apache-Konfigurationsblock von setup.sh ausgeführt wird.

Das funktioniert über zwei Variablen, die bereits im Originalskript vorgesehen sind:

INDIALLSKY_WEBSERVER="apache" erzwingt die Verarbeitung im Apache-Zweig des Setups.

WEBSERVER_CONFIG="false" sorgt dafür, dass der gesamte Block zur Neu­generierung der Apache-Konfiguration übersprungen wird – unabhängig davon, was der Nutzer im Whiptail-Dialog auswählt.

Damit bleiben alle individuellen Anpassungen an der Apache-Konfiguration (Zertifikate, VirtualHosts, Redirects etc.) vollständig erhalten, während alle anderen Komponenten von indi-allsky regulär aktualisiert werden.

custom-setup.sh erstellen


#!/bin/bash
set -e

###############################################################################
# custom-setup.sh
#
# Sicherer Wrapper für das offizielle indi-allsky setup.sh
#
# Ziele:
# - Apache-Konfiguration NICHT überschreiben
# - SQLite-Fehler "database is locked" vermeiden
# - Dienste kontrolliert stoppen und neu starten
# - systemd-User-Socket-Units defensiv behandeln
# - Idempotent sein und mehrfach ausführbar
# - xxx mit deinem Pfad ersetzen
###############################################################################


### Konfiguration #############################################################

INDI_DIR="/home/xxx/indi-allsky"
APACHE_VHOST="/etc/apache2/sites-available/indi-allsky.conf"

###############################################################################


echo ">>> custom-setup.sh: startet"


# --------------------------------------------------
# 1. Plausibilitätsprüfungen
# --------------------------------------------------

if [ ! -d "$INDI_DIR" ]; then
    echo "ERROR: indi-allsky-Verzeichnis nicht gefunden: $INDI_DIR"
    exit 1
fi

if [ ! -f "$INDI_DIR/setup.sh" ]; then
    echo "ERROR: setup.sh nicht gefunden in $INDI_DIR"
    exit 1
fi

if [ ! -f "$APACHE_VHOST" ]; then
    echo "WARNUNG: Apache-VHost nicht gefunden: $APACHE_VHOST"
    echo "         Apache-Konfiguration wird nicht verwaltet."
fi


# --------------------------------------------------
# 2. Laufende Dienste stoppen (verhindert SQLite-Locks)
# --------------------------------------------------

echo ">>> Stoppe laufende Dienste..."

# User-Level-Dienste
systemctl --user stop indi-allsky.service 2>/dev/null || true
systemctl --user stop gunicorn-indi-allsky.service 2>/dev/null || true
systemctl --user stop gunicorn-indi-allsky.socket 2>/dev/null || true

# System-Level-Dienste (unproblematisch, falls nicht vorhanden)
sudo systemctl stop indi-allsky.service 2>/dev/null || true
sudo systemctl stop gunicorn-indi-allsky.service 2>/dev/null || true
sudo systemctl stop gunicorn-indi-allsky.socket 2>/dev/null || true

sleep 3


# --------------------------------------------------
# 3. Apache-Modus erzwingen, Konfig-Änderungen überspringen
# --------------------------------------------------

echo ">>> Erzwinge Apache-Modus ohne Konfigurationsänderungen"

export INDIALLSKY_WEBSERVER="apache"
export WEBSERVER_CONFIG="false"

# Optionales Hardening (standardmäßig auskommentiert)
# export INDI_ALLSKY_OS_PACKAGE_UPGRADE="false"


# --------------------------------------------------
# 4. Offizielles setup.sh ausführen
# --------------------------------------------------

echo ">>> Führe offizielles setup.sh aus"

cd "$INDI_DIR"
./setup.sh

echo ">>> setup.sh erfolgreich abgeschlossen"


# --------------------------------------------------
# 5. Apache-Prüfungen
# --------------------------------------------------

if command -v apachectl >/dev/null 2>&1; then
    echo ">>> Prüfe Apache-Konfiguration"
    sudo apachectl configtest

    echo ">>> Starte Apache neu"
    sudo systemctl restart apache2

    echo ">>> Aktive Apache-VirtualHosts:"
    sudo apachectl -S
else
    echo "HINWEIS: apachectl nicht gefunden – Apache-Prüfung wird übersprungen"
fi


# --------------------------------------------------
# 6. systemd-User-Units defensiv behandeln
# --------------------------------------------------

echo ">>> Lade systemd-User-Daemon neu"
systemctl --user daemon-reload

if systemctl --user list-unit-files | grep -q gunicorn-indi-allsky.socket; then
    echo ">>> gunicorn-indi-allsky.socket gefunden – starte Socket"
    systemctl --user start gunicorn-indi-allsky.socket
else
    echo "WARNUNG: gunicorn-indi-allsky.socket nicht gefunden"
    echo "         setup.sh hat systemd-User-Units ggf. nicht erstellt"
fi


# --------------------------------------------------
# 7. indi-allsky-Dienst neu starten (User-Level)
# --------------------------------------------------

if systemctl --user list-unit-files | grep -q indi-allsky.service; then
    echo ">>> Starte indi-allsky-Dienst neu"
    systemctl --user restart indi-allsky.service
else
    echo "WARNUNG: indi-allsky.service nicht im systemd-User-Kontext gefunden"
fi


echo ">>> custom-setup.sh erfolgreich abgeschlossen"
echo ">>> indi-allsky wurde aktualisiert, ohne die Apache-Konfiguration zu überschreiben"


Installation der eigenen Setup-Routine

Die Datei custom-setup.sh wird direkt im Hauptverzeichnis der indi-allsky-Installation angelegt, beispielsweise unter /home/xxx/indi-allsky/. Nachdem der oben gezeigte Inhalt eingefügt wurde, wird die Datei ausführbar gemacht:

 chmod +x custom-setup.sh 

Ab diesem Zeitpunkt erfolgt jedes Update ausschließlich über das neue Skript:

 ./custom-setup.sh 

Das ursprüngliche setup.sh bleibt funktional vorhanden, sollte jedoch nicht mehr direkt ausgeführt werden, da es die bestehende Webserver-Konfiguration überschreiben und Zertifikate oder Listener-Einstellungen beschädigen kann. Mit der custom-setup.sh bleibt die Apache-Konfiguration unverändert, während die Anwendung selbst weiterhin korrekt aktualisiert wird.

Hat dir dieser Beitrag gefallen?

Du kannst allsky-rodgau.de mit einem kleinen Kaffee auf BuyMeACoffee unterstützen.

Jetzt Kaffee spendieren!