Mailcow-dockerized: Multiple Sites mit mailcow docker?

Created on 18 Mar 2017  ·  8Comments  ·  Source: mailcow/mailcow-dockerized

Hi Andre, ich hoffe ich kann in Deutsch meine Frage stellen.
Docker ist für mich ziemliches Neuland war es mir zuvor mit der 0.14 noch möglich deine Konfiguration als Basis zu nutzen um mehrere Vhosts anzulegen, fällt mir das in Docker schon schwerer. Meine eigentliche Frage ist nun ob es vllt möglich wäre mir ein Snippet für die docker-compose.yml zu Schreiben wodurch ich ein 2. nginx container als reine Webkiste laufen lassen kann mit MySQL/PHP für eine weitere Domain?

Erschlag mich bitte nicht weils in Deutsch ist...

Vielen Dank!

support

Most helpful comment

Also dann würde ich in einem geeigneten Verzeichnis (zunächst) 3 Unterverzeichnisse für (zunächst) 3 docker-compose Setups anlegen:

  1. nginx-reverse-proxy
  2. mailcow
  3. lemp-stack

nginx-reverse-proxy

Unterverzeichnisse

  • etc/nginx
  • etc/letsencrypt (nur wenn das nginx-reverse-proxy auch HTTPS mit letsencrypt können soll; ist empfehlenswert weil es reicht sich einmal hier darum zu kümmern um überall HTTPS zu haben)
  • log
  • html

docker-compose.yml

version: '2'

services:

    nginx-proxy:
      image: nginx:latest
      ports:
       - "80:80"
       - "443:443"
      volumes:
       - ./etc/letsencrypt:/etc/letsencrypt
       - ./etc/nginx:/etc/nginx
       - ./log:/var/log
       - ./html:/var/www/mounted_html
      restart: always

etc/nginx

Befülle das Konfig-Verzeichnis initial mit der aktuellen nginx-Standardkonfig und pass an, was du anpassen willst. In jedem Fall sollte unter Konfig aus einem Unterordner sites-enabled eingebunden werden, in dem zumindest zwei Dateien zu finden sind (und mehr falls irgendwann mehr Docker Kompositionen oder anderes dazukommt):

mail.deine-mailkuh.de (falls deine Mailcow Domain 'mail.deine-mailkuh.de' heißt)

server {
    listen 80;

    server_name mail.deine-mailkuh.de;

    access_log /var/log/nginx/mail.deine-mailkuh.de-access.log;
    error_log /var/log/nginx/mail.deine-mailkuh.de-error.log;

    include /etc/nginx/letsencrypt-location;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:81;
    }
}

server {
    listen 443;

    server_name mail.deine-mailkuh.de;

    access_log /var/log/nginx/mail.deine-mailkuh.de-access.log;
    error_log /var/log/nginx/mail.deine-mailkuh.de-error.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mail.deine-mailkuh.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.deine-mailkuh.de/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:kEDH+AESGCM:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_dhparam /etc/nginx/dhparam.pem;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass https://127.0.0.1:444;
        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options DENY;
    }
}

Ohne HTTPS kannst du den ganzen 443-Teil und include /etc/nginx/letsencrypt-location; im 80-Teil weg lassen. Mit darfst du auch die dhparam.pem nicht vergessen zu erstellen, musst dir die letsencrypt-locations konfigurieren und natürlich dann deine Zertifikate mit certbot holen. Dazu würde ich das docker image quay.io/letsencrypt/letsencrypt empfehlen, in dem du dann auch ./etc/letsencrypt:/etc/letsencrypt mountest. Details hierzu spar ich mir aber weil würde etwas zu weit führen und ist nicht Mailcow-spezifisch. Falls du den 443-Teil verwendest ist das nur ein Konfig-Vorschlag - das gilt im Übrigen auch für alles andere...

default-proxy

server {
    listen 80 default_server;

    access_log /var/log/nginx/default-access.log;
    error_log /var/log/nginx/default-error.log;

    include /etc/nginx/letsencrypt-location;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:82;
    }
}

