Moin.
Bei mir läuft ein ähnliches Setup. Ich distanziere mich allerdings von fertigen Images - bau es lieber selbst auf, da weißt du, was du hast und vor allem ist ein Lerneffekt da.
Ich habe einen Server mit einer IPv4 und einer IPv6. Die Firewalls von Proxmox sind überall aus, ich mache mein Firewalling selbst mit iptables.
Ich habe einen nginx Container und mehrere Container mit diversen Webapps.
Per iptables auf dem Proxmox Host mache ich also ein Portforwarding von Port 80/tcp und 443/tcp auf den nginx Container.
Dieser splittet dann je nach Domain auf und leitet den Traffic an den entsprechenden Container mit der Webapp an.
Also wenn ich jetzt meinen Container per cloud.domain.tld anspreche, werde ich mit dem Nextcloud Container verbunden und wenn ich ihn per monitoring.domain.tld anspreche, dann mit meinem IcingaWeb.
Hier sind mal meine nginx Konfigurationen für meine Nextcloud. Die kannst du dir eigentlich zum Vorbild nehmen. Das SSL arbeitet mit einem ECDSA (ec-384) Zertifikat und mit OCSP must staple. Das musst du bei der Zertifikatsanfrage in acme.sh mitgeben. Wenn man mit OCSP arbeitet, muss man auch OCSP Caching betreiben, sonst kann es zu nervigen Fehlermeldungen im Browser kommen. Mehr Infos hier.
server {
listen 80;
listen [::]:80;
server_name cloud.meinedomain.tld;
include vhost.d/subconfigs/http_redirect_acme.conf;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.meinedomain.tld;
location / {
include vhost.d/subconfigs/botcheck.conf;
include vhost.d/subconfigs/proxy_header.conf;
proxy_pass http://[fd00:21:1::111]:80/;
proxy_buffering off;
proxy_request_buffering off;
client_max_body_size 50G;
}
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
# standard SSL config
include vhost.d/subconfigs/ssl_standard.conf;
# custom ssl config
ssl_certificate /etc/acme_letsencrypt/cloud.meinedomain.tld/fullchain.pem;
ssl_certificate_key /etc/acme_letsencrypt/cloud.meinedomain.tld/privatekey.pem;
ssl_stapling_file /etc/acme_letsencrypt/cloud.meinedomain.tld/ocsp.der;
ssl_trusted_certificate /etc/acme_letsencrypt/cloud.meinedomain.tld/chain.pem;
# header
add_header Expect-CT "enforce; max-age=21600;" always;
}
Alles anzeigen
# acme challenge config
include vhost.d/subconfigs/acme.conf;
# redirect all HTTP requests to HTTPS with a 301 Moved Permanently response (if its not a bot)
location / {
include vhost.d/subconfigs/botcheck.conf;
return 301 https://$host$request_uri;
}
# send no answer if a bot user agent is asking
if ( $is_bot ) {
return 444;
}
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict;";
# standard SSL config
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;
ssl_dhparam /etc/nginx/dhparams/dhparams.pem;
ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;
resolver [fd00:21:1::103] valid=300s;
Alles anzeigen
acme.sh sollte man übrigens nicht unbedingt als root laufen lassen... 
Es empfiehlt sich auch, auf dem Proxmox Host noch ein Wireguard VPN aufzusetzen und zwischen diesem und der Bridge zu routen/forwarden. Das hat den Vorteil, dass du SSH Ports, phpMyAdmin, Webmin, Shellinabox usw usw nicht von außen zugänglich machen musst. Das erhöht den Bedienkomfort und die Sicherheit erheblich.
Wenn du noch Fragen hast, dann stell sie mir bzw. uns gern. 