February 1, 20251 yr 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 February 1, 20251 yr by zero_neverload
February 2, 20251 yr 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"
February 2, 20251 yr 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.
February 2, 20251 yr 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 Vorteil, man muss nicht umdenken, Nachteil, man gibt einem Docker Zugriff auf /mnt/...
February 2, 20251 yr 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 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?
February 2, 20251 yr 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
February 2, 20251 yr 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 February 2, 20251 yr 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.