server {
    listen 443 default_server;

    access_log /var/log/nginx/default-access.log;
    error_log /var/log/nginx/default-error.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mail.deine-mailkuh.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.deine-mailkuh.de/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:kEDH+AESGCM:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_dhparam /etc/nginx/dhparam.pem;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:82;
        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options DENY;
    }
}

mailcow

Hier triffst du deine Einstellungen je nach Geschmack. Das einzige, was du für das Nginx Reverse Proxy speziell anpassen / beachten musst, sind die HTTP(S) Ports. Wie aus der Konig oben erkenntlich sollte HTTP auf 81 und HTTPS auf 444 gestellt werden. Kannst du natürlich ändern wenn du es auch in der Konfig von Nginx entsprechend anpasst. Wenn du letsencrypt hast musst du außerdem deine Zertifikate auch ins Mailcow mounten und für Postfix und Dovecot konfigurieren (Zertifikate Beschaffen würde in dem Beispiel unabhängig von Mailcow laufen und der Mailcow Nginx muss sie nicht kennen, da er nie externe Verbindungen aufbaut).

lemp-stack

Unterverzeichnisse

Anlegen wie in docker-compose.yml eingestellt.

docker-compose.yml

version: '2.1'

services:
    default-mysql:
      image: mysql:latest
      volumes:
        - ./data/db/default-mysql/:/var/lib/mysql/
        - ./data/conf/default-mysql/:/etc/mysql/conf.d/
#      ports:
#        - "3306:3306" # Nur fuer Debugging
      environment:
        - MYSQL_ROOT_PASSWORD=pass1
        - MYSQL_DATABASE=db
        - MYSQL_USER=user
        - MYSQL_PASSWORD=pass2
      restart: always

    default-php-fpm:
      image: php:7.1-fpm # Auskommentieren wenn stattdessen build verwendet wird
#      build: ./directory/to/custom/dockerfile # Vermutlich willst du dein PHP anpassen, dann brauchst du eine eigene Dockerfile beginnend mit "FROM php:7.1-fpm" in der du dann anschließend alle Extensions installierst die du möchtest
      depends_on:
        - default-mysql
      volumes:
        - ./data/default-html:/var/www/html
      restart: always

    default-nginx:
      image: nginx:mainline
      depends_on:
        - default-php-fpm
      volumes:
        - ./data/default-html:/var/www/html
        - ./data/conf/default-nginx/:/etc/nginx/conf.d/
      ports:
        - "82:80"
      restart: always

Spezifische Konfig

  • /data/conf/default-mysql/ braucht eine my.conf, einfach die Standardversion davon reinkopieren und nach Belieben anpassen
  • /data/conf/default-nginx/ braucht wieder nginx-Konfiguration, hier kann man ähnlich wie beim Nginx Reverse Proxy verfahren, wichtig ist nur, dass im globalen Konfigbereich irgendwo noch ein Statement wie folgt ergänzt wird, damit PHP in allen Seiten funktioniert:
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass default-php-fpm:9000;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PHP_VALUE "max_execution_time = 1200
                             max_input_time = 1200
                             memory_limit = 64M";
    fastcgi_read_timeout 1200;
  }
  • Je nach Belieben kann man neue Unterseiten mit eigenen Domains oder Subdomains nun an 2 Stellen konfigurieren:

    1. Nur in der Konfig von default-nginx (sie teilen sich DB-Server, PHP-Server und Webspace)

    2. In der Nginx Reverse Proxy Konfig unter sites-enabled und der docker-compose.yml des LEMP-Stack indem man die Services kopiert und "default-" je durch "eigene-domain-" ersetzt, sowie entsprechend eigene Konfig- und Datenverzeichnisse anlegt. Es wäre auch denkbar, dass eine Domain einen eigenen PHP-Server und Nginx bekommt aber die default-mysql nuzt. Klar vorteilhaft gegenüber 1., da Nutzer bzw. Sichereitslücken sich nur auf den speziellen Container auswirken.

  • Natürlich kann man sonst auch noch einiges anders machen und je nach Größe des Servers und Anzahl der Domains auch andere Ansätze wählen.

