VOLEJ KDYKOLIV

+420 792 368 067

Jednoduchá proxy, pro moje docker kontejnery

Moje oblíbené hosting kombo nginx proxy + letsencrypt ssl companion

Žijeme v době, kdy je internet součástí našich životů stejně tak jako třeba elektrická energie. A tomu odpovídá i široké spektrum možností, jak hostovat své internetové projekty – od webhostingu, přes privátní či soukromý cloud až po konkrétní SaaS. Přehršle řešení se liší mírou soukromí a jednoduchostí použití. O jednom soukromém řešení jsem např. psal v předchozím článku: ISPConfig král, který přežil cloud .

Jsem vyznavačem KISS principu, tedy „keep it simple, stupid“ a tak se snažím věci příliš nekomplikovat. Mám rád svobodu – a protože jsem v technologiích docela rozkročen, hostuju své projekty v kontejnerech na nejlevnějším virtuálním serveru od Linode, asi za 6 dolarů měsíčně. Není to sice takové jako tehdy, když jsem měl svůj fyzický server v housingu, ale aspoň mám více možností než v klasickém cloudu. Na stejném serveru tak běží projekty v Node.js, PHP, Go i .NET.

Jako každý Čech :) mám rád za málo peněz hodně muziky – a tak hledám optimální řešení všude, kde to jde. Používám Alpine Linux nejen v kontejnerech, ale i jako hypervisor pro můj Docker host. Ze všech distribucí zabírá nejméně místa.

V duchu již zmíněného KISS principu celý systém ovládám vzdáleně přes docker context přes SSH. Všechny služby si držím v rámci jediného docker-compose. A tady se právě projevuje síla řešení, které je předmětem tohoto krátkého příspěvku – již zmíněného komba: jwilder/nginx-proxy a jrcs/letsencrypt-nginx-proxy-companion. Ideální nízkonákladové řešení pro osobní projekty nebo menší profesionální služby.

ukázka konfigurace

services:
  nginx-proxy:
    restart: always
    image: jwilder/nginx-proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
    network_mode: host 
  letsencrypt-nginx-proxy-companion:
    restart: always
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    networks:
        - proxy
    depends_on:
      - nginx-proxy
  lab.example.me:
    image: georgjung/nginx-brotli
    volumes:
      - /home/example/test/wwwroot:/usr/share/nginx/html
      - /home/example/test/nginx.conf:/etc/nginx/nginx.conf
    expose:
      - "80"
    environment:
      - NGINX_PORT=80
      - VIRTUAL_HOST=lab.example.me
      - LETSENCRYPT_HOST=lab.example.me
      - LETSENCRYPT_EMAIL=${EMAIL:-info@mirav.cz}
      - TZ=Europe/Prague  
    restart: unless-stopped

  freshrss:
    image: freshrss/freshrss:latest
    environment:
      - VIRTUAL_HOST=rss.example.me
      - LETSENCRYPT_HOST=rss.example.me
      - LETSENCRYPT_EMAIL=${EMAIL:-info@mirav.cz}
      - CRON_MIN=4,34
      - TZ=Europe/Prague  
    volumes:
      - freshrss-data:/var/www/FreshRSS/data
      - /home/example/data/freshrss-extensions:/var/www/FreshRSS/extensions  
    depends_on:
      - nginx-proxy
    restart: unless-stopped
  fathom:
    image: usefathom/fathom:latest
    environment:
      - "FATHOM_SERVER_ADDR=:8080"
      - "FATHOM_GZIP=true"
      - "FATHOM_DEBUG=false"
      - "FATHOM_SECRET=secrethashsecrethashsecrethash"
      - "FATHOM_DATABASE_DRIVER=sqlite3"
      - "FATHOM_DATABASE_NAME=./fathom.db"
      - "FATHOM_DATABASE_USER="
      - "FATHOM_DATABASE_PASSWORD="
      - VIRTUAL_HOST=stats.example.me,stats.example.cz
      - LETSENCRYPT_HOST=stats.example.me,stats.example.cz
      - LETSENCRYPT_EMAIL=${EMAIL:-info@mirav.cz}
    volumes:
      - type: bind
        source: /home/example/fathom/fathom.db
        target: /app/fathom.db
    restart: always
  
  registry:
    image: registry:latest
    container_name: registry
    restart: always
    ports:
      - 127.0.0.1:5000:5000/tcp
    volumes:
      - registry_data:/var/lib/registry

  watchtower:
      restart: always
      image: containrrr/watchtower
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
      command: --include-restarting
volumes:
  registry_data:
    driver: local  # Volume pro registry data
  certs:
    driver: local
  html:
     driver: local
  vhosts:
    driver: local
  freshrss-data:
    external: true
networks:
  proxy:
    driver: bridge

Tato konfigurace slouží jako příklad pro použití. Pro správné spárování domény a kontejneru je potřeba uvést proměnnou prostředí pro každý kontejner: VIRTUAL_HOST, a pro správné vygenerování certifikátu LETSENCRYPT_HOST. LETSENCRYPT_EMAIL je pak kontaktní e-mail pro potřeby registrace u Let’s Encrypt.

V konfiguraci je také vidět Watchtower, který slouží pro automatické upgrady image kontejnerů, a lokální registry, do kterého si pushuju své vlastní image. Obě tyto volby jsou jen ilustrativní – ukazují, jakým způsobem pracuju.

Toto jednoduché a efektivní řešení umožňuje snadno provozovat různé služby v Docker kontejnerech a bez nutnosti výpadku přidávat a odebírat nové služby. Nginx proxy pak sama zkonfiguruje a namapuje doménu („virtual host“) na konkrétní kontejner, a SSL companion zajistí automatické vydání Let’s Encrypt SSL certifikátu.



🚨

Máš něco, co potřebuješ spravit? Napiš mi nebo volej na IT pohotovost.
Jsem tady.



Odkazy

Miroslav Valenta