Думаю, я нашёл проблему. Если я выполняю пересборку, я никогда не перезапускаю Caddy. С этого момента я буду делать так:
./launcher rebuild app && systemctl reload caddy
Я подозреваю, что Caddy использует кэш сокета или что-то подобное после пересборки. Но обычно это не происходит сразу после пересборки. Посмотрим.