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 Neugenerierung 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.