HTTPS sous Docker pour Dokos

Bonjour,
J’accède enfin depuis le monde à mon app de test sur dodock. Tout fonctionne: login, list, create, logout.
Mais j’ai remarqué que si je refresh la page, il rajoute :8080 à la fin du domaine, et donc https:site.example.org:8080/mapage plante.
Est-ce un setting via le dashboard?
Ou un paramètre dans docker compose ?
Ou ailleurs ?

Je précise : j’ai ce problème qu’avec cette stack, les autres docker stacks (pas frappe) qui font tourner d’autres services n’ont pas ce souci quand je refresh.

Bonjour @pmz,

Je n’arrive pas à reproduire le problème, quel est le reverse proxy que tu utilises pour tes services ? Avec les étapes suivantes, je fais tourner sans problème le fichier compose standard sans modification et avec HTTPS :

docker compose -f dodock.yaml up
# /etc/nginx/conf.d/test-docker.conf
server {
	server_name test.local;

	location / {
		proxy_set_header   X-Forwarded-For $remote_addr;
		proxy_set_header   Host $http_host;
		proxy_pass         http://127.0.0.1:8080;
	}
}

server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name test.local;

	ssl_certificate /home/corentin/tls/fullchain.pem;
	ssl_certificate_key /home/corentin/tls/privkey.pem;
	ssl_trusted_certificate /home/corentin/tls/chain.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:MozSSL:10m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.3;
	ssl_prefer_server_ciphers off;
	ssl_stapling on;
	ssl_stapling_verify on;

	location / {
		proxy_set_header   X-Forwarded-For $remote_addr;
		proxy_set_header   Host $http_host;
		proxy_pass         http://127.0.0.1:8080;
	}
}

Je pense que c’est parce que j’utilise le fichier nginx par défaut de la stack dodock :

upstream backend-server {
        server backend:8000 fail_timeout=0;
}

upstream socketio-server {
        server websocket:9000 fail_timeout=0;
}

server {
        listen 8080;
        server_name frontend;
        root /home/frappe/frappe-bench/sites;

        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;

        add_header X-Frame-Options "SAMEORIGIN";
        add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header Referrer-Policy "same-origin, strict-origin-when-cross-origin";

        set_real_ip_from 127.0.0.1;
        real_ip_header X-Forwarded-For;
        real_ip_recursive off;

        location /assets {
                try_files $uri =404;
        }

        location ~ ^/protected/(.*) {
                internal;
                try_files /frontend/$1 =404;
        }

        location /socket.io {
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header X-Frappe-Site-Name frontend;
                proxy_set_header Origin $scheme://frontend;
                proxy_set_header Host $host;

                proxy_pass http://socketio-server;
        }

        location / {
                rewrite ^(.+)/$ $1 permanent;
                rewrite ^(.+)/index\.html$ $1 permanent;
                rewrite ^(.+)\.html$ $1 permanent;

                location ~ ^/files/.*.(htm|html|svg|xml) {
                        add_header Content-disposition "attachment";
                        try_files /frontend/public/$uri @webserver;
                }

                try_files /frontend/public/$uri @webserver;
        }

        location @webserver {
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Frappe-Site-Name frontend;
                proxy_set_header Host $host;
                proxy_set_header X-Use-X-Accel-Redirect True;
                proxy_read_timeout 120;
                proxy_redirect off;

                proxy_pass  http://backend-server;
        }

        # optimizations
        sendfile on;
        keepalive_timeout 15;
        client_max_body_size 50m;
        client_body_buffer_size 16K;
        client_header_buffer_size 1k;

        # enable gzip compression
        # based on https://mattstauffer.co/blog/enabling-gzip-on-nginx-servers-including-laravel-forge
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 5;
        gzip_min_length 256;
        gzip_proxied any;
        gzip_vary on;
        gzip_types
                application/atom+xml
                application/javascript
                application/json
                application/rss+xml
                application/vnd.ms-fontobject
                application/x-font-ttf
                application/font-woff
                application/x-web-app-manifest+json
                application/xhtml+xml
                application/xml
                font/opentype
                image/svg+xml
                image/x-icon
                text/css
                text/plain
                text/x-component;
                # text/html is always compressed by HttpGzipModule
}

Pardon si je ne suis pas très clair : il ne faut pas généralement pas modifier la configuration Nginx à l’intérieur du conteneur.

Il faut un second Nginx sur la machine hôte qui fait office de reverse proxy depuis un nom de domaine vers le conteneur qui tourne sur le port 8080 (ou autre si nécessaire). Éventuellement on peut utiliser Traefik pour gérer le reverse proxying à l’intérieur du compose si c’est plus simple.

Ah, ok, merci mais mon reverse proxy fonctionne avec les autres containers.
Si c’était lui, j’aurais le problème ailleurs aussi, il me semble que le problème est sur dodock.

Peut-être j’ai coupé le coin ? Je teste avec frontend, pas un site custom site.example.org.

Hmm, apparemment ce n’est pas ça, car quand je refresh la racine https://site.example.org sans la page, il ne rajoute pas le 8080. Il affiche la page #login ou « My account Â» quand je suis loggĂ© en tant que customer.

Hmm j’avoue que c’est curieux : ça vaut le coup de configurer la clé host_name du fichier site_config.json du site pour voir si ça règle le problème :

bench --site frontend set-config host_name "https://site.example.org"

Bonne idée !

Alors j’ai repris ton idée de mini reverse proxy en local, et il y a le même problème avec l’app, je pense que c’est le routage.

EDIT:
C’est mon routage, c’était pas bien codé, je me suis mis une tape sur la main, et je rebuild tout ça vite vite avant le weekend !

Bon weekend :tada: @corentin, toute l’équipe Dokos, et les collaborateurs.

2 Likes