Caddy – základy

Caddy je webový server vytvorený v jazyku Go. Zdrojový kód je otvorený a tvorí ho komunita nadšencov. Na začiatku bol tuším len jeden zanietenec Matt Holt . S trochou preháňania si trúfam napísať, že čo sa týka webových serverov a nasadenia https môžeme kľudne dobu deliť na „pred Caddy“ a po :)

Caddy vo svojej dobe skutočne prišiel s technológiami, ktoré pri ostatných webových serveroch neboli vôbec bežné a už vôbec nie ľahko nasaditeľné. Napríklad:

  • HTTPS s autoritou Let's Encrypt
  • HTTP/2
  • QUIC
  • Brotli

Ja Caddy webový server poznám a aj sa s ním hrám už niekedy od verzie 0.7.6 (najstaršia stiahnutá verzia, čo som našiel na serveri), to bola približne jeseň 2015. Prvé vydanie má číslo 0.5.0 a bolo z 28.4.2015.

Inštalácia

Caddy tvorí jeden binárny súbor. A teda inštalácia spočíva v stiahnutí správcami už pripraveného, zostaveného a zabaleného balíčku alebo v stiahnutí zdrojákov a ich skompilovaní. Caddy je vydávaný pre rôzne operačné systémy. Sťahovať môžem z viacerých miest, buď priamo zo stránky projektu , alebo čistú verziu Caddy bez „plug-inov“ z github.com .

Vytvorím si nový adresár, prepnem sa do novovytvoreného adresáru, stiahnem si archív s vanilkovou verziu Caddy, rozbalím archív a prekopírujem súbor caddy do adresáru /usr/local/bin:

mkdir ~/Downloads/Caddy/0.10.14
cd ~/Downloads/Caddy/0.10.14
wget https://github.com/caddyserver/caddy/releases/download/v0.10.14/caddy_v0.10.14_linux_amd64.tar.gz
tar -xvf *
cp caddy /usr/local/bin

Zmením vlastníka a skupinu na root a upravím prístupové práva na 755:

sudo chown root:root /usr/local/bin/caddy
sudo chmod 755 /usr/local/bin/caddy

Udelím binárnemu súboru caddy schopnosť pracovať na privilegovaných portoch (80, 443) aj keď bude spúšťaný len bežným užívateľom (teda nie super užívateľom – root):

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

Užívateľ a skupina www-data

Webové servery štandardne bežia pod iným ako bežným či super užívateľom. V Debiane a podobných to býva užívateľ/skupina www-data. Overím si, či mám takú v systéme:

egrep -i "^www-data" /etc/group

Ak už v systéme existuje, odpoveď bude niečo podobné ako: www-data:x:33.

Ak skupina a užívateľ ešte neexistujú, vytvorím si ich:

sudo groupadd -g 33 www-data
sudo useradd \
  -g www-data --no-user-group \
  --home-dir /var/www --no-create-home \
  --shell /usr/sbin/nologin \
  --system --uid 33 www-data

Adresáre

Pre správny chod webového servera Caddy je potrebné vytvoriť zopár adresárov a nastaviť im správne prístupové práva a vlastníkov.

Najskôr si vytvorím adresár pre konfiguračný súbor a nastavím užívateľa aj skupinu na root:

sudo mkdir /etc/caddy
sudo chown -R root:root /etc/caddy

Vytvorím ďalší adresár pre certifikáty atď., nastavím užívateľa na root a skupinu na www-data a upravím prístupové práva na 0770 (to znamená, že užívateľ aj skupina môžu všetko, ostatní nič):

sudo mkdir /etc/ssl/caddy
sudo chown -R root:www-data /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

Ak ho ešte nemám, tak do tretice vytvorím adresár pre samotné webové projekty /var/www, nastavím užívateľa aj skupinu na www-data a upravím prístupové práva na veľmi bezpečné 555 (nik nemôže zapisovať):

