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
- DockerHub nginx-proxy dokumentace
- Github letsencrypt-nginx-proxy-companion dokumentace