PasarGuard
Панель

Конфигурация групп

Управление группами, контроль доступа, отношения и документация API

Документация по группам

Этот документ объясняет, как работают группы в PasarGuard. Группы являются основным механизмом для контроля того, к каким входящим соединениям (и, следовательно, к каким хостам) пользователи могут получить доступ в своих подписках. Он разработан, чтобы помочь новичкам понять управление группами, отношения и контроль доступа.

Содержание

  1. Обзор
  2. Основы конфигурации группы
  3. Как работают группы
  4. Отношения
  5. Контроль доступа к входящим соединениям
  6. Управление группами
  7. Массовые операции
  8. Правила валидации и ограничения
  9. API Endpoints
  10. Распространенные сценарии

Обзор

Группы в PasarGuard — это механизмы контроля доступа, которые:

  • Подключают пользователей к входящим соединениям - Группы определяют, к каким тегам входящих соединений пользователи могут получить доступ
  • Контролируют видимость хостов - Пользователи видят только хосты, чей inbound_tag находится в их группах
  • Включают массовое управление - Назначение групп нескольким пользователям одновременно
  • Поддерживают шаблоны - Шаблоны пользователей могут быть назначены группам для автоматического назначения групп

Поток группы

User → Groups → Inbound Tags → Hosts (in subscriptions)

Как это работает:

  1. Пользователи назначаются в группы (отношение многие-ко-многим)
  2. Группам назначаются теги входящих соединений (отношение многие-ко-многим)
  3. При генерации подписки PasarGuard собирает все теги входящих соединений из всех групп пользователя
  4. В подписке появляются только хосты, чей inbound_tag соответствует одному из этих доступных входящих соединений

Группы — это шлюз между пользователями и хостами. Без членства в группе пользователи не могут видеть никаких хостов в своих подписках.


Основы конфигурации группы

Обязательные поля

Каждая группа должна иметь:

FieldTypeConstraintsDescription
namestring3-64 символа, только a-z и 0-9Уникальный идентификатор/имя группы
inbound_tagslist[string]Требуется хотя бы один тег (при создании)Список тегов входящих соединений, к которым эта группа может получить доступ

Необязательные поля

FieldTypeDefaultDescription
is_disabledbooleanfalseОтключить группу (исключает её из расчетов доступа)
inbound_tagslist[string]Может быть пустым/null (при изменении)Может быть очищен при изменении

Поля ответа группы

При получении групп вы также получаете:

FieldTypeDescription
idintegerУникальный идентификатор (автоматически генерируется)
total_usersintegerКоличество пользователей, находящихся в этой группе

Как работают группы

Основная концепция

Группы действуют как контейнеры разрешений, которые предоставляют пользователям доступ к определенным входящим соединениям. Думайте об этом так:

  • Group = Набор разрешений
  • Inbound Tags = К чему группа разрешает доступ
  • Users = Кто получает разрешения

Пример потока

1. Создать группу "Premium" с inbound_tags: ["vless-443", "trojan-8443"]
2. Назначить пользователя "john" в группу "Premium"
3. Когда "john" запрашивает подписку:
   - Система собирает: ["vless-443", "trojan-8443"] (из группы Premium)
   - Появляются только хосты с inbound_tag, соответствующим этим
   - Хост с inbound_tag "vmess-8080" не появится (не в группе)

Отключенные группы

Когда у группы is_disabled: true:

  • Группа исключается из расчетов доступа к входящим соединениям
  • Пользователи в отключенных группах теряют доступ к этим входящим соединениям
  • Группа все еще существует и может быть повторно включена

Пример:

User "john" находится в:
  - Group "Premium" (отключена) с ["vless-443"]
  - Group "Standard" (включена) с ["vmess-8080"]

Результат: Пользователь имеет доступ только к ["vmess-8080"]

Отношения

Отношение User ↔ Group

  • Многие-ко-многим: Пользователи могут принадлежать нескольким группам, группы могут иметь несколько пользователей
  • Таблица ассоциации: users_groups_association
  • Без ограничений: Пользователь может быть в неограниченном количестве групп

Пример:

User "john" принадлежит:
  - Group "Premium"
  - Group "Standard"
  - Group "VIP"

