Site icon Tosolini.info

Nginx Proxy Manager (docker)

Se avete letto l’articolo che riguarda Portainer, è molto probabile che una delle esigenze successive sia quello di esporre un servizio dalla propria bolla dei Container verso il mondo.

Le macchine che stanno girando dentro Docker nel 99% dei casi avranno una “port configuration” che crea una sorta di “tunnel” da una porta all’interno del Container, verso una porta nel server fisico.

Il comando che si vede nel docker-compose o meglio quando creiamo un nuovo container in Portainer, è proprio quello dell’accoppiamento di una porta reale con una che sta dentro la “cosa” virtuale.

Viene logico dedurre che nell’host reale la situazione porte diventerà presto complicata. Se abbiamo tre container che per default usano la porta 80, nel server saremo costretti ad usare numerazioni diverse. In genere alte, 8080, 8081, eccetera.

Questa considerazione ci porta alla necessità di usare un web server proxy. Il software più quotato per questa operazione è sicuramente Nginx, perché è più leggero e reattivo rispetto ad Apache o IIS. Sebbene, va detto, ci sono progetti meno noti ma ancora più reattivi e con minore impatto. Ad ogni modo, non dovendo cercare cose improbabili rimaniamo nello stile classico.

Nginx ha una sua immagine Docker, ma questa è più come supporto di uno stack di progetto, non come multifunzione per un Server Portainer. A questo ci ha pensato qualcun’altro della comunità, lanciando il progetto Nginx Proxy Manager.

Si tratta di una immagine Docker specificatamente pensata a questo scopo, ovvero esporre in modo molto veloce e facile i container verso l’esterno. Ad essa, infatti, daremo l’esclusivo accesso alle porte 80 e 443, ovvero HTTP e HTTPS verso il lato HOST. Mentre la porta 81 rimane per la gestione del manager stesso, e per buona regola non andrà esposta.

Questo ci permetterà di non avere nemmeno la necessità di mappare porte sulle configurazioni, perché del “prelievo” se ne occuperà il manager.

Installazione e configurazione

Per prima cosa in Portainer ho deciso di creare una nuova Network che si chiamerà “public“. La creazione è molto semplificata, dal menu a sinistra Network, quindi “Add Network“. Nella schermata di configurazione ho semplicemente dato il nome “public“, assicurandoci che il driver sia “bridge” e che l’access control, in fondo alla pagina, sia disabilitato.

Questa rete ci servirà per essere usata come LAN DMZ per i vari Container, a cui daremo accesso (anche come seconda Ethernet) a questa virtual subnet, e dove chiaramente ci sarà anche il nostro Manager.

Ora dobbiamo creare il Container di Nginx-Proxy-Manager, personalmente ho avuto qualche problema nel crearne uno diretto, per cui mi sono affidato alla creazione di uno Stack Docker. Anche se di fatto non esiste nessuno stack, visto che il Container stesso non ha dipendenze verso terzi.

Nello Stack (sempre menu zona blu a sinistra), “Add Stack“. Come nome ho dato “nginx-proxy” e come Build ho scelto “Web Editor” a cui ho dato in pasto questo “docker-compose

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - .docker/data:/data
      - .docker/letsencrypt:/etc/letsencrypt
networks:
  default:
    external: true
    name: public

Potete modificare i “volumes” se volete posizionare altrove i file. Di default Portainer li mette sotto /data/compose.

Qui chiaramente le porte devono essere mappate, poiché questo container sarà l’unico che esporremo verso Internet. Gli altri passeranno attraverso di lui come proxy.

Non resta che dare il comando di Deploy, il sistema provvederà a creare ed avviare il Container. Prima di aprire il firewall dobbiamo accedere alla porta 81 che non esporremo, e il consiglio è quello di usarlo sempre attraverso un tunnel-ssh.

ssh -L 81:0.0.0.0:81 sshuser@ip-server

Si apre una sessione SSH dove è stata mappata la porta 81 del server remoto con la nostra macchina fisica, quindi accedendo al sito http://localhost:81 dovremo vedere la pagina di login di Nginx Proxy Manager.

Le credenziali di avvio sono

user: admin@example.com
password: changeme

Una volta entrati vi verrà subito chiesto di cambiarle entrambe ed è mandatorio.

Nell’interfaccia, piuttosto semplice, potremo istanziare dei Proxy Hosts, dove andremo ad indicare un nome di dominio di terzo livello, ad esempio “test.tosolini.info” e l’IP corrispondente del container nella network public, con la porta del container medesimo.

Configurare un Container su Public Network

Ok, se state seguendo la guida è probabile che un container ce l’abbiate già e non sta nella network Public. Per ovviare al problema basta aprire il container cliccando sul nome dentro Portainer, sul fondo ci sarà la sezione “Connected networks” con un selettore a tendina.

Premendo su Public, andrà ad inserire una seconda scheda di rete virtuale su questa rete, assegnando un indirizzo IP privato.

A questo punto abbiamo un indirizzo IP valido sulla stessa rete dell’Nginx Proxy Manager e abbiamo anche la porta, ad esempio la 80. Possiamo completare la configurazione di un nuovo Proxy Hosts

Nel Firewall possiamo attivare l’ascolto sulle porte 80/443 e testare la nostra configurazione.

Cenni su Configurazioni avanzate

Il Proxy Manager però fa molto altro, permette di gestire i redirect, crea un sistema (blando) di autenticazione, permette di richiedere i certificati SSL di LetsEncrypt e attivare un sistema leggero di caching e blocco exploit.

La facilità d’uso e la versatilità di fatto sbloccano le potenzialità d’uso di Docker e Portainer. Se non avete un nome a dominio, potete andare a crearne uno fasullo mettendo l’IP pubblico e un nome tipo “portainer.local” sul vostro /etc/hosts se siete sotto Linux o macOS, oppure sotto c:/windows/system32/drivers/etc/hosts per Windows.

Exit mobile version