Schlusswort

Ich hab das nicht getestet und so nirgendwo im Einsatz, es sollte dir aber als Docker-Neuling einen Überblick geben, wie du das machen kannst. Du wirst es vermutlich aber nicht exakt so einsetzen können, sondern schon an der einen oder anderen Stelle deiner Infrastruktur anpassen müssen.

All 8 comments

Bin nicht sicher, ob ich dich richtig verstehe, aber du hast nur einen Server und zuvor hattest du auf dem Mailcow installiert und die Apache/Ngnix Config so angepasst, dass du weitere Seiten (eigentlich unabhängig von Mailcow) mit dem Mailcow (Apache/Nginx) Server ausgeliefert hast? Und jetzt willst du wieder auf dem gleichen Server zusätzlich zu Mailcow auch wieder andere Seiten unter ggf. anderen Domains ausliefern?

Wenn ich dich richtig verstanden habe, wäre das von mir empfohlene Setup nicht, in der Mailcow docker-compose.yml rumzubasteln, sondern ein Nginx Reverse Proxy (dockerized natürlich) davor zu setzen. Zusätzlich zu Mailcow (dockerized) kannst du dann noch einen (oder auch viele) LAMP- oder LEMP-Stacks ebenfalls dockerized laufen lassen. Die lässt du alle auf eigenen Ports laufen (die auch nur intern erreichbar sein müssen) und nur das Nginx Reverse Proxy läuft auf 80/443 und ist extern auch über diese erreichbar und leitet alle Anfragen je nach Domain zum richtigen Container. Mailcow sollte natürlich mit den öffentlichen Mailports auch direkt und von außen erreichbar sein, aber eben nicht mit HTTP(S).
Ist tatsächlich sogar ein recht einfaches Setup und wenn du magst kann ich dir auch ein paar docker-compose.yml Snippets dafür zusammen schreiben, sag mir dann aber bitte, ob es LAMP oder LEMP (also Apache oder Ngnix) hinten darn werden sollte.

Danke @tehXor ich würde dann bei Nginx bleiben also ne LEMP Umgebung nutzen wollen. Wenn du mir dabei helfen könntest wäre das natürlich klasse :)

Also dann würde ich in einem geeigneten Verzeichnis (zunächst) 3 Unterverzeichnisse für (zunächst) 3 docker-compose Setups anlegen:

  1. nginx-reverse-proxy
  2. mailcow
  3. lemp-stack

nginx-reverse-proxy

Unterverzeichnisse

  • etc/nginx
  • etc/letsencrypt (nur wenn das nginx-reverse-proxy auch HTTPS mit letsencrypt können soll; ist empfehlenswert weil es reicht sich einmal hier darum zu kümmern um überall HTTPS zu haben)
  • log
  • html

docker-compose.yml

version: '2'

services:

    nginx-proxy:
      image: nginx:latest
      ports:
       - "80:80"
       - "443:443"
      volumes:
       - ./etc/letsencrypt:/etc/letsencrypt
       - ./etc/nginx:/etc/nginx
       - ./log:/var/log
       - ./html:/var/www/mounted_html
      restart: always

etc/nginx

Befülle das Konfig-Verzeichnis initial mit der aktuellen nginx-Standardkonfig und pass an, was du anpassen willst. In jedem Fall sollte unter Konfig aus einem Unterordner sites-enabled eingebunden werden, in dem zumindest zwei Dateien zu finden sind (und mehr falls irgendwann mehr Docker Kompositionen oder anderes dazukommt):

mail.deine-mailkuh.de (falls deine Mailcow Domain 'mail.deine-mailkuh.de' heißt)

server {
    listen 80;

    server_name mail.deine-mailkuh.de;

    access_log /var/log/nginx/mail.deine-mailkuh.de-access.log;
    error_log /var/log/nginx/mail.deine-mailkuh.de-error.log;

    include /etc/nginx/letsencrypt-location;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:81;
    }
}

