SystemdDoctor
служба не работает веб-серверы права порты

Caddy не занимает порты 80 и 443 без прав

Веб-серверы, работающие от непривилегированного пользователя, не могут занять порты ниже тысячи без отдельной возможности. Выдать её правильнее, чем запускать службу от root: у процесса, доступного из сети, прав должно быть минимум.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Нет возможности занимать привилегированные порты

    Пользователь службы непривилегированный, а порт ниже тысячи требует особого разрешения.

  2. Возможность выдана, но обрезана границей

    Граница возможностей действует поверх выданных. Если нужной в ней нет, выдача не работает.

  3. Порт занят другим веб-сервером

    Отказ доступа и занятость порта дают разные сообщения, но оба останавливают запуск.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Сообщение об отказе при открытии слушателя.

journalctl -u caddy -n 30 --no-pager

Пользователь и возможности службы.

systemctl show caddy -p User -p AmbientCapabilities -p CapabilityBoundingSet

Кто занимает веб-порты.

sudo ss -tlnp | grep -E ":80|:443"

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Нет возможности занимать привилегированные порты
Почему происходит
Пользователь службы непривилегированный, а порт ниже тысячи требует особого разрешения.
Как проверить
Посмотрите возможности службы и сообщение об отказе.
systemctl show caddy -p User -p AmbientCapabilities -p CapabilityBoundingSet 2>/dev/null
journalctl -u caddy -n 20 --no-pager | grep -i "permission denied"
Как исправить
Выдайте службе возможность занимать привилегированные порты и оставьте её в границе возможностей. Одной строки недостаточно, если граница возможностей сужена.
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
2. Возможность выдана, но обрезана границей
Почему происходит
Граница возможностей действует поверх выданных. Если нужной в ней нет, выдача не работает.
Как проверить
Посмотрите оба списка.
systemctl show caddy -p AmbientCapabilities -p CapabilityBoundingSet 2>/dev/null
Как исправить
Добавьте нужную возможность в границу возможностей. Это частая ловушка: параметры выглядят похоже, а работают вместе.
3. Порт занят другим веб-сервером
Почему происходит
Отказ доступа и занятость порта дают разные сообщения, но оба останавливают запуск.
Как проверить
Посмотрите, кто держит порт.
sudo ss -tlnp | grep -E ":80|:443"
Как исправить
Остановите прежний веб-сервер или разведите службы по портам. Два сервера на одном порту работать не могут.

Пример вывода

Нет возможности занимать привилегированные порты. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

caddy[7900]: run: loading initial config: loading new config: http app module: start: listening on :443: listen tcp :443: bind: permission denied
systemd[1]: caddy.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: caddy.service: Failed with result 'exit-code'.

Связанные ошибки

Где встречается чаще всего

Источники

  • systemd.exec(5)
    AmbientCapabilities= и CapabilityBoundingSet=.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Документация Caddy: запуск службой документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено службой от непривилегированного пользователя без выданной возможности.
    собственная проверка, systemd 255
    сверено 15 сентября 2026