SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor

Настройка Authentik через Docker Compose и Traefik

Разверните Authentik для единого входа в свои приложения. В статье разобраны переменные окружения, первичная настройка akadmin и интеграция forward auth через Traefik.

Единая учетная запись для всех ваших приложений

Authentik — это self-hosted сервер SSO (единого входа): пользователи авторизуются один раз, и все приложения за ним принимают эту сессию, не запрашивая собственный пароль. Установка выполняется с помощью официального файла Docker Compose и двух сгенерированных секретов. Самая сложная часть работы начинается после: настройка reverse proxy и подключение существующего приложения через forward auth.

В этом файле Compose Authentik представлен тремя сервисами: базой данных PostgreSQL, процессом server и процессом worker. Контейнер сервера также запускает встроенный outpost — компонент, который отвечает на вопрос «авторизован ли этот запрос?» для каждого защищенного приложения. Версия 2026.8.5 является текущим релизом на 25 октября 2026 года. Она была выпущена 21 октября 2026 года как последний патч серии 2026.8, которая началась с версии 2026.8.0 18 августа, и заменяет 2026.8.4 от 14 октября в качестве тега образа по умолчанию в официальном файле Compose. Проект требует хост минимум с 2 ядрами CPU и 2 ГБ оперативной памяти. Считайте это минимальными требованиями. PostgreSQL и worker потребляют память после того, как сервер проработал сутки.

Что необходимо перед началом работы

Вам потребуется Docker Engine с плагином Compose v2, наличие которого можно проверить командой docker compose version. Если вместо версии выводится ошибка, установите плагин, прежде чем продолжать; основы описаны в руководстве запуск приложений с помощью Docker Compose на VPS. Также необходима DNS-запись типа A, указывающая на ваш сервер (в примерах ниже используется auth.example.com), так как Authentik формирует URL для перенаправления на основе имени хоста, использованного в браузере.

Запускайте стек от имени обычного пользователя, входящего в группу docker, а не от пользователя root. Членство в этой группе равносильно получению прав root на хосте, поэтому предоставьте его только одной учетной записи для развертывания, следуя принципам учетных записей с минимальными привилегиями на VPS.

Установка с помощью официального файла Compose

sudo install -d -o "$USER" -g "$USER" /opt/authentik
cd /opt/authentik
wget https://docs.goauthentik.io/compose.yml
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
docker compose pull
docker compose up -d

docker compose ps должен показать три запущенных контейнера, а postgresql должен сообщать healthy после успешного прохождения проверки. Первый запуск выполняет миграции базы данных, поэтому подождите минуту, прежде чем веб-интерфейс начнет отвечать.

Оба сгенерированных значения важны по разным причинам. PG_PASS — это пароль для PostgreSQL. В документации по установке Authentik указано, что пароли длиннее 99 символов не поддерживаются, поэтому выбирайте пароль короче этого значения; сгенерированный пароль значительно короче. AUTHENTIK_SECRET_KEY — это ключ, который Authentik использует для подписи cookie. В документации по конфигурации сказано, что его изменение делает недействительными активные сессии, поэтому новый ключ принудительно завершит сеансы всех пользователей. Установите права доступа .env на 600 и сохраните копию в надежном месте вместе с резервными копиями, чтобы при восстановлении сервер использовал тот же ключ, с которым работал ранее.

Файл Compose помечает оба значения как обязательные с помощью формы ${VAR:?message}: ${PG_PASS:?database password required} для сервиса PostgreSQL и ${AUTHENTIK_SECRET_KEY:?secret key required} для сервера и worker. Это означает, что Compose откажется запускаться, если файл отсутствует. Запуск docker compose up -d из неправильной директории выведет строку вроде required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required и остановится. Это сообщение указывает на проблему с путем, а не с конфигурацией.

Важные переменные окружения