Пользователь получает доступ ко ВСЕМ входящим соединениям из ВСЕХ групп (если включены)

Отношение Group ↔ Inbound

  • Многие-ко-многим: Группы могут иметь несколько входящих соединений, входящие соединения могут быть в нескольких группах
  • Таблица ассоциации: inbounds_groups_association
  • Теги входящих соединений: Группы ссылаются на входящие соединения по их tag (не ID)

Пример:

Group "Premium" имеет:
  - inbound_tag: "vless-443"
  - inbound_tag: "trojan-8443"
  - inbound_tag: "vmess-8080"

Все пользователи в "Premium" могут получить доступ к хостам с этими тегами входящих соединений

Отношение Group ↔ UserTemplate

  • Многие-ко-многим: Группы могут быть назначены шаблонам пользователей
  • Цель: При создании пользователей из шаблонов они автоматически назначаются в группы шаблона
  • Таблица ассоциации: template_group_association

Пример:

UserTemplate "Basic Plan" имеет:
  - Group "Standard"
  - Group "Free"

Новые пользователи, созданные из этого шаблона, автоматически присоединяются к обеим группам

Контроль доступа к входящим соединениям

Как рассчитывается доступ к входящим соединениям

Когда пользователь запрашивает подписку, PasarGuard:

  1. Собирает все группы, к которым принадлежит пользователь
  2. Фильтрует отключенные группы
  3. Собирает все теги входящих соединений из включенных групп
  4. Удаляет дубликаты тегов входящих соединений (пользователь может иметь одно и то же входящее соединение из нескольких групп)
  5. Использует этот список для фильтрации того, какие хосты появляются в подписке

Поток кода

# Псевдокод того, что происходит
user_groups = user.groups  # Получить все группы пользователя
enabled_groups = [g for g in user_groups if not g.is_disabled]
accessible_inbounds = set()
for group in enabled_groups:
    accessible_inbounds.update(group.inbound_tags)

# Теперь фильтруем хосты
for host in all_hosts:
    if host.inbound_tag in accessible_inbounds:
        # Включить в подписку
        pass

Примеры доступа

User "john" → Group "Premium" → ["vless-443", "trojan-8443"]
Результат: Пользователь может видеть хосты с inbound_tag "vless-443" или "trojan-8443"
User "john" → 
  - Group "Premium" → ["vless-443"]
  - Group "Standard" → ["vmess-8080", "vless-443"]
  
Результат: Пользователь может видеть хосты с inbound_tag "vless-443" или "vmess-8080"
Примечание: "vless-443" появляется в обеих группах, но дубликаты удаляются
User "john" →
  - Group "Premium" (отключена) → ["vless-443"]
  - Group "Standard" (включена) → ["vmess-8080"]
  
Результат: Пользователь может видеть ТОЛЬКО хосты с inbound_tag "vmess-8080"
Примечание: Группа Premium игнорируется, потому что она отключена
User "john" → Группы не назначены
Результат: Пользователь не видит хостов в подписке (пустая подписка)

Управление группами

Создание групп

При создании группы:

  1. Валидация имени: Должно быть 3-64 символа, только a-z и 0-9
  2. Валидация входящих соединений: Все теги входящих соединений должны существовать в конфигурациях ядра XRay
  3. Уникальность: Имя группы должно быть уникальным
  4. Автоматическое создание: Теги входящих соединений автоматически создаются в базе данных, если они не существуют

Пример:

POST /api/group
{
  "name": "premium",
  "inbound_tags": ["vless-443", "trojan-8443"],
  "is_disabled": false
}

Валидация:

  • ✅ Имя валидно (3-64 символа)
  • ✅ Все теги входящих соединений существуют в конфигурациях ядра

Изменение групп

При изменении группы:

  1. Имя может быть изменено (должно оставаться уникальным)
  2. Теги входящих соединений могут быть обновлены (все должны существовать в конфигурациях ядра)
  3. Может быть отключена/включена
  4. Теги входящих соединений могут быть очищены (установлены в пустой список/null)
  5. Пользователи автоматически обновляются - Активные и on_hold пользователи получают обновленные конфигурации узлов

Пример:

