Powrót do bloga
Sierpień 19, 2026Poradniki

Jak zainstalować serwer WWW Caddy z automatycznym HTTPS

Zainstaluj Caddy na Ubuntu z oficjalnego repozytorium, napisz Caddyfile dla stron statycznych i reverse proxy, zrozum automatyczne certyfikaty, systemd, logi i typowe błędy przy migracji z Nginx.

Jak zainstalować serwer WWW Caddy z automatycznym HTTPS

Caddy to serwer WWW, który domyślnie uzyskuje i odnawia certyfikaty TLS. Na małym VPS z jedną czy dwiema domenami usuwa całą klasę timerów Certbot i fragmentów Nginx. Język konfiguracji (Caddyfile) jest krótki. Reverse proxy, gzip i HTTP/2 to zwykłe funkcje, nie weekend dodatkowych modułów.

Nginx nadal jest właściwym wyborem w części firm: masz już przetestowane w boju konfigi albo potrzebujesz bardzo konkretnego modułu. Ten poradnik jest od drugiego częstego przypadku — chcesz HTTPS, które działa na świeżym VPS Hiddence bez wkuwania include. Zainstalujemy Caddy z oficjalnego repo apt, wyjaśnimy, jak rozmawia z Let's Encrypt, serwujemy stronę statyczną, proxy lokalnej aplikacji, kilka domen, spojrzymy na logi i typowe walki o port 80 z Apache albo starym Nginx.

Kiedy Caddy dobrze pasuje

Automatyczny HTTPS to nagłówek, ale codzienny zysk to mniej ruchomych części. Caddy słucha na 80 i 443, przekierowuje HTTP na HTTPS i trzyma certy w swoim katalogu danych. Nadal potrzebujesz domeny wskazującej na VPS. Nadal nie wolno psuć ACME (firewall 80/tcp, żaden inny proces nie kradnie :80). Certyfikaty wildcard potrzebują modułu dostawcy DNS — to dłuższa droga niż cert na jeden host.

  • Automatyczne HTTP→HTTPS i odnawianie certyfikatu
  • Czytelny Caddyfile zamiast długich bloków server
  • Sprawne reverse proxy dla Node, Python, PHP-FPM (z dodatkowym konfigiem) albo backendów Docker
  • HTTP/2 i nowoczesne domyślne TLS bez arkusza szyfrów
  • Unit systemd z oficjalnego pakietu

Wymagania

Domena musi rozwiązywać się na ten VPS, zanim Caddy udowodni ACME HTTP-01. Jeśli DNS jeszcze się rozchodzi, Caddy nie wyda certu i będzie ponawiał; wygląda to jak „Caddy zepsuty”, choć winny jest tylko DNS. Zatrzymaj Apache albo Nginx najpierw, jeśli trzymają 80/443.

  • Ubuntu 22.04 lub 24.04
  • Rekord A domeny na IP VPS (i AAAA, jeśli używasz IPv6)
  • Porty 80 i 443 wolne i dozwolone w firewallu
  • Root lub sudo

Krok 1. Zainstaluj Caddy z oficjalnego repozytorium

Nie instaluj przypadkowego starego Caddy z domyślnego universe Ubuntu, jeśli chcesz aktualne TLS i ACME. Projekt Caddy dokumentuje źródło apt. Po instalacji istnieje użytkownik caddy, a usługa jest włączona.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install debian-keyring debian-archive-keyring apt-transport-https curl gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

apt update
apt -y install caddy

caddy version
systemctl status caddy --no-pager

Krok 2. Pierwszy Caddyfile — strona statyczna

Domyślny Caddyfile to /etc/caddy/Caddyfile. Podmień go na swoją domenę. Caddy spróbuje wziąć certyfikat zaraz po załadowaniu konfigu, jeśli hostname nie jest localhost. Pliki witryny kładź w katalogu czytelnym dla użytkownika caddy (często uprawnienia w stylu www-data, ale pakiet używa użytkownika caddy).

bash
mkdir -p /var/www/example
echo '<h1>It works</h1>' > /var/www/example/index.html
chown -R caddy:caddy /var/www/example

cat >/etc/caddy/Caddyfile <<'EOF'
example.com {
    root * /var/www/example
    file_server
    encode gzip
}
EOF

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

# Watch issuance:
journalctl -u caddy -f

Krok 3. Reverse proxy lokalnej aplikacji

Jeśli Gunicorn, Node albo Docker słucha na 127.0.0.1:8000, Caddy powinien być jedynym publicznym procesem. Dyrektywa reverse_proxy przekazuje Host i X-Forwarded-* w rozsądny sposób dla większości aplikacji. Jeśli aplikacja generuje bezwzględne URL HTTP, ustaw zaufany proxy / flagi HTTPS w aplikacji (Django SECURE_PROXY_SSL_HEADER, Express trust proxy i tak dalej).

bash
app.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8000
}

# Several hosts in one file are normal:
# blog.example.com {
#     root * /var/www/blog
#     file_server
# }

Krok 4. Firewall i systemd

