To host a couple websites, and I was working toward hosting a Huginn instance.
a. System environment:
Debian VPS
b. Command:
caddy start
caddy reload
c. Service/unit/compose file:
n/a, I think?
d. My complete Caddyfile or JSON config:
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace the line below with your
# domain name.
natehn.com {
root * /home/nathan/blog/public
# Enable the static file server.
file_server
encode zstd gzip
header Access-Control-Allow-Origin
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
# header Content-Security-Policy "default-src 'none'; font-src https://fonts.gstatic.com; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'"
header X-Content-Type-Options nosniff
header X-Frame-Options DENY
header Referrer-Policy no-referrer-when-downgrade
header Permissions-Policy interest-cohort=()
header -Server
header X-XSS-Protection "1; mode=block"
route {
header Cache-Control max-age=3600
header /static/* Cache-Control max-age=31536000
}
photos.natehn.com {
root * /home/nathan/photos/_build
# Enable the static file server.
file_server
encode zstd gzip
header Access-Control-Allow-Origin
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
# header Content-Security-Policy "default-src 'none'; font-src https://fonts.gstatic.com; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'"
header X-Content-Type-Options nosniff
header X-Frame-Options DENY
header Referrer-Policy no-referrer-when-downgrade
header Permissions-Policy interest-cohort=()
header -Server
header X-XSS-Protection "1; mode=block"
route {
header Cache-Control max-age=3600
header /static/* Cache-Control max-age=31536000
}
handle_errors {
rewrite * /404/
file_server
}
}
3. The problem I’m having:
I updated Caddy through Homebrew (I was focused on something else and let it happen) and now I can’t start or reload Caddy and I have no idea why. I get the below error message and, tbh, I don’t know where to begin.
4. Error messages and/or full log output:
2022/06/30 23:26:18.067 INFO using adjacent Caddyfile
reload: sending configuration to instance: performing request: Post "http://localhost:2019/load": dial tcp 127.0.0.1:2019: connect: connection refused
5. What I already tried:
At first I thought the Caddyfile was the issue because I made some changes, but I undid the changes and still had the same problem. Is this a Caddy issue or something else outside the scope of this forum?
Here’s what I get when I run systemctl start caddy:
Failed to start caddy.service: Access denied
See system logs and 'systemctl status caddy.service' for details.
And here’s what I get when I run systemctl status caddy.service:
â—Ź caddy.service - Caddy
Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2022-06-30 18:51:27 UTC; 5h 9min ago
Docs: https://caddyserver.com/docs/
Process: 483 ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile (code=exited, st
Main PID: 483 (code=exited, status=1/FAILURE)
The timing lines up with me updating Caddy, I"m pretty sure.
You can validate your config via caddy validate before applying
Please don’t use caddy start but instead caddy run. Or even better, the systemd service, which you seem to have since you shared some systemctl status caddy.service output.
Please see Problem with with caddy - #2 by francislavoie
That isn’t actually a caddy error but instead systemd trying to tell you, that you are missing the necessary permissions and might need to use sudo (sudo systemctl start caddy.service) or user root.
To actually view the full logs of caddy (when running as systemd service), you would use something like journalctl --unit caddy.service --no-pager | less +G (and press q if you want to exit again).
Also, with both root * /home/nathan/blog/public and /home/nathan/photos/_build you might be running into file permission issues.
I am more or less in the process of doing a proper write-up about common file permission with caddy (or any webserver really) which would explain that in detail.
But in the meantime, you might want to read:
tldr is basically: Don’t use /home/ but instead /srv/ or /var/www/.
Feel free to ask any additional questions, especially because if anything is unclear or if you encounter any issue
The caddy reload (stop and reload too) fails, because caddy isn’t running.
It crashed immediately after you ran sudo systemctl start caddy.
The sudo systemctl status caddy might be a bit hard to parse at first, but basically:
An up and running systemd service would usually read something like
Active: active (running) since Fri 2022-07-01 03:47:55 UTC; 8s ago
The logs you shared in the systemctl status output are truncated, but we need to see the whole lines
Could you please print the (last few) lines of journalctl --unit caddy.service --no-pager | less +G?
So we can see what’s actually going on
Here you go! Thank you very much for walking through this with me, by the way.
nathan@hugo:~$ sudo systemctl status caddy
â—Ź caddy.service - Caddy
Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2022-07-01 11:44:05 UTC; 55s ago
Docs: https://caddyserver.com/docs/
Process: 28502 ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile (code=exited, status=1/FAILURE)
Main PID: 28502 (code=exited, status=1/FAILURE)
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.869066,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.877141,"logger":"admin","msg":"admin endpoint started","address":"tcp/localhost:2019","enforce_origin":false,"origins":["//[::1]:2019","//127.0.0.1:2019","//localhost:2019"]}
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.8776665,"logger":"http","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS","server_name":"srv0","https_port":443}
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.877912,"logger":"http","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.880124,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0001accb0"}
Jul 01 11:44:05 hugo caddy[28502]: {"level":"info","ts":1656675845.8801503,"logger":"tls.cache.maintenance","msg":"stopped background certificate maintenance","cache":"0xc0001accb0"}
Jul 01 11:44:05 hugo caddy[28502]: run: loading initial config: loading new config: http app module: start: tcp: listening on :80: listen tcp :80: bind: address already in use
Jul 01 11:44:05 hugo systemd[1]: Started Caddy.
Jul 01 11:44:05 hugo systemd[1]: caddy.service: Main process exited, code=exited, status=1/FAILURE
Jul 01 11:44:05 hugo systemd[1]: caddy.service: Failed with result 'exit-code'.
Perhaps another webserver is already running on that port :80.
Even if you don’t remember installing anything besides caddy, some VPS provider preinstall for example apache2 and put it in autostart.
We can continue to speculate, or just print whatever process is using port :80.
There are multiple ways to achieve that, pick one and maybe try another one if you get an error like command not found.
Also, use need sudo again, if you aren’t user root.
lsof -i :80 -s TCP:LISTEN
netstat -lnp | grep :80
ss -lnp 'sport = :80'
Next step would be to stop whatever process that is and stop it from autostarting again (systemctl stop <service> and systemctl disable <service>, or systemctl disable --now <service>).
For example, in case of apache, use systemctl disable --now apache2
Feel free to post the output from one of the lsof/netstat/ss commands above, and we can figure out the service name together if you need help