
Ä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




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