PUT /api/group/1
{
  "name": "premium-v2",
  "inbound_tags": ["vless-443", "trojan-8443", "vmess-8080"],
  "is_disabled": false
}

Что происходит:

  • Имя группы изменяется
  • Теги входящих соединений обновляются
  • Все пользователи в этой группе получают обновленные конфигурации узлов
  • Их подписки теперь включают хосты с новыми тегами входящих соединений

Удаление групп

При удалении группы:

  1. Группа удаляется из базы данных
  2. Ассоциации пользователей удаляются (пользователи больше не в этой группе)
  3. Пользователи обновляются - Все затронутые пользователи получают обновленные конфигурации узлов
  4. Ассоциации входящих соединений удаляются (но сами входящие соединения остаются)

Важно:

  • Пользователи теряют доступ к входящим соединениям, которые были только в этой группе
  • Если пользователь имел доступ к входящему соединению через несколько групп, он сохраняет доступ через другие группы
  • Удаленные группы не могут быть восстановлены

Пример:

Перед удалением:
  User "john" → Group "Premium" → ["vless-443"]
  User "john" → Group "Standard" → ["vless-443", "vmess-8080"]
  
Удалить Group "Premium":
  User "john" → Group "Standard" → ["vless-443", "vmess-8080"]
  
Результат: Пользователь все еще имеет доступ к обоим входящим соединениям (через группу Standard)

Массовые операции

PasarGuard поддерживает массовые операции для эффективного управления назначением групп.

Массовое добавление групп пользователям

Добавьте одну или несколько групп нескольким пользователям одновременно.

Endpoint: POST /api/groups/bulk/add

Request Body:

{
  "group_ids": [1, 2, 3],
  "users": [10, 11, 12],
  "admins": [5, 6],
  "has_group_ids": [4]
}

Поведение:

  • Если указан users: Добавить группы этим конкретным пользователям
  • Если указан admins: Добавить группы всем пользователям, созданным этими администраторами
  • Если ни users, ни admins не указаны: Добавить группы ВСЕМ пользователям
  • has_group_ids: Фильтровать только пользователей, которые уже имеют эти группы
  • Существующие ассоциации игнорируются (дубликаты не создаются)
{
  "group_ids": [1, 2],
  "users": [10, 11, 12]
}

Результат: Пользователи 10, 11, 12 получают группы 1 и 2

{
  "group_ids": [1],
  "admins": [5]
}

Результат: Все пользователи, созданные администратором 5, получают группу 1

{
  "group_ids": [1, 2]
}

Результат: ВСЕ пользователи в системе получают группы 1 и 2

{
  "group_ids": [2],
  "has_group_ids": [1]
}

Результат: Только пользователи, которые уже имеют группу 1, получают группу 2

Массовое удаление групп у пользователей

Удалите одну или несколько групп у нескольких пользователей одновременно.

Endpoint: POST /api/groups/bulk/remove

Request Body:

{
  "group_ids": [1, 2, 3],
  "users": [10, 11, 12],
  "admins": [5, 6],
  "has_group_ids": [4]
}

Поведение:

  • Аналогично массовому добавлению, но удаляет ассоциации групп
  • Удаляются только существующие ассоциации
  • Пользователи теряют доступ к входящим соединениям, которые были только в удаленных группах

Пример:

{
  "group_ids": [1],
  "users": [10, 11]
}

Результат: Пользователи 10 и 11 теряют группу 1 (и доступ к её входящим соединениям)


Правила валидации и ограничения

Валидация имени

RuleConstraintError Message
Length3-64 символаИмя должно быть 3-64 символа
  • premium
  • standard123
  • group1
  • vip
  • pr (слишком короткое, < 3 символов)

Валидация тегов входящих соединений

RuleConstraintError Message
ExistenceДолжен существовать в конфигурациях ядраТег входящего соединения не найден в конфигурациях ядра
CreationТребуется хотя бы одинВы должны выбрать хотя бы одно входящее соединение
ModificationМожет быть пустым/nullРазрешено при изменении

Процесс валидации:

  1. При создании: Все теги входящих соединений проверяются на соответствие конфигурациям ядра XRay
  2. При изменении: Если указаны inbound_tags, все проверяются
  3. Автоматическое создание: Теги входящих соединений автоматически создаются в базе данных, если они существуют в конфигурациях ядра