server {
    listen 443;

    server_name mail.deine-mailkuh.de;

    access_log /var/log/nginx/mail.deine-mailkuh.de-access.log;
    error_log /var/log/nginx/mail.deine-mailkuh.de-error.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mail.deine-mailkuh.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.deine-mailkuh.de/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:kEDH+AESGCM:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_dhparam /etc/nginx/dhparam.pem;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass https://127.0.0.1:444;
        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options DENY;
    }
}

Ohne HTTPS kannst du den ganzen 443-Teil und include /etc/nginx/letsencrypt-location; im 80-Teil weg lassen. Mit darfst du auch die dhparam.pem nicht vergessen zu erstellen, musst dir die letsencrypt-locations konfigurieren und natürlich dann deine Zertifikate mit certbot holen. Dazu würde ich das docker image quay.io/letsencrypt/letsencrypt empfehlen, in dem du dann auch ./etc/letsencrypt:/etc/letsencrypt mountest. Details hierzu spar ich mir aber weil würde etwas zu weit führen und ist nicht Mailcow-spezifisch. Falls du den 443-Teil verwendest ist das nur ein Konfig-Vorschlag - das gilt im Übrigen auch für alles andere...

default-proxy

server {
    listen 80 default_server;

    access_log /var/log/nginx/default-access.log;
    error_log /var/log/nginx/default-error.log;

    include /etc/nginx/letsencrypt-location;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:82;
    }
}

server {
    listen 443 default_server;

    access_log /var/log/nginx/default-access.log;
    error_log /var/log/nginx/default-error.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mail.deine-mailkuh.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.deine-mailkuh.de/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:kEDH+AESGCM:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_dhparam /etc/nginx/dhparam.pem;

    root /usr/share/nginx/www;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://127.0.0.1:82;
        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options DENY;
    }
}

mailcow

Hier triffst du deine Einstellungen je nach Geschmack. Das einzige, was du für das Nginx Reverse Proxy speziell anpassen / beachten musst, sind die HTTP(S) Ports. Wie aus der Konig oben erkenntlich sollte HTTP auf 81 und HTTPS auf 444 gestellt werden. Kannst du natürlich ändern wenn du es auch in der Konfig von Nginx entsprechend anpasst. Wenn du letsencrypt hast musst du außerdem deine Zertifikate auch ins Mailcow mounten und für Postfix und Dovecot konfigurieren (Zertifikate Beschaffen würde in dem Beispiel unabhängig von Mailcow laufen und der Mailcow Nginx muss sie nicht kennen, da er nie externe Verbindungen aufbaut).

lemp-stack

Unterverzeichnisse

Anlegen wie in docker-compose.yml eingestellt.

docker-compose.yml

version: '2.1'

services:
    default-mysql:
      image: mysql:latest
      volumes:
        - ./data/db/default-mysql/:/var/lib/mysql/
        - ./data/conf/default-mysql/:/etc/mysql/conf.d/
#      ports:
#        - "3306:3306" # Nur fuer Debugging
      environment:
        - MYSQL_ROOT_PASSWORD=pass1
        - MYSQL_DATABASE=db
        - MYSQL_USER=user
        - MYSQL_PASSWORD=pass2
      restart: always

    default-php-fpm:
      image: php:7.1-fpm # Auskommentieren wenn stattdessen build verwendet wird
#      build: ./directory/to/custom/dockerfile # Vermutlich willst du dein PHP anpassen, dann brauchst du eine eigene Dockerfile beginnend mit "FROM php:7.1-fpm" in der du dann anschließend alle Extensions installierst die du möchtest
      depends_on:
        - default-mysql
      volumes:
        - ./data/default-html:/var/www/html
      restart: always

    default-nginx:
      image: nginx:mainline
      depends_on:
        - default-php-fpm
      volumes:
        - ./data/default-html:/var/www/html
        - ./data/conf/default-nginx/:/etc/nginx/conf.d/
      ports:
        - "82:80"
      restart: always

