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!
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:
nginx-reverse-proxymailcowlemp-stackdocker-compose.ymlversion: '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
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-proxyserver {
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;
}
}
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).
Anlegen wie in docker-compose.yml eingestellt.
docker-compose.ymlversion: '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
/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;
}
default-nginx (sie teilen sich DB-Server, PHP-Server und Webspace)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.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 ...
Most helpful comment
Also dann würde ich in einem geeigneten Verzeichnis (zunächst) 3 Unterverzeichnisse für (zunächst) 3
docker-composeSetups anlegen:nginx-reverse-proxymailcowlemp-stacknginx-reverse-proxy
Unterverzeichnisse
docker-compose.ymletc/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-enabledeingebunden 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)Ohne HTTPS kannst du den ganzen 443-Teil und
include /etc/nginx/letsencrypt-location;im 80-Teil weg lassen. Mit darfst du auch diedhparam.pemnicht vergessen zu erstellen, musst dir dieletsencrypt-locationskonfigurieren und natürlich dann deine Zertifikate mitcertbotholen. Dazu würde ich das docker imagequay.io/letsencrypt/letsencryptempfehlen, in dem du dann auch./etc/letsencrypt:/etc/letsencryptmountest. 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-proxymailcow
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.ymleingestellt.docker-compose.ymlSpezifische Konfig
/data/conf/default-mysql/braucht einemy.conf, einfach die Standardversion davon reinkopieren und nach Belieben anpassen/data/conf/default-nginx/braucht wiedernginx-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:default-nginx(sie teilen sich DB-Server, PHP-Server und Webspace)sites-enabledund derdocker-compose.ymldes 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 diedefault-mysqlnuzt. Klar vorteilhaft gegenüber 1., da Nutzer bzw. Sichereitslücken sich nur auf den speziellen Container auswirken.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.