Paano I-install ang Caddy Web Server na may Automatic HTTPS
I-install ang Caddy sa Ubuntu mula sa official repository, magsulat ng Caddyfile para sa static sites at reverse proxies, unawain ang automatic certificates, systemd, logs, at mga karaniwang pagkakamali kapag nagmi-migrate mula sa Nginx.

Ang Caddy ay web server na kumukuha at nagre-renew ng TLS certificates bilang default. Para sa maliit na VPS na nagho-host ng isa o dalawang domains, inaalis nito ang buong klase ng Certbot timers at Nginx snippet files. Maikli ang configuration language (Caddyfile). Normal features ang reverse proxy, gzip, at HTTP/2, hindi weekend ng extra modules.
Tama pa rin ang Nginx para sa ilang shops: may battle-tested configs ka na, o kailangan mo ng napaka-specific na module. Para sa ibang karaniwang kaso ang gabay na ito — gusto mo ng HTTPS na gumagana sa sariwang Hiddence VPS nang hindi isaulo ang include snippets. I-i-install natin ang Caddy mula sa official apt repo, ipapaliwanag kung paano ito nakikipag-usap sa Let's Encrypt, magse-serve ng static site, magpu-proxy ng local app, magho-host ng ilang domains, titingnan ang logs, at aayusin ang karaniwang away sa port 80 sa Apache o lumang Nginx.
Kailan maganda ang Caddy
Automatic HTTPS ang headline, pero ang araw-araw na panalo ay mas kaunting moving parts. Nakikinig ang Caddy sa 80 at 443, nireridirect ang HTTP papunta sa HTTPS, at nag-iimbak ng certs sa data directory nito. Kailangan mo pa rin ng domain na tumuturo sa VPS. Kailangan mo pa ring hindi sirain ang ACME (firewall 80/tcp, walang ibang process na nagnanakaw ng :80). Kailangan ng wildcard certificates ng DNS provider module — mas mahaba iyon kaysa single-host cert.
- Automatic HTTP→HTTPS at certificate renewal
- Nababasa ang Caddyfile imbes na mahabang server blocks
- Kayang reverse proxy para sa Node, Python, PHP-FPM sa extra config, o Docker backends
- HTTP/2 at modernong TLS defaults nang walang cipher spreadsheet
- systemd unit mula sa official package
Mga kailangan
Kailangang mag-resolve ang domain sa VPS na ito bago mapatunayan ng Caddy ang ACME HTTP-01. Kung nagpo-propagate pa ang DNS, mabibigo ang issuance ng Caddy at magre-retry; mukhang 'sira ang Caddy' kapag DNS lang pala. Itigil muna ang Apache o Nginx kung hawak nila ang 80/443.
- Ubuntu 22.04 o 24.04
- Domain A record papunta sa VPS IP (at AAAA kung gumagamit ka ng IPv6)
- Libre at pinapayagan sa firewall ang ports 80 at 443
- Root o sudo
Hakbang 1: I-install ang Caddy mula sa official repository
Huwag mag-install ng random na lumang Caddy mula sa default Ubuntu universe kung gusto mo ng kasalukuyang TLS at ACME behaviour. May dokumentadong apt source ang Caddy project. Pagkatapos mag-install, may caddy user at naka-enable ang service.
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-pagerHakbang 2: Unang Caddyfile — static site
Ang default Caddyfile ay /etc/caddy/Caddyfile. Palitan ng domain mo. Susubukan ng Caddy kumuha ng certificate sa sandaling mag-load ang config kung hindi localhost ang hostname. Ilagay ang site files sa directory na nababasa ng caddy user (madalas www-data-style permissions, pero user caddy ang ginagamit ng package).
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 -fHakbang 3: Mag-reverse proxy ng local application
Kung nakikinig ang Gunicorn, Node, o Docker sa 127.0.0.1:8000, dapat Caddy lang ang public process. Ipinapasa ng reverse_proxy directive ang Host at X-Forwarded-* nang makatuwiran para sa karamihan ng apps. Kung gumagawa ang app ng absolute HTTP URLs, itakda ang trusted proxy / HTTPS flags sa app (Django SECURE_PROXY_SSL_HEADER, Express trust proxy, at iba pa).
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
# }Hakbang 4: Firewall at systemd
Payagan ang 80 at 443. Ang unit ng Caddy ay caddy.service; sapat na ang reload pagkatapos mag-edit ng Caddyfile kung healthy ang process. Kung palitan mo ang environment variables para sa DNS plugin, mas malinaw ang full restart. Nakatira ang certificates sa ilalim ng /var/lib/caddy/.local/share/caddy/ bilang default — isama ang path na iyon sa backups kung mahalaga sa iyo ang rate limits sa reinstall.
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/Hakbang 5: Logs, compression, at headers
Tumutulong ang access logs kapag binabayo ng bot ang isang path o kapag nagde-debug ka ng 404s. Pwede kang mag-log bawat site. Magdagdag ng security headers kung nagho-host ka ng browser app; huwag kopyahin ang malaking header pack nang hindi nauunawaan ang HSTS (kapag nagtakda ka ng mahabang max-age, naaalala ito ng browsers).
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 caddyHakbang 6: PHP at iba pang extras
Kaya ng Caddy makipag-usap sa PHP-FPM sa php_fastcgi directive. Sapat iyon para sa maraming WordPress o Laravel hosts, pero kailangan mo pa rin ng naka-install na php-fpm at tumutugmang socket path. Kung may perpektong Nginx PHP config ka na, optional ang pag-migrate sa isang gabi — mas nagniningning ang Caddy sa reverse proxy + static + automatic TLS.
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-fpmPag-migrate mula sa Nginx nang walang downtime surprises
Itigil ang Nginx bago simulan ang Caddy o mag-aaway sila para sa 80/443. Ibaba ang DNS TTL isang araw bago kung lilipat ka rin ng IPs. Mag-test sa curl --resolve para matamaan mo ang bagong VPS bago palitan ang A record. Itago ang Nginx configs sa git ng isang linggo kung sakaling kailangan mong mag-roll back.
- systemctl stop nginx && systemctl disable nginx
- I-install ang Caddy, i-validate ang Caddyfile, simulan ang Caddy
- curl -I --resolve example.com:443:NEW_IP https://example.com
- Saka palitan ang DNS kung bago ang IP
- Automatic ang re-issue; huwag ding magpatakbo ng Certbot laban sa parehong hostname
Troubleshooting
Halos palaging DNS, firewall, o ibang service sa port 80 ang ACME failures. Binabanggit ng Caddy log lines ang tls.obtain. Kung gumagana ang site sa HTTP pero hindi sa HTTPS, hindi natapos ang issuance. Kung masyadong maraming certificates, tinamaan mo ang Let's Encrypt rate limits — gamitin ang staging CA habang nagte-test, hindi production.
- Nabigo ang validate: Caddyfile syntax, nawawalang brace
- permission denied sa root: chown caddy para sa site directory
- bind: address already in use — ss -tulpn | grep -E ':80|:443'
- certificate timeout: dig +short ang domain mula sa VPS, ufw allow 80
- 502 reverse_proxy: down ang backend, o mali ang pag-proxy mo sa localhost mula sa container network
Mga security notes
Conservative ang TLS defaults ng Caddy. Application security at SSH ang trabaho mo. Huwag i-enable ang Caddy admin API sa public interface. Local ang default admin endpoint; iwanan nang ganoon. Kung gumagamit ka ng Caddyfile mula sa internet, basahin ang bawat matcher — ang snippet na nagre-reverse_proxy ng /* papunta sa internal IP ay pwedeng maging open proxy.
- Huwag i-expose ang admin API
- Panatilihing updated ang package
- HSTS lang pagkatapos kang sigurado na gumagana ang HTTPS para sa lahat ng hostnames
- Ihiwalay ang test at production hostnames para protektahan ang ACME rate limits
Mga tips
- Pinapanatiling nababasa ng caddy fmt --overwrite /etc/caddy/Caddyfile ang file
- Gumamit ng import snippets kapag marami kang magkakaparehong sites
- Para sa Docker, karaniwan ang caddy:alpine image na may mounted Caddyfile
- Kailangan ng wildcard certs ng DNS module at API token — protektahan ang token na iyon
- Basahin ang journalctl -u caddy bago mo isulat muli ang buong file
Ang Caddy sa VPS ay: official package, maikling Caddyfile, bukas na ports 80/443, DNS na tumuturo na sa server, at systemd reload pagkatapos mag-edit. Gamitin bilang static file server o reverse proxy sa harap ng Gunicorn, Node, o Docker. Gumagana ang automatic HTTPS kapag kayang sagutin ng ACME sa port 80; kung nabigo ang issuance, ayusin ang DNS at port conflicts bago sisihin ang Caddy. I-back up ang /var/lib/caddy kung madalas kang mag-reinstall.