Пример:

Конфигурация ядра имеет входящие соединения: ["vless-443", "trojan-8443"]

Валидная группа:
  inbound_tags: ["vless-443", "trojan-8443"] ✅

Невалидная группа:
  inbound_tags: ["vmess-8080"] ❌ (не в конфигурации ядра)

Валидация состояния группы

  • Отключенные группы исключаются из расчетов доступа
  • Удаленные группы удаляют все ассоциации пользователей
  • Пустые inbound_tags (при изменении) означает, что группа не предоставляет доступ

API Endpoints

Создать группу

Endpoint: POST /api/group

Authentication: Требуется sudo администратор

Request Body:

{
  "name": "premium",
  "inbound_tags": ["vless-443", "trojan-8443"],
  "is_disabled": false
}

Response:

{
  "id": 1,
  "name": "premium",
  "inbound_tags": ["vless-443", "trojan-8443"],
  "is_disabled": false,
  "total_users": 0
}

Получить все группы

Endpoint: GET /api/groups

Authentication: Требуется администратор

Query Parameters:

  • offset (необязательно): Смещение пагинации
  • limit (необязательно): Лимит пагинации

Response:

{
  "groups": [
    {
      "id": 1,
      "name": "premium",
      "inbound_tags": ["vless-443"],
      "is_disabled": false,
      "total_users": 5
    }
  ],
  "total": 1
}

Получить группу по ID

Endpoint: GET /api/group/{group_id}

Authentication: Требуется администратор

Response:

{
  "id": 1,
  "name": "premium",
  "inbound_tags": ["vless-443", "trojan-8443"],
  "is_disabled": false,
  "total_users": 10
}

Изменить группу

Endpoint: PUT /api/group/{group_id}

Authentication: Требуется sudo администратор

Request Body:

{
  "name": "premium-v2",
  "inbound_tags": ["vless-443", "trojan-8443", "vmess-8080"],
  "is_disabled": false
}

Response: То же, что и получить группу по ID

Все активные и on_hold пользователи в этой группе автоматически получают обновленные конфигурации узлов.

Удалить группу

Endpoint: DELETE /api/group/{group_id}

Authentication: Требуется sudo администратор

Response: 204 No Content

Все пользователи в этой группе автоматически получают обновленные конфигурации узлов.

Массовое добавление групп

Endpoint: POST /api/groups/bulk/add

Authentication: Требуется администратор

Request Body:

{
  "group_ids": [1, 2],
  "users": [10, 11, 12],
  "admins": [5],
  "has_group_ids": [3]
}

Response:

{
  "detail": "operation has been successfuly done on 15 users"
}

Массовое удаление групп

Endpoint: POST /api/groups/bulk/remove

Authentication: Требуется администратор

Request Body: То же, что и массовое добавление

Response: То же, что и массовое добавление


Распространенные сценарии

Проблема: Вы хотите создать группу для пользователей премиум с доступом к определенным входящим соединениям.

Решение:

POST /api/group
{
  "name": "premium",
  "inbound_tags": ["vless-443", "trojan-8443"],
  "is_disabled": false
}

Проблема: Вы хотите назначить группу пользователю (выполняется через изменение пользователя, а не через API группы).

Решение:

PUT /api/user/john
{
  "group_ids": [1, 2]
}

Проблема: Вы добавили новое входящее соединение в конфигурацию XRay и хотите, чтобы существующие группы имели к нему доступ.

Решение:

PUT /api/group/1
{
  "inbound_tags": ["vless-443", "trojan-8443", "vmess-8080"]
}

Все пользователи в группе 1 теперь имеют доступ к хостам с inbound_tag: "vmess-8080".

Проблема: Вы хотите временно отозвать доступ без удаления группы.

Решение:

PUT /api/group/1
{
  "is_disabled": true
}

Все пользователи в этой группе немедленно теряют доступ к её входящим соединениям. Повторно включите, установив is_disabled: false.

Проблема: Вы хотите предоставить всем пользователям доступ к новой группе.

Решение:

POST /api/groups/bulk/add
{
  "group_ids": [1]
}

