Files
self-host-101/caddy/readme.md
Kulvir Singh 2ff2e4ffb3 reverse proxy
2025-10-15 13:45:16 +05:30

3.7 KiB

Caddy web server and reverse proxy

Usually we will have multiple services and websites running on our VPS. So we need a web server which will listen on HTTP and HTTPS ports and redirect the traffic to correct service.

Installation

I'll install caddy as a systemd service on my ubuntu machine. Hence I'll following debian docs to install caddy. To verify if caddy is installed and running run the following command.

sudo service caddy status

Caddy web server is now started on your VPS and you can visit domain-name.com and see the caddy homepage. Caddy homepage will tell you where to edit caddy config and where you can put your static files for your webserver.

TLS Certificates

Right now Caddy is running on HTTP only 80 port. To use automatic HTTPS replace the :80 port in caddy config to your domain name. Before that ensure DNS record of domain name points to IP address of VPS.

- :80 {
+ domain-name.com {
}

After making any change to caddy config we also need to restart the caddy service.

sudo systemctl reload caddy

Now visit domain-name.com again and it will be serving site over HTTPS. Caddy will automatically provision and renew TLS certificates from LetsEncrypt

Redirects

You might want to setup few redirects to your root domain for like IP Address and www sub domain.

192.168.1.1,
www.domain-name.com {
    redir https://domain-name.com{uri}
}

You can setup this rule for multiple domains by either writing them space seperated or comma seperated as above. {uri} specified at the end of domain name preserves the path from the URL user entered. Now if anyone visits your website via server's IP address or using www subdomain they will be redirected to your root domain. It just looks cleaner.

Multiple file caddy config

Caddy supports writing config in multiple files so that we don't polluting our main config. Just import all other caddy configs to the main caddy config. Usually we can structure our config files in any way it doesn't matter. But there are some common ways to structure it.

Place all other config files inside /etc/caddy/conf.d/ directory and import Caddyfile from this directory to main config file.

import conf.d/*.Caddyfile

Handling errors

We can setup seperate error pages for different kind of error. But I'll be using single error.html page which is a caddy template page and I can fill in error msg and error code using placeholders. For reference look at error.html file.

To learn more about it check the Caddy docs RTFM about handling errors.

Reverse Proxy

Most of the devs don't know what reverse proxy is. So maybe check this out.

Lets say we have pokemon API running on PORT 8080 and we want any traffic coming to subdomain pokemon.domain-name.com to be redirected to the pokemon server. To achieve this we can setup reverse proxy for this subdomain. To setup reverse proxy first we need to set A Record of sub-domain to the IP address of the VPS. Then we can define the reverse proxy in our caddy config like mentioned below.

pokemon.domain-name.com {
    reverse_proxy :8080
}

Checkout this sample reverse proxy config and ofc read caddy docs to check what else you can do with reverse proxy.