Настройка Authentik через Docker Compose и Traefik
Разверните Authentik для единого входа в приложения. В статье разобраны ключевые переменные окружения, первичная настройка akadmin и интеграция forward auth через Traefik.
Единая учетная запись для всех размещаемых приложений
Authentik — это self-hosted сервер SSO (single sign-on): пользователи авторизуются один раз, и все приложения за ним принимают эту сессию, не запрашивая собственный пароль. Установка выполняется с помощью официального файла Docker Compose и двух сгенерированных секретов. Самая сложная часть начинается после: настройка reverse proxy и подключение существующего приложения через forward auth.
Authentik поставляется в виде трех сервисов в этом файле Compose: базы данных PostgreSQL, процесса server и процесса worker. Контейнер сервера также запускает встроенный outpost — компонент, который отвечает на вопрос «авторизован ли этот запрос?» для каждого защищенного приложения. Версия 2026.5 является текущим релизом на июль 2026 года, и для проекта требуется хост минимум с 2 ядрами CPU и 2 GB оперативной памяти. Считайте это минимальными требованиями. 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 -ddocker compose ps должен отобразить три контейнера, при этом postgresql должен сообщать о healthy, а server и worker — о running. При первом запуске выполняются миграции базы данных, поэтому подождите минуту, прежде чем веб-интерфейс начнет отвечать.
Оба сгенерированных значения важны по разным причинам. PG_PASS — это пароль PostgreSQL, он имеет жесткое ограничение в 99 символов. AUTHENTIK_SECRET_KEY используется для подписи сессий и токенов, поэтому его изменение в будущем приведет к выходу из системы всех пользователей и аннулированию всех выданных вами API-токенов. Установите для .env права доступа 600 и сохраните копию в надежном месте, так как база данных, восстановленная без соответствующего секретного ключа, станет недоступной для входа.
Файл Compose считывает оба значения с помощью формы ${PG_PASS:?database password required}, что означает, что 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только в том случае, если вы согласны отправлять отчеты о сбоях разработчикам.
Поскольку это секретные данные в обычном текстовом файле, относитесь к директории так же, как к любому другому хранилищу учетных данных. Менеджер паролей, такой как self-hosted Vaultwarden instance, подходит для хранения резервной копии лучше, чем заметка на вашем ноутбуке.
Первый вход и учетная запись администратора
Откройте http://SERVER_IP:9000 в браузере. Authentik отобразит процесс начальной настройки и предложит задать пароль для пользователя по умолчанию akadmin. Если вы уже настроили AUTHENTIK_BOOTSTRAP_PASSWORD, этот шаг будет пропущен, и вы сразу перейдете на страницу входа.
Создайте для себя обычную учетную запись администратора в разделе Directory, затем Users, добавьте ее в группу authentik Admins и войдите под этой учетной записью. Оставьте 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 означает, что контейнер не находится в сети proxy, и Traefik не может направить трафик в контейнер, к которому нет доступа.
Как только доменное имя заработает, привяжите опубликованные порты к 127.0.0.1 в файле переопределения, чтобы единственный путь доступа к приложению проходил через прокси-сервер.
Защита приложения с помощью forward auth
У proxy provider в Authentik есть три режима. Ошибка при выборе режима может стоить часа работы. Proxy означает, что сам outpost передаёт трафик в upstream-приложение. Forward auth (single application) означает, что ваш reverse proxy по-прежнему передаёт трафик, а Authentik только проверяет, авторизован ли запрос. Forward auth (domain level) защищает все приложения в одном родительском домене с помощью одного provider, но не позволяет задавать отдельные правила авторизации для приложений. Если перед Authentik используется Traefik, выбирайте forward auth (single application). Для практики подойдёт, например, самостоятельно размещённое рабочее пространство AFFiNE, поскольку это внутренний инструмент, к которому нужен доступ с ваших устройств и ниоткуда больше. Для командного инструмента этот вариант ещё полезнее: разместите самостоятельно размещённую службу поддержки Chatwoot за тем же provider, и каждый сотрудник, отвечающий на обращения, будет входить один раз в день вместо того, чтобы передавать друг другу ещё один пароль.
В веб-интерфейсе откройте 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-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-versionauthResponseHeaders — это список заголовков, которые Traefik копирует из ответа Authentik в запрос, отправляемый вышестоящему приложению. Если их опустить, приложение останется защищённым, но не узнает, кто именно является пользователем, поэтому любой сервис, считывающий X-authentik-username для автоматического входа, останется в состоянии «не в сети». Этот пробел наиболее заметен перед приложением, которое поддерживает собственную систему входа, например, self-hosted трекер тренировок openGym с авторизацией по passkey, где наличие заголовков определяет, будет ли один запрос на вход или два для одной и той же страницы.
Самому защищаемому приложению нужны два роутера, а не один:
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 сессии устанавливается для другого источника, и каждый запрос выглядит как новый анонимный запрос. Исправьте внешний хост и очистите cookie для обоих доменов перед повторным тестированием.
Ошибка 404 по адресу /outpost.goauthentik.io/start. Отсутствует маршрутизатор outpost или его приоритет ниже, чем у универсального маршрутизатора (catch-all) для этого хоста.
Приложение загружается без запроса на вход. Метка middlewares указывает на middleware, которого не существует. Traefik не выдает предупреждение об этом, поэтому опечатка в authentik@docker означает, что никакое middleware не выполняется. Откройте панель управления Traefik и убедитесь, что в списке маршрутизатора отображается нужное middleware.
Ошибка 403 от Authentik после успешного входа. Пользователь аутентифицирован, но не авторизован: к приложению привязана политика или требование к группе, которым данный пользователь не соответствует. В журнале событий (Events) в интерфейсе администратора указана политика, которая отклонила доступ.
Когда Keycloak подходит лучше
Keycloak — это более старый проект, поддерживаемый Red Hat. Он является предпочтительным выбором для классических корпоративных задач управления идентификацией: интенсивного использования SAML-федерации, объединения входов из нескольких внешних поставщиков идентификации одновременно, а также экспорта и импорта realm как документированного пути миграции. Наличие коммерческой поддержки для некоторых организаций является формально важным фактором. Обратной стороной является то, что у Keycloak нет собственного прокси, поэтому для защиты приложения, не поддерживающего OIDC (OpenID Connect), требуется запуск дополнительных инструментов, таких как 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 вместе. Одного дампа недостаточно, так как секретный ключ, защищающий данные сессий и токенов, находится в .env.
Обновления выполняются путем смены тега. Установите AUTHENTIK_TAG в файле .env на нужную версию релиза, затем выполните docker compose pull, а после — docker compose up -d. Сначала ознакомьтесь с примечаниями к выпуску, так как Authentik использует версии, основанные на датах, и некоторые релизы содержат миграции, требующие последовательного обновления с предыдущей версии. Создавайте дамп базы данных до выполнения команды pull, а не после.
FAQ
Бесплатен ли Authentik для self-hosted установки?
Open source версия бесплатна и включает в себя всё перечисленное выше: провайдер прокси, forward auth, OIDC (OpenID Connect), SAML и движок потоков (flows engine). Платная корпоративная подписка добавляет поддержку и некоторые специфические функции, но для описанных здесь задач лицензия не требуется.
Нужен ли Traefik для использования Authentik?
Нет. Forward auth работает с nginx через auth_request и с Caddy через forward_auth. Принцип везде одинаков: обратный прокси-сервер запрашивает у Authentik информацию о каждом запросе, а префикс пути /outpost.goauthentik.io/ на защищаемом хосте должен перенаправлять трафик на Authentik, а не на само приложение.
Почему защищаемое приложение постоянно переключается между страницей входа и ошибкой?
Внешний хост, настроенный в провайдере прокси, не совпадает с URL, который использует браузер; чаще всего это http против https. Файл cookie сессии выпускается для одного источника (origin), а считывается на другом, поэтому Authentik каждый раз видит анонимный запрос. Исправьте внешний хост, затем очистите cookies для обоих доменных имен перед повторным тестированием.
Сколько оперативной памяти требуется для Authentik?
Минимальные системные требования по состоянию на июль 2026 года составляют 2 ядра CPU и 2 ГБ оперативной памяти для совместной работы PostgreSQL, сервера и worker. На сервере с 2 ГБ памяти worker является первым процессом, который ядро завершает при нехватке ресурсов (OOM killer). Симптомом этого является остановка фоновых задач и отправки почты при продолжающей работать странице входа. Выделите 4 ГБ, если на том же сервере работают защищаемые вами приложения.