Letsencrypt och Reverse Proxy med Docker

Jag skrev innan en guide hur du sätter upp docker compose för att kunna köra Home Assistant i docker. Ett tag senare kompleterade jag denna med Nginx Reverse Proxy och Letsencrypt. Kom på att då jag kört Hassio innan så slutade helt plötsligt ssl att fungera då certet förnyas var tredje månad med automatik. Vi kommer använda containern som heter letsencrypt.

Efter du gjort detta kommer du att få:

  • HTTPS med Letsencrypt till alla dina containers
  • Slippa använda portar utan kunna använda tex ha.mydomain,duckdns.org
  • En NGINX Reverseproxy som kan mappa in dina befintliga http siter till https.
  • Du får med Failtoban
  • Certet kommer förnya sig med automatik

Starta med att lägga till dessa rader i docker-compose.yaml. Lägg till dina uppgifter för duckdns. Lägg till de domäner du kan tänkas vilja ha.

Skapa även en port forward i din router för 80 och 443. Du kan efter att det fungerar sen ta bort 80 i routern.

Starta om docker.

  letsencrypt:
    container_name: letsencrypt
    image: linuxserver/letsencrypt
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    environment:
      - TZ=Europe/Stockholm
      - URL=mydomain.duckdns.org
      - EMAIL=myemail@mydomain.se
      - SUBDOMAINS=hass,grafana,portainer,synology,nodered,tomato,dsphoto,dsm
      - VALIDATION=http
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /srv/docker/letsencrypt/config:/config
    cap_add:
      - NET_ADMIN

Du har antagligen redan skapat en mapp där du har alla dina konfigurationsfiler. I mitt fall är det denna:

/srv/docker/letsencrypt/config/

Skapa filen hassio här:

/srv/docker/letsencrypt/config/nginx/site-confs/

Nedan är ett exempel på hur filen kan se ut för hassio.

map $http_upgrade $connection_upgrade {
   default upgrade;
   ''      close;
}

server {
    listen       443 ssl;
    server_name  hass.mydomain.duckdns.org;
    
    include /config/nginx/ssl.conf;
    
    proxy_buffering off;
    location / {
        proxy_pass http://192.168.0.11:8123;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location /api/websocket {
        proxy_pass http://192.168.0.11:8123/api/websocket;
        proxy_set_header Host $host;

        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

    }

}

Då denna är på plats starta om letsencrypt containern. Ett bra sätt att se om det fungerar är att kika direkt i loggen på containern. Har du portainer kan du göra detta som i bilden nedan. Jag hittade tex ett litet fel här med att jag missat en sak som jag inte såg innan.

 

Nu kan du testa att gå till https://hass.mydomain.duckdns.org Det bör fungera. betydligt enklare än att komma ihåg https://mydomain.duckdns.org:73465763 eller vad du nu haft innan.

Kanske du vill ha Grafana tillgängligt med. Skapa en till fil i /srv/docker/letsencrypt/config/nginx/site-confs/ som heter grafana. Min ser ut som nedan. Och du når sen Grafana med https://grafana.mydomain.com

map $http_upgrade $connection_upgrade {
   default upgrade;
   ''      close;
}

server {
    listen       443 ssl;
    server_name  grafana.mydomain.duckdns.org;
    
    include /config/nginx/ssl.conf;
    
    proxy_buffering off;
    
    location / {
        proxy_pass http://192.168.0.11:3000;
        proxy_redirect http:// https://;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    }

}

Det kan vara vissa saker som behövs för olika siter. Vissa fungerar rakt av medans andra som kanske använder websockets kan kräva fler parametrar.