# Authentik — единая система аутентификации ## Обзор **Authentik** — это open-source платформа для управления идентификацией и доступом (IAM). Позволяет организовать единый вход (SSO) для всех сервисов на сервере Olimp. **Расположение:** LXC 208 (manage) **Домен:** https://cerberus.zailon.ru **Порт:** 45133 (внутренний), HTTPS через NPM --- ## Установка ### 1. Подготовка директории ```bash cd /mnt mkdir authentik cd authentik ``` Переход в директорию /mnt, создание папки authentik и переход в неё ### 2. Создание файла окружения ```bash 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 конфигурация ```yaml 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. Запуск ```bash sudo docker compose up -d ``` Запуск контейнеров в фоновом режиме ```bash sudo docker ps | grep authentik ``` Проверка статуса контейнеров --- ## Первоначальная настройка ### 1. Создание администратора Подождите 30-60 секунд после запуска, затем откройте: ```text http://192.168.1.208:45133/if/flow/initial-setup/ ``` Создайте первого пользователя: - **Username:** `zailon` (или другой) - **Email:** ваш email - **Password:** надёжный пароль ### 2. Настройка Nginx Proxy Manager (NPM) 1. Откройте NPM: `http://192.168.1.201:81` 2. **Add Proxy Host:** - **Domain Names:** `cerberus.zailon.ru` - **Scheme:** `http` - **Forward Hostname:** `192.168.1.208` - **Forward Port:** `45133` 3. **Вкладка SSL:** - **SSL Certificate:** Request a new SSL Certificate - **Force SSL:** ✅ - **HTTP/2 Support:** ✅ - **Let's Encrypt Email:** ваш email 4. **Save** Теперь доступен по: `https://cerberus.zailon.ru` --- ## Создание пользователей ### 1. Создание обычного пользователя 1. Войдите в Authentik как администратор 2. **Directory → Users → Create** 3. Заполните: - **Username:** `zevs` (логин для входа) - **Display Name:** `Admin Olimp` (отображаемое имя) - **Email:** `zevs@zailon.ru` - **Тип пользователя:** Внутренний (Internal) - **Active:** ✅ - **Path:** `users` 4. **Create** 5. После создания нажмите на пользователя → вкладка **Password** → **Set Password** 6. Установите пароль ### 2. Права доступа По умолчанию новые пользователи **не являются суперпользователями** и имеют доступ только к тем приложениям, которые вы им явно предоставите. --- ## Настройка Proxy Provider ### Шаг 1: Создание Proxy Provider 1. **Applications → Providers → Create** 2. Выберите **Proxy Provider** 3. Заполните: - **Provider Name:** `Kiwix` - **Authorization flow:** `default-provider-authorization-explicit-consent (Authorize Application)` - **Внешний хост:** `https://kiwix.zailon.ru` - **Внутренний хост:** `http://192.168.1.202:45134` 4. **Create** **Важно:** Используйте flow `explicit-consent` — он стабильнее работает с встроенным Outpost. ### Шаг 2: Создание Application 1. **Applications → Applications → Create** 2. Заполните: - **Name:** `Kiwix` - **Provider:** выберите созданный `Kiwix` 3. **Create** ### Шаг 3: Привязка к Outpost 1. **Каталог → Внешние компоненты** 2. Нажмите на **карандаш** у `authentik Embedded Outpost` 3. В разделе **Providers** выберите **Kiwix** 4. **Save** --- ## Интеграция с Nginx Proxy Manager ### Конфигурация NPM для защищённого сервиса 1. Откройте NPM: `http://192.168.1.201:81` 2. Найдите Proxy host для `wiki.zailon.ru` (или создайте новый) 3. **Edit → вкладка Custom Nginx Configuration** ```nginx 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; } ``` 4. **Save** --- ## Проверка работы ### Тест входа 1. Откройте **инкогнито-вкладку** браузера 2. Перейдите на `https://wiki.zailon.ru` 3. Должен произойти редирект на `https://cerberus.zailon.ru/if/flow/...` 4. Введите логин/пароль пользователя (например, `zevs`) 5. После входа — возврат в Kiwix --- ## Полезные команды ```bash cd /mnt/authentik sudo docker compose restart ``` Перезапуск всех сервисов Authentik ```bash sudo docker logs authentik-server --tail 50 ``` Просмотр последних 50 строк логов сервера ```bash sudo docker logs authentik-worker --tail 50 ``` Просмотр последних 50 строк логов worker ```bash sudo docker ps | grep authentik ``` Проверка статуса контейнеров ```bash sudo docker exec -it authentik-postgres psql -U authentik -d authentik ``` Вход в PostgreSQL контейнер ```bash \du ``` Список пользователей базы данных (выполнять внутри psql) ```bash \q ``` Выход из psql --- ## Решение проблем ### Ошибка 500 в NPM **Симптомы:** При входе на защищённый сервис появляется `500 Internal Server Error` **Проверка логов:** ```bash sudo docker logs nginx-proxy-manager 2>&1 | tail -30 ``` Просмотр последних ошибок NPM ### Outpost не отвечает ```bash curl -I http://192.168.1.208:45133/outpost.goauthentik.io/auth/nginx ``` Проверка доступности встроенного Outpost. Ожидаемый ответ: 401 Unauthorized или 404 Not Found ### Сброс пароля администратора ```bash 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 и выдача прав суперпользователя --- ## Безопасность 1. **Регулярное обновление:** ```bash cd /mnt/authentik sudo docker compose pull sudo docker compose up -d ``` 2. **Резервное копирование:** ```bash sudo docker compose down tar -czf authentik-backup-$(date +%Y%m%d).tar.gz /mnt/authentik sudo docker compose up -d ``` 3. **Мониторинг логов:** ```bash sudo docker logs authentik-server --follow ``` 4. **Проверка здоровья:** ```bash 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) 1. **Applications → Providers → Create** 2. Выберите **OAuth2/OpenID Provider** 3. Заполните: - **Name:** `Immich OIDC` - **Client ID:** `immich` - **Client Type:** Confidential - **Redirect URIs:** `https://immich.zailon.ru/auth/login` 4. **Create** ### SAML Provider (для корпоративных приложений) 1. **Applications → Providers → Create** 2. Выберите **SAML Provider** 3. Настройте метаданные и атрибуты 4. **Create** --- ## Обновление Authentik ```bash cd /mnt/authentik sudo docker compose pull sudo docker compose down sudo docker compose up -d ``` Полное обновление образов контейнеров с пересозданием ```bash sudo docker image prune -f ``` Удаление старых образов после обновления ---