Проблема: Вы хотите добавить группу премиум всем пользователям, созданным конкретным администратором.

Решение:

POST /api/groups/bulk/add
{
  "group_ids": [1],
  "admins": [5]
}

Проблема: Вы хотите разные уровни доступа: Free (ограниченный), Standard (больше), Premium (все).

Решение:

// Создать группу Free
POST /api/group
{
  "name": "free",
  "inbound_tags": ["vmess-8080"]
}

// Создать группу Standard
POST /api/group
{
  "name": "standard",
  "inbound_tags": ["vmess-8080", "vless-443"]
}

// Создать группу Premium
POST /api/group
{
  "name": "premium",
  "inbound_tags": ["vmess-8080", "vless-443", "trojan-8443"]
}

Пользователи могут быть назначены в соответствующие группы на основе уровня их подписки.

Проблема: Вы хотите удалить доступ к входящему соединению из группы.

Решение:

PUT /api/group/1
{
  "inbound_tags": ["vless-443"]
}

Пользователи в этой группе теряют доступ к хостам с inbound_tag: "trojan-8443".

Проблема: Вы хотите удалить весь доступ к входящим соединениям из группы (но сохранить группу).

Решение:

PUT /api/group/1
{
  "inbound_tags": []
}

Пользователи в этой группе теперь не видят хостов в своих подписках.

Проблема: Вы хотите переместить пользователей из группы "Standard" в группу "Premium".

Решение:

// Шаг 1: Удалить из Standard
POST /api/groups/bulk/remove
{
  "group_ids": [2],
  "users": [10, 11, 12]
}

// Шаг 2: Добавить в Premium
POST /api/groups/bulk/add
{
  "group_ids": [1],
  "users": [10, 11, 12]
}

Проблема: Вы хотите добавить группу 2 только пользователям, которые уже имеют группу 1.

Решение:

POST /api/groups/bulk/add
{
  "group_ids": [2],
  "has_group_ids": [1]
}

Проблема: Пользователь должен иметь доступ к входящим соединениям из нескольких групп.

Решение:

PUT /api/user/john
{
  "group_ids": [1, 2, 3]
}

Пользователь получает доступ ко всем входящим соединениям из всех групп (объединение всех тегов входящих соединений).


Резюме

  • Группы контролируют доступ к входящим соединениям - Пользователи видят только хосты, чей inbound_tag находится в их группах
  • Отношения многие-ко-многим - Пользователи могут быть в нескольких группах, группы могут иметь несколько входящих соединений
  • Отключенные группы исключаются - Пользователи теряют доступ, когда их группы отключены
  • Ограничения имени - 3-64 символа
  • Валидация входящих соединений - Все теги входящих соединений должны существовать в конфигурациях ядра XRay
  • Автоматические обновления - Конфигурации узлов пользователей обновляются при изменении/удалении групп
  • Массовые операции - Эффективное управление назначением групп для нескольких пользователей
  • Пустые группы - Группы без входящих соединений не предоставляют доступ
  • Интеграция шаблонов - Шаблоны пользователей могут автоматически назначать группы
  • Доступ накапливается - Пользователи получают доступ к входящим соединениям из ВСЕХ своих включенных групп

Для получения дополнительной информации о:

  • Как хосты используют теги входящих соединений: См. hosts.md
  • Конфигурация XRay: См. xray.md

On this page

СодержаниеОбзорПоток группыОсновы конфигурации группыОбязательные поляНеобязательные поляПоля ответа группыКак работают группыОсновная концепцияПример потокаОтключенные группыОтношенияОтношение User ↔ GroupОтношение Group ↔ InboundОтношение Group ↔ UserTemplateКонтроль доступа к входящим соединениямКак рассчитывается доступ к входящим соединениямПоток кодаПримеры доступаУправление группамиСоздание группИзменение группУдаление группМассовые операцииМассовое добавление групп пользователямМассовое удаление групп у пользователейПравила валидации и ограниченияВалидация имениВалидация тегов входящих соединенийВалидация состояния группыAPI EndpointsСоздать группуПолучить все группыПолучить группу по IDИзменить группуУдалить группуМассовое добавление группМассовое удаление группРаспространенные сценарииРезюме