Все остальные параметры размещаются в том же файле .env. Authentik преобразует двойное подчеркивание в ключ вложенной конфигурации, поэтому AUTHENTIK_EMAIL__HOST задает email.host. Одинарное подчеркивание не преобразуется во вложенный ключ — это самая частая причина, по которой настройка не оказывает никакого эффекта.

  • AUTHENTIK_BOOTSTRAP_PASSWORD задает пароль встроенного пользователя akadmin при первом запуске, чтобы вам не пришлось вводить его в публичную веб-форму. AUTHENTIK_BOOTSTRAP_EMAIL и AUTHENTIK_BOOTSTRAP_TOKEN аналогичным образом задают адрес электронной почты этого пользователя и API-токен.
  • COMPOSE_PORT_HTTP и COMPOSE_PORT_HTTPS меняют стандартные порты 9000 и 9443 на другие.
  • AUTHENTIK_EMAIL__HOST, AUTHENTIK_EMAIL__PORT, AUTHENTIK_EMAIL__USERNAME, AUTHENTIK_EMAIL__PASSWORD, AUTHENTIK_EMAIL__USE_TLS и AUTHENTIK_EMAIL__FROM настраивают исходящую почту. Без них Authentik пытается использовать localhost на порту 25, из-за чего письма для сброса пароля приводят к ошибке соединения в логе воркера.
  • AUTHENTIK_LOG_LEVEL=debug включает детализацию логов, необходимую при некорректной работе процесса входа. После завершения отладки верните значение info.
  • AUTHENTIK_ERROR_REPORTING__ENABLED по умолчанию имеет значение false. Установите true только в том случае, если вы согласны отправлять отчеты о сбоях разработчикам.

Поскольку это секретные данные в обычном текстовом файле, относитесь к директории так же, как к любому другому хранилищу учетных данных. Менеджер паролей, например самохостируемый экземпляр Vaultwarden, подходит для хранения резервной копии лучше, чем заметка на вашем ноутбуке.

Первый вход и учетная запись администратора

Откройте http://SERVER_IP:9000 в браузере. Authentik покажет процесс начальной настройки и попросит задать пароль для пользователя по умолчанию akadmin. Если вы уже задали AUTHENTIK_BOOTSTRAP_PASSWORD, этот шаг будет пропущен, и вы сразу перейдете на страницу входа.

Создайте для себя обычную учетную запись администратора в разделе Directory, затем Users, добавьте её в группу authentik Admins и войдите под этой учетной записью. Оставьте akadmin в качестве аварийной учетной записи с длинным паролем, хранящимся в офлайне. Если из-за сбоя процесса или этапа вы потеряете доступ, docker compose run --rm server create_recovery_key 10 akadmin, запущенная из /opt/authentik, выведет ссылку, которая позволит войти как akadmin напрямую. Любой, у кого есть эта ссылка, получает такой же доступ, поэтому относитесь к ней как к паролю. Повседневная работа под общей встроенной учетной записью делает аудит невозможным, так как каждое событие будет помечено как akadmin без указания автора. Этот аргумент применим и к компонентам за Authentik: например, self-hosted OneCLI harness, предоставляющий каждому человеку свой агент оставляет читаемый след только в том случае, если личность, обращающаяся к нему, принадлежит конкретному человеку, а не общей учетной записи всей команды.

Размещение Authentik за обратным прокси-сервером

Публикация порта 9000 в интернет работает, но вам необходимы TLS (transport layer security) и корректное доменное имя. Если вы уже используете конфигурацию из Traefik в качестве обратного прокси для нескольких Compose-приложений, добавьте Authentik в ту же внешнюю сеть proxy с помощью файла переопределения. Создайте docker-compose.override.yml рядом с compose.yml:

services:
  server:
    networks:
      - default
      - proxy
    labels:
      traefik.enable: "true"
      traefik.docker.network: proxy
      traefik.http.routers.authentik.rule: Host(`auth.example.com`)
      traefik.http.routers.authentik.entrypoints: websecure
      traefik.http.routers.authentik.tls.certresolver: le
      traefik.http.services.authentik.loadbalancer.server.port: "9000"

networks:
  proxy:
    external: true

Примените изменения с помощью docker compose up -d. Compose автоматически объединяет конфигурации, поэтому сервис server сохраняет все параметры из официального файла и получает дополнительные метки. Проверьте результат командой curl -I https://auth.example.com/if/user/, которая должна вернуть HTTP/2 200. Ошибка 404 page not found от Traefik означает, что ни один маршрутизатор не подошел под запрос. Убедитесь, что метки применились к контейнеру, правило Host() точно соответствует доменному имени, а запрос поступает на HTTPS-точку входа, которую прослушивает маршрутизатор.

Как только доменное имя заработает, привяжите опубликованные порты к 127.0.0.1 в файле переопределения, чтобы доступ был возможен только через прокси-сервер.

Защита одного приложения с помощью forward auth

