SSD Nodes Learn 8GB RAM — $66/год
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-01

Authentik: SSO для приложений на своем сервере

Настройте Authentik через Docker Compose: узнайте нужные env-параметры, создайте пользователя akadmin и подключите forward auth через Traefik.

Одна учетная запись для каждого размещенного приложения

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

Authentik запускается как три сервиса, описанные в этом файле Compose: база данных PostgreSQL, процесс server и процесс worker. Контейнер сервера также запускает встроенный outpost. Этот компонент проверяет, выполнен ли вход для каждого защищенного приложения. Версия 2026.5 является текущим выпуском по состоянию на July 2026. Проект рекомендует хост как минимум с 2 ядрами CPU и 2 GB RAM. Считайте это минимальными требованиями. После суток работы 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 и server, а workerrunning. При первом запуске выполняется миграция базы данных, поэтому подождите около минуты, прежде чем веб-интерфейс начнет отвечать.

Оба сгенерированных значения важны, но по разным причинам. 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, поэтому сообщения для сброса пароля завершаются ошибкой подключения в журнале worker.
  • AUTHENTIK_LOG_LEVEL=debug включает подробную информацию, необходимую при неправильной работе login flow. После этого верните значение info.
  • По умолчанию AUTHENTIK_ERROR_REPORTING__ENABLED имеет значение false. Установите true, только если вы согласны отправлять отчеты о сбоях разработчикам.

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

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

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

Создайте для себя обычного пользователя с правами администратора в разделах Directory и Users, добавьте его в группу authentik Admins и войдите под этой учетной записью. Оставьте akadmin для экстренного доступа и сохраните для него длинный пароль в автономном хранилище. Ежедневная работа под общей встроенной учетной записью нарушает аудит, поскольку в каждом событии указано akadmin, а информация о фактическом пользователе отсутствует.

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

Публикация порта 9000 в интернете работает, но вам нужны TLS (защита транспортного уровня) и настоящее имя хоста. Если вы уже используете конфигурацию из раздела 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

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

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

Определите 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-version

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

Для самого защищенного приложения нужны два роутера, а не один:

    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. Встроенный proxy provider Authentik уже выполняет эту функцию и интегрирован в систему. Поэтому большинство пользователей, самостоятельно размещающих смешанный набор приложений, выбирают Authentik.

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

Восстановление возможно при наличии 3 компонентов: базы данных 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 для самостоятельного размещения бесплатно?

Версия с открытым исходным кодом бесплатна и включает всё перечисленное выше: 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/ на защищённом hostname должен направлять запросы в Authentik, а не в приложение.

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

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

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

По состоянию на July 2026 документированный минимум составляет 2 ядра CPU и 2 GB RAM для PostgreSQL, server и worker вместе. На сервере с 2 GB worker первым процессом завершается ядром при нехватке памяти. В результате фоновые задачи и отправка исходящей почты прекращаются, хотя страница входа продолжает работать. Выделите 4 GB, если на том же сервере работают приложения, доступ к которым вы защищаете.

#authentik#sso#authentication#self-hosting#docker-compose#traefik