Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Versuch Webhost-Docker AIO für WebApp zu erstellen?

Featured Replies

 

Hallo zusammen, ich brauche mal eure Hilfe.

Ich möchte gerne eine Website / WebApp entwickeln (lernen) und suche dafür eine passenden AIO Docker.
(zum testen würde ich erstmal ein klassisches CMS wie (Joomla o.Ä. dort Hosten)

Der Docker sollte einen Nginx, mit den Features PHP, Flask, usw. enthalten. Als weitere Datenbank wollte ich dann entweder MariaDB oder alternativ MySQL verwenden. (klar diese könnte ich gesondert Hosten, wollte sie aber diesmal mit in dem Docker haben)

Mein Ziel ist es am Ende meine WebApp als eigenständigen Docker  anderen zu teilen.

 

Da ich hierzu keine Docker von der Stange gefunden habe, der das abbildet, habe ich versucht mir einen Docker selbst zu erstellen. (Falls jemand eine Docker kennt, die meinen Anforderungen entspricht, bin ich über einen Tipp dankbar)
Ich muss dazu sagen, das ich bis jetzt immer nur fertige Docker verwendet habe und nun das erste mal einen Docker selbst erstellt habe.

Was ich bis jetzt gemacht habe:

1. Dockerfile erstellt in welchem Nginx, mit MariaDB und PHP mehr schlecht als recht installiert werden. (Dockerfile folgt weiter unten)
   (Problem ist das die Ngnix config datei nicht automatisch in den Config-Ordner unter Appdata abgelegt wird)

 

2. Entrypoint.sh erstellt welche gewisse abhängigkeiten prüft und Ordner unter Appdata/Dockername/ bereitstellt 

 

3. Supervisord.conf erstellt um die Dienste starten

 

Hier meine Files zur Ansicht (sorry hab den Knopf zum Einklappen nicht gefunden)
 

#Dockerfile
# Verwende das offizielle Nginx-Alpine-Image
FROM nginx:alpine

# Installiere benötigte Pakete für PHP, Python und Supervisor
RUN apk add --no-cache \
    php83 php83-fpm php83-mysqli php83-json php83-openssl php83-curl \
    python3 py3-pip \
    mariadb mariadb-client \
    supervisor \
    && rm -rf /var/cache/apk/*

# Erstelle notwendige Verzeichnisse (für Nginx & Supervisor)
RUN mkdir -p /var/log/supervisor /docker-entrypoint.d/

# Kopiere Supervisor-Konfigurationsdatei
COPY supervisord.conf /etc/supervisord.conf

# Kopiere EntryPoint-Skript für automatische Einrichtung
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Setze Arbeitsverzeichnis
WORKDIR /var/www

# Exponiere Ports für Nginx (HTTP, HTTPS) und Flask
EXPOSE 80 443 5000

# Startet das EntryPoint-Skript
CMD ["/entrypoint.sh"]

 

#Entrypoint.sh
#!/bin/sh
set -e

# Logging-Funktion (lässt sich mit Umgebungsvariable deaktivieren)
entrypoint_log() {
    if [ -z "${NGINX_ENTRYPOINT_QUIET_LOGS:-}" ]; then
        echo "$@"
    fi
}

entrypoint_log "🛠️ Starte EntryPoint-Skript..."

# Sicherstellen, dass benötigte Verzeichnisse existieren
mkdir -p /mnt/user/appdata/AIO-Webserver/html
mkdir -p /mnt/user/appdata/AIO-Webserver/flaskapp
mkdir -p /mnt/user/appdata/AIO-Webserver/mariadb
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx/custom-configs
mkdir -p /docker-entrypoint.d/

entrypoint_log "📂 Standardkonfigurationen werden überprüft..."

# Prüfen, ob Nginx vorhanden ist – falls nicht, installieren
if [ ! -f /etc/nginx/nginx.conf ]; then
    entrypoint_log "⚠️ Nginx wurde nicht gefunden. Installiere jetzt..."
    apk add --no-cache nginx
fi

# Falls /mnt/user/appdata/AIO-Webserver/nginx leer ist, Standarddateien aus /etc/nginx kopieren
if [ ! "$(ls -A /mnt/user/appdata/AIO-Webserver/nginx 2>/dev/null)" ]; then
    entrypoint_log "📝 Kopiere Standard-Nginx-Konfiguration..."
    cp -r /etc/nginx/* /mnt/user/appdata/AIO-Webserver/nginx/
fi

# Falls Supervisor-Konfiguration nicht existiert, kopiere Standarddatei
if [ ! -f /mnt/user/appdata/AIO-Webserver/supervisord.conf ]; then
    entrypoint_log "📝 Kopiere Standard-Supervisor-Konfiguration..."
    cp /etc/supervisord.conf /mnt/user/appdata/AIO-Webserver/supervisord.conf
fi

# Falls keine Standard-Webseite existiert, erstelle eine
if [ ! -f /mnt/user/appdata/AIO-Webserver/html/index.html ]; then
    entrypoint_log "🌐 Erstelle Standard-Webseite..."
    echo "<h1>AIO-Webserver läuft erfolgreich!</h1>" > /mnt/user/appdata/AIO-Webserver/html/index.html
fi

# Prüft, ob `/docker-entrypoint.d/` Skripte enthält und führt sie aus
if /usr/bin/find "/docker-entrypoint.d/" -mindepth 1 -maxdepth 1 -type f -print -quit 2>/dev/null | read v; then
    entrypoint_log "🔄 Führe zusätzliche Skripte in /docker-entrypoint.d/ aus..."
    find "/docker-entrypoint.d/" -follow -type f -print | sort -V | while read -r f; do
        case "$f" in
            *.sh)
                if [ -x "$f" ]; then
                    entrypoint_log "▶ Starte Skript: $f"
                    "$f"
                else
                    entrypoint_log "⚠ Skript ist nicht ausführbar: $f"
                fi
                ;;
            *) entrypoint_log "ℹ Ignoriere Datei: $f";;
        esac
    done
fi

entrypoint_log "🚀 Starte Supervisor..."
exec /usr/bin/supervisord -c /etc/supervisord.conf

 

#Superwisord.conf
[supervisord]
nodaemon=true

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true
stderr_logfile=/var/log/nginx.err.log
stdout_logfile=/var/log/nginx.out.log

[program:flask]
command=python3 /var/www/flaskapp/app.py
autostart=true
autorestart=true
stderr_logfile=/var/log/flask.err.log
stdout_logfile=/var/log/flask.out.log

[program:mariadb]
command=/usr/bin/mysqld_safe --skip-grant-tables
autostart=true
autorestart=true
stderr_logfile=/var/log/mysql.err.log
stdout_logfile=/var/log/mysql.out.log


[program:php-fpm]
command=/usr/sbin/php-fpm83 --nodaemonize
autostart=true
autorestart=true
stderr_logfile=/var/log/php-fpm.err.log
stdout_logfile=/var/log/php-fpm.out.log

 

Vermutlich wird jetzt jeder erfahrene Programmierer die Hände über den Kopf zusammenschlagen und mir sagen das es alles Mist ist was ich da zusammengeschusstert habe, ich wusste es eben nicht besser. (KI hat geholfen)

Was der Docker beim starten nicht macht:
Es werden die Dateien im Ngnix Ordner (fastcgi_params, mime.types, nginx.conf) nicht automatisch angelegt unter Appdata/AIO-Webserver/nginx/ und wenn ich mir den standart Nginx Docker mal anschaue, fehlt da glaube ich noch mehr.
Weiterhin erstellt er mir keine DB unter dem Ordner Appdata/AIO-Webserver/mariadb/, sowie unter Appdata/flaskapp/ die app.py


Nachdem ich mit viel rummgefummel obigen Docker tatsächlich irgenwie zum laufen gebracht habe, bin ich mir ziemlich sicher, das dies eben nicht der richtige Weg ist (zumindes was ich mir mit der KI da zurechtgefummelt habe)

Alternativ hatte ich versucht die originale Nginx Docker zu erweitern, jedoch waren dort die von mir hinzugefügten Services nicht Persistent und nach jedem Neustart oder Neuinstallation weg. (Falls es da einen Weg gibt, wäre ich über einen Tipp sehr Dankbar)
Nach weiteren Recherchen habe ich dann versucht über Docker-Compose einzelne Docker zu einem Stack zu verbinden, hab das aber dann erstmal auf Eis gelegt.


Weitere Idee war, einen vorhandenes Projekt von Github zu kopieren und zu erweitern (wenn man das darf, bzw. wenn das geht)

Ich danke euch im Voraus für eure Hilfe und hoffe auf hilfreiche Tipps.
 

Edited by zero_neverload

mal 2 Ansätze

 

1/ nginx kann man starten mit Parametern (wo die config liegt ...), Beispiel mal Unraid Host hier, ich lasse parallel einen nginx laufen -c /mnt/user/system/...

 

root@AlsServerII:~# ps x | grep -i "nginx -c"
  13428 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
  14968 ?        Ss     0:00 nginx: master process nginx -c /mnt/user/system/nginx_stream/nginx.conf
 251266 pts/0    S+     0:00 grep -i nginx -c
root@AlsServerII:~#

 

die als Ansatz bzgl. Umgehen der "Standard" Pfade ... dafür gibt es den Trigger

 

2/ dein Ansatz zu Pfaden, bitte bedenke, du prüfst hier aus "Docker Sicht" ... was voraussetzt das der Docker auch 1:1 mounts zum Host hätte ...

 

# Sicherstellen, dass benötigte Verzeichnisse existieren
mkdir -p /mnt/user/appdata/AIO-Webserver/html
mkdir -p /mnt/user/appdata/AIO-Webserver/flaskapp
mkdir -p /mnt/user/appdata/AIO-Webserver/mariadb
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx/custom-configs

 

wenn der mount nicht existiert, wird "im Docker" erstellt ... nach Update und co, alles weg da nicht persistent ...

 

sprich, daher wird oft im Docker ein Pfad wie /config genutzt, wecher dann per mount mapped wird

/config <> /mnt/user/appdata/....

 

und da "spielt" man beim ersten Start Standards ein bzw. übernimmt vorhandene Konfigurationen ...

 

nur als Denkansatz zum Start ... dies gilt für alle Apps welche du im Docker laufen lässt und Konfigurationen "persistent" sein sollen.

 

Mein Ansatz war, ich hab mir einfach diverse Docker angeschaut und dann angefangen davon abzuleiten ...

das war noch vor ChatGPT (ich muss mich mal endlich damit befassen) ;)

 

von daher, eine Base suchen, vielleicht auch nicht unbedingt alpine, ist zwar auch mein meist genommener da "super light" ...

aber mit debian / ubuntu base wirst du gerade zum Start und Hilfe suchend mehr Ergebnisse haben ...

 

alpine ist ab und an etwas "sperriger" da weniger "onboard"

  • Author
3 hours ago, alturismo said:

mal 2 Ansätze

 

1/ nginx kann man starten mit Parametern (wo die config liegt ...), Beispiel mal Unraid Host hier, ich lasse parallel einen nginx laufen -c /mnt/user/system/...

 

root@AlsServerII:~# ps x | grep -i "nginx -c"
  13428 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
  14968 ?        Ss     0:00 nginx: master process nginx -c /mnt/user/system/nginx_stream/nginx.conf
 251266 pts/0    S+     0:00 grep -i nginx -c
root@AlsServerII:~#

 

die als Ansatz bzgl. Umgehen der "Standard" Pfade ... dafür gibt es den Trigger

 

2/ dein Ansatz zu Pfaden, bitte bedenke, du prüfst hier aus "Docker Sicht" ... was voraussetzt das der Docker auch 1:1 mounts zum Host hätte ...

 

# Sicherstellen, dass benötigte Verzeichnisse existieren
mkdir -p /mnt/user/appdata/AIO-Webserver/html
mkdir -p /mnt/user/appdata/AIO-Webserver/flaskapp
mkdir -p /mnt/user/appdata/AIO-Webserver/mariadb
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx/custom-configs

 

wenn der mount nicht existiert, wird "im Docker" erstellt ... nach Update und co, alles weg da nicht persistent ...

 

sprich, daher wird oft im Docker ein Pfad wie /config genutzt, wecher dann per mount mapped wird

/config <> /mnt/user/appdata/....

 

und da "spielt" man beim ersten Start Standards ein bzw. übernimmt vorhandene Konfigurationen ...

 

nur als Denkansatz zum Start ... dies gilt für alle Apps welche du im Docker laufen lässt und Konfigurationen "persistent" sein sollen.

 

Mein Ansatz war, ich hab mir einfach diverse Docker angeschaut und dann angefangen davon abzuleiten ...

das war noch vor ChatGPT (ich muss mich mal endlich damit befassen) ;)

 

von daher, eine Base suchen, vielleicht auch nicht unbedingt alpine, ist zwar auch mein meist genommener da "super light" ...

aber mit debian / ubuntu base wirst du gerade zum Start und Hilfe suchend mehr Ergebnisse haben ...

 

alpine ist ab und an etwas "sperriger" da weniger "onboard"

Danke für die Tipps.

Zu 1 das kannte ich nicht und werde ich dann anpassen

Zu 2 bin ich davon ausgegangen das eigentlich jeder dieses Verzeichniss hat, aber ja klar, sollte ich den Docker wirklich veröffentlichen wollen, könnte ja auch theoretisch ein nicht Unraiduser diesen in andren Dockerumgebungen pullen und hätte diese Ordner nicht.

Zu meiner Schande war ich mir garnicht sicher, ob ich ein anderen Docker als nicht Alpine beim selbst erstellen verwenden darf. (wieder was gelernt)

Aktuell bin ich erstmal etwas zurück gerudert und versuche mein Glück über Docker-Compose Manager, aber auch hier bin ich gerade in ner kleinen Sackgasse (Websocket/Socket.io) was mich doch wieder in richtung eigenes Docker zurückbewegt...

Bestehende Docker ändern/erweitern/fork geht vermutlich nicht, ausser man hat eben die Dockerfile/entrypoint/weitere Daten die der Ersteller verwendet hat.

 

Mich selbst hat auch gewundert, das es noch nicht so eine AIO entwicklungsumgebung für WebApp gibt. 

5 minutes ago, zero_neverload said:

bin ich davon ausgegangen das eigentlich jeder dieses Verzeichniss hat

per se hat die fast niemand ... bzw. fast niemand so mounted

 

schau doch mal die Dockers durch, einen /mnt <> /mnt gibt es selten und nutzen auch die wenigsten, dann hat man eine 1:1 Beziehung, ist aber auch Risiko behaftet da /mnt vieles beinhaltet ;) daher, überdenke diesen Ansatz ...

 

Beispiel aus meinem Media cache mover plugin, da habe ich sogar einen rewrite integriert weil auch bei Mediaservern die wenigsten 1:1 nutzen sondern

 

/data <> /mnt/user/Media

/Filme <> /mnt/user/filme

... was auch immer

 

image.thumb.png.d5c467e4efa1ac23e99a6b8663841231.png

 

Vorteil, man muss nicht umdenken, Nachteil, man gibt einem Docker Zugriff auf /mnt/... ;)

  • Author
14 minutes ago, alturismo said:

per se hat die fast niemand ... bzw. fast niemand so mounted

 

schau doch mal die Dockers durch, einen /mnt <> /mnt gibt es selten und nutzen auch die wenigsten, dann hat man eine 1:1 Beziehung, ist aber auch Risiko behaftet da /mnt vieles beinhaltet ;) daher, überdenke diesen Ansatz ...

 

Beispiel aus meinem Media cache mover plugin, da habe ich sogar einen rewrite integriert weil auch bei Mediaservern die wenigsten 1:1 nutzen sondern

 

/data <> /mnt/user/Media

/Filme <> /mnt/user/filme

... was auch immer

 

image.thumb.png.d5c467e4efa1ac23e99a6b8663841231.png

 

Vorteil, man muss nicht umdenken, Nachteil, man gibt einem Docker Zugriff auf /mnt/... ;)



 

 

On 2/1/2025 at 12:38 PM, zero_neverload said:
# Sicherstellen, dass benötigte Verzeichnisse existieren
mkdir -p /mnt/user/appdata/AIO-Webserver/html
mkdir -p /mnt/user/appdata/AIO-Webserver/flaskapp
mkdir -p /mnt/user/appdata/AIO-Webserver/mariadb
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx/custom-configs
mkdir -p /docker-entrypoint.d/

Ja aber diese Verzeichnisse erstellt doch der Docker in meinem Fall auf dem Unraid Host und nicht im Docker um die Configdaten peristent zu machen, falls jemand etwas anpassen will und Reboot/Pull/etc. den Docker beeinflussen.

 

On 2/1/2025 at 12:38 PM, zero_neverload said:
# Falls keine Standard-Webseite existiert, erstelle eine
if [ ! -f /mnt/user/appdata/AIO-Webserver/html/index.html ]; then
    entrypoint_log "🌐 Erstelle Standard-Webseite..."

Und als Beispiel vom Webserver wird dann im Nachgang die index.html rein gelegt und über mein Appdata Backup werden diese ja auch gesichert. (oder hab ich da gerade ein Denkfehler?)


Das was du oben mit Plex beschrieben hattest, habe ich bei mir ja auch (wenn ich das richtig verstehe), dass meine vorhandenen Medien über den z.B /Media im Docker auf /mnt/user/Data/Media vom Unraid-Host verweisen. Oder was meintest du mit rewrite?

3 minutes ago, zero_neverload said:

Ja aber diese Verzeichnisse erstellt doch der Docker in meinem Fall auf dem Unraid Host und nicht im Docker um die Configdaten peristent zu machen, falls jemand etwas anpassen will und Reboot/Pull/etc. den Docker beeinflussen.

 

Vorsicht, NUR wenn auch der entsprechende /mnt <> /mnt existiert, ansonsten werden die IM Docker erstellt ;)

 

4 minutes ago, zero_neverload said:

Das was du oben mit Plex beschrieben hattest, habe ich bei mir ja auch (wenn ich das richtig verstehe), dass meine vorhandenen Medien über den z.B /Media im Docker auf /mnt/user/Data/Media vom Unraid-Host verweisen. Oder was meintest du mit rewrite?

genau

  • Author
37 minutes ago, alturismo said:

Vorsicht, NUR wenn auch der entsprechende /mnt <> /mnt existiert, ansonsten werden die IM Docker erstellt ;)

ok dann hatte ich das richtig verstanden.

muss das dann halt so hinbekommen, wie du es oben beschrieben hattest (/config <> /mnt/user/appdata/....) und eben in /config alles umbiegen, das dort die änderbare Daten landen um sie dann über Volumes oder Bind Mounts peristent zu halten. (wie hast du das bei deinem Docker geregelt? (Dockerfile/Entrypoint) Wenn ich mir die standart Nginx Dockerfile mal anschaue, ist dort ja im Prinzip erstmal ja auch nichts angegeben und der User muss es selbst regeln, das er die Dateien peristent bekommt.

 

Edited by zero_neverload

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.