У провайдера прокси в Authentik есть три режима, и выбор неверного приводит к потере времени. Proxy означает, что сам аутпост пересылает трафик на вышестоящее приложение. Forward auth (single application) означает, что ваш собственный обратный прокси продолжает обрабатывать трафик и лишь запрашивает у Authentik, авторизован ли запрос. Forward auth (domain level) защищает все приложения в рамках одного родительского домена с помощью одного провайдера, но ценой отсутствия правил авторизации для каждого отдельного приложения. Если перед ними стоит Traefik, вам нужен режим forward auth (single application). Если вам нужно конкретное приложение для практики, то самохостинг AFFiNE — хороший первый кандидат, так как это внутренний инструмент, к которому нужен доступ только с ваших устройств. Для командных инструментов аргументы еще весомее: разместите самохостинг Chatwoot за тем же провайдером, и каждый сотрудник будет авторизоваться один раз в день вместо использования общего пароля.

В веб-интерфейсе откройте Applications, затем Providers, создайте Proxy Provider, выберите режим forward auth single application и укажите внешний хост https://app.example.com. Создайте Application, которое указывает на этот провайдер. Затем откройте Outposts, отредактируйте authentik Embedded Outpost и добавьте новое приложение в список выбранных (selected applications). Аутпост отвечает только за те приложения, которые ему назначены, поэтому пропуск этого шага — причина, по которой правильно настроенный провайдер не возвращает результат.

Определите middleware один раз в контейнере Authentik и ссылайтесь на него из каждого защищаемого приложения:

      traefik.http.middlewares.authentik.forwardauth.address: http://server:9000/outpost.goauthentik.io/auth/traefik
      traefik.http.middlewares.authentik.forwardauth.trustForwardHeader: "true"
      traefik.http.middlewares.authentik.forwardauth.authResponseHeaders: X-authentik-username,X-authentik-groups,X-authentik-entitlements,X-authentik-email,X-authentik-name,X-authentik-uid,X-authentik-jwt,X-authentik-meta-jwks,X-authentik-meta-outpost,X-authentik-meta-provider,X-authentik-meta-app,X-authentik-meta-version

authResponseHeaders — это список заголовков, которые Traefik копирует из ответа Authentik в запрос, отправляемый вышестоящему приложению. Если их пропустить, приложение останется защищенным, но не узнает, кто является пользователем, поэтому любой сервис, считывающий X-authentik-username для автоматического входа, останется в состоянии «не в сети». Этот пробел наиболее заметен в приложениях с собственной системой входа, таких как самохостинг openGym, где заголовки определяют, потребуется ли пользователю один или два запроса на вход для одной и той же страницы.

Самому защищаемому приложению нужны два роутера, а не один:

    labels:
      traefik.enable: "true"
      traefik.http.routers.myapp.rule: Host(`app.example.com`)
      traefik.http.routers.myapp.entrypoints: websecure
      traefik.http.routers.myapp.tls.certresolver: le
      traefik.http.routers.myapp.middlewares: authentik@docker
      traefik.http.routers.myapp-auth.rule: Host(`app.example.com`) && PathPrefix(`/outpost.goauthentik.io/`)
      traefik.http.routers.myapp-auth.entrypoints: websecure
      traefik.http.routers.myapp-auth.tls.certresolver: le
      traefik.http.routers.myapp-auth.priority: "15"
      traefik.http.routers.myapp-auth.service: authentik

Второй роутер — это то, что все забывают. После входа Authentik перенаправляет браузер обратно на путь в рамках /outpost.goauthentik.io/ на хостнейме приложения, а не на auth.example.com. Без роутера, который направляет этот префикс пути к сервису Authentik, запрос попадает в ваше приложение, которое отвечает 404, и процесс входа не завершается. Более высокий приоритет priority заставляет правило для конкретного пути перекрывать общее правило Host() для того же домена.

Протестируйте конфигурацию в окне приватного просмотра. Вас должны перенаправить на auth.example.com, после входа вы должны вернуться в приложение. docker compose logs -f server на стороне Authentik выводит событие авторизации для каждой попытки, что позволяет понять, дошел ли запрос до Authentik.

Реальные ошибки, с которыми вы столкнетесь

Бесконечный цикл перенаправлений между приложением и страницей входа. Внешний хост в настройках провайдера не совпадает с тем, который использует браузер: обычно это http:// в настройках провайдера против https:// в адресной строке. В результате сессионная cookie устанавливается для другого источника, и каждый запрос выглядит как новый анонимный запрос. Исправьте внешний хост и очистите cookies для обоих доменов перед повторным тестированием.