sudo mkdir /var/www
sudo chown www-data:www-data /var/www
sudo chmod 555 /var/www

Konfigurácia

Caddy webový server používa jeden konfiguračný súbor uložený v adresári /etc/caddy.

Ak ho ešte nemám, vytvorím si ho, zmením vlastníka aj skupinu na root a upravím prístupové práva na 644:

sudo touch /etc/caddy/Caddyfile
sudo chown root:root /etc/caddy/Caddyfile
sudo chmod 644 /etc/caddy/Caddyfile

V konfiguračnom súbore Caddyfile môžem okrem iného nastaviť aj:

  • adresu alebo port na ktorom webový server pracuje
  • HTTPS spojenie a jeho parametre
  • vlastnosť, aby adresy v adresnom riadku fungovali aj bez prípon, takzvané čisté adresy ( clean URL )
  • adresár so samotným webom
  • adresáre kam a spôsob ako sa majú ukladať logy
  • miesto kam sa majú posielať FastCGI požiadavky
  • bezpečnostné hlavičky

Príklad jednoduchého konfiguračného súboru pre miestny, testovací webový server bez HTTPS:

:8080 {
	gzip
	tls off
	ext .html .htm .php
	root /var/www/collector.example.com
	log /var/log/caddy/collector_caddyaccess.log
	errors /var/log/caddy/collector_caddyerror.log
	fastcgi / /run/php/php7.4-fpm.sock php
	header / {
		Server "StarTrek_cluster_dev02"
		Referrer-Policy "no-referrer-when-downgrade"
		}
}

Caddy a systemd

Spúšťanie a beh Caddy zabezpečí systemd. Preto potrebujem takzvaný „unit“ súbor, ktorý popisuje proces spúšťania atď.

Stiahnem si unit súbor a vykonám v ňom prípadné úpravy:

wget https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service

Prekopírujem ho do adresáru s jednotkami, zmením vlastníka aj skupinu na root a upravím prístupové práva:

sudo cp caddy.service /etc/systemd/system/
sudo chown root:root /etc/systemd/system/caddy.service
sudo chmod 644 /etc/systemd/system/caddy.service

Zabezpečím opakované načítanie démona systemd po pridaní novej jednotky:

sudo systemctl daemon-reload

Toto musím vykonať po každej zmene v súbore /etc/systemd/system/caddy.service.

Ak chcem aby bol Caddy spustený po každom reštarte operačného systému, nastavím to:

sudo systemctl enable caddy.service

Analogicky viem spúšťanie vypnúť pomocou disable.

Spustenie

Ak už mám všetko nastavené, chcem Caddy spustiť:

sudo systemctl start caddy.service

S Caddy ako systemd jednotkou môžem vykonávať bežné operácie:

  • start – spustenie
  • stop – zastavenie
  • status – kontrola stavu
  • reload – znovu načítanie konfiguračného súboru
  • restart – reštart

Aktualizácia

Po vydaní novej verzie chcem Caddy aktualizovať.

Tak ako každá nová verzia softvéru, tak aj nová verzia Caddy môže okrem zlepšení priniesť aj nové chyby. Pred nasadením na produkčných serveroch musím novú verziu Caddy otestovať !

Vytvorím si adresár pre novú verziu, prepnem sa do neho, stiahnem si novú verziu, rozbalím ju, zastavím Caddy webový server, prekopírujem rozbalený súbor do správneho adresáru, zmením vlastníka aj skupinu, upravím prístupové práva, znovu spustím Caddy:

mkdir ~/Downloads/Caddy/1.0.4
cd ~/Downloads/Caddy/1.0.4
wget https://github.com/caddyserver/caddy/releases/download/v1.0.4/caddy_v1.0.4_linux_amd64.tar.gz
tar -xvf *
sudo systemctl stop caddy.service
cp caddy /usr/local/bin
sudo chown root:root /usr/local/bin/caddy
sudo chmod 755 /usr/local/bin/caddy
sudo systemctl start caddy.service

Zdroj