Spezifische Konfig

  • /data/conf/default-mysql/ braucht eine my.conf, einfach die Standardversion davon reinkopieren und nach Belieben anpassen
  • /data/conf/default-nginx/ braucht wieder nginx-Konfiguration, hier kann man ähnlich wie beim Nginx Reverse Proxy verfahren, wichtig ist nur, dass im globalen Konfigbereich irgendwo noch ein Statement wie folgt ergänzt wird, damit PHP in allen Seiten funktioniert:
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass default-php-fpm:9000;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PHP_VALUE "max_execution_time = 1200
                             max_input_time = 1200
                             memory_limit = 64M";
    fastcgi_read_timeout 1200;
  }
  • Je nach Belieben kann man neue Unterseiten mit eigenen Domains oder Subdomains nun an 2 Stellen konfigurieren:

    1. Nur in der Konfig von default-nginx (sie teilen sich DB-Server, PHP-Server und Webspace)

    2. In der Nginx Reverse Proxy Konfig unter sites-enabled und der docker-compose.yml des LEMP-Stack indem man die Services kopiert und "default-" je durch "eigene-domain-" ersetzt, sowie entsprechend eigene Konfig- und Datenverzeichnisse anlegt. Es wäre auch denkbar, dass eine Domain einen eigenen PHP-Server und Nginx bekommt aber die default-mysql nuzt. Klar vorteilhaft gegenüber 1., da Nutzer bzw. Sichereitslücken sich nur auf den speziellen Container auswirken.

  • Natürlich kann man sonst auch noch einiges anders machen und je nach Größe des Servers und Anzahl der Domains auch andere Ansätze wählen.

Schlusswort

Ich hab das nicht getestet und so nirgendwo im Einsatz, es sollte dir aber als Docker-Neuling einen Überblick geben, wie du das machen kannst. Du wirst es vermutlich aber nicht exakt so einsetzen können, sondern schon an der einen oder anderen Stelle deiner Infrastruktur anpassen müssen.

Wow all diese Mühen für mich :) vielen lieben Dank ich werde das jedoch erst am Wochenende testen können. Ich informiere dich dann :) DANKE! :)

Bedank dich erst, wenn du damit auch was zum Laufen bekommst. In diesem Sinne good luck am Wochenende ;-)

Okay ich bin das nun mal durch gegangen was mach ich denn wenn ich mittlerweile mailcow am laufen habe? kann ich dann mail cow als reverse proxy missbrauchen sodass ich nen 2. nginx container installiere der zb auf port 83 läuft? und das an mailcow über port 80 routed?

Du kannst diesen "Missbrauch" machen, ich würde davon aber wirklich abraten, weil die nginx Konfig von Mailcow schon etwas speziell ist und ja auch hin und wieder von André angepasst wird. Diese Konfig müsstest du dann mit der für ein Nginx Reverse Proxy mergen. Geht schon, aber sauberer ist, das Proxy im eigenen Container zu haben.

Meine Empfehlung wäre, du änderst in der Konfig von Mailcow jetzt einfach die HTTP(S) Ports und machst einen Restart des Nginx Containers (docker-compose restart nginx-mailcow). Sollte mehr nötig sein sollte ein recreate langen, damit die neuen Ports aktiv sind (bin nicht ganz sicher, denke aber fast der Restart langt). Dadurch passiert erst mal nichts weiter, als dass dein Mailcow Webinterface unter anderen Ports erreichbar ist (SMTP/IMAP etc. bleibt davon unbehelligt) und so dann auch zum Nginx Reverse Proxy Setup "passt".

Hey ihr zwei, ich betrachte dieses Issue mal als gelöst an.
Falls ich mich irren sollte können wir auch wieder aufmachen - räume grade auf ...

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Braintelligence picture Braintelligence  ·  3Comments

K2rool picture K2rool  ·  3Comments

poldixd picture poldixd  ·  3Comments

GalacticLion7 picture GalacticLion7  ·  3Comments

lgleim picture lgleim  ·  3Comments