Äntligen har jag tagit mig i kragen för att ta mig an ett jobbigt projekt. Att förstå de magiska med proxy. Provade på först med Traefik och fick ändå det till att fungera väldigt bra. Lite mer meck och stundtals så förstod jag inte varför det fungerade. Och ännu värre när jag inte förstod varför det inte fungerade.

Nginx har väl alltid varit min nemesis eftersom jag började med Apache och började förstå Apache och kände att nginx är alldelles för invecklat och onödigt att kunna… lika så med detta.. Men måste säga att de är vansingt enkelt. Så enkelt att de är jobbigt hur enkelt det är att få det till att fungera med väldigt lite ansträngning och vansningt enkelt att få SSL att fungera. Ett super plus är att det är tänkt och utformat att fungera i docker.

Började att testa lite på min contabo server och implementerade det sent och det blev aldrig riktigt som jag ville. Vilket gjorde att jag gjorde om allt för att implementera en proxy direkt istället för att få allt att fungera med cloudflare. Cloudflare är jätte trevligt men det är bra mycket ballare att lösa allt utan massa tunnlar. Speciellt när man kör en server utanför sitt hem-nät.

Så jag gjorde slag i sak och återställde allt och hittade att man kunde säkra upp sin docker compose fil med secrets. Vilket var en ball överraskning. Det tråkiga vara att de blev lite för invecklat för man måste aktivera swarms i docker och de blev en lite mindre huvudverk. Men ballt!

https://nginxproxymanager.com/advanced-config/

version: '3.8'

secrets:
  # Secrets are single-line text files where the sole content is the secret
  # Paths in this example assume that secrets are kept in local folder called ".secrets"
  DB_ROOT_PWD:
    file: .secrets/db_root_pwd.txt
  MYSQL_PWD:
    file: .secrets/mysql_pwd.txt

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # Admin Web Port:
      - '81:81'
    environment:
      # These are the settings to access your db
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      # DB_MYSQL_PASSWORD: "npm"  # use secret instead
      DB_MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
      DB_MYSQL_NAME: "npm"
      # If you would rather use Sqlite, remove all DB_MYSQL_* lines above
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    secrets:
      - MYSQL_PWD
    depends_on:
      - db

  db:
    image: jc21/mariadb-aria
    restart: unless-stopped
    environment:
      # MYSQL_ROOT_PASSWORD: "npm"  # use secret instead
      MYSQL_ROOT_PASSWORD__FILE: /run/secrets/DB_ROOT_PWD
      MYSQL_DATABASE: "npm"
      MYSQL_USER: "npm"
      # MYSQL_PASSWORD: "npm"  # use secret instead
      MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
    volumes:
      - ./mysql:/var/lib/mysql
    secrets:
      - DB_ROOT_PWD
      - MYSQL_PWD

Efter lite klurande så var det så enkelt att man måste aktivera swarm för att kunna nytja de dära secret mojängerna. La även till dom localt eftersom ja… jag tog bort swarmen tillsist för det blev klyddigt. Men man kan ändå göra det lite säkrare med att inte skriva det i klartext

# activate swarm
docker swarm init

Enkelt! Sen för att skapa secrets

# DB_MYSQL_PASSWORD__FILE 
printf "password_1" | docker secret create DB_MYSQL_PASSWORD__FILE -

# MYSQL_ROOT_PASSWORD__FILE
printf "password_2" | docker secret create MYSQL_ROOT_PASSWORD__FILE -

# MYSQL_PASSWORD__FILE 
printf "password_1" | docker secret create MYSQL_PASSWORD__FILE -

Där gjorde jag bort mig lite innan jag förstod att DB_MYSQL_PASSWORD__FILE & MYSQL_PASSWORD__FILE är samma…. tog pinsamt länge innan jag förstod att dessa två skulle vara samma

Sen sparade jag två filer lokalt som jag la lite dumt i min docker-compose map /.secrets/db_root_pwd.txt & secrets/mysql_pwd.txt men den mappen kommer väl antaligen ligga kvar på samma ställe alltid. I efterhand så var det skönt att jag fixade det redan ifrån början. Eftersom jag fimpade swarmen när allt var up and running. Vilket hade gjort att min proxy troligtvis hade slutat fungera nästa gång jag startade om. Vilket jag antagligen då hade glömt bort varför….

Sen var det bara till att tuta och köra. Just det jag öppnade upp lite portar också för att SSL skulle fungera (80, 443)

Och så på ren magi så var det bara att logga in och lägga till tjänserna.

Först SSL

SSL

Först SSL certifikatet
Eftersom jag använder mig av cloudflare så körde jag med DNS Challange, ska jag vara ärlig så är jag inte helt hundra på hur man gör annars. Men skulle gissa på att det nästan är enklare att köra utan cloudflared.

API nyckeln fick jag ifrån cloudlfared. Var lite svårt att hitta men det gick att goggla sig till. Skriva in domän namnet. Sen var det bara att tuta och köra. Om man får några felmedellanden så hade jag tagit en extra koll så att port 80 och 443 verkligen är öppna.

New Proxy Host

Så enkelt är det… tyvärr. Bara att lägga till hostnamet som man får ifrån docker. Vilken port och sen snabbt över till SSL flicken för att lägga till subdomänen och klicka i force SSL och HTTP/2 Support

DÖNE!

Så jag tar tillbaka allt som jag har tänkt om nginx… som nybörjar proxy kan man nog inte komma undan lättare. Just det att de är väldigt lite konfigering i compose filerna och sen meck med portar och grejer. För det som är väldigt skönt är att man behöver aldrig tilldela portar i dockers. Det enda man får hålla reda på är vilka portar som contenerna använder sig av.

En sak som man måste lägga till och som jag tyckte var rätt skönt när jag kom på det är att man skapar ett virtuelt nätverk i dockers för att hantera proxyn. Dels blir det mycket trevligare för att de blir lättare att hålla reda på. Plus säkert?! lite osäkert på den sista. Men man får det mer enhetligt

docker create network stokitvarre

sen får man bara komma ihåg att lägga till detta i alla compose filerna så att varje contener som man ska använda kör samma nätverk

networks:
  default:
    external:
      name: stokitvarre
Scroll to Top