14 KiB
Authentik — единая система аутентификации
Обзор
Authentik — это open-source платформа для управления идентификацией и доступом (IAM). Позволяет организовать единый вход (SSO) для всех сервисов на сервере Olimp.
Расположение: LXC 208 (manage)
Домен: https://cerberus.zailon.ru
Порт: 45133 (внутренний), HTTPS через NPM
Установка
1. Подготовка директории
cd /mnt
mkdir authentik
cd authentik
Переход в директорию /mnt, создание папки authentik и переход в неё
2. Создание файла окружения
cat > .env << 'EOF'
PG_USER=authentik
PG_PASS=$(openssl rand -base64 32)
PG_DB=authentik
AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60)
EOF
Создание файла .env с переменными окружения. Пароли генерируются автоматически через openssl
3. Docker Compose конфигурация
services:
postgresql:
image: docker.io/library/postgres:16-alpine
container_name: authentik-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: ${PG_DB:-authentik}
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
healthcheck:
interval: 30s
retries: 5
start_period: 20s
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
timeout: 5s
volumes:
- /mnt/authentik/postgres:/var/lib/postgresql/data
networks:
- authentik
redis:
image: docker.io/library/redis:7-alpine
container_name: authentik-redis
restart: unless-stopped
command: --save 60 1 --loglevel warning
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- /mnt/authentik/redis:/data
networks:
- authentik
server:
image: ghcr.io/goauthentik/server:2026.2.3
container_name: authentik-server
command: server
restart: unless-stopped
env_file:
- .env
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_POSTGRESQL__DB: ${PG_DB:-authentik}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
ports:
- "0.0.0.0:45133:9000"
shm_size: 512mb
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- /mnt/authentik/data:/data
- /mnt/authentik/custom-templates:/templates
networks:
- authentik
worker:
image: ghcr.io/goauthentik/server:2026.2.3
container_name: authentik-worker
command: worker
restart: unless-stopped
env_file:
- .env
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_POSTGRESQL__DB: ${PG_DB:-authentik}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
shm_size: 512mb
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- /mnt/authentik/data:/data
- /mnt/authentik/certs:/certs
- /mnt/authentik/custom-templates:/templates
networks:
- authentik
networks:
authentik:
driver: bridge
Конфигурация docker-compose с четырьмя сервисами: PostgreSQL, Redis, Authentik Server и Worker
4. Запуск
sudo docker compose up -d
Запуск контейнеров в фоновом режиме
sudo docker ps | grep authentik
Проверка статуса контейнеров
Первоначальная настройка
1. Создание администратора
Подождите 30-60 секунд после запуска, затем откройте:
http://192.168.1.208:45133/if/flow/initial-setup/
Создайте первого пользователя:
- Username:
zailon(или другой) - Email: ваш email
- Password: надёжный пароль
2. Настройка Nginx Proxy Manager (NPM)
- Откройте NPM:
http://192.168.1.201:81 - Add Proxy Host:
- Domain Names:
cerberus.zailon.ru - Scheme:
http - Forward Hostname:
192.168.1.208 - Forward Port:
45133
- Domain Names:
- Вкладка SSL:
- SSL Certificate: Request a new SSL Certificate
- Force SSL: ✅
- HTTP/2 Support: ✅
- Let's Encrypt Email: ваш email
- Save
Теперь доступен по: https://cerberus.zailon.ru
Создание пользователей
1. Создание обычного пользователя
- Войдите в Authentik как администратор
- Directory → Users → Create
- Заполните:
- Username:
zevs(логин для входа) - Display Name:
Admin Olimp(отображаемое имя) - Email:
zevs@zailon.ru - Тип пользователя: Внутренний (Internal)
- Active: ✅
- Path:
users
- Username:
- Create
- После создания нажмите на пользователя → вкладка Password → Set Password
- Установите пароль
2. Права доступа
По умолчанию новые пользователи не являются суперпользователями и имеют доступ только к тем приложениям, которые вы им явно предоставите.
Настройка Proxy Provider
Шаг 1: Создание Proxy Provider
- Applications → Providers → Create
- Выберите Proxy Provider
- Заполните:
- Provider Name:
Kiwix - Authorization flow:
default-provider-authorization-explicit-consent (Authorize Application) - Внешний хост:
https://kiwix.zailon.ru - Внутренний хост:
http://192.168.1.202:45134
- Provider Name:
- Create
Важно: Используйте flow explicit-consent — он стабильнее работает с встроенным Outpost.
Шаг 2: Создание Application
- Applications → Applications → Create
- Заполните:
- Name:
Kiwix - Provider: выберите созданный
Kiwix
- Name:
- Create
Шаг 3: Привязка к Outpost
- Каталог → Внешние компоненты
- Нажмите на карандаш у
authentik Embedded Outpost - В разделе Providers выберите Kiwix
- Save
Интеграция с Nginx Proxy Manager
Конфигурация NPM для защищённого сервиса
- Откройте NPM:
http://192.168.1.201:81 - Найдите Proxy host для
wiki.zailon.ru(или создайте новый) - Edit → вкладка Custom Nginx Configuration
proxy_buffers 8 16k;
proxy_buffer_size 32k;
port_in_redirect off;
location / {
proxy_pass $forward_scheme://$server:$port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
auth_request /outpost.goauthentik.io/auth/nginx;
error_page 401 = @goauthentik_proxy_signin;
auth_request_set $auth_cookie $upstream_http_set_cookie;
add_header Set-Cookie $auth_cookie;
auth_request_set $authentik_username $upstream_http_x_authentik_username;
auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
auth_request_set $authentik_entitlements $upstream_http_x_authentik_entitlements;
auth_request_set $authentik_email $upstream_http_x_authentik_email;
auth_request_set $authentik_name $upstream_http_x_authentik_name;
auth_request_set $authentik_uid $upstream_http_x_authentik_uid;
proxy_set_header X-authentik-username $authentik_username;
proxy_set_header X-authentik-groups $authentik_groups;
proxy_set_header X-authentik-entitlements $authentik_entitlements;
proxy_set_header X-authentik-email $authentik_email;
proxy_set_header X-authentik-name $authentik_name;
proxy_set_header X-authentik-uid $authentik_uid;
}
location /outpost.goauthentik.io {
auth_request off;
proxy_pass http://192.168.1.208:45133/outpost.goauthentik.io;
proxy_set_header Host $host;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
add_header Set-Cookie $auth_cookie;
auth_request_set $auth_cookie $upstream_http_set_cookie;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location @goauthentik_proxy_signin {
internal;
add_header Set-Cookie $auth_cookie;
return 302 /outpost.goauthentik.io/start?rd=$scheme://$http_host$request_uri;
}
- Save
Проверка работы
Тест входа
- Откройте инкогнито-вкладку браузера
- Перейдите на
https://wiki.zailon.ru - Должен произойти редирект на
https://cerberus.zailon.ru/if/flow/... - Введите логин/пароль пользователя (например,
zevs) - После входа — возврат в Kiwix
Полезные команды
cd /mnt/authentik
sudo docker compose restart
Перезапуск всех сервисов Authentik
sudo docker logs authentik-server --tail 50
Просмотр последних 50 строк логов сервера
sudo docker logs authentik-worker --tail 50
Просмотр последних 50 строк логов worker
sudo docker ps | grep authentik
Проверка статуса контейнеров
sudo docker exec -it authentik-postgres psql -U authentik -d authentik
Вход в PostgreSQL контейнер
\du
Список пользователей базы данных (выполнять внутри psql)
\q
Выход из psql
Решение проблем
Ошибка 500 в NPM
Симптомы: При входе на защищённый сервис появляется 500 Internal Server Error
Проверка логов:
sudo docker logs nginx-proxy-manager 2>&1 | tail -30
Просмотр последних ошибок NPM
Outpost не отвечает
curl -I http://192.168.1.208:45133/outpost.goauthentik.io/auth/nginx
Проверка доступности встроенного Outpost. Ожидаемый ответ: 401 Unauthorized или 404 Not Found
Сброс пароля администратора
sudo docker exec -it authentik-server python manage.py shell -c "
from authentik.core.models import User
from django.contrib.auth.hashers import make_password
user = User.objects.get(username='zailon')
user.password = make_password('NewPassword123!')
user.is_superuser = True
user.save()
print('Password updated')
"
Установка нового пароля для пользователя zailon и выдача прав суперпользователя
Безопасность
-
Регулярное обновление:
cd /mnt/authentik sudo docker compose pull sudo docker compose up -d -
Резервное копирование:
sudo docker compose down tar -czf authentik-backup-$(date +%Y%m%d).tar.gz /mnt/authentik sudo docker compose up -d -
Мониторинг логов:
sudo docker logs authentik-server --follow -
Проверка здоровья:
sudo docker inspect --format='{{.State.Health.Status}}' authentik-server
Архитектура
Компоненты:
- PostgreSQL — база данных для хранения пользователей, приложений и сессий
- Redis — кэширование и хранение временных данных
- Authentik Server — основной веб-интерфейс и API
- Authentik Worker — фоновые задачи (очередь событий, задачи по расписанию)
- Embedded Outpost — встроенный прокси для аутентификации внешних сервисов
Порт 45133: Основной порт доступа к веб-интерфейсу Authentik (проброшен из контейнера server:9000)
Сеть authentik: Изолированная Docker-сеть для взаимодействия компонентов
Интеграция с другими сервисами
OIDC Provider (для сервисов с поддержкой OAuth2/OIDC)
- Applications → Providers → Create
- Выберите OAuth2/OpenID Provider
- Заполните:
- Name:
Immich OIDC - Client ID:
immich - Client Type: Confidential
- Redirect URIs:
https://immich.zailon.ru/auth/login
- Name:
- Create
SAML Provider (для корпоративных приложений)
- Applications → Providers → Create
- Выберите SAML Provider
- Настройте метаданные и атрибуты
- Create
Обновление Authentik
cd /mnt/authentik
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d
Полное обновление образов контейнеров с пересозданием
sudo docker image prune -f
Удаление старых образов после обновления