Ошибка 404 по адресу /outpost.goauthentik.io/start. Отсутствует маршрутизатор outpost или его приоритет ниже, чем у универсального маршрутизатора для этого хоста.

Приложение загружается без запроса на вход. Метка middlewares указывает на middleware, которого не существует. Traefik не выдает предупреждение об этом, поэтому опечатка в authentik@docker означает, что никакое middleware не выполняется. Откройте панель управления Traefik и убедитесь, что маршрутизатор содержит нужный middleware.

Ошибка 403 от Authentik после успешного входа. Пользователь аутентифицирован, но не авторизован: к приложению привязана политика или требование к группе, которым этот пользователь не соответствует. В журнале событий (Events) в интерфейсе администратора указана политика, которая отклонила доступ.

Когда Keycloak подходит лучше

Keycloak — более старый проект, поддерживаемый Red Hat. Это более предпочтительный выбор для классических корпоративных задач управления идентификацией: масштабная федерация SAML, брокеринг входов из нескольких внешних поставщиков идентификации одновременно, а также экспорт и импорт realm как документированный путь миграции. Наличие коммерческой поддержки для некоторых организаций является формально важным фактором. Обратная сторона заключается в том, что у Keycloak нет собственного прокси, поэтому для защиты приложения, которое не поддерживает ни OIDC (OpenID Connect), ни SAML, требуется запуск дополнительного компонента, например oauth2-proxy. Встроенный прокси-провайдер Authentik уже интегрирован в систему, поэтому большинство пользователей, самостоятельно размещающих набор разнородных приложений, выбирают именно его.

Резервное копирование и обновление

Восстановление возможно при наличии трех компонентов: базы данных PostgreSQL, директории ./data и .env.

cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gz

Храните этот дамп и .env вместе. Дамп не содержит копии AUTHENTIK_SECRET_KEY, а восстановление с другим ключом делает недействительными все активные сессии, поэтому сохранение исходного ключа позволяет восстановленному серверу продолжить работу в прежнем режиме.

Обновления выполняются путем смены тега. Установите AUTHENTIK_TAG в .env на нужный релиз, затем выполните docker compose pull, а за ним docker compose up -d. Если вы не задавали AUTHENTIK_TAG, версия берется из значения по умолчанию, прописанного в самом compose.yml, поэтому загрузка новой копии этого файла и есть обновление — именно этот путь описывает официальная документация. Сначала прочитайте примечания к релизу. Authentik использует версии на основе даты, и по состоянию на октябрь 2026 года документация требует соблюдать последовательность мажорных релизов: переходите к последнему патчу текущей серии, затем последовательно к каждой следующей серии, не пропуская их. Authentik не поддерживает понижение версии (downgrade), поэтому делайте дамп базы данных до выполнения pull, а не после.

FAQ

Бесплатен ли Authentik для самостоятельного размещения?

Редакция с открытым исходным кодом бесплатна и включает всё описанное выше: proxy provider, forward auth, OIDC (OpenID Connect), SAML и flows engine. Платный enterprise-уровень добавляет поддержку и некоторые корпоративные функции, но для описанной конфигурации лицензия не требуется.

Нужен ли Traefik для использования Authentik?

Нет. Forward auth работает с nginx через auth_request и с Caddy через forward_auth. Во всех случаях используется одна и та же схема: reverse proxy отправляет каждый запрос в Authentik для проверки, а префикс пути /outpost.goauthentik.io/ на защищённом хосте должен направлять запрос в Authentik, а не в приложение.

Почему защищённое приложение бесконечно переключается между страницей входа и ошибкой?

Внешний хост, настроенный в proxy provider, не совпадает с URL, который использует браузер. Чаще всего http настроен вместо https. Файл cookie сессии выдаётся для одного origin, а читается на другом, поэтому Authentik каждый раз видит анонимный запрос. Исправьте внешний хост, затем удалите cookies для обоих имён хостов и повторите проверку.

Сколько RAM требуется Authentik?

По состоянию на October 2026 документированный минимум составляет 2 ядра CPU и 2 GB RAM для PostgreSQL, сервера и worker вместе. На хосте с 2 GB нехватка памяти может активировать в ядре OOM killer. Он завершает процесс с самым высоким показателем badness — примерно долей доступной памяти, которую процесс использует, плюс его oom_score_adj. Если этим процессом оказывается worker, фоновые задачи и исходящая почта прекращаются, а страница входа продолжает работать. Выделите 4 GB, если на том же сервере также работают защищаемые приложения.

Была ли эта статья полезной?