1

I have two docker container running, one is the jwilder nginx reverse proxy. The other one is portainer. I can access the portainer backend by adding the :9443 port to the url. But the virtual host and virtual port configured for nginx reverse proxy don't seem to work. I get a 504 Gateway Time-out. I use the following docker-compose.yml's each with their Dockerfile in the same folder:

For nginx reverse proxy (compose)

version: '3.3'

services:
    nginxproxy: 
        build: .
        container_name: nginxproxy_container
        restart: always
        ports:
            - 80:80
            - 443:443
        volumes:
            - /etc/letsencrypt/live/mydomain.nl/cert.pem:/etc/nginx/certs/mydomain.nl.crt:ro
            - /etc/letsencrypt/live/mydomain.nl/privkey.pem:/etc/nginx/certs/mydomain.nl.key:ro
            - /var/run/docker.sock:/tmp/docker.sock:ro
            
networks:
  default:
    external:
      name: cloud01_network

For nginx reverse proxy (Dockerfile)

FROM nginxproxy/nginx-proxy
EXPOSE 80
EXPOSE 443

For portainer (compose)


version: '3.3'

volumes:
  portainer_data:
  
services:
    portainer:
        build: .
        container_name: portainer_container
        restart: always
        ports:
            - 9443:9443
            - 8000:8000
        # Environment variables
        environment:
            # Virtual host for nginx-proxy
            VIRTUAL_PROTO: https
            VIRTUAL_HOST: cloud01.mydomain.nl
            VIRTUAL_PORT: 9443
        volumes:
            - portainer_data:/data
            - /etc/letsencrypt/live/mydomain.nl:/certs/live/mydomain.nl:ro
            - /etc/letsencrypt/archive/mydomain.nl:/certs/archive/mydomain.nl:ro
            - /var/run/docker.sock:/var/run/docker.sock
        command:
            --ssl
            --sslcert /certs/live/mydomain.nl/fullchain.pem
            --sslkey /certs/live/mydomain.nl/privkey.pem
            
networks:
  default:
    external:
      name: cloud01_network

For portainer (Dockerfile):

FROM portainer/portainer-ce:latest
EXPOSE 9443
EXPOSE 8000

Now https://cloud01.mydomain.nl:9443 brings up portainer backend just fine. But https://cloud01.mydomain.nl doesn't do the same like I would expect. I have taken a look at the /etc/nginx/conf.d/default.conf in the nginx container. Which was automatically generated like this:

# nginx-proxy version : 1.0.0-4-g4ea3437
# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the
# scheme used to connect to this server
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
  default $http_x_forwarded_proto;
  ''      $scheme;
}
# If we receive X-Forwarded-Port, pass it through; otherwise, pass along the
# server port the client connected to
map $http_x_forwarded_port $proxy_x_forwarded_port {
  default $http_x_forwarded_port;
  ''      $server_port;
}
# If we receive Upgrade, set Connection to "upgrade"; otherwise, delete any
# Connection header that may have been passed to this server
map $http_upgrade $proxy_connection {
  default upgrade;
  '' close;
}
# Apply fix for very long server names
server_names_hash_bucket_size 128;
# Default dhparam
ssl_dhparam /etc/nginx/dhparam/dhparam.pem;
# Set appropriate X-Forwarded-Ssl header based on $proxy_x_forwarded_proto
map $proxy_x_forwarded_proto $proxy_x_forwarded_ssl {
  default off;
  https on;
}
gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
log_format vhost '$host $remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" '
                 '"$upstream_addr"';
access_log off;
                ssl_protocols TLSv1.2 TLSv1.3;
                ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
                ssl_prefer_server_ciphers off;
error_log /dev/stderr;
resolver 127.0.0.11;
# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
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 $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;
proxy_set_header X-Original-URI $request_uri;
# Mitigate httpoxy attack (see README for details)
proxy_set_header Proxy "";
server {
        server_name _; # This is just an invalid value which will never trigger on a real hostname.
        server_tokens off;
        listen 80;
        access_log /var/log/nginx/access.log vhost;
        return 503;
}
        # cloud01.mydomain.nl
        upstream cloud01.mydomain.nl {
        ## Can be connected with "cloud01_network" network
        # portainer_container
        server 172.27.0.3:9443;
        }
server {
        server_name cloud01.mydomain.nl;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        # Do not HTTPS redirect Let'sEncrypt ACME challenge
        location ^~ /.well-known/acme-challenge/ {
                auth_basic off;
                auth_request off;
                allow all;
                root /usr/share/nginx/html;
                try_files $uri =404;
                break;
        }
        location / {
                return 301 https://$host$request_uri;
        }
}
server {
        server_name cloud01.mydomain.nl;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_session_timeout 5m;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_certificate /etc/nginx/certs/mydomain.nl.crt;
        ssl_certificate_key /etc/nginx/certs/mydomain.nl.key;
        add_header Strict-Transport-Security "max-age=31536000" always;
location / {
                proxy_pass https://cloud01.mydomain.nl;
}
}

I have been tinkering with it for a couple of days already, but can't get any further then this.

0

1 Answer 1

1

I was able to find out what went wrong. Maybe it helps someone who runs into the same problem. It was a iptables that didn't allow the traffic. So remember to test without any extra iptables rules to rule that out.

Sign up to request clarification or add additional context in comments.

2 Comments

If you solve your problem, mark this answer as accepted to close the question. Maybe, also add more information about how you identified the problem.
There is a 2 day wait time to accept the answer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.