Zezwól na 80 i 443. Unit Caddy to caddy.service; reload wystarczy po edycji Caddyfile, jeśli proces jest zdrowy. Jeśli zmieniasz zmienne środowiskowe wtyczki DNS, pełny restart jest jaśniejszy. Certyfikaty domyślnie leżą pod /var/lib/caddy/.local/share/caddy/ — włącz tę ścieżkę do kopii, jeśli obchodzą Cię limity przy reinstalacji.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

systemctl enable --now caddy
systemctl reload caddy

# Backup cert storage (path may vary slightly by version):
ls -la /var/lib/caddy/

Krok 5. Logi, kompresja i nagłówki

Logi dostępu pomagają, gdy bot wali w ścieżkę albo debugujesz 404. Możesz logować per witryna. Dodawaj nagłówki bezpieczeństwa, jeśli hostujesz aplikację przeglądarkową; nie kopiuj ogromnego pakietu nagłówków bez rozumienia HSTS (gdy ustawisz długi max-age, przeglądarki to pamiętają).

bash
example.com {
    root * /var/www/example
    file_server
    encode gzip
    log {
        output file /var/log/caddy/example.log
    }
    header {
        X-Content-Type-Options nosniff
        Referrer-Policy no-referrer-when-downgrade
        -Server
    }
}

mkdir -p /var/log/caddy
chown caddy:caddy /var/log/caddy
systemctl reload caddy

Krok 6. PHP i inne dodatki

Caddy umie rozmawiać z PHP-FPM przez dyrektywę php_fastcgi. To wystarczy wielu hostom WordPress albo Laravel, ale nadal musisz mieć zainstalowane php-fpm i pasującą ścieżkę gniazda. Jeśli masz już idealny konfig PHP w Nginx, migracja jednego wieczoru jest opcjonalna — Caddy świeci raczej na reverse proxy + statykę + automatyczny TLS.

bash
example.com {
    root * /var/www/example
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}

# Confirm FPM is running:
systemctl status php8.3-fpm

Migracja z Nginx bez niespodzianek o downtime

Zatrzymaj Nginx przed startem Caddy, albo będą walczyć o 80/443. Obniż TTL DNS dzień wcześniej, jeśli przenosisz też IP. Testuj curl --resolve, żeby uderzyć w nowy VPS przed zmianą rekordu A. Trzymaj konfigi Nginx w git przez tydzień na wypadek rollbacku.

  • systemctl stop nginx && systemctl disable nginx
  • Zainstaluj Caddy, zwaliduj Caddyfile, uruchom Caddy
  • curl -I --resolve example.com:443:NEW_IP https://example.com
  • Dopiero wtedy zmień DNS, jeśli IP jest nowe
  • Wydanie jest automatyczne; nie odpalaj też Certbota na ten sam hostname

Rozwiązywanie problemów

Awarie ACME to prawie zawsze DNS, firewall albo inna usługa na porcie 80. Linie logu Caddy wspominają tls.obtain. Jeśli witryna działa na HTTP, ale nie na HTTPS, wydanie nigdy się nie skończyło. Jeśli widzisz za dużo certyfikatów, uderzyłeś w limity Let's Encrypt — na testach używaj staging CA, nie produkcji.

  • validate nie przechodzi: składnia Caddyfile, brakujący nawias
  • permission denied na root: chown caddy dla katalogu witryny
  • bind: address already in use — ss -tulpn | grep -E ':80|:443'
  • timeout certyfikatu: dig +short domeny z VPS, ufw allow 80
  • 502 reverse_proxy: backend padł albo proxowałeś na localhost z sieci kontenerów niepoprawnie

Uwagi o bezpieczeństwie

Domyślne TLS Caddy są zachowawcze. Twoja robota to bezpieczeństwo aplikacji i SSH. Nie włączaj admin API Caddy na publicznym interfejsie. Domyślny endpoint admina jest lokalny; zostaw go takim. Jeśli bierzesz Caddyfile z internetu, czytaj każdy matcher — fragment, który reverse_proxies /* na wewnętrzne IP, może stać się otwartym proxy.

  • Nie wystawiaj admin API
  • Aktualizuj pakiet
  • HSTS dopiero gdy jesteś pewien, że HTTPS działa na wszystkich hostname’ach
  • Rozdziel testowe i produkcyjne nazwy, żeby chronić limity ACME

Wskazówki

  • caddy fmt --overwrite /etc/caddy/Caddyfile trzyma plik czytelny
  • Używaj import snippetów, gdy masz wiele podobnych witryn
  • W Dockerze częsty jest obraz caddy:alpine z zamontowanym Caddyfile
  • Certy wildcard potrzebują modułu DNS i tokenu API — chroń ten token
  • Czytaj journalctl -u caddy, zanim przepiszesz cały plik

Caddy na VPS to: oficjalny pakiet, krótki Caddyfile, otwarte 80/443, DNS już wskazujący na serwer i reload systemd po edycjach. Używaj go jako serwera plików statycznych albo reverse proxy przed Gunicorn, Node albo Docker. Automatyczny HTTPS działa, gdy ACME potrafi odpowiedzieć na porcie 80; jeśli wydanie pada, napraw DNS i konflikty portów, zanim obwinisz Caddy. Kopiuj /var/lib/caddy, jeśli często reinstaluujesz.