---
url: /functionality/index.md
---
# Функциональные характеристики
## Общие функциональные характеристики
Модульная платформа безопасной разработки **CodeScoring** обеспечивает решение задач безопасного использования **open source**, идентификации секретов в коде и проверки качества разработки.
Платформа включает в себя следующие модули:
* **CodeScoring.Save** – управление артефактами разработки с поддержкой proxy- и hosted-репозиториев, интеграцией проверок безопасности и контролем доступа;
* **CodeScoring.OSA (Open Source Analysis)** – защита цепочки поставки: проверка сторонних компонентов на соответствие политикам безопасности и блокировка при несоответствии;
* **CodeScoring.SCA (Software Composition Analysis)** – композиционный анализ: автообнаружение **open source** зависимостей, выявление уязвимостей и вредоносных компонентов, проверка совместимости лицензий, формирование перечня программных компонентов и построение графа зависимостей;
* **CodeScoring.Secrets** – поиск секретов в коде: оркестрация проверок исходного кода на наличие конфиденциальной информации (**секретов**) и оценка истинности с помощью собственной модели машинного обучения;
* **CodeScoring.TQI (Teams & Quality Intelligence)** – оценка качества кода через расчет ключевых метрик качества, отслеживание динамики разработки и построение профилей участников разработки с подтвержденной компетенцией в проектах.
Комплексно платформа обеспечивает:
* анализ 24 языков программирования (для отдельных модулей список языков может варьироваться): **Java**, **Kotlin**, **JavaScript**, **TypeScript**, **Python**, **R**, **Erlang**, **Elixir**, **Gleam**, **C**, **C++**, **Go**, **PHP**, **Ruby**, **C#**, **Objective-C**, **Swift**, **Rust**, **Scala**, **Bash**, **Perl**, **SQL**, **PLSQL**, **PGSQL**;
* анализ манифестов пакетных экосистем: **Maven**, **Gradle**, **Apache Ivy**, **NPM**, **Yarn**, **pnpm**, **bun**, **NuGet**, **Paket**, **pip**, **Poetry**, **Pipenv**, **Conda**, **uv**, **PDM**, **R/renv**, **rebar3**, **Mix**, **Gleam**, **RubyGems**, **Cocoapods**, **Swift**, **Composer**, **Conan**, **Go Modules**, **Cargo** и **sbt**;
* интеграцию с менеджерами репозиториев и реестрами контейнерных образов: **Nexus Repository Manager**, **JFrog Artifactory Pro**, **Harbor**, **GitLab**, **GitFlic**, **Сфера.Дистрибутивы и Лицензии**;
* менеджер репозиториев **CodeScoring.Save** с поддержкой proxy- и hosted-режимов для **Maven**, **npm**, **NuGet**, **PyPI**, **Go**, **Docker/OCI** и **raw**;
* интеграцию с **hosted** и **cloud**-системами хостинга кода: **GitFlic**, **GitLab**, **Github**, **Bitbucket** и **Azure DevOps**;
* универсальную интеграцию в системы сборки при помощи агента: **Jenkins**, **GitLab**, **GitFlic**, **TeamCity** и прочие;
* управление политиками безопасности организации;
* автоматизацию запусков сканирования по расписанию;
* интеграцию для почтовых уведомлений;
* интеграцию с системой управления задачами **Jira**;
* систему управления пользователями;
* интеграцию с **LDAP** и **OIDC**;
* создание вебхуков;
* разграничение прав доступа для разных пользователей;
* журналирование всех выполняемых операций (**аудит-лог**);
* сбор метрик по проведенным операциям;
* открытый и задокументированный программный интерфейс (**API**).
## Функциональные характеристики модуля **CodeScoring.Save** {#codescoring-save}
* централизованное хранилище артефактов с поддержкой двух типов репозиториев:
* **proxy-репозитории** — проксирование запросов к upstream-репозиториям с кэшированием артефактов и выполнением проверок безопасности;
* **hosted-репозитории** — полностью локальные репозитории для хранения собственных артефактов организации;
* поддержка популярных пакетных экосистем:
* **Maven** (Java, Kotlin, Scala и другие JVM-инструменты поверх Maven layout);
* **npm** (JavaScript / TypeScript);
* **NuGet** (.NET);
* **PyPI** (Python);
* **Go** (Go Modules);
* **Docker / OCI** (контейнерные образы, Helm OCI-чарты, oras-артефакты);
* **Deb** (APT);
* **RPM** (YUM/DNF);
* **RAW** (произвольные файлы);
* микросервисная архитектура с разделением компонентов:
* **Save API service** — основной сервис работы с артефактами и репозиториями;
* **Auth / RBAC service** — выделенный микросервис аутентификации и авторизации;
* интеграция проверок безопасности:
* автоматическое сканирование артефактов через **CodeScoring.OSA**;
* применение политик безопасности при загрузке компонентов;
* блокировка загрузки артефактов, не соответствующих политикам;
* управление доступом и безопасность:
* ролевая модель доступа (**RBAC**) с тремя уровнями (**global / project / repository**);
* поддержка пользователей (**users**) и сервисных аккаунтов (**robot accounts**);
* управление членством в проектах с гранулярным контролем прав;
* выпуск и валидация **JWT-токенов** для API с локальной проверкой подписи на стороне Save через JWKS;
* поддержка шести типов учётных данных: Basic Auth (пользовательский и сервисный robot), Bearer JWT, opaque Bearer (npm), `X-NuGet-ApiKey` и Docker v2 token;
* поддержка **OCI Distribution Spec / Docker Registry v2** с эндпоинтом выпуска короткоживущих access-токенов;
* аудит операций, связанных с доступом и управлением артефактами, в едином журнале платформы;
* организационная структура:
* иерархия **проект → репозиторий → артефакт**;
* управление проектами с назначением участников;
* настройка прав доступа на уровне проектов и репозиториев;
* управление жизненным циклом артефактов:
* **cleanup policies** — правила для автоматического удаления устаревших или неиспользуемых артефактов;
* настройка правил очистки по возрасту, количеству версий, по последнему скачиванию, по регулярным выражениям, по размеру;
* dry-run / preview результата перед запуском;
* веб-интерфейс для управления:
* создание и настройка проектов и репозиториев;
* просмотр и скачивание артефактов и их метаданных;
* управление пользователями, ролями и правами доступа;
* настройка правил очистки;
* управление лицензией;
* просмотр сконфигурированных параметров;
* мониторинг операций и экспорт журнала событий;
* варианты развертывания:
* **hosted-инсталляция** на базе **k3s** для небольших команд;
* **базовая инсталляция** на **Kubernetes** с **PostgreSQL** и **S3-совместимым хранилищем** для продуктивного использования;
* конфигурация хранения: **SQLite/PostgreSQL** для метаданных, **S3/файловая система** для артефактов;
* производительность и масштабируемость:
* stateless-архитектура для горизонтального масштабирования;
* in-pod кэш и локальная валидация Bearer JWT по JWKS;
* стриминговая обработка больших файлов без полной буферизации в памяти;
* независимое горизонтальное масштабирование Save и cs-auth;
* мониторинг и наблюдаемость:
* экспорт метрик в **Prometheus** в формате OpenTelemetry;
* структурированное логирование операций в JSON;
* health checks для контроля состояния сервисов;
* метрики HTTP-запросов, операций хранилища, загрузок/скачиваний артефактов и proxy cache hit-rate;
* открытый программный интерфейс (**API**):
* REST API для управления проектами, репозиториями и артефактами;
* совместимость с протоколами пакетных менеджеров (Maven 2 layout, npm Registry API, NuGet v3, PyPI Simple PEP 503/691, Go Module Proxy, OCI Distribution Spec);
* API для управления пользователями, ролями, robot-аккаунтами и правами доступа;
* внутренние API для межсервисного взаимодействия между Save и cs-auth, защищённые shared secret.
## Функциональные характеристики модуля **CodeScoring.OSA**
* блокировка загрузки нежелательных компонентов при попытке их скачивания через командный интерфейс пакетного менеджера или веб-интерфейс;
* формирование перечня программных компонентов (**SBOM**, Software Bill of Materials);
* проверка артефактов в реестрах контейнерных образов;
* проксирование и контроль загрузок пакетов через сервис [OSA Proxy](/user-guide/osa-proxy.md) для популярных пакетных менеджеров и реестров: Maven, npm, PyPI, NuGet, Go modules, Composer, RubyGems, Debian, Alpine, RPM и Docker Registry API v2;
* анализ архивов, включая:
* разбор содержимого популярных архивных форматов (**zip**, **jar**, **tar**, **war**, **tgz** и другие);
* анализ системных пакетов, включая поддержку популярных менеджеров пакетов:
* **DEB** (Debian, Ubuntu);
* **RPM** (RHEL, CentOS, Fedora);
* **APK** (Alpine Linux);
* настройка критериев безопасности (**политик**) по 40 критериям, включая:
* метаданные пакетов: название, версия, автор пакета, возраст, дата;
* критерии уязвимостей: идентификатор, оценка **CVSS**, уровень угрозы, дата публикации, возраст, наличие эксплойта, импакт;
* категории и типы лицензий, совместимость лицензий (**лицензионная чистота**);
* признаки применения пакета: директивный/транзитивный и окружение (**scope**);
* наличие вредоносного кода;
* черные списки пакетов, включая собственный фид **protestware**;
* определение и дедупликация уязвимостей из 20 баз знаний, включая агрегационные (**БДУ ФСТЭК**, **NVD**, **OSV**, **GHSA** и иные), экосистемные (**Debian**, **RPM**, **Alpine** и иные), коммерческие (**Kaspersky OSS Threats Data Feed**) и собственные, включая данные о **protestware**;
* управление компонентами в интерфейсе, включая:
* просмотр и фильтрацию списка пакетов;
* просмотр и фильтрацию списка контейнерных образов;
* просмотр и фильтрацию запросов компонентов;
* выгрузку отчетности.
## Функциональные характеристики модуля **CodeScoring.SCA**
* анализ манифестов пакетных менеджеров;
* формирование перечня программных компонентов (**SBOM, Software Bill of Materials**) c учетом рекомендаций **ФСТЭК России**;
* работа с версиями проектов: просмотр результатов анализа для отдельных версий, назначение версии по умолчанию и вывод версии в отчетах и SBOM;
* проверка **open source** на всех этапах цикла разработки с возможностью задания политик безопасности для отдельных этапов цикла разработки:
* проверка кода в средах разработки (**IDE**): **IntelliJ-based**, **VSCode**, **OpenIDE**;
* проверка на локальной машине разработчика (**агент CLI**);
* непрерывный мониторинг кода (сканирование веток репозиториев);
* проверка в **CI-конвейере** универсальным агентом с возможностью блокирования сборки;
* пост-релизный мониторинг **SBOM**;
* пост-релизный мониторинг кода (сканирование тегов репозиториев);
* обнаружение **open source** зависимостей:
* по экосистеме, названию и версии пакета;
* по файлам конфигураций (**манифестам**) пакетных менеджеров;
* через механизм разрешения транзитивных зависимостей;
* через механизм идентификации **open source**-включений по вендорской базе мета-данных, с применением алгоритмов гибкого поиска;
* через анализ сборки для языков **C** и **C++**;
* разделение директивных и транзитивных зависимостей и определение отношения к окружениям (**scope**) разработки: **runtime**, **compile**, **test**, **provided** и другим;
* построение графа зависимостей с возможностью трассирования использования транзитивных компонентов;
* актуализация информации об обнаруженных зависимостях:
* общая информация о зависимости: способ обнаружения; дата релиза пакета; автор пакета; официальная веб-страница; ссылка на размещение в пакетном индексе; окружение применения (**scope**) и ссылка на граф связей; ссылка на манифест;
* информация об уязвимостях;
* информация о лицензиях;
* максимальная версия исправления;
* используемость в проектах организации;
* предоставление информации об уязвимостях:
* идентификаторы в базах знаний;
* описание уязвимости;
* оценка критичности по **CVSS 2**, **CVSS 3.1** и **CVSS 4.0**;
* ссылки на дополнительные индексы уязвимостей;
* рекомендуемая версия пакета для обновления;
* перечень всех проектов, задетых уязвимостью;
* дополнительные материалы, содержащие ссылки на патчи, эксплоиты и уязвимые коммиты;
* предоставление информации о лицензиях:
* лицензионный ландшафт проекта;
* **SPDX**-идентификатор лицензии;
* текст лицензии;
* краткое представление об условиях лицензии;
* информация о совместимости лицензий (**license compliance**);
* определение и дедупликация уязвимостей из более 20 баз знаний, включая агрегационные (**БДУ ФСТЭК**, **NVD**, **OSV**, **GHSA** и иные), экосистемные (**Debian**, **RPM**, **Alpine** и иные), коммерческие (**Kaspersky OSS Threats Data Feed**) и собственные, включая данные о **protestware**;
* настройка политик безопасности по 40 критериям, включая:
* метаданные пакетов: название, версия, автор пакета, возраст, дата;
* критерии уязвимостей: идентификатор, оценка **CVSS**, уровень угрозы, дата публикации, возраст, наличие эксплойта, импакт;
* категории и типы лицензий, совместимость лицензий (**лицензионная чистота**);
* признаки применения пакета: директивный/транзитивный и окружение (**scope**);
* наличие вредоносного кода;
* черные списки пакетов, включая подготовленный фид **protestware**;
* настройка политик безопасности отдельно для сканирования кода в репозиториях, **CI-конвейере** и локальной машине разработчика с указанием этапа цикла разработки;
* система отображения результатов сканирований для каждого отдельного этапа и возможность управления игнорируемыми событиями;
* возможность настройки защиты от популярных атак на цепочку поставки;
* возможность настройки временного игнорирования политик срабатывания по различным критериям: проекту, технологии, пакету, типу лицензии, идентификатору уязвимости, для отдельных политик;
* выгрузка отчетности в популярных форматах: **CycloneDX**, **SPDX**, **JUnit**, **SARIF**, **CSV**, **GitLab Dependency Scanning Report**, **GitLab Code Quality Report**;
* анализ достижимости уязвимостей.
## Функциональные характеристики модуля **CodeScoring.Secrets**
* обнаружение чувствительных данных в коде, включая пароли, **API-ключи**, токены, учетные данные;
* использование собственной модели машинного обучения для фильтрации ложных срабатываний;
* интеграция с системами контроля версий (**VCS**) для автоматического мониторинга репозиториев;
* настройка критериев поиска секретов с возможностью конфигурирования правил обнаружения;
* запуск анализа секретов:
* выбор сканирования отдельной ветки или всего репозитория;
* ручной запуск анализа в отдельных проектах;
* общее сканирование всех проектов организации;
* загрузка отчетов о секретах, найденных сторонними инструментами, в систему;
* предоставление детализированной информации о найденных секретах:
* контекст обнаружения (проект, файл, автор изменения);
* оценка вероятности истинности секрета;
* дата обнаружения и исправления секрета;
* управление найденными секретами:
* просмотр списка обнаруженных секретов;
* подтверждение ложных срабатываний и исключение их из дальнейших сканирований;
* маркировка секретов как устраненных;
* управление процессом обучения **ML-модели** для повышения точности обнаружения:
* разметка обнаруженных секретов пользователем;
* дообучение модели на размеченных данных;
* сравнение результатов дообученной модели с исходной версией;
* возможность отката к базовой модели;
* интеграция с **DevSecOps**-процессами:
* работа в **CI/CD-конвейере** с возможностью прерывания сборки при обнаружении секретов;
* анализ секретов на локальной машине разработчика через **CLI-агент**;
* система отчетности и уведомлений:
* отображение результатов сканирования на уровне организации, проекта и отдельного репозитория;
* фильтрация результатов;
* экспорт отчетов со списком секретов или их свойств.
## Функциональные характеристики модуля **CodeScoring.TQI**
* построение профиля проектов, детализация технического и авторского состава разработки;
* построение профиля разработчиков, детализация их работы в анализируемых проектах с учетом объема работ и качества произведенных изменений;
* автоматическая оценка сходства разработчиков в анализируемых проектах по опыту участия и технологиях;
* поиск активности разработчиков в **open source** проектах;
* анализ заимствований с применением алгоритмов нечеткого поиска (толерантность к переименованиям объектов в коде):
* поиск внутри-проектных дубликатов кода;
* поиск кросс-проектных дубликатов кода;
* определение объема найденных заимствований;
* построение интерактивной карты заимствований;
* определение времени возникновения заимствования;
* привязка авторства к найденным дубликатам кода;
* оценка сложности сопровождения проекта:
* расчет цикломатической сложности кода в разрезе проекта;
* расчет цикломатической сложности кода в разрезе автора;
* построение аналитических ретроспективных карт:
* развития проектов;
* работы авторов;
* эволюции сложности проектов;
* встраивание в цикл разработки программного обеспечения (**SDLC**) посредством интеграции с системами версионирования исходного кода.
---
url: /functionality/integration-stages.md
---
# Этапы интеграции
Платформа безопасной разработки **CodeScoring** интегрируется в жизненный цикл разработки программного обеспечения и помогает применять разные политики безопасности на разных этапах:
* локальная среда и IDE;
* репозитории и платформы разработки;
* конвейер CI/CD;
* пост-релизный мониторинг.
Общая схема интеграции представлена ниже:

**Важно**: перечислена основная функциональность платформы по этапам. Полный перечень возможностей доступен на странице [функциональных характеристик](/functionality.md).
## Локальная среда и IDE

На этапе локальной разработки CodeScoring помогает предотвратить попадание уязвимых или вредоносных компонентов в кодовую базу и показывает проблемы до отправки изменений в репозиторий.
Плагины для IDE позволяют разработчикам видеть уязвимые зависимости прямо в файлах проекта, получать информацию о нарушениях политик и отслеживать прогресс исправления. Для локальных проверок также можно использовать универсальный агент [Johnny](/user-guide/agent.md).
Функциональность:
* подсветка уязвимых зависимостей в IDE;
* обновление зависимостей до безопасных версий без выхода из IDE;
* анализ и блокировка сторонних компонентов при загрузке из прокси-репозиториев;
* композиционный анализ локального проекта;
* [поиск конфиденциальной информации](/user-guide/secrets.md) в исходном коде.
## Репозитории и платформы разработки

На этапе хранения и управления исходным кодом CodeScoring позволяет обеспечить непрерывный контроль качества и безопасности репозиториев.
Поддерживается интеграция с основными платформами разработки, использующими git: **GitFlic**, **GitHub**, **GitLab**, **Bitbucket**, **Azure DevOps** и др.
Функциональность:
* инвентаризация сторонних компонентов в репозиториях;
* обнаружение уязвимостей и потенциально опасных компонентов;
* поиск секретов;
* анализ [качества разработки](/user-guide/tqi.md).
## Конвейер CI/CD

На этапе сборки CodeScoring анализирует программное обеспечение в конвейере CI/CD и проверяет используемые артефакты до попадания небезопасного компонента в релиз.
Поддерживаются инструменты автоматизации: **GitLab CI/CD**, **Jenkins**, **TeamCity**, **Bamboo**, **GitFlic** и др.
Функциональность:
* автоматическое формирование перечня программных компонентов (SBOM);
* обнаружение уязвимостей и потенциально опасных компонентов;
* анализ лицензионной совместимости;
* контроль соответствия сборки политикам безопасности.
Анализ выполняется с помощью агента [Johnny](/user-guide/agent.md), доступного как бинарный файл или контейнерный образ. При нарушении политик безопасности агент завершает выполнение с соответствующим кодом ошибки, что позволяет остановить сборку до попадания небезопасного артефакта в релиз.
## Пост-релизный мониторинг

После публикации продукта CodeScoring обеспечивает непрерывный мониторинг безопасности исходного кода и состава компонентов. Это позволяет своевременно реагировать на новые уязвимости и угрозы в уже выпущенных версиях.
Функциональность:
* сканирование по расписанию репозиториев с кодом и SBOM;
* автоматическое обновление данных об угрозах;
* отправка уведомлений в почту, менеджеры задач и **ASPM/ASOC/SIEM**-системы;
* ведение истории сканирований и отчетов.
---
url: /functionality/supported-package-managers.md
---
# Поддерживаемые экосистемы и способы анализа
## Манифесты
Для поиска зависимостей CodeScoring в первую очередь опирается на разбор файлов манифестов пакетных менеджеров. Платформа поддерживает разбор следующих технологий:
| Экосистема
| Пакетный менеджер или инструмент сборки | Формат файла |
|----------------|:------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Java и Kotlin** | Gradle | `*.gradle`
`*.gradle.kts`
`gradle-dependency-tree.txt`
`gradle.lockfile` |
| | Maven | `pom.xml`
`maven-dependency-tree.txt` |
| | Apache Ivy | `ivy.xml` |
| **JavaScript и TypeScript** | npm | `package.json`
`package-lock.json`
`npm-shrinkwrap.json` |
| | yarn | `yarn.lock`
`package.json`
`package-lock.json` |
| | pnpm | `pnpm-lock.yaml` |
| | bun | `bun.lock` |
| **Python** | pip | `requirements.txt`
`requirements.pip`
`requires.txt`
`pip-resolved-dependencies.txt`
`pipdeptree.txt` |
| | Poetry | `pyproject.toml`
`poetry.lock` |
| | Pipenv | `Pipfile`
`Pipfile.lock` |
| | Conda | `environment.yml`
`meta.yml`
`conda-lock.yml` |
| | uv | `pyproject.toml`
`uv.lock` |
| | PDM | `pyproject.toml`
`pdm.lock`
`pylock.toml` |
| **C и C++** | Conan | `conanfile.txt`
`conan.lock`
`conanfile.py` |
| | GCC, Clang, CMake, Make и др. | [Сканирование сборки](/user-guide/agent/scan-build/index.md) |
| **Go** | Go Modules | `go.mod`
`go.sum` |
| **PHP** | Composer | `composer.json`
`composer.lock` |
| **Ruby** | RubyGems | `Gemfile`
`Gemfile.lock`
`*.gemspec`
`gems.locked`
`gems.rb` |
| **R** | R / renv | `DESCRIPTION`
`renv.lock` |
| **Erlang, Elixir и Gleam** | rebar3 | `rebar.config`
`rebar.lock` |
| | Mix | `mix.exs`
`mix.lock` |
| | Gleam | `gleam.toml`
`manifest.toml` |
| **.NET** | Nuget | `*.nuspec`
`packages.lock.json`
`Project.json`
`Project.lock.json`
`packages.config`
`*.csproj`
`project.assets.json`
`dependencyReport.json`
`deps.json`
`*.sln` |
| | Paket | `paket.dependencies`
`paket.lock` |
| **Objective-C** | CocoaPods | `Podfile`
`Podfile.lock`
`*.podspec` |
| **Swift** | Swift Package Manager | `Package.swift`
`Package.resolved` |
| **Rust** | Cargo | `Cargo.toml`
`Cargo.lock` |
| **Scala** | sbt | `scala-dependency-tree.txt`
`sbt-dependency-tree.txt` |
Лучший результат будет при наличии основного файла манифеста и соответствующего lock-файла, если он предусмотрен механизмом пакетного менеджера.
## Типы PURL и компонентов
Для унифицированного описания зависимостей CodeScoring использует стандарт **[Package URL (PURL)](https://github.com/package-url/purl-spec)**.
:::tip Пример PURL
```
pkg:maven/org.apache.logging.log4j/log4j-core@2.17.2
```
:::
При анализе SBOM через [команду агента](/user-guide/agent/scan-bom.md) или [импорте в платформу](/user-guide/sca/export-results/index.md#sbom) CodeScoring распознаёт и поддерживает следующие типы PURL в соответствии со спецификацией:
| Тип PURL | Описание | Спецификация |
|----------------|---------|------------------|
| `cocoapods` | Библиотеки для **Objective-C / Swift** через CocoaPods | [CocoaPods Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/cocoapods-definition.md) |
| `conan` | Пакеты экосистемы **C / C++ (Conan)** | [Conan Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/conan-definition.md) |
| `conda` | Пакеты экосистемы **Python / Conda** | [Conda Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/conda-definition.md) |
| `nuget` | Компоненты **.NET / NuGet** | [NuGet Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/nuget-definition.md) |
| `golang` | Пакеты **Go Modules** | [Go Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/golang-definition.md) |
| `maven` | Артефакты **Java / Kotlin** (Maven / Gradle) | [Maven Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/maven-definition.md) |
| `npm` | Пакеты **JavaScript / TypeScript** | [NPM Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/npm-definition.md) |
| `composer` | Пакеты **PHP (Composer)** | [Composer Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/composer-definition.md) |
| `pypi` | Пакеты **Python (PyPI)** | [PyPI Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/pypi-definition.md) |
| `gem` | Пакеты **Ruby (RubyGems)** | [RubyGems Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/gem-definition.md) |
| `cargo` | Пакеты **Rust (Cargo)** | [Cargo Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/cargo-definition.md) |
| `generic` | Общий тип для произвольных бинарных или кастомных артефактов | [Generic Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/generic-definition.md) |
| `apk` | Системные пакеты **Alpine Linux** | [APK Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/apk-definition.md) |
| `deb` | Системные пакеты **Debian / Ubuntu** | [DEB Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/deb-definition.md) |
| `rpm` | Системные пакеты **RHEL / CentOS / Fedora** | [RPM Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/rpm-definition.md) |
| `swift` | Пакеты **Swift Package Manager** | [Swift Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/swift-definition.md) |
| `oci` | Контейнерные образы **OCI / Docker** | [OCI Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/oci-definition.md) |
| `docker` | Образы **Docker Hub / Docker** | [Docker Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/docker-definition.md) |
| `github` | Репозитории **GitHub** | [GitHub Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/github-definition.md) |
| `huggingface` | Модели **Hugging Face Hub** | [HuggingFace Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/huggingface-definition.md) |
| `mlflow` | Модели **MLflow Model Registry** | [MLflow Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/mlflow-definition.md) |
| `pub` | Пакеты **Dart / Flutter (pub.dev)** | [Pub Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/pub-definition.md) |
| `swid` | **SWID-теги (Software Identification Tags)** | [SWID Definition](https://github.com/package-url/purl-spec/blob/main/types-doc/swid-definition.md) |
Каждый компонент с PURL классифицируется по типу, который CodeScoring распознаёт при импорте SBOM-файлов. Тип указывается в поле `type` внутри описания компонента.
:::note Различие типов PURL и компонентов
Тип компонента описывает его функциональную роль внутри продукта — например, библиотека, фреймворк или встроенное ПО. Тип PURL, в свою очередь, определяет экосистему и источник, из которого этот компонент был получен.
:::
:::tip Пример компонента в SBOM
```json
{
"components": [
{
"name": "log4j-core",
"version": "2.17.2",
"purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.17.2",
"type": "library"
}
]
}
```
:::
Поддерживаются следующие типы компонентов:
| Тип компонента | Описание |
| -------------- | --------------------------------------------------------------------------------------------- |
| **library** | Библиотека, пакет или модуль стороннего кода, используемый в проекте. |
| **framework** | Инфраструктурный или прикладной фреймворк, включающий набор библиотек. |
| **firmware** | Исполняемый бинарный образ или встроенное ПО, анализируемое на наличие сторонних компонентов. |
## Системные пакеты
В рамках работы модуля OSA платформа поддерживает разбор системных пакетов следующих форматов:
* [Debian](https://www.debian.org/distrib/packages);
* [Alpine](https://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html);
* [RPM](https://rpm.org);
* [Astra Linux](https://astralinux.ru/);
* [ALT Linux](https://packages.altlinux.org/en/sisyphus/);
* [РЕД ОС](https://redos.red-soft.ru/).
## Сканирование архивов
Плагины CodeScoring.OSA поддерживают сканирование архивов в следующих форматах:
| Экосистема | Формат архива |
|------------|---------------|
| Maven | `.jar`, `.war`, `.ear` |
| NPM | `.tgz` |
| PyPI | `.zip`, `.tar`, `.tgz`, `.tar.gz`, `.tar.bz2`, `.egg`, `.whl` |
| Nuget | `.nupkg` |
| Cocoapods | `.tar.gz`, `.zip` |
| Go | `.mod`, `.zip` |
| Gems | `.rz`, `.gz`, `.gem` |
| Debian | `.deb`, `.xz`, `.gz` |
| Yum | `.rpm` |
| Alpine | `.apk` |
| Docker | `.json` |
:::note Сканирование архивов через Johnny
Консольный агент Johnny также поддерживает сканирование архивов. Поддерживаемые форматы приведены на странице [Сканирование архивов](/user-guide/agent/scan-archive.md).
:::
## Механизм резолва при отсутствии lock-файла
При отсутствии lock-файла для некоторых пакетных индексов система выполняет разрешение транзитивных OSS зависимостей следующим образом:
* Maven
* для формата pom.xml и build.gradle генерация maven-dependency-tree через соответствующий плагин maven
* используются Maven версии 3.8.8 и OpenJDK версии 11
* PyPi
* генерация poetry.lock с помощью пакетного менеджера Poetry
* используется Python версии 3.11.7
* NPM
* генерация yarn.lock с помощью пакетного менеджера Yarn
* используется Node.js версии 20.9.0
* Nuget
* для формата csproj и sln генерация project.assets.json с помощью встроенных инструментов nuget
* используется .NET SDK версии 8.0.404
* Packagist
* генерация composer.lock с помощью пакетного менеджера Composer
* используется PHP версии 8.2.26
* Rubygems
* генерация Gemfile.lock с помощью пакетного менеджера Bundler
* используется Ruby версии 3.1.2p20
Самостоятельная генерация lock-файлов системой не может давать результат в 100% случаев, так как результат часто зависит от окружения.
## Разрешение зависимостей в окружении
Пакетные менеджеры некоторых экосистем по умолчанию не включают транзитивные зависимости в манифесты. Для качественного проведения композиционного анализа при работе с ними рекомендуется применять механизм [разрешения зависимостей в окружении сборки](/user-guide/agent/resolve.md).
При разрешении зависимостей в окружении система проверяет отсутствие lock-файла, самостоятельно запускает пакетный менеджер или инструмент сборки и формирует полный список компонентов с учетом корректной версии сборки. На данный момент функциональность доступна для следующих экосистем:
* .NET
* Go
* Gradle
* Maven
* npm
* Poetry
* sbt
* yarn
* Conda
## Механизм поиска зависимостей по хэшам
Поиск по хэшам подразумевает определение непосредственного включения библиотек в код проектов путём копирования. В рамках этого механизма происходит хэширование всех файлов проекта и сверка этих сигнатур с известными нам open source библиотеками.
В данный момент поиск по хэшам происходит для следующих индексов пакетных менеджеров по следующим типам файлов:
* Maven
* `.jar`
* `.war`
* `.ear`
* npm
* `.min.js`
* PyPI
* `.whl`
* `.egg`
* Nuget
* `.nupkg`
От платформы в облако **не уходят** хэши файлов, размер которых не превышает 512 байт.
## Сканирование сборки для языков C и C++
В случае, если для сборки C/С++ проекта не используется пакетный менеджер Conan и соответствующие манифесты, для получения списка используемых библиотек можно использовать специальный [режим для анализа вывода процесса сборки](/user-guide/agent/scan-build.md).
В данном режиме консольный агент Johnny анализирует процесс сборки, используя флаги компилятора и выявляя использованные библиотеки. Далее с помощью системного кэша определяется местоположение библиотек и их источник.
---
url: /functionality/standards.md
---
# Соответствие стандартам
Платформа **CodeScoring** помогает организациям соответствовать стандартам безопасной разработки и требованиям регуляторов.
Система покрывает ключевые практики безопасной разработки, включая контроль качества исходного кода, контроль безопасности стороннего ПО, поиск уязвимостей, поиск конфиденциальной информации (секретов) и реагирование на инциденты безопасности в цепочке поставок.
## ГОСТ Р 56939–2024
ГОСТ Р 56939–2024 *«Разработка безопасного программного обеспечения. Общие требования»* регламентирует этапы, требования и методы безопасной разработки программного обеспечения, включая архитектурные практики, анализ кода и обработку зависимостей.
**CodeScoring обеспечивает выполнение 8 пунктов стандарта из 25:**
| Требование | Модуль реализации | Комментарий |
|------------|------------------|-------------|
| **5.9 Экспертиза исходного кода** | CodeScoring.TQI | Обеспечивается автоматизированная экспертиза качества кода с использованием метрик (цикломатическая сложность, дублирование, динамика изменений). Поддерживается системная оценка качества и сопровождения кода в процессе разработки. |
| **5.12 Использование безопасной системы сборки ПО**
**5.13 Обеспечение безопасности сборочной среды ПО** | CodeScoring.OSA, CodeScoring.SCA, CodeScoring.Save | Анализируются зависимости, применяемые при сборке, выявляются небезопасные компоненты. Контроль состава ПО выполняется до запуска сборки, что позволяет снизить риск привнесения уязвимостей и ошибок со стороны системы и среды сборки в соответствии с целями 5.12.1.1 и 5.13.1.1. |
| **5.15 Безопасность используемых секретов** | CodeScoring.Secrets | Выполняется поиск ключей, паролей, токенов и других секретов в исходном коде, истории коммитов и конфигурационных файлах. Применяются методы машинного обучения для снижения числа ложноположительных срабатываний. |
| **5.16 Композиционный анализ** | CodeScoring.SCA | Выполняется анализ всех зависимостей, включая транзитивные, с определением их источников, лицензий и известных уязвимостей. Формируется и актуализируется перечень зависимостей (ППК, SBOM), что обеспечивает контроль состава, выявление уязвимостей и применение корректирующих мер в цепочке поставок. |
| **5.17 Проверка на внедрение вредоносного ПО через цепочку поставок** | CodeScoring.OSA, CodeScoring.SCA, CodeScoring.Save | Обеспечивается контроль сторонних библиотек и компонентов, используемых в проекте. Реализуется:
• *5.17.2.4* – выявление и контроль предсобранного ПО поставщика;
• *5.17.2.5* – анализ зависимостей на предмет внедрения вредоносного кода (за исключением антивирусной проверки, которая относится к дополнительным средствам защиты). |
| **5.23 Реагирование на информацию об уязвимостях** | CodeScoring.OSA, CodeScoring.SCA, CodeScoring.Secrets | Обеспечивается регулярное обновление базы уязвимостей и автоматическое оповещение о новых рисках. Поддерживается интеграция с корпоративными системами (почта, менеджер задач), что позволяет инициировать своевременное реагирование в рамках политики безопасности организации. |
| **5.24 Поиск уязвимостей при эксплуатации** | CodeScoring.SCA | Реализована возможность регулярной перепроверки выпущенных сборок для рекуррентного поиска уязвимостей. Выполняются оповещения о новых уязвимостях в рамках анализа исходного кода, контейнерных образов и SBOM-файлов на этапе эксплуатации. |
Более подробно ознакомиться с функциональностью платформы можно в разделе [Функциональные характеристики](/functionality.md).
---
url: /admin-guide/server-requirements.md
---
# Требования к установке
## Операционная система
Установка on-premise версии возможна на **GNU/Linux** дистрибутивы (включая отечественные: AstraLinux, AltLinux, RedOS и иные).
:::warning Требование к файловой системе
Для установки CodeScoring требуется POSIX-совместимая файловая система с поддержкой прав доступа Unix.
:::
## Ресурсы сервера
### Базовые требования для рабочей среды
* Минимально допустимые требования для серверов приложения: **32Gb RAM, 16 ядер CPU**.
:::warning Рекомендация по ресурсам
Для установки в рабочей среде не рекомендуется опускаться ниже указанных значений, так как это может приводить к деградации производительности и нестабильной работе платформы.
:::
:::warning Рекомендация по CPU
Используйте CPU, совместимый с семейством Intel Scalable Gen 2.
Для работы CodeScoring требуются инструкции CPU, которые могут отсутствовать в старых CPU.
:::
### Требования к сервисам данных
* **PostgreSQL**: от **32Gb RAM**;
* **Redis**: от **2Gb RAM**;
* Размер `shm` для **PostgreSQL**: не менее **4Gb**;
* При использовании [внешней базы данных](/admin-guide/external-database.md) для **PostgreSQL** рекомендуется от **64Gb RAM**.
### Требования к хранилищу
* Для модуля **CodeScoring.SCA** при использовании VCS-проектов объем тома `analysis-root` рассчитывается из размера анализируемых репозиториев, умноженного на три;
* Для модуля **CodeScoring.SCA** при использовании CLI-проектов и для модуля **CodeScoring.OSA** отдельные требования по формуле `×3` не предъявляются;
* При оффлайн-установке для базы данных [CodeScoring Index](/user-guide/general/feeds.md) необходимо выделять от **300Gb** с запасом под последующие обновления;
### Пример высоконагруженной инсталляции
* Сервер базы данных: **96Gb RAM, 24 ядер CPU**;
* Сервер приложений: **192Gb RAM, 48 ядер CPU**.
## Поддерживаемые версии внешних сервисов
При использовании собственных экземпляров баз данных убедитесь, что их версии соответствуют требованиям ниже:
### Redis
* Минимальная версия: **7.0.0**;
* Протестированная версия: **7.4.9**.
### PostgreSQL
* Минимальная версия: **15.x** (любая минорная);
* Протестированная версия: **15.15**.
Использование других мажорных веток не гарантирует корректный результат и может приводить к ошибкам или снижению производительности.
## Внешние запросы
Для установки системы должен быть доступен Docker Registry с образами CodeScoring, адрес которого предоставляется вместе с ключом активации.
Для корректной работы с сервера также должен быть доступен адрес `index.codescoring.ru` с постоянно актуализируемой базой известных пакетов, их атрибутов и уязвимостей.
Из Index API платформа получает обогащенную информацию по найденным зависимостям, их лицензиям и уязвимостями.
Общая архитектура работы представлена на изображении ниже.

Из платформы в облако CodeScoring не отправляется исходный код, но для получения информации по зависимостям и лицензионного контроля отправляются:
1. анонимизированные данные по найденным манифестам пакетных менеджеров и их содержимому;
2. хэши файлов исходного кода для поиска прямых включений Open Source библиотек в код проектов;
3. количество активных авторов за последний год;
4. количество проектов в системе;
5. версия платформы.
Пути манифестов и названия хэшируемых файлов специально анонимизируются. От платформы в облако **не уходят** хэши файлов, размер которых не превышает 512 байт.
Пример содержимого запроса от платформы к Index API с данными по манифестам пакетных менеджеров:
```json
[
{
"path": "114bc73d-a9ba-433d-9a3e-f2b29d822204",
"type": "file",
"extension": ".txt",
"result": {
"platform": "pypi",
"dependencies": [
{
"name": "django",
"requirement": "==3.0.0",
"resolved_requirement": "3.0.0",
"env": "dev"
}
],
"kind": "manifest",
"success": true,
"extra": {}
}
},
{
"path": "efde2364-dc0c-45a9-905a-a487b3361ac7",
"type": "file",
"extension": ".xml",
"result": {
"platform": "maven",
"dependencies": [
{
"name": "org.liquibase:liquibase-core",
"requirement": "3.6.2",
"resolved_requirement": "3.6.2",
"env": "compile"
},
{
"name": "xpp3:xpp3",
"requirement": "1.1.4c",
"resolved_requirement": "1.1.4c",
"env": "compile"
}
],
"kind": "manifest",
"success": true,
"extra": {}
}
},
{
"path": "49dd4c09-b5de-474a-998a-3ce0a94a5221",
"type": "file",
"extension": ".txt",
"result": {
"platform": "pypi",
"dependencies": [
{
"name": "apt-wrapper",
"requirement": "==1.18",
"resolved_requirement": "1.18",
"env": "runtime"
},
{
"name": "django",
"requirement": "==2.0.0",
"resolved_requirement": "2.0.0",
"env": "runtime"
},
{
"name": "text-unidecode",
"requirement": "==1.3",
"resolved_requirement": "1.3",
"env": "runtime"
}
],
"kind": "manifest",
"success": true,
"extra": {}
}
}
]
```
Пример содержимого запроса от платформы к Index API с данными по хэшам файлов исходного кода:
```json
[
{
"id": "ca028ad9-0676-4c85-a5b0-9bf81fba6fcc",
"ext": ".xml",
"sha256": "e01c736a351633932e8b3ed041e553f67968e07d35d2c153b02b60e910a8c433"
}
]
```
---
url: /admin-guide/installation.md
---
# Установка системы
1. Установить Docker Engine под нужную операционную систему в соответствии с документацией: https://docs.docker.com/engine/install/.
2. Авторизоваться в приватном реестре Docker-образов системы «CodeScoring» при помощи команды `docker login REGISTRY_URL`, используя адрес, логин и пароль, полученные от вендора.
3. Скачать полученный от вендора архив с установочными файлами, распаковать.
4. Перейти в консоли в созданную директорию.
5. Скопировать шаблонный файл с настройками:
```bash
cp app.env.template app.env
```
Как правило, для корректной работы никаких изменений в файле не требуется. При необходимости настройки работы **CodeScoring** через прокси, обратите внимание на [инструкцию](/admin-guide/proxy.md).
6. Скопировать шаблонный файл с секретами:
```
cp .env.template .env
```
Настроить параметры конфигурации в новом файле.
* Список доменов для правильной работы CSRF защиты. Рекомендуется перечислить localhost на внутреннем и внешнем портах, а также внешний домен (или сочетание ip:порт). Если не менять параметры в файле, то по умолчанию система будет доступна по адресу `http://localhost:8081`. Указание протокола является обязательным, например:
* `DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost:18000,https://localhost:8081,https://внешний ip:8081`
* Параметры подключения к базе данных PostgreSQL. База поставляется вместе с установкой. Указание доступов отдельно является мерой предосторожности и контроля. При использовании собственной базы данных необходимо убедиться, что она соответствует [требованиям](/admin-guide/server-requirements/index.md#_4).
* `POSTGRES_DB` — название базы данных
* `POSTGRES_USER` — имя пользователя. При использовании собственной базы необходимо убедиться, что пользователь имеет следующие права: **Superuser**, **Create role**, **Create DB**, **Replication**, **Bypass RLS**.
* `POSTGRES_PASSWORD` — пароль
* `POSTGRES_HOST` - хост, на котором доступна база данных
* `POSTGRES_PORT` - порт, на котором доступна база данных
* Секрет платформы
* `SECRET_KEY` — случайная строка символов
* Настройки домена системы
* `NGINX_HOST` — хост, на котором будет доступна система
* `NGINX_PORT` — порт, на котором будет доступна система
* `SITE_SCHEME` - протокол передачи данных, по умолчанию https
* Пути исключений
* `ANALYSIS_IGNORED_PATHS` - список путей, которые будут игнорироваться системой при анализе. Подробнее с добавлением путей исключения можно ознакомиться [тут](/admin-guide/analysis-ignore-paths.md)
* Версия системы
* `CODESCORING_VERSION` – обязательная переменная. Актуальную версию можно узнать в разделе [Changelog](/changelog/on-premise-changelog.md)
* Настройки Docker Compose
* `COMPOSE_PROJECT_NAME` - название проекта в Compose, используется как префикс для ресурсов, создаваемых Docker Compose
:::warning Символ #
Не используйте в параметрах символ `#`, он может некорректно восприниматься системой при установке.
:::
:::note SSL-сертификаты
В случае необходимости работы системы с самоподписанными сертификатами перед запуском прочтите [инструкцию по добавлению сертификата](/admin-guide/self-signed-ssl.md).
:::
7. Выполнить команду установки CodeScoring (выполнение команды должно быть с правами суперпользователя системы):
```bash
docker compose -f ./docker-compose.yml up -d --force-recreate --remove-orphans --renew-anon-volumes
```
8. Для просмотра логов можно использовать команду:
```bash
docker compose logs -f
```
9. После запуска сервис будет доступен по настроенному домену или адресу `http://localhost:8081`. При первом запуске дополнительно выполняются миграции базы данных, операция может занять больше времени, чем при последующих запусках.
**Примечание**: для работы платформы по протоколу HTTPS нужен внешний балансировщик, который реализует терминирование SSL.
10. Для входа в систему необходимо предварительно создать пользователя с правами администратора с помощью следующей команды:
```bash
docker compose exec -it backend python ./manage.py createsuperuser
```
11. Для изменения пароля администратора можно использовать следующую команду:
```bash
docker compose exec -it backend python ./manage.py changepassword
```
---
url: /admin-guide/external-database.md
---
# Работа платформы CodeScoring в Docker Compose со внешней СУБД
1. В случае, если необходимо использовать схему, отличную от `public`, необходимо явно задать
`search_path` для пользователя, включив в него целевую схему, чтобы обеспечить корректное разрешение объектов:
```sql
ALTER USER codescoring_user_name SET search_path = non_default_schema_name;
```
2. Необходимо сконфигурировать соответствующие параметры в файле `.env`:
* `POSTGRES_DB`
* `POSTGRES_USER`
* `POSTGRES_PASSWORD`
* `POSTGRES_HOST`
* `POSTGRES_PORT`
3. Для администрирования платформы необходимо применять файл `external-db.override.yml`, который поставляется вместе с файлом `docker-compose.yml`:
* Запуск платформы:
```bash
docker compose -f ./docker-compose.yml -f external-db.override.yml up -d --force-recreate --remove-orphans --renew-anon-volumes
```
* Просмотр логов:
```bash
docker compose -f ./docker-compose.yml -f external-db.override.yml logs -f
```
* Остановка платформы:
```bash
docker compose -f ./docker-compose.yml -f external-db.override.yml down --remove-orphans
```
---
url: /admin-guide/installation-in-k8s.md
---
# Работа системы в Kubernetes
## Установка с помощью Helm-чарта {#helm-installation}
**Порядок установки:**
1. Создать namespace.
```
kubectl create namespace codescoring
```
2. Создать secret для доступа к приватному реестру Docker-образов системы "CodeScoring", используя адрес (`REGISTRY_URL`), логин (`USERNAME`) и пароль (`PASSWORD`), полученные от вендора.
```
kubectl create secret docker-registry codescoring-regcred --docker-server=REGISTRY_URL --docker-username=USERNAME --docker-password=PASSWORD -n codescoring
```
Альтернативно, можно создать секрет для доступа к реестру с помощью `values.yaml`, добавив в поле .Values.imagePullSecrets запись вида
```yaml
registry.org: |
{"auths":{"registry.org":{"auth":""}}}
```
3. Установить [Helm](https://helm.sh/docs/intro/install/) предпочтительным способом.
4. Выполнить следующие команды для добавления актуального Helm-репозитория на локальную машину:
```
helm repo add codescoring-org https://{REGISTRY_URL}/repository/helm/ --username USERNAME --password PASSWORD
helm repo update
```
## Настройки параметров Helm-чарта {#helm-parameters}
:::warning Важно
Настоятельно рекомендуется вносить необходимые изменения **до установки CodeScoring**, в противном случае может потребоваться полная переустановка системы. Данные инструкции предполагают, что **специалист имеет опыт работы с кластером Kubernetes и утилитой Helm**.
:::
:::tip
Все представленные в данном документе ограничения вычислительных ресурсов являются приблизительными. Реальное потребление ресурсов компонентами зависит от нагруженности и конкретных сценариев использования инсталляции.
:::
Для удобного редактирования параметров CodeScoring можно скачать и распаковать исходный код Helm-чарта командой:
```
helm pull codescoring-org/codescoring-helm --version CHART_VERSION --untar --untardir codescoring-src && cd codescoring-src
```
В файле `values.yaml` можно отредактировать нужные переменные, и после этого, находясь в каталоге с исходным кодом Helm-чарта, выполнить команду установки:
```
helm install codescoring . -f values.yaml -n codescoring --atomic --version CHART_VERSION
```
Структура чарта предполагает, что абсолютно вся конфигурация, вплоть до описания Kubernetes-ресурсов, описывается в `values.yaml`, из-за чего данный файл является довольно объемным и его редактирование может быть не столь удобно.
Вполне допустимо и даже рекомендуется, при необходимости в переопределении каких-либо параметров, создать дополнительный файл с произвольным именем, например, `values-override.yaml` (здесь и далее этот файл будет называться именно так), в котором и переопределить значения необходимых полей.
Для удобства с чартом поставляется шаблон файла `values-override.yaml`.
В таком случае команда установки будет выглядеть так (порядок указания файлов имеет значение):
```
helm install codescoring . -f values.yaml -f values-override.yaml -n codescoring --atomic --version CHART_VERSION
```
### Установка с использованием встроенных PostgreSQL и Redis {#internal-postgresql-and-redis}
Чарт предусматривает возможность развертывания PostgreSQL и Redis. Для этого предусмотрены ресурсы StatefulSet.
Чтобы активировать установку PostgreSQL и Redis, необходимо определить следующие параметры в `values-override.yaml`:
```yaml
statefulSets:
codescoring-postgresql:
enabled: true
containers:
postgresql:
resources:
limits:
cpu: 2000m
memory: 12Gi
requests:
cpu: 1m
memory: 500Mi
codescoring-redis:
enabled: true
containers:
redis:
resources:
limits:
cpu: 2000m
memory: 4Gi
pvcs:
codescoring-postgresql:
accessModes:
- ReadWriteOnce
size: 20Gi
storageClassName: "default"
codescoring-redis:
accessModes:
- ReadWriteOnce
size: 1Gi
storageClassName: "default"
```
При использовании встроенных баз данных дополнительная конфигурация параметров подключения не требуется.
### Подключение к внешним базам данных {#external-databases}
:::warning Важно
При использовании собственной базы данных необходимо убедиться, что она соответствует [требованиям](/admin-guide/server-requirements.md#_4).
:::
#### Подключение к внешнему Redis {#external-redis}
Для подключения к внешнему Redis, необходимо указать соответствующие строки подключения в следующих полях, соблюдая соответствие номеров баз данных:
```yaml
configMaps:
ipcs-backend-env:
data:
DJANGO_CACHES_REDIS_URL: "redis://codescoring-redis:6379/1"
HUEY_REDIS_URL: "redis://codescoring-redis:6379/0"
CELERY_BROKER_URL: "redis://codescoring-redis:6379/2"
CELERY_RESULT_BACKEND: "redis://codescoring-redis:6379/2"
```
#### Подключение к PostgreSQL через пулер Pgbouncer {#external-postgres}
:::warning Важно
Подключение к внешней PostgreSQL необходимо выполнять с использованием пулера соединений.
:::
Данный вариант подходит, если в существующей инфраструктуре уже развернута PostgreSQL, но пулер соединений не используется. Helm-чарт развернет пулер [Pgbouncer](https://github.com/pgbouncer/pgbouncer) и подключит его к существующей PostgreSQL. Необходимо выполнить следующие действия:
1. Сконфигурировать пулер соединений, указав соответствующие данные в следующих полях:
```yaml
secrets:
pgbouncer-secrets:
data:
# секреты для подключения pgbouncer к PostgreSQL
POSTGRES_DB: "codescoring_db"
POSTGRES_USER: "codescoring_user"
POSTGRES_PASSWORD: "changeme"
# секреты для внутренних пулов pgbouncer
TRANSACTION_POOL_PASSWORD: "changeme"
SESSION_POOL_PASSWORD: "changeme"
STATS_USER: "codescoring_user-stats"
STATS_PASSWORD: "changeme"
ADMIN_USER: "codescoring_user-admin"
ADMIN_PASSWORD: "changeme"
configMaps:
pgbouncer-env:
data:
# параметры подключения pgbouncer к PostgreSQL
POSTGRES_HOST: "codescoring-postgresql"
POSTGRES_PORT: "5432"
# параметры для внутренних пулов pgbouncer
TRANSACTION_POOL_USER: "codescoring_user"
SESSION_POOL_USER: "codescoring_user-session"
TRANSACTION_POOL_SIZE: "50"
TRANSACTION_POOL_MIN_SIZE: "1"
SESSION_POOL_SIZE: "50"
SESSION_POOL_MIN_SIZE: "1"
# виртуальные базы данных pgbouncer, существуют только внутри него
TRANSACTION_POOL_DATABASE_NAME: "codescoring_generic"
SESSION_POOL_DATABASE_NAME: "codescoring_generic-session"
MAX_CLIENT_CONN: "500"
```
2. Передать созданные в пункте 1 конфигурационные параметры компонентам CodeScoring:
```yaml
secrets:
ipcs-secrets:
data:
# секреты для подключения к пулам из pgbouncer-secrets
TRANSACTION_POOL_PASSWORD: "changeme"
SESSION_POOL_PASSWORD: "changeme"
DATABASE_PASSWORD: "changeme" # соответствует TRANSACTION_POOL_PASSWORD
configMaps:
ipcs-backend-env:
data:
# параметры подключения osa-api и judge
DATABASE_HOST: "pgbouncer"
DATABASE_PORT: "6432"
DATABASE_USERNAME: "codescoring_user" # соответствует TRANSACTION_POOL_USER
DATABASE_NAME: "codescoring_db" # соответствует TRANSACTION_POOL_DATABASE_NAME
TRANSACTION_POOL_HOST: "pgbouncer"
TRANSACTION_POOL_PORT: "6432"
TRANSACTION_POOL_USER: "codescoring_user"
TRANSACTION_POOL_DATABASE_NAME: "codescoring_db"
SESSION_POOL_HOST: "pgbouncer"
SESSION_POOL_PORT: "6432"
SESSION_POOL_USER: "codescoring_user-session"
SESSION_POOL_DATABASE_NAME: "codescoring_generic-session"
```
### Настройка томов {#volumes}
#### Dynamic Volume Provisioning с использованием требуемого StorageClass {#dynamic-volume-provisioning}
Чарт создает необходимые тома через [Dynamic Volume Provisioning](https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/) с использованием указанного явно `StorageClass`.
Для создания ресурсов PersistentVolumeClaim необходимо заполнить следующую секцию values:
```yaml
pvcs:
# storageClassName необходимо заменить на используемый в кластере
codescoring-ipcs-django-static:
accessModes:
- ReadWriteOnce
size: 10Gi
storageClassName: "default"
codescoring-ipcs-analysis-root:
accessModes:
- ReadWriteOnce
size: 10Gi
storageClassName: "default"
codescoring-ipcs-media-root:
accessModes:
- ReadWriteOnce
size: 10Gi
storageClassName: "default"
```
Если кластер поддерживает тома с типом доступа ReadWriteMany (RWX), то рекомендуется использовать именно его, так как в этом случае допустимо размещение компонентов инсталляции на разных нодах кластера.
Если же поддержки RWX в кластере нет, либо есть необходимость в использовании RWO по иным причинам, рекомендуется настроить podAffinity, чтобы поды, использующие одни и те же тома были назначены на одну ноду:
Для этого необходимо добавить следующий блок в `values-override.yaml`:
```yaml
deploymentsGeneral:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: codescoring-component
operator: In
values:
- backend
- frontend
- huey
- celery
topologyKey: kubernetes.io/hostname
```
#### PersistentVolumeClaim для заранее созданных PersistentVolume {#persistentvolumeclaim-for-precreated-pv}
Названия предварительно созданных PersistentVolume можно указать в поле `volumeName`, например:
```yaml
pvcs:
codescoring-ipcs-analysis-root:
accessModes:
- ReadWriteOnce
size: 10Gi
storageClassName: "default"
volumeName: "codescoring-precreated-pv"
```
### Настройка ограничения ресурсов (resource limits) {#resource-limits}
По умолчанию `requests` и `limits` заданы в демонстрационных объемах, не предназначенных для продуктивного использования. Это сделано для обеспечения возможности запуска системы CodeScoring в кластерах с малым количеством ресурсов (например, minikube) c целью тестирования.
При запуске в **production-окружении** может потребоваться настроить ограничение ресурсов. Это можно сделать, отредактировав следующие поля:
#### Ограничение ресурсов для init-контейнеров {#init-container-limits}
```yaml
# ограничения, применяемые ко всем init-контейнерам
# редактирование данного поля возможно только в values.yaml, override невозможен из-за ограничений yaml-структур
init-container-resources: &init-container-resources
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 1m
memory: 100Mi
# отдельно настраиваются ограничения init-контейнеров компонента backend
deployments:
ipcs-backend:
initContainers:
ipcs-collectstatic:
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 1m
memory: 500Mi
ipcs-migrate:
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 1m
memory: 500Mi
```
#### Настройка ограничений ресурсов для основных контейнеров компонентов {#main-components-resources}
В общем виде ресурсы конфигурируются по следующему шаблону:
```yaml
deployments:
:
containers:
:
resources:
limits:
cpu: 8000m
memory: 12Gi
requests:
cpu: 1m
memory: 500Mi
```
Возможно указание как `requests` и `limits` вместе, так и по отдельности. Однако, при указании только `limits`, Kubernetes автоматически выставит `requests` в таком же объеме, что может негативно сказаться на назначении подов на ноды.
### Добавление сертификата удостоверяющего центра (CA) {#ca-certificate}
Для доступа CodeScoring к ресурсам с TLS-сертификатами, подписанными корпоративным удостоверяющим центром (CA) необходимо добавить корневой сертификат удостоверяющего центра (RootCA) в `values.yaml` в формате `ключ: значение`,
где ключ - имя файла сертификата, включая расширение `.crt`, значение - сертификат в формате PEM, в следующее поле:
```yaml
secrets:
ca-certificates:
data:
my-root-CA.crt: |-
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA3MQswCQYDVQQGEwJERTEP
MA0GA1UEChMGZWR1UEtJMRcwFQYDVQQDEw5lZHVQS0kgVGVzdCBDQTAeFw0xMDAz
MzExMjIwMjRaFw0zMDAzMjYxMjIwMjRaMDcxCzAJBgNVBAYTAkRFMQ8wDQYDVQQK
EwZlZHVQS0kxFzAVBgNVBAMTDmVkdVBLSSBUZXN0IENBMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAt5IxCk/NQPOLqeA1lGuB3pvqHGQPxRQ1udYGcXQY
t7EuSMFymUR9m5TsifG1ktktJTtOWyaWFC4ac0vai49wGVeuDYptfZBoHLIUvCwN
DOofLYHxk04WzfrtSiUTptn1o6QPOw8YR0XH30MEi1zgD8fLMZmVTJ+XwA5Eus6c
XtTmI4XhNrHUtvWt4UsNgLmp5/djUgRMpNqxIdrpFQzl+XycRJRAaoAwUzHFl14t
49qwBhGChxQ8AdDMQGA7kv6VR8o0ktCPv3a4GQbs8+z0cX0w5dC+XhJ1xpqW6TOg
qAY9XBFIDe5j21hjKmNZ39rsODVGUS2wUtNEhSz+3YqxLwIDAQABo2MwYTAdBgNV
HQ4EFgQUqHe3saMjZZLan8RlFJs+Xuz4yiAwHwYDVR0jBBgwFoAUqHe3saMjZZLa
n8RlFJs+Xuz4yiAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQEFBQADggEBAEjQGyHZQis47c2kf+zXJJoDDlRgFzr9xfcnrHFaJvYx
nuqNE0T+xmujnwGm3VrgddeAQJuW3sD6y0Ox8NgL4z886VFeaDQ0GmFPI6HEVtg6
mixMhi+YzdkC+PFrEdYUeVNNwVO+bvJb1Rc08BYU4v7VtTkssHjru76E2/ahn/Ct
kaVTEojEWeRaxsw5/0VLkgyf8SwDaukM2aamqgEzfsw5GTdSAh7ERZKc+zF7Sr5s
DY8c5lOmyCwuNh9ODuw4cAThICrn7G8bh8ZyxLyj4Znxh0X45SwMZKTmYLfy9ab8
b/j7FK8uBNRL+pXl9HGBWAFA01uJw4HkYK+Uo+RcAzo=
-----END CERTIFICATE-----
```
Допустимо указание неограниченного количества файлов, но **критически важно, чтобы каждый сертификат был в отдельном файле**.
### Переменные окружения {#environment-variables}
#### Управление переменными окружения через values {#values-environment-variables}
Переменные окружения, а также конфигурационные файлы, используемые компонентами инсталляции, описаны в блоках `configMaps` и `secrets` в `values.yaml`.
В `values-override.yaml` вынесены наиболее часто переопределяемые параметры конфигурации.
#### Управление переменными окружения через External Secret {#external-secret-environment-variables}
Также присутствует возможность подключать внешние хранилища секретов. Для этого в кластере должен быть установлен **External Secrets Operator (ESO)**. Он добавляет в кластер необходимые CRD (Custom Resource Definition) и обеспечивает связь с хранилищем секретов.
Для создания ресурса `ExternalSecret` и подключения его к существующему `SecretStore` необходимо добавить соответствующую запись в блок `vaults`:
```yaml
vaults:
ipcs-backend-secret-external: # название секрета, который будет создан в результате
apiVersion: external-secrets.io/v1 # по умолчанию external-secrets.io/v1beta1
enabled: true
store:
name: vault-backend # имя предварительно созданного SecretStore
kind: ClusterSecretStore # тип предварительно созданного SecretStore
path: secret/data/my-vault-secret # путь до секрета в Vault
```
Для передачи созданного секрета всем ресурсам `Deployment`, в поле `deploymentsGeneral.envSecrets` необходимо добавить в список название ресурса из блока `vaults`, например:
```yaml
deploymentsGeneral:
envConfigmaps:
- ipcs-backend-env
envSecrets:
- ipcs-secrets
- ipcs-backend-secret-external # имя ресурса из vaults
```
Для передачи секрета только одному ресурсу `Deployment`, необходимо указать его в блоке `deployments` наряду со всеми секретами, которые уже используются данным ресурсом, например:
```yaml
deployments:
ipcs-backend:
envSecrets:
- ipcs-secrets
- ipcs-backend-secret-external
```
## Миграция с Helm Chart 2.x.x {#helm-chart-migration}
:::warning Важно
Если использовалась встроенная PostgreSQL, перед любыми манипуляциями необходимо сделать бэкап.
:::
Во время миграции инсталляция будет недоступна, поэтому рекомендуется выделять технологическое окно. Для проведения работ потребуется суммарно 5-10 минут.
Шаги для миграции:
1. Удалить все ресурсы Deployment `kubectl delete deployment --all -n codescoring`
2. Удалить все ресурсы Service `kubectl delete service --all -n codescoring`
3. Выполнить helm upgrade, предварительно заполнив values.yaml и values-override.yaml согласно пункту [Настройки параметров Helm-чарта](#helm-parameters):
```bash
helm upgrade codescoring codescoring-org/codescoring-helm --version -f values.yaml -f values-override.yaml -n codescoring
```
---
url: /admin-guide/installation-in-k8s-legacy.md
---
# Работа системы в Kubernetes (legacy)
:::warning Legacy-версия
Эта страница описывает legacy-версию Helm-чарта. Для новых установок используйте актуальную инструкцию [Работа системы в Kubernetes](/admin-guide/installation-in-k8s.md).
:::
## Установка с помощью Helm-чарта c параметрами по умолчанию {#helm-installation-default}
**Важно!**: Данный вариант установки не предоставляет возможность горизонтального масштабирования CodeScoring. Для установки CodeScoring с поддержкой горизонтального масштабирования обратитесь к соответствующему разделу документации ниже.
**Важно!**: Необходимо наличие настроенного default `StorageClass` в кластере. По умолчанию создаются тома **объемом 20 GiB**
**Порядок установки:**
1. Создать namespace.
```
kubectl create namespace codescoring
```
2. Создать secret для доступа к приватному реестру Docker-образов системы "CodeScoring", используя адрес (`REGISTRY_URL`), логин (`USERNAME`) и пароль (`PASSWORD`), полученные от вендора.
```
kubectl create secret docker-registry codescoring-regcred --docker-server=REGISTRY_URL --docker-username=USERNAME --docker-password=PASSWORD -n codescoring
```
3. Установить [Helm](https://helm.sh/docs/intro/install/) предпочтительным способом.
4. Выполнить следующие команды для добавления актуального Helm-репозитория на локальную машину:
```
helm repo add codescoring-org https://{REGISTRY_URL}/repository/helm/ --username USERNAME --password PASSWORD
helm repo update
```
5. Создать файл `values.yaml` со следующим содержимым:
**Важно!**: Пожалуйста, замените значения в полях с чувствительными данными на собственные. К таким полям относятся `secretKey`, `defaultSuperuserUsername`, `defaultSuperuserPassword`, `defaultSuperuserEmail`, а также все поля, содержащие `username` или `password`. Также важно учитывать, что все подобные переменные являются обязательными.
```
pgbouncer:
enabled: true
postgresql:
host: "codescoring-postgresql"
port: 5432
username: "codescoring"
password: "changeme"
database: "codescoring"
config:
transactionPoolSize: 50
transactionPoolMinSize: 1
sessionPoolSize: 50
sessionPoolMinSize: 1
transactionPoolDatabaseName: "codescoring"
sessionPoolDatabaseName: "codescoring-session"
codescoring:
config:
## codescoring-backend configuration parameters
siteScheme: https # схема сайта http или https
siteHost: "codescoring.k8s.local" # домен, по которому будет доступен CodeScoring
djangoCSRFTrustedOptions: "https://codescoring.k8s.local" # Домен, по которому будет доступен CodeScoring, включая схему
secretKey: "" # секретный ключ для бэкенда приложения, случайная строка символов
defaultSuperuserUsername: "admin" # имя администратора в системе
defaultSuperuserPassword: "changeme" # пароль администратора в системе
defaultSuperuserEmail: "mail@example.com" # e-mail администратора в системе
databaseHost: pgbouncer
databasePort: 6432
postgresqlDatabase: "codescoring"
postgresqlUsername: "codescoring"
postgresqlPassword: "changeme"
frontend:
ingress:
enabled: true
className: "nginx"
hosts:
- host: codescoring.k8s.local # домен, по которому будет доступен CodeScoring
paths:
- path: /
pathType: ImplementationSpecific
```
6. Выполнить команду для установки чарта
```
helm install codescoring codescoring-org/codescoring -n codescoring -f values.yaml --create-namespace --atomic --version CHART_VERSION
```
## Изменение пароля администратора {#changing-admin-password}
Для изменения пароля администратора без ручного редактирования файла `values.yaml` можно использовать следующую команду:
```bash
kubectl exec -it your-backend-pod -- python manage.py changepassword
```
## Расширенные настройки параметров Helm-чарта {#extended-helm-parameters}
**Важно!**: Настоятельно рекомендуется вносить необходимые изменения **до установки CodeScoring**, в противном случае может потребоваться полная переустановка системы. Данные инструкции предполагают, что **специалист имеет опыт работы с кластером Kubernetes и утилитой Helm**.
Для удобного редактирования параметров CodeScoring можно скачать и распаковать исходный код Helm-чарта командой:
```
helm pull codescoring-org/codescoring --version CHART_VERSION --untar --untardir codescoring-src && cd codescoring-src
```
В файле `values.yaml` можно отредактировать нужные переменные, и после этого, находясь в каталоге с исходным кодом Helm-чарта, выполнить команду установки
```
helm install codescoring . -f values.yaml -n codescoring --atomic --version CHART_VERSION
```
### Подключение к внешним PostgreSQL и Redis {#external-databases}
По умолчанию PostgreSQL и Redis запускаются в отдельных `StatefulSet`. Данный вариант может не подходить для использования в **production-окружении** , т.к. не является отказоустойчивым.
**Важно**: При использовании собственной базы данных необходимо убедиться, что она соответствует [требованиям](/admin-guide/server-requirements.md#_4).
#### Подключение к внешнему Redis {#external-redis}
Для подключения к внешнему Redis, необходимо выполнить следующие действия:
1. Отключить развертывание Redis, указав переменную - `redis.enabled: false`
2. В переменных `codescoring.config.djangoCachesRedisUrls` и `codescoring.config.hueyRedisUrl` указать строки подключения для внешнего Redis.
##### Подключение к внешнему Redis с использованием TLS {#external-redis-tls}
Для подключения к внешнему Redis с использованием TLS, дополнительно необходимо:
1. Задать значение `true` в переменной `codescoring.trustedCA.enabled`
2. Добавить корневой сертификат сервера Redis в `codescoring.trustedCA.certificates`
3. В переменных `codescoring.config.djangoCachesRedisUrls` и `codescoring.config.hueyRedisUrl` указать строки подключения для внешнего Redis в формате `rediss://redis.example.com:6379/0`, где 0 - номер базы данных в Redis.
#### Подключение к PostgreSQL через пулер Pgbouncer {#external-postgres}
**Важно!**: Подключение к внешней PostgreSQL необходимо выполнять с использованием пулера соединений.
Данный вариант подходит, если в существующей инфраструктуре уже развернута PostgreSQL, но пулер соединений не используется. Helm-чарт развернет пулер [Pgbouncer](https://github.com/pgbouncer/pgbouncer) и подключит его к существующей PostgreSQL. Необходимо выполнить следующие действия:
1. Отключить развертывание PostgreSQL, указав переменную - `postgresql.enabled: false`
2. Подключить пулер Pgbouncer к внешней PostgreSQL, заменив соответствующие параметры на нужные:
```
pgbouncer:
postgresql:
host: "postgresql.example.host"
port: 5432
username: "codescoring"
password: "changeme"
database: "codescoring"
config:
transactionPoolSize: 50
transactionPoolMinSize: 1
sessionPoolSize: 50
sessionPoolMinSize: 1
transactionPoolDatabaseName: "codescoring"
sessionPoolDatabaseName: "codescoring-session"
codescoring:
config:
databaseHost: pgbouncer
databasePort: 6432
postgresqlDatabase: "codescoring"
postgresqlUsername: "codescoring"
postgresqlPassword: "changeme"
```
#### Подключение к внешнему пулеру PostgreSQL {#external-postgres-pooler}
Данный вариант подходит, если в существующей инфраструктуре уже развернута PostgreSQL и пулер соединений (например, PgBouncer).
В этом случае развертывание пулера Pgbouncer не требуется. Необходимо выполнить следующие действия:
1. Отключить развертывание PostgreSQL, указав переменную - `postgresql.enabled: false`
2. Отключить развертывание Pgbouncer, указав переменную - `pgbouncer.enabled: false`
3. Подключить codescoring напрямую к внешнему пулеру, в секции `codescoring.config` параметры:
```
posgtresqlHost: "external-pooler.example.host"
posgtresqlPort: 5432
postgresqlDatabase: "codescoring"
postgresqlUsername: "codescoring"
postgresqlPassword: "changeme"
```
4. Включить использование внешнего пулера и настроить параметры подключения в секции `codescoring.config.externalPooler`:
**Важно!**: Внешний пулер соединений должен поддерживать работу в двух режимах: транзакционном и сессионном. Данные для подключения к пулам указываются в соответствующих секциях: `externalPooler.transactionPool` и `externalPooler.sessionPool`.
```
externalPooler:
enabled: true
transctionPool:
host: "external-pooler.example.host"
port: 5432
username: "codescoring"
password: "changeme"
database: "codescoring"
sessionPool:
host: "external-pooler.example.host"
port: 5432
username: "codescoring-session"
password: "changeme"
database: "codescoring-session"
```
### Настройка томов (PV) {#volumes}
По умолчанию чарт создает необходимые тома через [Dynamic Volume Provisioning](https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/) с использованием `StorageClass` по умолчанию (default). В случае, если данный вариант развертывания томов не подходит, присутствует возможность гибко настроить создание томов несколькими способами.
**Важно!**: Описанные ниже опции являются **взаимоисключающими**. Необходимо выбрать **ТОЛЬКО ОДИН** вариант развертывания для каждого тома. Допускается выбор разных вариантов развертывания для разных томов.
:::tip
Для изменения размера создаваемых томов (за исключением локальных) необходимо изменить параметр `size` в соответствующих секциях
:::
#### Dynamic Volume Provisioning с использованием требуемого StorageClass {#dynamic-volume-provisioning}
Задать требуемый `StorageClass` можно в следующих переменных:
* `codescoring.persistentVolumes.analysisRoot.storageClass`
* `codescoring.persistentVolumes.mediaRoot.storageClass`
* `codescoring.persistentVolumes.djangoStatic.storageClass`
* `codescoring.backup.persistentVolume.storageClass`
* `redis.persistentVolume.storageClass` (если используется встроенный Redis)
* `postgresql.persistentVolume.storageClass` (если используется встроенная PostgreSQL)
В этом случае, будут созданы тома с использованием заданного `StorageClass`
#### PersistentVolumeClaim для заранее созданных PersistentVolume {#persistent-volume}
Название предварительно созданных томов можно задать в следующих переменных:
* `codescoring.persistentVolumes.analysisRoot.volumeName`
* `codescoring.persistentVolumes.mediaRoot.volumeName`
* `codescoring.persistentVolumes.djangoStatic.volumeName`
* `codescoring.backup.persistentVolume.volumeName`
* `redis.persistentVolume.volumeName` (если используется встроенный Redis)
* `postgresql.persistentVolume.volumeName` (если используется встроенная PostgreSQL)
В этом случае будут созданы только `PersistentVolumeClaim` для томов, заданных в этих переменных
#### Использование предварительно созданных PersistentVolumeClaim {#persistent-volume-claim}
Название предварительно созданных PVC можно задать в следующих переменных:
* `codescoring.persistentVolumes.analysisRoot.existingClaim`
* `codescoring.persistentVolumes.mediaRoot.existingClaim`
* `codescoring.persistentVolumes.djangoStatic.existingClaim`
* `codescoring.backup.persistentVolume.existingClaim`
* `redis.persistentVolume.existingClaim` (если используется встроенный Redis)
* `postgresql.persistentVolume.exsistingClaim` (если используется встроенная PostgreSQL)
В этом случае указанное название PVC будет подставлено в секцию `volumes` для `Pod` напрямую.
#### Использование локальных томов {#local-volumes}
При отсутствии в кластере Kubernetes внешнего хранилища данных возможен запуск CodeScoring с использованием локальных томов. В этом случае данные будут хранится на одной из нод кластера.
Для создания локальных томов необходимо выполнить следующие действия:
1. Присвоить значение `true` следующим переменным:
* `codescoring.persistentVolumes.analysisRoot.localVolume.enabled`
* `codescoring.persistentVolumes.mediaRoot.localVolume.enabled`
* `codescoring.persistentVolumes.djangoStatic.localVolume.enabled`
* `codescoring.backup.persistentVolume.localVolume.enabled`
* `redis.persistentVolume.localVolume.enabled` (если используется встроенный Redis)
* `postgresql.persistentVolume.localVolume.enabled` (если используется встроенная PostgreSQL)
2. Задать путь до **каталога на ноде кластера**, в котором будут размещены данные в следующих переменных:
* `codescoring.persistentVolumes.analysisRoot.localVolume.path`
* `codescoring.persistentVolumes.mediaRoot.localVolume.path`
* `codescoring.persistentVolumes.djangoStatic.localVolume.path`
* `codescoring.backup.persistentVolume.localVolume.path`
* `redis.persistentVolume.localVolume.path` (если используется встроенный Redis)
* `postgresql.persistentVolume.localVolume.path` (если используется встроенная PostgreSQL)
3. Указать название ноды, на которой будет создан локальный том в следующих переменных:
* `codescoring.persistentVolumes.analysisRoot.localVolume.nodeHostname`
* `codescoring.persistentVolumes.mediaRoot.localVolume.nodeHostname`
* `codescoring.persistentVolumes.djangoStatic.localVolume.nodeHostname`
* `codescoring.backup.persistentVolume.localVolume.nodeHostname`
* `redis.persistentVolume.localVolume.nodeHostname` (если используется встроенный Redis)
* `postgresql.persistentVolume.localVolume.nodeHostname` (если используется встроенная PostgreSQL)
Допускается использование разных нод для разных томов.
#### Настройка хранилища для временных файлов сканирований {#temporary-files-storage}
По умолчанию временные файлы в процессе сканирования хранятся в директории `/tmp` внутри контейнеров, к которой монтируются Ephemeral Volumes типа `emptyDir`:
* `codescoring.huey.ipcsQueue.ephemeralVolumes`
* `codescoring.huey.tasksOsaContainerImageScan.ephemeralVolumes`
* `codescoring.huey.tasksOsaPackageScan.ephemeralVolumes`
Однако в некоторых случаях может потребоваться использовать Persistent Volume вместо Ephemeral Volume. В таком случае следует закомментировать соответствующие секции в `ephemeralVolumes` для одного или нескольких сервисов, в зависимости от того, для каких сервисов требуется монтировать тома:
```
codescoring:
huey:
ipcsQueue:
ephemeralVolumes:
volumeMounts:
# - mountPath: /tmp
# name: ipcs-queue-tmp
- mountPath: /etc/ssl/certs
name: ipcs-queue-ssl-certs
volumes:
# - name: ipcs-queue-tmp
# emptyDir: {}
- name: ipcs-queue-ssl-certs
emptyDir: {}
tasksOsaContainerImageScan:
ephemeralVolumes:
volumeMounts:
# - mountPath: /tmp
# name: container-image-scan-tmp
- mountPath: /etc/ssl/certs
name: container-image-scan-ssl-certs
volumes:
# - name: container-image-scan-tmp
# emptyDir: {}
- name: container-image-scan-ssl-certs
emptyDir: {}
tasksOsaPackageScan:
ephemeralVolumes:
volumeMounts:
# - mountPath: /tmp
# name: package-scan-tmp
- mountPath: /etc/ssl/certs
name: package-scan-ssl-certs
volumes:
# - name: package-scan-tmp
# emptyDir: {}
- name: package-scan-ssl-certs
emptyDir: {}
```
После необходимо выставить значение `enabled: true` в одной или нескольких из следующих секций:
* `codescoring.huey.persistentVolumes.hueyTmp`
* `codescoring.huey.persistentVolumes.hueyPackageScanTmp`
* `codescoring.huey.persistentVolumes.hueyContainerImageScanTmp`
В результате будут созданы PersistentVolumeClaim для соответствующих сервисов. Стоит отметить, что возможности конфигурирования данных томов полностью соответствуют описанным в секции [Настройка томов (PV)](#volumes).
При горизонтальном масштабировании сервисов, необходимо произвести настройку томов в соответствии с инструкцией в разделе [Горизонтальное масштабирование CodeScoring](#horizontal-scaling).
### Горизонтальное масштабирование CodeScoring {#horizontal-scaling}
**Важно!**: Для горизонтального масштабирования системы CodeScoring необходимо наличие в кластере Kubernetes возможности создания томов с типом доступа **ReadWriteMany (RWX)**
Для горизонтального масштабирования CodeScoring необходимо создать тома `analysis-root`, `media-root` и `django-static` с типом доступа `ReadWriteMany`.
Для этого необходимо заменить значение `ReadWriteOnce` на `ReadWriteMany` в переменных:
* `codescoring.persistentVolumes.analysisRoot.accessModes`
* `codescoring.persistentVolumes.mediaRoot.accessModes`
* `codescoring.persistentVolumes.djangoStatic.accessModes`
Затем, необходимо закоментировать переменные:
* `codescoring.backend.affinity`
* `codescoring.frontend.affinity`
Если этого не сделать, то все поды будут запущены только на одной ноде кластера.
## Настройка ограничения ресурсов (resource limits) {#resource-limits}
По умолчанию `requests` и `limits` не заданы. Это сделано для обеспечения возможности запуска системы CodeScoring в кластерах с малым количеством ресурсов (например, minikube) c целью тестирования.
При запуске в **production-окружении** может потребоваться настроить ограничение ресурсов. Это можно сделать, задав следующие переменные:
* `postgresql.resources` (при использовании встроенной PostgreSQL)
* `redis.resources` (при использовании встроенного Redis)
* `codescoring.backend.resources`
* `codescoring.frontend.resources`
* `codescoring.huey.highPriorityQueue.resources`
* `codescoring.huey.ipcsQueue.resources`
* `codescoring.huey.tasksOsaContainerImageScan.resources`
* `codescoring.huey.tasksOsaPackageScan.resources`
* `codescoring.huey.tasksPolicy.resources`
* `codescoring.huey.tasksMedia.resources`
Возможно указание как `resources` и `limits` вместе, так и по отдельности, например:
```
codescoring:
backend:
resources:
limits:
cpu: 1000m
memory: 2000Mi
huey:
ipcsQueue:
resources:
limits:
cpu: 2000m
memory: 3000Mi
requests:
cpu: 1000m
memory: 1000Mi
```
Ниже приведены примерные значения `limits` для платформе CodeScoring с 8-10 проектами:
```
codescoring:
backend:
resources:
limits:
cpu: 250m
memory: 2500Mi
huey:
ipcsQueue:
scheduler:
resources:
limits:
cpu: 500m
memory: 500Mi
resources:
limits:
cpu: 2250m
memory: 4000Mi
highPriorityQueue:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksOsaContainerImageScan:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksOsaPackageScan:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksOsaPackageScan:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksPolicy:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksTqi:
resources:
limits:
cpu: 2250m
memory: 4000Mi
tasksMedia:
resources:
limits:
cpu: 1000m
memory: 1500Mi
frontend:
resources:
limits:
cpu: 250m
memory: 500Mi
redis:
resources:
limits:
cpu: 1000m
memory: 2000Mi
postgresql:
resources:
limits:
cpu: 1000m
memory: 2000Mi
```
Также возможна настройка ресурсов init-контейнеров. Для сервиса backend они настраиваются в разделе
```
codescoring:
backend:
initContainers:
resources:
limits:
cpu: 2500m
memory: 2500Mi
requests:
cpu: 500m
memory: 500Mi
```
Для всех прочих сервисов init-контейнеры являются однотипными и выполняют функции wait-for для обеспечения последовательного запуска сервисов. Ресурсы для них настраиваются в разделе
```
codescoring:
initContainers:
limits:
cpu: 2500m
memory: 2500Mi
requests:
cpu: 200m
memory: 200Mi
```
## Добавление сертификата удостоверяющего центра (CA) {#ca-certificate}
Для доступа CodeScoring к ресурсам с TLS-сертификатами, подписанными корпоративным удостоверяющим центром (CA) необходимо:
1. Присвоить переменной `codescoring.trustedCA.enabled` значение `true`
2. Добавить корневой сертификат удостоверяющего центра (RootCA) в формате PEM в переменную `codescoring.trustedCA.certificates` в формате `ключ: значение`,
где ключ - имя файла сертификата, включая расширение `.crt`, значение - сертификат в формате PEM.
Например:
```
codescoring:
trustedCA:
enabled: true
certificates:
## THIS IS AN EXAMPLE ONE! DO NOT USE IN PRODUCTION!
my-root-ca.crt: |-
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA3MQswCQYDVQQGEwJERTEP
MA0GA1UEChMGZWR1UEtJMRcwFQYDVQQDEw5lZHVQS0kgVGVzdCBDQTAeFw0xMDAz
MzExMjIwMjRaFw0zMDAzMjYxMjIwMjRaMDcxCzAJBgNVBAYTAkRFMQ8wDQYDVQQK
EwZlZHVQS0kxFzAVBgNVBAMTDmVkdVBLSSBUZXN0IENBMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAt5IxCk/NQPOLqeA1lGuB3pvqHGQPxRQ1udYGcXQY
t7EuSMFymUR9m5TsifG1ktktJTtOWyaWFC4ac0vai49wGVeuDYptfZBoHLIUvCwN
DOofLYHxk04WzfrtSiUTptn1o6QPOw8YR0XH30MEi1zgD8fLMZmVTJ+XwA5Eus6c
XtTmI4XhNrHUtvWt4UsNgLmp5/djUgRMpNqxIdrpFQzl+XycRJRAaoAwUzHFl14t
49qwBhGChxQ8AdDMQGA7kv6VR8o0ktCPv3a4GQbs8+z0cX0w5dC+XhJ1xpqW6TOg
qAY9XBFIDe5j21hjKmNZ39rsODVGUS2wUtNEhSz+3YqxLwIDAQABo2MwYTAdBgNV
HQ4EFgQUqHe3saMjZZLan8RlFJs+Xuz4yiAwHwYDVR0jBBgwFoAUqHe3saMjZZLa
n8RlFJs+Xuz4yiAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQEFBQADggEBAEjQGyHZQis47c2kf+zXJJoDDlRgFzr9xfcnrHFaJvYx
nuqNE0T+xmujnwGm3VrgddeAQJuW3sD6y0Ox8NgL4z886VFeaDQ0GmFPI6HEVtg6
mixMhi+YzdkC+PFrEdYUeVNNwVO+bvJb1Rc08BYU4v7VtTkssHjru76E2/ahn/Ct
kaVTEojEWeRaxsw5/0VLkgyf8SwDaukM2aamqgEzfsw5GTdSAh7ERZKc+zF7Sr5s
DY8c5lOmyCwuNh9ODuw4cAThICrn7G8bh8ZyxLyj4Znxh0X45SwMZKTmYLfy9ab8
b/j7FK8uBNRL+pXl9HGBWAFA01uJw4HkYK+Uo+RcAzo=
-----END CERTIFICATE-----
```
В случае наличия нескольких корневых CA необходимо добавить их в отдельные ключи, например:
```
codescoring:
trustedCA:
enabled: true
certificates:
my-root-ca.crt: |-
...
my-root-ca-2.crt: |-
...
```
## Управление секретами {#secret-management}
По умолчанию для шаблонов `ipcs-backend`, `pgbouncer` и `postgresql` предусмотрены объекты типа `Secret`. Значения переменных в этих объектах заполняются из содержимого `values`.
Также присутствует возможность подключать внешние хранилища секретов. Для этого в кластере должен должен быть установлен **External Secrets Operator (ESO)**. Он добавляет в кластер необходимые CRD (Custom Resource Definition) и обеспечивает связь с хранилищем секретов.
Для подключения ESO к внешнему хранилищу секретов необходимо сконфигурировать провайдера для **SecretStore** в разделе `codescoring.secretStore`.
Далее, необходимо настроить объекты **ExternalSecret** для получения секретов из внешнего хранилища в разделах `codescoring.config.externalSecret,` `pgbouncer.externalSecret`, `postgresql.externalSecret`.
Вся конфигурация осуществляется в соответствии с документацией ESO.
**Важно!**: Некоторые провайдеры могут тарифицировать запросы к хранилищам секретов. Интервал запроса данных регулируется параметром `externalSecret.refreshInterval` для каждого отдельного сервиса.
## Мониторинг {#monitoring}
Для сбора метрик с сервисов в чарте предусмотрены ресурсы **ServiceMonitor**. Метрики собираются с сервисов `backend` и `osa-api`. Для использования **ServiceMonitor** в кластере должен быть установлен и настроен Prometheus Operator.
**ServiceMonitor** настраивается в следующих разделах values: `codescoring.backend.prometheus.serviceMonitor`, `codescoring.osa_api.prometheus.serviceMonitor`.
Также для вышеуказанных сервисов предусмотрены ресурсы **PrometheusRule**, необходимые для настройки правил алертинга. Настройка данных ресурсов осуществляется в следующих разделах values: `codescoring.backend.prometheus.alerts`, `codescoring.osa_api.prometheus.alerts`.
Все настройки осуществляются в соответствии с [документацией Prometheus Operator](https://prometheus-operator.dev/docs/).
## Обновление системы {#update}
Для обновления системы необходимо актуализировать helm-репозиторий командой
```shell
helm repo update
```
и далее выполнить команду обновления платформы, где `CHART_VERSION` - версия чарта, на которую происходит обновление
```shell
helm upgrade codescoring codescoring-org/codescoring -n codescoring -f values.yaml --version CHART_VERSION
```
---
url: /admin-guide/offline.md
---
# Установка оффлайн-версии
CodeScoring поддерживает работу в закрытом контуре. Для доступа к базе данных о пакетах и уязвимостях в таком режиме используется сервис Index API Offline.
:::note Порядок установки в закрытом контуре
Этот порядок относится только к установке в закрытом контуре: сначала установите и запустите Index API Offline по этой инструкции, затем разверните платформу CodeScoring.
:::
## Ресурсы для установки и обновления
Адрес ресурса с установочными файлами, Docker Registry и файлами оффлайн-БД можно узнать у вендора.
В примерах ниже используются плейсхолдеры:
* `` — HTTPS-адрес ресурса с файлами дистрибутива;
* `` — адрес Docker Registry без протокола.
На ресурсе доступны:
* Docker Registry с образами CodeScoring и Index API Offline
* Полная версия оффлайн-БД Index API: `/db/index-api.db`
* Инкрементальные обновления оффлайн-БД: `/#browse/browse:codescoring-offline-files:db%2Fv1%2Fupdates`
Оффлайн база данных представляет собой шифрованный файл SQLite. Инкрементальные обновления распространяются в виде WAL-файлов.
## Скачивание базы данных
1. Выберите сервер с доступным дисковым пространством не менее 300 ГБ.
2. Создайте файл `curl.config` со следующими параметрами доступа:
```shell
user = :
```
3. Запустите скачивание базы данных:
```shell
curl --config curl.config \
-C - \
--output index-api.db \
/db/index-api.db
```
Рекомендуется выполнять загрузку в `screen` или `tmux`, так как процесс может занимать значительное время.
## Установка Index API Offline
1. Выполните авторизацию в Docker Registry:
```shell
docker login
```
2. Скачайте архив с установочными файлами и распакуйте его:
```shell
curl -u : \
-C - \
/repository/codescoring-offline-files/index-api/docker-compose/.tar.gz \
-o index-api-offline.tar.gz
```
3. Переместите скачанный файл базы данных в директорию сервиса, например:
```shell
mv index-api.db index-api-offline/db
```
4. Перейдите в директорию с конфигурацией:
```shell
cd index-api-offline/
```
5. Скопируйте шаблон конфигурации `.env.template` в `.env` и заполните его:
Основные параметры:
* `INDEX_API_OFFLINE_VERSION` — версия Index API Offline;
* `NGINX_SSL_ENABLED` — включение SSL (true | false);
* `NGINX_HOST` — имя хоста для nginx;
* `OFFLINE_DB_UPDATE_ENABLED` — включение автоматического обновления базы данных;
* `WAL_CHECK_INTERVAL` — интервал проверки обновлений;
* `NEXUS_HOST` — адрес репозитория обновлений;
* `NEXUS_USERNAME` — логин для доступа к Nexus;
* `NEXUS_PASSWORD` — пароль для доступа к Nexus;
* `CODESCORING_ACTIVATION_KEY` — лицензионный ключ.
Параметры аутентификации для обновления базы данных и получения метрик через Prometheus (опционально):
* `MAINTENANCE_USERNAME` — Basic Auth логин для метода `/system/update_database`;
* `MAINTENANCE_PASSWORD` — Basic Auth пароль для метода `/system/update_database`;
* `METRICS_USERNAME` — Basic Auth логин для метода `/metrics`;
* `METRICS_PASSWORD` — Basic Auth пароль для метода `/metrics`.
6. При использовании SSL (`NGINX_SSL_ENABLED=true`) разместите сертификат и ключ в каталоге `ssl`.
:::warning Важно
Формат сертификата – PEM. Файл сертификата должен иметь расширение `.crt`, а файл ключа сертификата должен иметь расширение `.key`
:::
7. Запустите сервис:
```shell
docker compose up -d --remove-orphans
```
8. Разверните платформу CodeScoring с помощью [Docker](/admin-guide/installation.md) или [Kubernetes](/admin-guide/installation-in-k8s.md).
9. Укажите адрес Index API Offline:
* для Docker задайте `INDEX_API_URL=` в файле `app.env`;
* для Kubernetes добавьте `INDEX_API_URL: ""` в секцию `configMaps.ipcs-backend-env.data` файла `values-override.yaml`.
После установки CodeScoring и подключения к Index API Offline в интерфейсе можно посмотреть версию последнего загруженного WAL-файла.
## Обновление базы данных
### Автоматическое обновление оффлайн базы данных
Процесс обновления базы данных можно выполнить автоматически.
Механизм обновления работает следующим образом:
1. Запущенный сервис Index API Offline с заданной периодичностью опрашивает репозиторий обновлений.
2. Сервис хранит номер текущей версии базы данных (например, 72).
3. При обнаружении следующего доступного обновления (например, 73) файл загружается автоматически.
4. Загруженный WAL-файл применяется к локальной базе данных.
Интервал проверки задаётся параметром `WAL_CHECK_INTERVAL`.
При отключённом параметре `OFFLINE_DB_UPDATE_ENABLED` автоматическое обновление не выполняется.
### Ручное обновление базы данных
Ручное обновление используется в случаях, когда автоматическая загрузка WAL-файлов отключена (`OFFLINE_DB_UPDATE_ENABLED=false`) или невозможна по сетевым ограничениям.
#### Обновление с использованием отдельных файлов обновлений
Если развёрнута **первая версия оффлайн базы данных**, необходимо последовательно скачать и загрузить **все доступные WAL-файлы обновлений**, начиная с версии, следующей за текущей версией базы данных.
Файлы обновлений необходимо размещать в директории, указанной в параметре `WAL_DIR` в конфигурации Index API Offline. Сервис отслеживает появление файлов в этой директории и применяет их к базе данных.
В комплект обновления входят:
* `*.wal` — файл с изменениями (основные данные обновления);
* `*.shm` — вспомогательный служебный файл, необходимый SQLite для корректного применения WAL.
#### Обновление с использованием полной версии базы данных
В случае загрузки актуального файла **полной оффлайн-БД** необходимо выполнить следующие действия:
1. Остановить сервис Index API Offline.
2. Переместить текущий файл базы данных в резервную директорию (рекомендуется сохранить копию до завершения обновления).
3. Разместить новый файл базы данных в директории, указанной в параметре `DB_FILE`.
4. Запустить сервис Index API Offline.
5. Убедиться, что сервис успешно запущен.
После этого, при необходимости, можно продолжить обновление с помощью WAL-файлов, размещая их в директории `WAL_DIR` в стандартном порядке.
#### Запуск процесса обновления
При использовании ручного режима обновления запуск процесса обновления также выполняется вручную.
1. В файле `.env` необходимо указать параметры аутентификации:
```dotenv
MAINTENANCE_USERNAME=
MAINTENANCE_PASSWORD=
```
2. Файлы обновлений (`*.wal`, `*.shm`) необходимо разместить в директории, указанной в параметре `WAL_DIR`.
Для запуска процесса обновления выполните запрос:
```shell
curl -X GET --location "{{INDEX_API_URL}}/system/update_database" \
-H "Accept: application/json" \
-H "Authorization: Basic {{maintenance_auth}}"
```
Где:
* `{{INDEX_API_URL}}` — значение из переменной `INDEX_API_URL` в `.env`;
* `{{maintenance_auth}}` — Base64-кодированная строка вида `user:password`, где `user` и `password` — значения `MAINTENANCE_USERNAME` и `MAINTENANCE_PASSWORD`.
Статус обновления отслеживается в логах сервиса Index API Offline.
Возможные сообщения:
* `WAL files download scheduler started with interval:` — сервис обновлений запущен;
* `missing mandatory Nexus configuration parameters` — допустимое сообщение для ручного режима;
* `The WAL file [%s] was successfully loaded into the main database file` — обновление успешно применено;
* `Failed to checkpoint WAL file:` — ошибка применения WAL-файла;
* `No WAL files to checkpoint` — отсутствуют файлы для применения;
* `Error getting latest database update:` — ошибка получения информации об обновлениях.
---
url: /admin-guide/update.md
---
# Обновление системы
## Стандартная инструкция по обновлению
:::warning Резервное копирование
Перед обновлением обязательно выполните резервное копирование платформы.
:::
:::warning Обновите compose-файлы перед запуском новой версии
Недостаточно изменить только значение `CODESCORING_VERSION` в `.env`. Перед обновлением скачайте из реестра CodeScoring актуальные версии файлов `docker-compose.yml`, `external-db.override.yml`, `app.env` и `.env` и замените ими используемые файлы. Адрес реестра и данные для доступа можно получить у вендора. Если оставить старые compose-файлы, платформа может запуститься с неполной или некорректной конфигурацией.
:::
В переменной `CODESCORING_VERSION` внутри файла `.env` указывается требуемая версия системы. Актуальную версию можно узнать в разделе [Changelog](/changelog/on-premise-changelog.md).
Затем нужно выполнить следующие шаги:
1. Перейти в директорию с файлами запуска:
```bash linenums="1"
cd /path/to/docker/compose
```
2. Выполнить команду обновления образов:
```bash linenums="2"
docker compose pull
```
3. Перезапустить платформу:
```bash linenums="3"
docker compose down --remove-orphans
docker compose up -d --renew-anon-volumes
```
## Восстановление предыдущей версии
Если после обновления возникли ошибки или система работает нестабильно, можно восстановить предыдущую версию платформы из резервной копии:
1. Остановите текущую инсталляцию:
```bash
docker compose down
```
2. Очистите базу данных любым удобным способом:
* через Docker:
```bash
docker volume rm
```
* или удалив БД напрямую (например, `DROP DATABASE`);
* или, при использовании Kubernetes:
```bash
kubectl delete pvc
```
3. Восстановите базу данных из ранее созданного бэкапа.
4. В файле `.env` установите прежнее значение переменной `CODESCORING_VERSION`.
5. Перезапустите платформу:
```bash
docker compose up -d
```
Подробная инструкция по созданию резервных копий доступна в разделе [Резервное копирование](/admin-guide/backup.md).
## Инструкции по обновлению на версии с измененной конфигурацией
### \[2025.21.0] – 2025-05-21
Начиная с данной версии, значение переменной окружения `$SECRET_KEY` будет использоваться для шифрования чувствительных данных в базе данных и изменение значения этой переменной будет требовать дополнительных операций.
Перед обновлением необходимо убедиться, что в файле `.env` указано корректное (**уникальное, непредсказуемое**) значение `$SECRET_KEY`, а не значение по умолчанию.
### \[2025.13.0] - 2025-03-28
* Необходимо убедиться, что версия `Docker Engine` больше или равна 25. Для этого нужно выполнить команду `docker version` на машине с платформой. В случае, если версия Docker Engine ниже, чем 25, необходимо обновить Docker.
* **ВАЖНО!** Перед обновлением Docker необходимо штатно остановить платформу.
* Необходимо внести название проекта docker compose в конфигурацию:
* Перед выключением системы для обновления, необходимо отметить название docker compose проекта, в котором сейчас запущена платформа.
* Это либо значение, передаваемое с параметром `-p` для `docker compose`, либо название директории, в которой находился `docker-compose.yml` файл, по умолчанию -- `on-premise` или `on-premise-split-db`
* Это значение используется как префикс в названии ресурсов, создаваемых compose: томов, контейнеров, сетей
* Необходимо вписать это значение в `.env` файл c ключом `COMPOSE_PROJECT_NAME=`
* **ВАЖНО!** Если этого не сделать, то платформа не запустится. Если вписать некорректное значение, то создадутся томы с новым префиксом, и платформа на новой версии запустится "с нуля"
* После того, как значение добавлено в `.env` файл, вызовы к `docker compose` можно делать без опции `-p PROJECT_NAME`
* Необходимо скачать из реестра CodeScoring обновлённые файлы `docker-compose.yml` и `external-db.override.yml` и поместить их в директорию с compose файлом.
---
url: /admin-guide/postgres-upgrade-compose.md
---
# Обновление PostgreSQL в Docker
Обновление мажорной версии PostgreSQL требует инициализации БД с использованием новой версии PostgreSQL, создания дампа и его восстановления. Ниже описана процедура для инсталляций CodeScoring, развёрнутых с помощью Docker Compose.
:::warning Корректный порядок обновления
Не рекомендуется выполнять обновление инсталляции и базы данных одновременно.
Обновление следует проводить последовательно: сначала обновить инсталляцию и убедиться в корректной работе сервиса, после чего выполнять обновление базы данных.
:::
## Необходимые условия
### Дисковое пространство
Требуется свободное дисковое пространство в объёме не менее **размера тома `db-data`**.
Пример утилизации дискового пространства при обновлении:
* версии PostgreSQL:
* исходная: 13.21
* новая: 15.15
* данные инсталляции CodeScoring:
* \~500 000 пакетов
* \~1 200 проектов
* \~22 000 образов
* размер тома `db-data`: ~50 GiB
* потребление дискового пространства в процессе обновления:
* сжатая резервная копия: ~9 GiB
* сжатый дамп: ~3 GiB
* размер `db-data` после восстановления: ~32 GiB
### Окно планового технического обслуживания
Процедура требует полной остановки CodeScoring. Фактическое время выполнения зависит от объёма данных.
Для примера выше:
* создание сжатой резервной копии: ~11 минут 45 секунд
* восстановление резервной копии: ~2 минуты 30 секунд
* `pg_dump` + `pg_restore`: ~3 минуты 30 секунд
* перенос данных между томами: ~1 минута
* сбор статистики планировщика: ~1 секунда
## Переопределение конфигурации Docker Compose
Для обновления требуется файл переопределения конфигурации Docker Compose. Файл `postgres-upgrade.override.yml` поставляется, начиная с версии CodeScoring 2026.3.1, и располагается в той же директории, что и файл `docker-compose.yml`.
### Описание компонентов файла переопределения конфигурации
#### Тома
* `upgrade-new-db-data` - временный `pgdata` PostgreSQL новой версии
* `upgrade-dump` - сжатый дамп
* `upgrade-backup` - сжатый бэкап
#### Сервисы
* `psql-new` - PostgreSQL новой версии с конфигурацией, идентичной сервису `psql`
* `upgrade-dump` - создание сжатого дампа
* `upgrade-dump-restore` - восстановление дампа в PostgreSQL новой версии
* `upgrade-cleanup-transfer` - очистка и перенос данных в основной том `db-data`
* `upgrade-analyze-in-stages` - итеративный сбор статистики планировщика
* `upgrade-backup` - создание резервной копии
* `upgrade-backup-restore` - восстановление резервной копии
## Резервное копирование
### Создание резервной копии
Остановите CodeScoring:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
down
```
Создайте резервную копию:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
run --rm upgrade-backup
```
### Восстановление резервной копии
Остановите CodeScoring:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
down
```
Восстановите резервную копию:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
run --rm upgrade-backup-restore
```
Убедитесь, что значение `POSTGRES_IMAGE` в файле `.env` соответствует версии PostgreSQL **до** обновления:
```dotenv
POSTGRES_IMAGE=postgres:13.23-rev1 # версия, с которой обновляемся
```
## Процедура обновления
Установите в .env:
```dotenv
POSTGRES_IMAGE=postgres:13.23-rev1 # версия, с которой обновляемся
POSTGRES_UPGRADE_IMAGE=postgres:15.15-rev1 # версия, на которую обновляемся
```
Загрузите образы, необходимые для обновления:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
pull
```
Остановите все сервисы:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
down
```
Инициализируйте PostgreSQL новой версии, выполните дамп и восстановление:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
run --rm upgrade-dump-restore
```
Снова остановите сервисы:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
down
```
Перенесите данные в основной том `db-data`:
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
run --rm upgrade-cleanup-transfer
```
Установите версию PostgreSQL для образа, используемого сервисом `psql`, в файле `.env`:
```dotenv
POSTGRES_IMAGE=postgres:15.15-rev1 # версия, на которую обновились
```
Запустите сбор статистики (можно не дожидаться завершения):
```bash
docker compose \
-f docker-compose.yml \
-f postgres-upgrade.override.yml \
run --rm upgrade-analyze-in-stages
```
Запустите CodeScoring:
```bash
docker compose -f docker-compose.yml up \
--detach \
--force-recreate \
--remove-orphans \
--renew-anon-volumes
```
Проверьте логи и убедитесь в работоспособности инсталляции CodeScoring:
```bash
docker compose logs -f
```
Удалите следующие тома:
* `${COMPOSE_PROJECT_NAME}_upgrade-new-db-data`
* `${COMPOSE_PROJECT_NAME}_upgrade-dump`
* `${COMPOSE_PROJECT_NAME}_upgrade-backup`
---
url: /admin-guide/backup.md
---
# Резервное копирование
## Создание резервной копии установки
1. Перейти в директорию с файлами запуска:
```bash linenums="1"
cd /path/to/docker/compose
```
2. Для создания резервной копии выполнить команду:
```bash linenums="2"
docker compose run backup create
```
Файл резервной копии сохранится в директорию `backup`.
## Восстановление из резервной копии
1. Для восстановления из резервной копии выполнить команду:
```bash linenums="1"
docker compose run backup restore BACKUP_FILENAME
```
`BACKUP_FILENAME` — имя файла резервной копии. Список доступных резервных копий можно получить выполнив команду:
```bash
ls -la ./backup
```
2. Перезапустить платформу:
```bash linenums="2"
docker compose up -d --force-recreate --renew-anon-volumes
```
---
url: /admin-guide/proxy.md
---
# Работа через прокси
При необходимости работы системы через прокси необходимо раскомментировать и задать значения соответствующих переменных в файле `app.env`:
* `HTTP_PROXY` и `HTTPS_PROXY` — адрес прокси-сервера
**Важно**: для обеих переменных в значении должна использоваться схема `http`.
* `NO_PROXY` — список URL внешних систем, запросы к которым не должны идти через прокси. Среди значений возможно указание IP адресов, например:
```
NO_PROXY=127.0.0.1,192.168.0.1/24,example.com,domain.example.com,.subdomain.example.com
```
Если добавить список URL VCS в переменную `NO_PROXY` невозможно, то необходимо [добавить сертификат прокси в каталог SSL](/admin-guide/self-signed-ssl/index.md).
**Важно**: при заданных настройках НTTP Proxy мимо прокси-сервера будут идти все запросы к URL внешних систем, указанных в переменной `NO_PROXY`. Это относится как к системам контроля версий, так и, например, к подключенным таск-менеджерам.
---
url: /admin-guide/self-signed-ssl.md
---
# Работа с самоподписанными сертификатами
При работе с внешними системами CodeScoring проверяет валидность SSL-сертификатов удалённых хостов и по умолчанию не будет подключать проекты из систем, сертификаты которых не прошли валидацию или подписаны неизвестным системе удостоверяющим центром.
Чтобы подключить внешнюю систему, SSL-сертификат домена которой является самоподписанным, требуется добавить корневой сертификат в доверенные (trusted) на уровне установки. Для этого перед запуском системы его необходимо положить в директорию `ssl` в установочных файлах системы. Желательно дать файлу говорящее название, например, `codescoring-root-CA.crt`.
**Важно**: расширение файла обязательно должно быть `crt`.
Чтобы посмотреть всю цепочку используемых для домена сертификатов и выделить корневой, можно использовать команду:
```bash
openssl s_client -showcerts -partial_chain -connect DOMAIN.NAME:443
```
---
url: /admin-guide/postgresql-tls.md
---
# Подключение к PostgreSQL/PgBouncer с использованием TLS
Подключение к PostgreSQL/PgBouncer с использованием TLS обеспечивает безопасную и зашифрованную передачу данных между клиентом и сервером. Данная функциональность доступна начиная с [версии CodeScoring 2025.21.0](/changelog/on-premise-changelog/index.md#2025210-2025-05-21).
## Инструкция для подключение
1. Перед запуском системы разместить файлы сертификатов и ключей в каталоге `ssl` в установочных файлах системы;
2. Дать файлам говорящие названия, например `pgbouncer_server.crt`, `pgbouncer_server.key`;
**Важно**: расширение файлов сертификатов обязательно должно быть `crt`;
3. Сменить владельца файлов ключей следующим образом:
```bash
chown 999:0 ./ssl/postgresql_server.key
chown 1050:0 ./ssl/pgbouncer_server.key
```
4. Раскомментировать и отредактировать файлы конфигурации SSL/TLS.
## Пример включения PostgreSQL/PgBouncer в режим TLS с самоподписанными сертификатами
1. Сгенерировать сертификаты в каталоге `ssl` в установочных файлах системы, используя утилиту `mkcert`
```bash
docker run -v ./ssl:/ssl -it --rm alpine/mkcert -cert-file /ssl/pgbouncer_server.crt -key-file /ssl/pgbouncer_server.key pgbouncer
docker run -v ./ssl:/ssl -it --rm alpine/mkcert -cert-file /ssl/postgresql_server.crt -key-file /ssl/postgresql_server.key psql
```
2. Сменить владельцев файлов ключей
```bash
chown 999:0 ./ssl/postgresql_server.key
chown 1050:0 ./ssl/pgbouncer_server.key
```
3. Скопировать шаблоны конфигурации SSL/TLS
```bash
cp postgres/pgbouncer_tls_include.ini.template postgres/pgbouncer_tls_include.ini
cp postgres/postgresql_ssl_include.conf.template postgres/postgresql_ssl_include.conf
```
4. Раскомментировать и отредактировать следующие строчки в файле конфигурации `postgres/pgbouncer_tls_include.ini`
```bash
client_tls_sslmode = require
client_tls_ca_file = /usr/local/share/ca-certificates/pgbouncer_server.crt
client_tls_key_file = /usr/local/share/ca-certificates/pgbouncer_server.key
client_tls_cert_file = /usr/local/share/ca-certificates/pgbouncer_server.crt
server_tls_sslmode = require
server_tls_ca_file = /usr/local/share/ca-certificates/postgresql_server.crt
```
5. Раскомментировать и отредактировать следующие строчки в файле конфигурации `postgres/postgresql_ssl_include.conf`
```bash
ssl = on
ssl_cert_file = '/usr/local/share/ca-certificates/postgresql_server.crt'
ssl_key_file = '/usr/local/share/ca-certificates/postgresql_server.key'
```
---
url: /admin-guide/analysis-ignore-paths.md
---
# Пути анализа и исключения
## Значения по умолчанию
В анализе сконфигурированы исключения для путей, по которым **не производится** поиск манифестов, файлов и не происходит анализ качества. По умолчанию в исключения добавлены следующие значения (формат выражений — glob):
* `**/.git*`
* `**/.git/**`
* `**/fixtures/**`
* `**/tests/**`
* `**/doc/**`
* `**/docs/**`
* `**/samples/**`
## Добавление исключений
Чтобы добавить в список свои значения, в файле `app.env` в переменную `ANALYSIS_IGNORED_PATHS` необходимо **добавить** значения в формате:
* `**/ignoring_prj_1/**` - для исключения из анализа директории `ignoring_prj_1`;
* `**/ignoring_projects_*` - для исключения из анализа директорий у которых в названии присутствует `ignoring_projects_`;
* `**/ignoring_file.pom` - для исключения из анализа файла `ignoring_file.pom`.
**Важно**: не рекомендуется удалять пути исключений, указанные в переменной по умолчанию.
Пути добавляются через `,`. Пример переменной с добавленным исключением `**/migrations/**`:
```
ANALYSIS_IGNORED_PATHS=**/.git*,**/.git/**,**/fixtures/**,**/tests/**,**/doc/**,**/docs/**,**/samples/**,**/migrations/**
```
---
url: /admin-guide/scripts.md
---
# Скрипты для управления платформой
## Порядок запуска скриптов
Скрипты запускаются в backend-сервисе платформы:
* для Docker Compose:
```bash
docker exec -it ./manage.py runscript <команда>
```
* для Helm:
```bash
kubectl exec -it ./manage.py runscript <команда>
```
Переменные, передаваемые в скрипт, являются строго позиционными и обозначаются ключом `--script-arg`, опциональные переменные указаны в квадратных скобках.
## Доступные команды
### `update_cwes`
Обновляет данные о CWE (Common Weakness Enumeration) и уязвимостях в базе данных инсталляции. Опциональным аргументом можно управлять датой, с которой будет осуществлено обновление, по умолчанию дата и офсет обновления будут взяты из кэша последнего успешного обновления.
**Синтаксис**
```bash
update_cwes [--script-arg="2025-12-31"]
```
### `load_licenses`
Обновляет данные о лицензиях в базе данных инсталляции. Опциональным аргументом можно управлять датой, с которой будет осуществлено обновление, по умолчанию дата и офсет обновления будут взяты из кэша последнего успешного обновления.
**Синтаксис**
```bash
load_licenses [--script-arg="2025-12-31"]
```
### `set_new_secret_key`
Данная команда устанавливает новое значение переменной окружения `SECRET_KEY`. Чтобы избежать проблем с кодировкой, алиасами или других неожиданных действий консоли, значение `NEW_SECRET_KEY` рекомендуется скопировать из вывода в терминале после окончания работы скрипта.
**Синтаксис**
```bash
set_new_secret_key --script-arg="NEW_SECRET_KEY" [--script-arg="OLD_SECRET_KEY"]
```
**Варианты использования**
1. Изменение с явно указанного `OLD_SECRET_KEY` на явно указанный `NEW_SECRET_KEY`. Данное изменение требуется в ситуации, когда во время запуска платформы значение переменной окружения `SECRET_KEY` отличалось от `OLD_SECRET_KEY`.
```bash
./manage.py runscript set_new_secret_key --script-arg="NEW_SECRET_KEY" --script-arg="OLD_SECRET_KEY"
```
Данная команда перешифрует все чувствительные поля с переданного `OLD_SECRET_KEY` на `NEW_SECRET_KEY`.
:::warning Важно
Если значение переменной `SECRET_KEY` на момент запуска скрипта не совпадало с `NEW_SECRET_KEY`,
после успешного окончания скрипта необходимо изменить значение переменной `SECRET_KEY` на `NEW_SECRET_KEY`
и перезапустить платформу.
:::
2. Изменение на явно указанный `NEW_SECRET_KEY` без указания `OLD_SECRET_KEY`. Требуется в ситуации, когда `OLD_SECRET_KEY` совпадает с указанным в `settings.SECRET_KEY`.
```bash
./manage.py runscript set_new_secret_key --script-arg="NEW_SECRET_KEY"
```
Данная команда перешифрует все чувствительные поля с ключа, установленного в `settings.SECRET_KEY`
на `NEW_SECRET_KEY`.
После успешного окончания скрипта необходимо изменить значение переменной `SECRET_KEY` на `NEW_SECRET_KEY`
и перезапустить платформу.
### `migrate_users_from_ldap_to_oidc`
Переносит пользователей из LDAP в OIDC. Учётные записи не пересоздаются: у существующих пользователей сбрасывается привязка к LDAP-серверу и проставляются Issuer URL провайдера из настроек OIDC и идентификатор субъекта (`sub`) из файла соответствия.
:::warning Важно
Перед запуском миграции необходимо деактивировать настройки LDAP, из которых переносятся пользователи: установить `is_active=False` (чекбокс `Активно` в интерфейсе). Иначе скрипт завершится с ошибкой.
:::
**Синтаксис**
Аргументы передаются одним ключом `--script-args` и разделяются пробелом.
```bash
migrate_users_from_ldap_to_oidc --script-args LDAP_SETTINGS_PK OIDC_SETTINGS_PK MAPPING_FILE [dry-run]
```
**Обязательные аргументы**
* `LDAP_SETTINGS_PK` — идентификатор настроек LDAP, из которых переносятся пользователи;
* `OIDC_SETTINGS_PK` — идентификатор настроек OIDC, в которые переносятся пользователи;
* `MAPPING_FILE` — путь до JSON-файла с соответствием имён пользователей и идентификаторов субъектов. Файл должен быть доступен внутри контейнера backend-сервиса.
Идентификаторы настроек отображаются в адресной строке браузера: откройте нужную интеграцию — идентификатор будет последним сегментом адреса страницы.
Также идентификаторы можно получить напрямую из базы данных — из колонки `id` таблиц `ldap_ldapsettings` и `oidc_oidcsettings`.
**Опции**
* `dry-run` — выводит план миграции, не изменяя данные.
**Файл соответствия**
JSON-объект вида `{"": ""}`:
```json
{
"ivanov": "24a1f0c2-8e5b-4d31-9a77-1f0b2c3d4e5f",
"petrov": "7b93e5d1-2c46-4f88-b0a3-9d5e6f7a8b9c"
}
```
Значение `sub` должно совпадать со значением поля, указанного в параметре **Поле с идентификатором субъекта** настроек OIDC.
Скрипт завершится с ошибкой, если:
* в файле соответствия отсутствует `sub` хотя бы для одного пользователя переносимых настроек LDAP;
* один и тот же `sub` указан для нескольких имён пользователей;
* указанный `sub` уже занят другим пользователем этих настроек OIDC.
Имена пользователей из файла соответствия, которым не соответствует ни один пользователь переносимых настроек LDAP, игнорируются и перечисляются в выводе скрипта.
**Примеры**
1. Просмотр плана миграции без изменения данных.
```bash
./manage.py runscript migrate_users_from_ldap_to_oidc --script-args 1 2 /tmp/mapping.json dry-run
```
2. Выполнение миграции.
```bash
./manage.py runscript migrate_users_from_ldap_to_oidc --script-args 1 2 /tmp/mapping.json
```
### `cleanup`
Удаляет исторические данные из базы данных. В отличие от команд выше, `cleanup` запускается напрямую, без `runscript`.
:::warning Важно
Для запуска необходимо передать API-токен пользователя с правами администратора.
:::
**Синтаксис**
```bash
./manage.py cleanup [-h] --date TARGET_DATE --token ADMIN_API_TOKEN [--sca-runs] [--audit-logs] [--osa-requests] [--all] [--batch-size BATCH_SIZE] [--dry-run]
```
**Обязательные аргументы**
* `--date` — контрольная дата очистки в формате ISO 8601;
* `--token` — API-токен пользователя с правами администратора.
**Флаги очистки**
Необходимо выбрать хотя бы один флаг:
* `--sca-runs` — удаляет исторические данные SCA для всех проектов, включая старые анализы и исторические связи уязвимостей, алертов, зависимостей и лицензий;
* `--audit-logs` — удаляет записи журнала аудита, созданные не позднее контрольной даты;
* `--osa-requests` — удаляет запросы OSA, созданные не позднее контрольной даты;
* `--all` — применяет все флаги очистки: `--sca-runs`, `--audit-logs`, `--osa-requests`.
:::warning Важно
Последний успешный анализ и его данные не удаляются, даже если анализ выполнен до контрольной даты.
:::
**Опции**
* `--batch-size` — задаёт размер пакета удаления, по умолчанию — `50 000` элементов;
* `--dry-run` — оценивает количество удаляемых элементов и освобождаемое пространство, но не удаляет данные;
* `-h`, `--help` — отображает справку.
**Примеры**
```bash
./manage.py cleanup --date=2025-12-31 --token="ADMIN_API_TOKEN" --sca-runs --osa-requests --batch-size=1000
```
```bash
./manage.py cleanup --date=2025-12-31 --token="ADMIN_API_TOKEN" --all --dry-run
```
---
url: /admin-guide/variables-extended.md
---
# Описание переменных
В этом разделе представлено описание переменных, необходимых для установки и настройки платформы, включая те, которые описаны в разделах [Установка системы в Docker](/admin-guide/installation.md) и [Работа системы в Kubernetes](/admin-guide/installation-in-k8s.md).
:::warning Внесение изменений
Перед внесением любых изменений в стандартное значение переменных, необязательных к заполнению во время установки, проконсультируйтесь с технической поддержкой. Изменение стандартных значений может оказать влияние на производительность и эффективность работы системы.
:::
:::warning Не используйте в параметрах символ `#`, он может некорректно восприниматься системой при установке.
:::
## **env.template**
Файл `env.template` содержит переменные, необходимые для запуска инсталляции CodeScoring с использованием Docker Compose. Он определяет параметры, необходимые для корректного запуска инсталляции в контейнеризированной среде.
* **COMPOSE\_PROJECT\_NAME** - название проекта в Docker Compose, используемое как префикс для ресурсов, создаваемых Docker Compose;
* **CODESCORING\_VERSION** - определяет версию CodeScoring для установки. Актуальную версию можно узнать в разделе [Changelog](/changelog/on-premise-changelog.md);
* **SECRET\_KEY** - случайная строка символов, используемая CodeScoring как секрет инсталляции;
* **DJANGO\_CSRF\_TRUSTED\_ORIGINS** - cписок доменов для правильной работы CSRF защиты. Указание протокола является обязательным, например:
```bash
DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost:18000,https://localhost:8081,https://внешний_ip:8081
```
### Nginx
Для настройки домена системы CodeScoring использует [Nginx](https://nginx.org/ru/docs/).
* **NGINX\_HOST** - хост, на котором будет доступна система;
* **NGINX\_PORT** - порт, на котором будет доступна система;
* **SITE\_SCHEME** - протокол передачи данных, по умолчанию `https`;
* 2026.35.0 **NGINX\_MAX\_BODY\_SIZE** - максимальный размер тела запроса, принимаемого веб-сервером инсталляции, в том числе при загрузке SBOM-файлов. По умолчанию `2048M`;
* 2026.35.0 **NGINX\_PROXY\_READ\_TIMEOUT** - таймаут чтения ответа при проксировании запросов, в секундах. По умолчанию `300`.
### PostgreSQL
Для управления, обработки и хранения данных CodeScoring использует `PostgreSQL`.
* **POSTGRES\_DB** - название базы данных;
* **POSTGRES\_USER** - имя пользователя. При использовании собственной базы необходимо убедиться, что пользователь имеет следующие права: `Superuser, Create role, Create DB, Replication, Bypass RLS`;
* **POSTGRES\_PASSWORD** - пароль;
* **POSTGRES\_HOST** - хост, на котором доступна база данных;
* **POSTGRES\_PORT** - порт, на котором доступна база данных.
### Sentry
По умолчанию интеграция с Sentry отключена, **SENTRY\_ENABLE** = `False`. При необходимости использования Sentry для отправки данных об ошибках и других событий системы укажите **SENTRY\_ENABLED** = `True` и заполните следующие переменные:
* **SENTRY\_DSN** - идентификатор проекта внутри Sentry, в который будут отправляться данные;
* **SENTRY\_ENVIRONMENT** - окружение к которому будут относится отправляемые данные;
* **SENTRY\_RELEASE** - релиз с которым будут связаны отправляемые данные.
## **app.env.template**
Файл `app.env.template` содержит переменные окружения, необходимые для конфигурирования инсталляции CodeScoring. Он определяет настройки базы данных, веб-сервера и очередей, а также другие важные параметры системы.
* **PATH** - определяет путь к исполняемым файлам, файлам виртуального окружения (venv) и стандартным системным путям:
```bash
PATH=/venv/bin:${PATH}:/jscpd/node_modules/jscpd/bin:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/root/bin
```
* **ANALYSIS\_IGNORED\_PATHS** - содержит список путей, по которым не производится поиск манифестов, файлов и не происходит анализ качества. По умолчанию указаны следующие пути:
```bash
**/.git*,**/.git/**,**/fixtures/**,**/tests/**,**/doc/**,**/docs/**,**/samples/**
```
* Переменные, указывающие на расположение основных файлов инсталляции:
* **HOME** - значение по умолчанию: `ipcs-backend`;
* **BASE\_DIR** - значение по умолчанию: `ipcs-backend`;
* **AZURE\_DEVOPS\_CACHE\_DIR** - значение по умолчанию: `ipcs-backend`.
* **INDEX\_API\_URL** - базовый URL-адрес для запросов платформы к Index API. Значение по умолчанию: `https://index.codescoring.ru`. В закрытом контуре замените его адресом установленного [Index API Offline](/admin-guide/offline.md);
* Устарело **INDEX\_API\_TIMEOUT** - устаревшая переменная для единого таймаута запросов к Index API. Используйте отдельные таймауты ниже;
* **INDEX\_API\_POOL\_TIMEOUT** - время ожидания получения соединения из пула (секунды). Значение по умолчанию: `60`;
* **INDEX\_API\_CONNECT\_TIMEOUT** - время установки соединения (секунды). Значение по умолчанию: `60`;
* **INDEX\_API\_WRITE\_TIMEOUT** - время записи тела запроса (секунды). Значение по умолчанию: `60`;
* **INDEX\_API\_READ\_TIMEOUT** - время чтения тела ответа (секунды). Значение по умолчанию: `60`;
* **INDEX\_PROXY\_URL** - указывает внутри сети докер на URL-адрес контейнера Index Proxy. Не нуждается в изменении. Значение по умолчанию: `http://index-proxy:8000`;
* **ALLOWED\_HOSTS** - разрешенные хосты для Django. Определяет допустимые адреса, с которых Django может принимать запросы. При отсутствии хоста в списке, Django отклоняет входящие запросы. По умолчанию разрешены все хосты `*`;
* **DJANGO\_CACHES\_REDIS\_URL** - адрес сервера Redis, используемого в качестве системы кэширования Django. Значение по умолчанию: `redis://redis:6379/1`;
* **JOHNNY\_BIN** - путь к исполняемому файлу агента сканирования `JOHNNY`. Значение по умолчанию: `/agents/johnny-linux-amd64`;
* **HASHER\_BIN** - путь к исполняемому файлу агента `HASHER`, отвечающего за хеширование файлов. Значение по умолчанию: `/agents/hasher-linux-amd64`;
* **ANALYSIS\_ROOT** - корневая директория для клонирования репозиториев для анализа. Файлы копируются как временные и после анализа удаляются. Значение по умолчанию: `/analysis-root`;
* **MEDIA\_ROOT** - рабочая директория для промежуточного хранения скачиваемых и загружаемых файлов (таких как отчёт, SBOM и т.д.). Значение по умолчанию: `/analysis-root`;
* **NODE\_PATH** - директория расположения `node_modules`. Значение по умолчанию: `/jscpd/node_modules`;
* **REQUESTS\_CA\_BUNDLE** и **SSL\_CERT\_FILE** - указывают на расположение SSL-сертификатов, используемых инсталляцией для работы:
```bash
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
```
```bash
SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
```
* **USE\_SMART\_FILTERS** - отвечает за использование "умных фильтров" в Celery. Эти фильтры позволяют более гибко управлять порядком выполнения задач. Доступны значения `True` или `False`, значение по умолчанию: `True`;
* В случае необходимости использования прокси для предоставления доступа инсталляции в интернет или к системе контроля версий, раскомментируйте и заполните необходимые переменные, указав URL-адрес прокси с протоколом, а также имя пользователя и пароль (при необходимости), например:
* **HTTP\_PROXY**
```bash
HTTP_PROXY=http://proxy_user:password@proxy_host:proxy_port
```
* **HTTPS\_PROXY**
```bash
HTTPS_PROXY=http://proxy_user:password@proxy_host:proxy_port
```
* **NO\_PROXY**
```bash
NO_PROXY=localhost,gitlab.domain.local
```
### HUEY
**HUEY** - сервис, отвечающий за очереди и задачи. Количество воркеров рекомендуется изменять, только после консультации со специалистами технической поддержки.
* **HUEY\_REDIS\_URL** - адрес для подключения к серверу Redis, используемому Huey. Значение по умолчанию: `redis://redis:6379/0`;
* **HUEY\_WORKERS** - количество воркеров HUEY, разбирающих очереди `tasks-main`. Значение по умолчанию: `8`;
* **HUEY\_HIGH\_PRIORITY\_WORKERS** - количество воркеров HUEY для высокоприоритетных задач. Значение по умолчанию: `8`;
* **HUEY\_OSA\_PACKAGE\_SCAN\_WORKERS** - количество воркеров HUEY для модуля сканирования пакетов OSA. Значение по умолчанию: `4`;
* **HUEY\_OSA\_CONTAINER\_IMAGE\_SCAN\_WORKERS** - количество воркеров HUEY для модуля сканирования контейнеров OSA. Значение по умолчанию: `4`;
* **HUEY\_POLICY\_WORKERS** - количество воркеров HUEY для работы политик безопасности. Значение по умолчанию: `4`;
* **HUEY\_TQI\_WORKERS** - количество воркеров HUEY для модуля TQI. Значение по умолчанию: `4`;
* **HUEY\_SECRETS\_WORKERS** - количество воркеров HUEY для модуля поиска секретов. Значение по умолчанию: `4`;
* **HUEY\_MEDIA\_WORKERS** - количество воркеров Huey, отвечающих за загрузку медиа. Значение по умолчанию: `4`;
* **HUEY\_SCA\_EXTERNAL\_SCAN\_WORKERS** - количество воркеров отвечающих за очередь анализа, запущенного через агент Джонни `(tasks-sca-external-scan)`. Значение по умолчанию: `4`;
* **HUEY\_WEBHOOKS\_WORKERS** - стандартное количество воркеров HUEY, отвечающих за работу вебхуков. Значение по умолчанию: `2`;
* **HUEY\_WORKER\_MAX\_TASKS** - максимальное количество задач, которое может обработать один воркер HUEY. Значение по умолчанию: `500`.
### Redis
**Redis** - хранилище данных, предназначенное для кэширования и управления данными в реальном времени. Переменные, определяющие параметры конфигурации для взаимодействия с сервером [Redis](/admin-guide/containers-description.md):
* **REDIS\_BACKOFF\_CAP** - максимальное количество повторных попыток соединения при возникновении ошибок. Если после этого количества попыток соединение не установлено, будет возвращена ошибка. Значение по умолчанию: `5`;
* **REDIS\_BACKOFF\_BASE** - базовое время задержки (в секундах) между повторными попытками при возникновении ошибок. Значение по умолчанию: `0.08`;
* **REDIS\_RETRIES** - общее количество попыток подключения к серверу `Redis`. Значение по умолчанию: `5`;
* **REDIS\_SOCKET\_CONNECT\_TIMEOUT** - время ожидания (в секундах) при выполнении операций с сервером Redis. Если операция не завершится в течение этого времени, будет выдана ошибка. Значение по умолчанию: `5.0`;
* **REDIS\_SOCKET\_TIMEOUT** - время ожидания (в секундах) при выполнении операций с сервером Redis. Если соединение не установлено в течение этого времени, будет осуществлена повторная попытка или выдана ошибка. Значение по умолчанию: `5.0`;
* **REDIS\_SOCKET\_KEEPALIVE** - включает механизм поддержки активного соединения с сервером Redis, чтобы избежать его разрыва из-за бездействия. Доступны значения `True` или `False`, значение по умолчанию: `True`;
* **TASK\_RESULT\_EXPIRATION\_PERIOD** - указывает, как долго (в секундах) результаты выполнения задач будут храниться в `Redis`. После истечения этого времени они будут удалены. Значение по умолчанию: `14400`.
### Celery
**Celery** - сервис, отвечающий за управления асинхронными задачами, который позволяет разгрузить основные процессы приложения и повысить его отзывчивость. Переменные, отвечающие за настройку воркеров [Celery](/admin-guide/containers-description.md):
* **CELERY\_WORKER\_CONCURRENCY** - количество задач, которые может обрабатывать один воркер Celery одновременно, значение по умолчанию: `6`;
* **CELERY\_WORKER\_MAX\_CONCURRENCY** - максимальное количество задач, которые может обрабатывать один воркер Celery. Этот параметр используется для предотвращения перегрузки системы при большом количестве задач, значение по умолчанию: `12`;
* **CELERY\_MEDIA\_WORKER\_CONCURRENCY** - количество задач, которые может обрабатывать воркер Celery, отвечающий за обработку медиа-задач (например, генерация отчётов), значение по умолчанию: `2`;
* **CELERY\_MEDIA\_WORKER\_MAX\_CONCURRENCY** - максимальное количество задач, которые может обрабатывать воркер Celery, отвечающий за обработку медиа-задач. Этот параметр используется для предотвращения перегрузки системы при большом количестве задач, значение по умолчанию: `4`;
### Архивирование данных CodeScoring OSA
Следующие переменные отвечают за настройку архивирования данных сервиса системы CodeScoring - OSA. По умолчанию переменные `OSA_ARCHIVE_THRESHOLD_DAYS, OSA_ARCHIVE_AUTO_CLEANUP_ENABLED, OSA_ARCHIVE_RETENTION_PERIOD_DAYS, OSA_ARCHIVE_CHUNK_SIZE` закомментированы, при необходимости их использования, необходимо их расскомментировать.
* **OSA\_ARCHIVE\_THRESHOLD\_DAYS** - период (в днях), после которого пакет или контейнерный образ, не получивший запросов, архивируется. Значение по умолчанию: `14`;
* **OSA\_ARCHIVE\_RETENTION\_PERIOD\_DAYS** - период (в днях) указывающий, сколько дней архивные пакеты или контейнерные образы будут храниться перед тем, как быть удаленными, при включенной автоматической очистке `OSA_ARCHIVE_AUTO_CLEANUP_ENABLED`. Значение по умолчанию: `30`;
* **OSA\_ARCHIVE\_AUTO\_CLEANUP\_ENABLED** - включение или отключение автоматической очистки архивных компонентов OSA. Если выставлено значение `True`, то система будет автоматически удалять архивные пакеты после периода, указанного в `OSA_ARCHIVE_RETENTION_PERIOD_DAYS`, если `False` - очистка выполняется вручную, значение по умолчанию: `False`;
* **OSA\_ARCHIVE\_CHUNK\_SIZE** - определяет размер "порций" (чанков) для обработки архивных компонентов. Этот параметр может влиять на производительность и эффективность процесса архивирования/очистки. Значение по умолчанию: `1000`.
### Judge
Следующие переменные отвечают за настройку компонента [Judge](/admin-guide/containers-description.md), отвечающего за работу политик в рамках работы сервиса OSA Proxy. Их необходимо настраивать только в случае использования OSA Proxy:
* **WEB\_CONCURRENCY** - определяет количество воркеров для параллельной проверки компонентов или контейнеров на соответствие политикам безопасности. Значение по умолчанию: `5`;
* **MIN\_DATABASE\_CONNECTION\_POOL\_SIZE** - определяет минимальный пул активных соединений к базе данных. По умолчанию: переменная закомментирована и имеет значение `0`;
* **MAX\_DATABASE\_CONNECTION\_POOL\_SIZE** - определяет максимальный пул активных соединений к базе данных. По умолчанию: переменная закомментирована и имеет значение `10`.
---
url: /admin-guide/containers-description.md
---
# Описание служб
В данном разделе представлен обзор основных служб, используемых для работы системы.
## Основные компоненты
* **Frontend** – пользовательский интерфейс, обеспечивающий взаимодействие с системой. Отображает результаты анализа, настройки и параметры политик.
* **Backend** – обрабатывает запросы от Frontend и координирует работу других компонентов системы;
* **Celery-worker** – выполняет задачи, полученные от различных сервисов (например, Celery-beat и Backend);
* **Celery-beat** – планировщик задач, запускающий задачи в Celery-worker по заданному расписанию;
* **Collectstatic** – отвечает за сборку статических файлов, необходимых для работы системы;
* **Fluentd** – агент сбора логов, собирающий логи из всех компонентов системы;
* **Index-proxy** – обогащает запросы к индексу (https://index.codescoring.ru) дополнительными данными и заголовками;
* **Migrate** – выполняет конфигурацию системы при запуске и обновление базы данных;
* **Osa-api** – обеспечивает взаимодействие между основной системой и плагином OSA (установленным в Sonartype Nexus Repository или Jfrog Artifactory) через API;
* **Osa-registration** – отвечает за сканирование и проверку пакетов и контейнерных образов на соответствие политикам;
* **Pgbouncer** – обеспечивает управление и оптимизацию запросов к базе данных;
* **Psql** – клиент PostgreSQL, используемый для управления базой данных;
* **Redis** – кэш и брокер сообщений, обеспечивающий хранение данных и координацию работы компонентов;
* **Tasks-high-priority** – очередь для выполнения задач с высоким приоритетом;
* **Tasks-main** – очередь для выполнения основных задач, таких как сканирование, загрузка проектов и отправка политик;
* **Tasks-main-scheduler** – планировщик периодических задач, например сканирование по расписанию;
* **Tasks-media** – очередь для загрузки и выгрузки медиафайлов;
* **Tasks-osa-container-image-scan** – отвечает за сканирование образов в стандартах Docker, OCI и Singularity на предмет уязвимостей;
* **Tasks-osa-package-scan** – отвечает за сканирование пакетов на наличие уязвимостей;
* **Tasks-policy** – выполняет задачи по проверке соответствия политикам безопасности;
* **Tasks-sca-external-scan** – очередь для сканирований, запущенных через консольного агента Johnny;
* **Tasks-tqi** – агент модуля CodeScoring TQI (Teams and Quality Intelligence), анализирующий качество исходного кода;
* **Tasks-secrets** – агент модуля CodeScoring Secrets, отвечающий за поиск чувствительной информации в коде;
* **Judge** – отвечает за обработку политик для проектов, пакетов и контейнерных образов.
---
url: /admin-guide/troubleshooting.md
---
# Диагностика неполадок
## Работа с логами
1. Перейти в директорию с файлами запуска:
```bash linenums="1"
cd /path/to/docker/compose
```
2. Выполнить команду копирования файла логов из контейнера в файл `codescoring_onprem.log`
```bash linenums="2"
docker cp -L PROJECT_NAME-fluentd-1:/fluentd/log/docker.log codescoring_onprem.log
```
3. Отправить вендору файл `codescoring_onprem.log`.
## Переустановка системы
При необходимости начать процесс установки с нуля нужно выполнить очистку томов.
Если на сервере с докером нет других контейнеров, кроме проекта CodeScoring, выполнить команду:
```bash
docker system prune --all --volumes
```
Если на сервере есть ещё другие проекты на docker:
1. остановить docker compose:
```bash linenums="1"
docker compose down --remove-orphans
```
2. выполнить команду:
```bash linenums="2"
docker volume rm PROJECT_NAME__db-data
```
3. Если возникнет ошибка, что данный том используется контейнером, следует выполнить команду и повторить предыдущие шаги (`CT_HASH` будет в сообщении об ошибке):
```bash linenums="3"
docker rm CT_HASH
```
Если проблема не решается, обратиться к контактному лицу вендора, оказывающему сопровождение, для получения дальнейших инструкций.
---
url: /admin-guide/activation.md
---
# Активация системы
## Ввод ключа активации
Для работы системы необходимо её активировать с помощью ключа, который передается клиенту в отдельном `txt` файле.
Для ввода ключа необходимо перейти в раздел `Настройки -> Ключ активации`, скопировать текст из файла в поле без каких-либо изменений и нажать кнопку **Сохранить**. В случае успеха на странице появится информация по ключу и поле Статус перейдет в значение **Активен**.
## Параметры ключа
При успешной активации системы в разделе `Настройки -> Ключ активации` отображаются параметры используемого ключа:
* **Статус** – статус активации системы;
* **Владелец** – наименование организации, на чье имя выдан ключ;
* **Дата выпуска** – день выпуска ключа;
* **Дата истечения** день истечения действия ключа;
* **Ограничение по количеству авторов** – максимальное количество авторов (разработчиков), на которое лицензирована система;
* **Частные базы уязвимостей** – список подключенных частных баз уявимостей, например **Kaspersky OSS Threats Data Feed**;
* **Доступные модули** – список подключенных модулей с отображением даты истечения ключа для каждого.
## Истечение ключа активации
При истечении срока действия ключа активации платформа продолжает работать с ограничениями:
* Ранее выполненные сканирования и их результаты остаются доступными для просмотра;
* Попытка выполнения нового сканирования приводит к ошибке, связанной с истечением ключа активации.
---
url: /admin-guide/author-audit.md
---
# Аудит количества авторов
Функция аудита количества авторов доступна в платформе, начиная с версии **2025.37.0**. Она позволяет получить статистику об уникальных авторах коммитов в выбранных репозиториях.
Совершить расчет можно в разделе `Настройки → Ключ активации` по кнопке **Рассчитать**.
## Поддерживаемые платформы
На данный момент аудит доступен для платформы GitLab.
## Настройка параметров
После нажатия кнопки открывается форма с параметрами анализа:
* **Провайдер** — источник данных о репозиториях. На текущий момент поддерживается **GitLab**;
* **VCS URL** — адрес хоста, на котором размещены репозитории (без указания конкретного репозитория).
Пример:
```
https://gitlab.svc.cdscrng.ru/
```
* **Ключ доступа** — персональный токен с правами `read_api`. Токен не сохраняется и используется только для текущего расчёта.
В GitLab токен можно получить по адресу:
```
/-/user_settings/personal_access_tokens
```
* **Фильтр по email авторов** — список доменов или регулярных выражений для отбора авторов. Можно указать несколько значений через `|`.
:::warning Важно
VCS URL должен начинаться с протокола передачи данных. Закрывающий слэш необязателен.
:::
## Выполнение анализа
После заполнения формы нажмите **Рассчитать**. Пока идёт сканирование, процесс можно отменить нажатием кнопки **Отменить**.
## Результаты расчёта
После завершения аудита в разделе ключей активации отображаются следующие данные:
* **Статус расчёта** – показывает результат выполнения. При ошибке причину можно посмотреть в разделе **Аудит-лог**;
* **Время расчёта** – дата и время выполнения аудита;
* **Уникальных авторов за год** – количество авторов коммитов за последние 365 дней. Через API параметр можно изменить;
* **Успешно обработанных репозиториев** – количество репозиториев, обработанных без ошибок;
* **Репозиториев с ошибкой** – количество репозиториев, где возникли ошибки чтения. Подробности можно увидеть в логах бэкенда;
* **URL отчёта (JSON)** – ссылка на полный отчёт в формате JSON с деталями анализа и списком обработанных репозиториев.
## Диагностика ошибок
Если анализ завершился с ошибкой:
1. Проверьте **VCS URL** и корректность **токена**. При ошибке **401** обычно указаны неверный адрес или недействительный токен.
2. Дополнительную информацию можно найти в разделе **Аудит-лог**.
---
url: /admin-guide/users.md
---
# Управление учетными записями
## Создание учетных записей
Платформа CodeScoring поддерживает работу множества пользователей с отдельными учетными записями. Создание и управление учетными записями пользователей происходит в разделе `Настройки -> Пользователи`.
Для создания нового пользователя необходимо перейти на форму по кнопке **Create New** и заполнить следующие поля:
* **Имя пользователя** — имя пользователя в системе;
* **Имя** — имя;
* **Фамилия** — фамилия;
* **Email** — электронная почта;
* **Подразделение** — принадлежность к подразделению организации в рамках системы;
* **Уровень доступа** — уровень доступа в рамках системы;
* **Пароль** – пароль для входа в систему;
* **Может создавать CLI проекты через API** – возможность создавать проекты типа CLI при использовании API.
Список созданных пользователей можно отфильтровать по следующим параметрам:
* **Подразделение**;
* **Уровень доступа**;
* **Активен** — признак действующей учетной записи;
* **Сервер LDAP** — [сервер LDAP](/admin-guide/ldap-settings.md), подключенный к системе.
## Настройка учетных записей
Созданные учетные записи можно отредактировать или удалить в разделе `Настройки -> Пользователи`. Добавить пользователя в проект с указанной ролью можно по кнопке **Добавить пользователи** на вкладке "Проекты" страницы редактирования пользователя.
Время сессии для неактивного пользователя ограничено. По умолчанию сессия пользователя заканчивается через 2 недели с момента последней активности, после чего нужно произвести повторный вход в систему.
Для конфигурации времени жизни сессии доступна переменная окружения (в секундах): `SESSION_COOKIE_AGE`.
:::warning Важно
Изменение имени УЗ и пароля для пользователей из внешних провайдеров идентичности невозможно.
:::
## Разделение уровней доступа
При создании учетной записи ей должен быть присвоен один из следующих уровней доступа - **User** (пользователь), **Administrator** (администратор), **Auditor** (аудитор ИБ) или **Security Manager** (Менеджер безопасности).
### Уровень доступа Administrator
Для уровня доступа Administrator предоставляется доступ во все проекты. Данный уровень доступа также дает возможность просматривать и изменять все настройки в системе без ограничений.
### Уровень доступа Security Manager
Для уровня доступа Security Manager предоставляется доступ во все проекты. Данный уровень доступа также дает возможность просматривать все разделы, связанные с безопасностью, и запускать все виды сканирования. Точные права на изменение приведены в таблице ниже.
### Уровень доступа Auditor
Для уровня доступа Auditor предоставляется доступ во все проекты. Данный уровень доступа также дает право просмотра всех настроек и проектов в системе без возможности вносить и сохранять изменения.
### Уровень доступа User
Для уровня доступа User доступ организуется индивидуально. Для каждого проекта может быть предоставлен доступ со следующими ролями:
* **Viewer** — доступ только на просмотр результатов анализов в рамках проекта;
* **Developer** — все права роли Viewer, а также доступ к запуску анализа в веб-интерфейсе, через агента и через плагин прокси-репозитория;
* **Owner** — все права роли Developer, доступ к изменению настроек проекта и управлению доступами других пользователей проекта.
Для каждой роли в рамках уровня доступа **User** доступно создание CLI проектов через API при активации параметра **Может создавать CLI проекты через API** в профиле пользователя.
В проекте может быть несколько пользователей с одинаковыми ролями, в том числе несколько **Owner**. При отсутствии пользователей в роли **Owner** проектом может управлять только пользователь с уровнем доступа **Administrator**.
## Доступные действия
Более подробное перечисление доступных действий для каждого уровня доступа представлено в таблице ниже:
| **Действие** | **User (Viewer)** | **User (Developer)** | **User (Owner)** | **Auditor** | **Security Manager** | **Administrator** |
|---------------------------------------------------------------------| ----------------- | -------------------- | ---------------- | ----------- | -------------------- | ----------------- |
| **Analysis**: просмотр результатов анализа | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Analysis**: запуск SCA анализа | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
| **Analysis**: запуск анализа Secrets | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
| **Analysis**: изменение статуса Secrets | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ |
| **Analysis**: запуск Authors анализа | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Analysis**: запуск Quality анализа | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Activation key**: просмотр информации об активационном ключе | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Activation key**: сохранение активационного ключа | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Audit log**: просмотр аудит лога | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Audit log**: экспорт аудит лога | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Authors merge**: просмотр правил | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Authors merge**: создание правил | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Dashboard**: просмотр страницы | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Dependencies**: просмотр списка зависимостей | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Dependencies**: экспорт списка зависимостей | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Email**: просмотр настроек почты | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Email**: редактирование настроек почты | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Groups**: просмотр групп пользователей | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Groups**: создание групп пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Groups**: редактирование групп пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Groups**: удаление групп пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **LDAP**: просмотр настроек LDAP | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **LDAP**: редактирование настроек LDAP | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **OSS Index**: просмотр настроек OSS Index | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **OSS Index**: редактирование настроек OSS Index | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Policies**: просмотр политик | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Policies**: создание политик | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Policies**: редактирование настроек политик | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Policies**: удаление политик | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Policy alerts**: просмотр списка алертов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Policy alerts**: экспорт списка алертов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Policy alerts**: отправка уведомлений | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Policy ignores**: просмотр правил | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Policy ignores**: создание правил | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Policy ignores**: редактирование правил | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Policy ignores**: удаление правил | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| **Projects**: просмотр проектов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Projects**: просмотр Contribution map | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Projects**: просмотр Complexity map | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
| **Projects**: создание проектов | 〰️ | 〰️ | 〰️ | ❌ | ❌ | ✅ |
| **Projects**: редактирование настроек проектов | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| **Projects**: удаление проектов | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Projects**: управление правами доступа групп для проектов | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| **Projects**: управление правами доступа пользователей для проектов | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| **Projects**: загрузка SBOM | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
| **Projects**: редактирование зависимостей для экспорта SBOM | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
| **Project categories**: просмотр категорий | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ |
| **Project categories**: создание категорий | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Project categories**: редактирование категорий | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Project categories**: удаление категорий | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Proprietors**: просмотр владельцев кода | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ |
| **Proprietors**: создание владельцев кода | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Proprietors**: редактирование владельцев кода | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Proprietors**: удаление владельцев кода | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Task managers**: просмотр интеграций | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Task managers**: добавление интеграций | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Task managers**: редактирование настроек интеграций | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Task managers**: удаление интеграций | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Task managers**: выполнение проверки настроек | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Users**: просмотр пользователей | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Users**: создание пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Users**: редактирование настроек пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **Users**: удаление пользователей | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **VCS**: просмотр репозиториев | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **VCS**: добавление репозиториев | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **VCS**: редактирование настроек репозиториев | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **VCS**: удаление репозиториев | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| **VCS**: выполнение проверки настроек | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
| **Vulnerabilities**: просмотр списка уязвимостей | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Vulnerabilities**: экспорт списка уязвимостей | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Vulnerabilities**: выполнение триажа | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
:::warning Важно
Для возможности запуска сканирования также убедитесь, что в лицензии включен соответствующий модуль анализа.
:::
## Группы пользователей
Пользователи внутри системы могут быть распределены в группы. Создание и управление группами происходит в разделе `Настройки -> Группы`.
Для создания новой группы пользователей необходимо перейти на форму по кнопке **Создать** и заполнить следующие поля:
* **Название** — название группы;
* **Описание** — описание группы.
Группы могут быть добавлены к созданным проектам для более удобного отслеживания пользователей, связанных с проектом.
---
url: /admin-guide/groups.md
---
# Создание групп
Группы используются для объединения [пользователей](/admin-guide/users.md) в списки и привязки к определенным проектам. Это позволяет удобно управлять массовым доступом к проектам в системе.
Создание групп происходит в разделе `Настройки -> Группы`. Перейти на форму создания группы можно по кнопке **Создать**. В форме необходимо обязательно заполнить поле названия **Название** и опционально задать описание группы, цвет иконки.
## Настройка групп
Каждая группа имеет свой список пользователей и набор привязанных проектов. Изменить данные параметры можно по кнопке **Редактировать**.
Привязать проект к группе можно по кнопке **Добавить проект**. После привязки группы каждый ее пользователь будет иметь доступ к проекту согласно назначенной роли.
При добавлении нового пользователя в группу по кнопке **Добавить пользователя** необходимо выбрать существующую учетную запись в системе CodeScoring и назначить одну из ролей в рамках группы:
* **Наблюдатель** — доступ только на просмотр результатов анализов проекта;
* **Разработчик** — доступ к запуску анализа в веб-интерфейсе, через агента и через плагин прокси-репозитория;
* **Владелец** — доступ к просмотру политик проекта, изменению настроек проекта и управлению доступами других пользователей проекта.
В рамках интеграции со внешними провайдерами идентичности также можно настроить [сопоставление идентичности](/admin-guide/identity-mapping/index.md) для автоматического назначения групп, ролей и уровня доступа.
---
url: /admin-guide/ldap-settings.md
---
# Работа с LDAP
## Возможности интеграции с LDAP
**CodeScoring** поддерживает аутентификацию и авторизацию пользователей по протоколу **LDAP** и маппинг атрибутов записей о пользователях в **LDAP** на атрибуты пользователей в системе.
## Страница аутентификации CodeScoring
На странице аутентификации доступно меню с выбором провайдера аутентификации. Помимо провайдера по умолчанию (локальные учётные записи, `internal directory`), доступны для выбора активные интеграции с **LDAP** серверами.
## Маппинг атрибутов записей о пользователях LDAP на атрибуты пользователей CodeScoring
При аутентификации через **LDAP** происходит маппинг следующих данных из записи в директории на учётную запись в CodeScoring:
* название УЗ (`username`);
* имя;
* фамилия;
* электронная почта.

## Сопоставление идентичности на основе LDAP-групп {#mapping-groups}
При аутентификации через LDAP CodeScoring может запрашивать данные об LDAP-группах пользователя и на основе них применять правила [сопоставления идентичности](/admin-guide/identity-mapping/index.md).
## Просмотр существующих интеграций с LDAP
Просмотр существующих интеграций доступен в разделе `Настройки -> Провайдеры идентификации -> LDAP`. В разделе отображаются таблица со списком настроенных интеграций LDAP, кнопка для создания новой интеграции (`Добавить`) и окно поиска.

## Просмотр деталей о существующей интеграции с LDAP
Просмотр деталей открывается при нажатии на гиперссылку с названием интеграции либо при нажатии на кнопку **View** в разделе Actions.
При просмотре доступны следующие действия:
* удаление интеграции;
* редактирование интеграции;
* проверка доступности (`Обновить статус`).
Помимо основных полей настроек (описаны ниже), при просмотре деталей об интеграции с **LDAP** доступны данные о:
* дате создания;
* дате последнего обновления;
* статусе доступности;
* (опционально) причине недоступности.

## Создание или редактирование интеграции с LDAP
Для того чтобы создать новую интеграцию с **LDAP**, необходимо на просмотре списка интеграций нажать на кнопку `Добавить`. Для того чтобы отредактировать существующую интеграцию, необходимо нажать на кнопку `Редактировать` на странице просмотра или списка интеграций. Формы создания и редактирования идентичны.
### Описание полей формы
* `Название` — название интеграции, отображается на странице аутентификации;
* `LDAP протокол` — выбор между протоколами **LDAP** и **LDAPS** (**LDAP** поверх **SSL**);
* `Имя хоста LDAP` — доменное имя или IP адрес сервера **LDAP**;
* `Порт LDAP` — порт **LDAP** сервера;
* `База для поиска пользователя` — указание места поиска записей о пользователе;
* `Фильтр поиска пользователя` — фильтр для поиска записи о пользователе. Должен содержать шаблон `%USERNAME%`, при поиске он
будет заменён на имя УЗ, для которой производится аутентификация через LDAP;
* `Поле с именем учетной записи` — атрибут хранящий название УЗ пользователя в записи о нём;
* `Поле с email` — атрибут хранящий email пользователя в записи о нём;
* `Поле с именем` — атрибут хранящий имя пользователя в записи о нём;
* `Поле с фамилией` — атрибут хранящий фамилию пользователя в записи о нём;
* `Формат имени учетной записи` — выбор формата строки авторизации;
* `Домен` — указание домена **Active Directory** (появляется при выборе соответствующего **Username format**);
* `Сервисный пользователь` — логин пользователя с правами чтения каталогов на сервере **LDAP**;
* `Пароль` — пароль пользователя с правами чтения каталогов на сервере **LDAP**;
* `Поле с названием группы` — атрибут хранящий название группы в записи о ней;
* `База для поиска групп` — указание места поиска записей о группах;
* `Фильтр поиска групп пользователя` — фильтр для поиска записей о группах, к которым принадлежит пользователь. Должен
содержать шаблон `%USERNAME%`, при поиске он будет заменён на имя УЗ, для которой производится аутентификация через **LDAP**;
* `Фильтр поиска для всех групп` — фильтр для поиска записей о всех группах в **LDAP**;
* `Поле с группами пользователя` — атрибут хранящий идентификаторы членов группы в записи о ней;
* `Использовать TLS`;
* `Активно` — используется ли интеграция с **LDAP** для аутентификации пользователей.

### Доступные опции для username format

### Тестирование конфигурации интеграции с LDAP
Для удобства конфигурации пользователям доступны 2 формы для тестирования подключения:
* тестирование подключения и аутентификации (`Тестирование подключения`);
* тестирование поиска (`Тест поиска пользователя`).
Для обоих тестов комбинируются данные из основной формы с данными формы тестирования. Данные из полей `Сервисный пользователь` и `Пароль сервисного пользователя` игнорируются.
#### Тестирование подключения и аутентификации
При нажатии на кнопку теста (`Проверить подключение`) в секции **Тестирование подключения** происходит подключение к LDAP серверу (операция `bind`). В случае успешного теста выводится уведомление об успехе операции, в случае провала теста — сообщение об ошибке.


#### Тестирование загрузки данных о пользователе
При нажатии на кнопку теста (`Проверить подключение`) в секции **Тест поиска пользователя** происходит подключение к LDAP серверу (операция `bind`) и поиск данных о пользователе (операция `search`) согласно данным в форме. В случае успешного теста выводится уведомление об успехе операции и результат поиска, в случае провала теста — сообщение об ошибке.


#### Тестирование загрузки данных о группах
При нажатии на кнопку теста (`Проверить подключение`) в секции **Тест загрузки групп** происходит подключение к LDAP серверу (операция `bind`) и поиск данных о группах (операция `search`) согласно данным в форме. В случае успешного теста выводится уведомление об успехе операции и результат поиска, в случае провала теста — сообщение об ошибке.


## Механизм аутентификации с помощью LDAP

## Замечания
* Использование авторизации через **LDAP** не подразумевает полную синхронизацию директории с информацией о пользователях из **Службы каталогов**.
* Редактирование название УЗ (`username`) и назначение пароля пользователю из **LDAP** невозможно.
* Возможно наличие пользователей из различных провайдеров аутентификации с одинаковым названием УЗ (`username`).
* Возможно назначение пользователю из **LDAP** любого уровня доступа (`User`, `Auditor`, `Administrator`, `Security Manager`).
---
url: /admin-guide/oidc.md
---
# Настройка интеграции с OpenID Connect
## Страница аутентификации CodeScoring
**CodeScoring** поддерживает аутентификацию и авторизацию пользователей по протоколу **OpenID Connect**. На странице аутентификации доступно меню с выбором провайдера аутентификации. Помимо провайдера по умолчанию (локальные учётные записи, `internal directory`) и интеграций с LDAP, доступны для выбора активные интеграции с **OpenID Connect**.
## Настройка клиента на стороне провайдера OpenID Connect
Ниже представлен пример валидной конфигурации клиента OpenID Connect на стороне провайдера при условии, что URL
платформы CodeScoring - `https://codescoring.example.com/`:
* **Root url** - `https://codescoring.example.com/`;
* **Home url** - `https://codescoring.example.com/cabinet/dashboard/`;
* **Valid redirect urls** - `https://codescoring.example.com/auth/oidc/callback*`;
* **Web origins** - `https://codescoring.example.com/`;
* **Admin url** - `https://codescoring.example.com/`;
* **Authentication flow** - standard flow.
## Настройка интеграции с OpenID Connect на стороне CodeScoring
Сконфигурировать OpenID Connect на стороне CodeScoring можно в разделе `Настройки -> Провайдеры идентичности -> OpenID Connect`.
Переход на форму создания нового подключения осуществляется по кнопке **Создать**. В форме необходимо заполнить следующие поля:
### Основные настройки OIDC
* **Наименование** - название интеграции, будет отображаться на экране аутентификации;
* **Активно** - флаг активности интеграции, в зависимости от значения, эта интеграция будет доступна как провайдер
аутентификации;
* **Идентификатор клиента** - значение должно соответствовать полю "идентификатор клиента" (client id) в конфигурации клиента на стороне провайдера;
* **Секрет клиента** - значение должно соответствовать полю "секрет клиента" (client secret) в конфигурации клиента на стороне провайдера.
### Настройки подключения
CodeScoring может настроить поля ниже на основе эндпоинта `/.well-known/openid-configuration` издателя OIDC при нажатии на кнопку `Получить настройки`.
* **Issuer URL провайдера** - адрес издателя провайдера OpenID Connect;
* **Authorization URL провайдера** - URL для авторизации в провайдере OpenID Connect, значение можно получить по
`$ISSUER_URL/.well-known/openid-configuration`;
* **Token URL провайдера** - URL для получения у провайдера токена авторизации, значение можно получить по
`$ISSUER_URL/.well-known/openid-configuration`;
* **UserInfo URL провайдера** - UserInfo эндпоинт провайдера, значение можно получить по
`$ISSUER_URL/.well-known/openid-configuration`;
* **JWKS URL провайдера** - JWKS эндпоинт провайдера, значение можно получить по
`$ISSUER_URL/.well-known/openid-configuration`;
* **Области доступа клиента** - значения передаются в параметре "scope" запроса авторизации.
### Настройки соотнесения полей
* **Поле с идентификатором субъекта** - название поля с идентификатором субъекта (sub) в ответе, возвращаемом эндпоинтом
UserInfo;
* **Поле с именем учётной записи** - название поля с предпочитаемым именем УЗ пользователя в ответе, возвращаемом
эндпоинтом UserInfo;
* **Поле с именем** - название поля с именем пользователя в ответе, возвращаемом эндпоинтом UserInfo;
* **Поле с фамилией** - название поля с фамилией пользователя в ответе, возвращаемом эндпоинтом UserInfo;
* **Поле с email** - название поля с email пользователя в ответе, возвращаемом эндпоинтом UserInfo;
* **Поле сопоставления идентичности** - название claim, значение которого используется в правилах сопоставления идентичности;
* **Поле для фильтрации при авторизации** - поле в ответе UserInfo, используемое для фильтрации пользователей при авторизации;
* **Доступ только для** - допустимые значения поля фильтрации. Пользователь будет авторизован, если ответ UserInfo содержит одно из этих значений.
## УЗ CodeScoring, созданные при аутентификации через OpenID Connect
При аутентификации через OpenID Connect, CodeScoring будет создавать новые или обновлять существующие учётные записи.
Соотносятся следующие данные:
* Идентификатор субъекта в провайдере OpenID Connect;
* Предпочитаемое название УЗ;
* Имя;
* Фамилия;
* Email.
УЗ, созданные таким образом, можно добавлять в группы, для них можно менять уровень доступа так же, как и для обычных УЗ.
Для автоматического назначения групп, ролей и уровня доступа пользователям OIDC используйте
[сопоставление идентичности](/admin-guide/identity-mapping/index.md).
Для УЗ, созданных при аутентификации через OpenID Connect, нельзя менять имя УЗ или устанавливать пароль.
---
url: /admin-guide/identity-mapping.md
---
# Сопоставление идентичности
Сопоставление идентичности позволяет автоматически назначать пользователям CodeScoring уровень доступа, группы и роли в группах на основе данных из внешних провайдеров идентичности. Правила сопоставления настраиваются в разделе `Настройки -> ID Провайдеры -> Правила сопоставления`.
Правило сопоставления связывает значение, полученное от внешнего провайдера, с действием в CodeScoring:
* назначить пользователю уровень доступа (`User`, `Auditor`, `Administrator`, `Security Manager`);
* добавить пользователя в одну или несколько групп CodeScoring с выбранной ролью.
В качестве источника данных для сопоставления используются:
* для LDAP — группы пользователя, найденные в LDAP;
* для OIDC — значение claim, указанного в настройках OIDC как `Поле сопоставления идентичности`.
## Настройка источников данных
### LDAP
Для применения правил сопоставления к пользователям LDAP CodeScoring должен иметь возможность получать данные о группах пользователя. Для этого в настройках LDAP необходимо заполнить следующие поля:
* `Сервисный пользователь`;
* `Пароль`;
* `База для поиска групп`;
* `Фильтр поиска для всех групп`;
* `Поле с названием группы`;
* `Поле с группами пользователя` — если в качестве значения поля `Метод поиска по группе` выбрана `Пользовательская запись`;
* `Фильтр поиска групп пользователя` — если в качестве значения поля `Метод поиска по группе` выбран `Поиск по группе`.
Группы пользователя могут определяться одним из двух способов:
* по данным пользовательской записи, если сведения о группах хранятся в атрибуте пользователя;
* по результатам поиска записей о группах, если принадлежность пользователя к группам определяется через отдельный поиск.
### OIDC
Для применения правил сопоставления к пользователям OIDC в настройках интеграции необходимо заполнить `Поле сопоставления идентичности`. В этом поле указывается название claim, значение которого CodeScoring будет сравнивать со значениями в правилах сопоставления.
Убедитесь, что выбранный claim возвращается провайдером OIDC при входе пользователя. Если claim отсутствует в ответе провайдера, правила сопоставления для этого пользователя применены не будут.
## Запуск сопоставления
Сопоставление запускается в следующих случаях:
* для OIDC — при входе пользователя в систему;
* для LDAP — при входе пользователя в систему;
* для LDAP — при нажатии кнопки `Применить все правила` в разделе
`Настройки -> ID Провайдеры -> Правила сопоставления`.
Кнопка `Применить все правила` применяет правила к пользователям LDAP на основе текущих данных о группах в LDAP. Для OIDC сопоставление выполняется только при входе пользователя, так как необходимые claim доступны CodeScoring только в момент аутентификации.
## Применение правил
Правила сопоставления применяются следующим образом:
* в процессе сопоставления обновляется уровень доступа пользователя и состав групп, управляемые правилами сопоставления;
* добавление, изменение или удаление правил не приводит к немедленному обновлению пользователей. Для применения
изменённых правил необходимо повторно запустить сопоставление доступным для провайдера способом;
* группы пользователя, добавленные или отредактированные администратором вручную, не изменяются в процессе сопоставления:
приоритет отдаётся ручным изменениям;
* если поиск данных об авторизации пользователя во внешнем провайдере идентичности завершится неудачно (LDAP группы не найдены, OIDC claim отсутствует), пользователь будет удалён из групп, в которые он был добавлен в результате сопоставления. Если уровень доступа также был назначен в ходе сопоставления, он будет сброшен до `User`.
---
url: /admin-guide/save/architecture.md
---
# Архитектура
CodeScoring.Save построен на микросервисной архитектуре. Backend API и контур аутентификации / авторизации вынесены в отдельные сервисы: **Save API service** и **cs-auth (Auth/RBAC service)**.
## Технологический стек
* **Язык разработки:** Go 1.25+.
* **Хранилище метаданных:** PostgreSQL 14+ (рекомендуется для production) или SQLite 3.x.
* **Объектное хранилище:** S3-совместимое (MinIO, AWS S3, Yandex Object Storage) или локальная файловая система.
* **Аутентификация:** RSA-2048 JWT с JWKS, выпускаемый cs-auth и локально валидируемый Save через публичный ключ.
## Архитектурная диаграмма
```mermaid
flowchart TB
UI["Web UI · React"]
PM["Пакетные менеджеры
npm · mvn · docker · nuget · pypi · go · apt · yum/dnf"]
LB["Load Balancer / Ingress"]
SAVE["Save API service
stateless · pods 1..N"]
AUTH["cs-auth (Auth / RBAC)
stateless · pods 1..N
общий RSA-ключ"]
SCHED["Scheduler
save/backend/cmd/scheduler/main.go"]
WORKER["Workers
save/backend/cmd/worker/main.go
cleanup, metadata jobs"]
REDIS[("Queue (Redis)
job queue / pubsub")]
DB[("Metadata DB
см. примечание ниже")]
OBJ[("Object Storage
S3-совместимое / локальная ФС")]
UI --> LB
PM --> LB
LB --> SAVE
LB -- "/v2/token (Docker auth flow)" --> AUTH
SAVE -- "авторизация действий · JWKS · события для аудита" --> AUTH
SAVE --> DB
SAVE --> OBJ
AUTH --> DB
%% Scheduler enqueues background jobs
SCHED --> REDIS
%% Workers consume jobs and operate on DB/Blob storage and emit audit events
REDIS --> WORKER
WORKER --> DB
WORKER --> OBJ
WORKER -- "audit events" --> AUTH
%% Save can enqueue ad-hoc background jobs
SAVE -- "поместить в очередь jobs" --> REDIS
```
:::note О схеме базы данных
В развёртывании с **PostgreSQL** оба сервиса могут делить один экземпляр БД и одну схему; данные разделены префиксами имён таблиц.
В развёртывании с **SQLite** у каждого сервиса свой отдельный файл базы.
:::
## Компоненты системы
### Save API service
Основной backend-сервис, обрабатывающий входящие запросы к репозиториям и административному API.
**Функции:**
* Обработка HTTP/HTTPS запросов от пакетных менеджеров и веб-интерфейса.
* Валидация токенов и интеграция с выделенным Auth/RBAC service.
* Маршрутизация запросов к storage backend.
* Интеграция с CodeScoring.OSA через OSA Proxy для сканирования артефактов при маршрутизации загрузок через прокси.
* Применение политик безопасности и политик очистки.
* Структурированное логирование и экспорт метрик в Prometheus.
**Технические характеристики:**
* Stateless-архитектура для горизонтального масштабирования.
* Graceful shutdown при обновлении.
* Health checks для Kubernetes.
### Auth/RBAC service
Выделенный сервис аутентификации и авторизации, разворачиваемый отдельно от Save API service.
**Функции:**
* Аутентификация пользователей и сервисных аккаунтов.
* Выпуск и обновление JWT-токенов (RSA-2048, alg=RS256).
* Управление ролями и разрешениями (RBAC) на уровнях global / project / repository.
* Управление API keys, robot accounts и project membership.
* Аудит операций, связанных с доступом и общесистемными событиями.
* Internal API для взаимодействия с Save API service.
* OCI Distribution Spec token endpoint для Docker / Helm / oras-клиентов.
**Технические характеристики:**
* Отдельная кодовая база и отдельная точка входа.
* Собственная схема в PostgreSQL при общем экземпляре БД, либо отдельный SQLite-файл.
* Горизонтальное масштабирование независимо от Save API service.
* **Обязательное условие масштабирования:** все реплики должны делить один и тот же RSA-ключ для подписи JWT.
### Storage Backend
Подсистема хранения артефактов:
* **Metadata Store** — PostgreSQL или SQLite для хранения метаданных.
* **Blob Store** — объектное хранилище для артефактов: S3-совместимое или filesystem.
Операции: сохранение и извлечение артефактов, управление версиями, генерация контрольных сумм.
### Background Workers
Фоновые процессы для выполнения отложенных задач. Компоненты разделены на три основных роли: планировщик (scheduler), очередь заданий (Redis) и воркеры (workers).
#### Scheduler
* Отвечает за планирование периодических и отложенных задач (cron-подобные задания): очистка, массовые операции с метаданными, уведомления и т.д.
* Реализован в `save/backend/cmd/scheduler/main.go`.
* Помещает задания в очередь (Redis) в виде задач с описанием типа и полезной нагрузки; задания должны быть идемпотентными и иметь метаданные для повторов/аттрибуции.
#### Queue (Redis)
* Централизованная очередь задач (Redis-backed pub/sub или list-based queue). Обеспечивает надёжную доставку, видимость задач, механизмы повторов и возможность DLQ (dead-letter).
* Рекомендуется конфигурация с включённой персистентностью и, при высокой нагрузке, кластеризацией Redis.
* Save API service также может помещать ad-hoc задачи в очередь (например, по событию upload).
#### Workers
* Воркеры забирают задания из Redis и выполняют операции над Metadata DB и Object Storage (удаление артефактов, перерасчёт метаданных, репликация, и т.д.).
* Реализованы в `save/backend/cmd/worker/main.go`.
* Воркеры публикуют события аудита в `cs-auth` (через internal API) при необходимости.
* Масштабируются горизонтально: несколько воркеров могут параллельно обрабатывать очередь; реализации должны учитывать контроль конкурентного доступа, тайм-ауты и ретраи.
### Web UI
Веб-интерфейс для управления проектами, репозиториями, артефактами и настройками доступа. Общее описание возможностей модуля приведено на странице [Функциональные характеристики](/functionality.md#codescoring-save).
### Взаимодействие сервисов
* Внешние клиенты (Web UI и пакетные менеджеры) обращаются только к Save API service через ingress; cs-auth напрямую снаружи кластера не доступен
* Save API service делегирует аутентификацию, проверку ролей и выпуск токенов в Auth/RBAC service
* Оба сервиса могут использовать отдельные или общий экземпляр PostgreSQL, но работают они в отдельных схемах/базах данных
* Save API service напрямую работает с metadata store и object storage; cs-auth работает только с metadata store и не имеет доступа к object storage
* Save обращается к cs-auth в нескольких случаях:
* **Проксирование части административного API** — Save форвардит запросы, не обрабатывая их сам
* **Проверка учётных данных**, отсутствующих в локальном кэше пода — (Basic Auth, API key, NuGet API key, NPM token, Docker token)
* **Оповещение о событиях для аудита** - единый журнал событий для всех сервисов
* Все internal-эндпоинты дополнительно защищены shared secret.
* На горячем пути Save валидирует Bearer JWT **локально**, используя кэшированный публичный RSA-ключ JWKS без сетевого вызова в cs-auth.
## Модель данных
### Основные сущности
#### Project (Проект)
```text
- ID
- Name
- Description
- Owner
- Created/Updated timestamps
```
#### Repository (Репозиторий)
```text
- ID
- Project ID
- Name
- Type (proxy/hosted)
- Format (maven, npm, docker, nuget, pypi, go, deb, rpm, raw)
- Configuration
- Storage Backend
- Cleanup Policies
- Created/Updated timestamps
```
#### Artifact (Артефакт)
```text
- ID
- Repository ID
- Group/Namespace
- Name
- Version
- Format-specific metadata
- Size
- Checksums (MD5, SHA1, SHA256)
- Upload date
- Last accessed
```
#### User (Пользователь)
```text
- ID
- Username
- DisplayName
- Email
- PasswordHash (bcrypt)
- IsActive
- AuthSource (local / ldap / oidc)
- LastLoginAt
- Created/Updated timestamps
```
#### Role / Robot account (Роль или сервисный аккаунт)
```text
- ID
- Name
- Description
- Permissions (global / project / repository scopes)
- IsAdmin
- IsSystem
- API keys (only for robot accounts)
- Created/Updated timestamps
```
#### APIKey (API-ключ)
```text
- ID
- UserID (FK на user с IsService=true)
- KeyPrefix (первые 12 hex-символов plaintext-ключа — индекс для O(1)-поиска)
- KeyHash (bcrypt(plaintext))
- Description
- ExpiresAt (NULL = бессрочный)
- LastUsedAt
- CreatedAt
```
Полный plaintext-ключ возвращается клиенту единожды при создании.
#### Cleanup Policy (Политика очистки)
```text
- ID
- Name
- Type (cleanup/security)
- Rules
- Repositories
- Enabled
- Created/Updated timestamps
```
## Варианты установки
CodeScoring.Save поддерживает несколько профилей установки. Требования, различия между профилями и порядок развертывания описаны в разделе [Варианты установки](/admin-guide/save/installation-options.md).
## Безопасность
### Аутентификация и авторизация
* JWT tokens для API, выпускаемые Auth/RBAC service
* Basic Auth / API keys для пакетных менеджеров и service accounts
* Ролевая модель (RBAC) с тремя scope'ами (global / project / repository), управляемая выделенным Auth/RBAC service
* Межсервисная валидация токенов через JWKS-эндпоинт
Способы аутентификации со стороны клиента подробно описаны в разделе [Аутентификация](/user-guide/save/repositories.md#authentication).
### Шифрование данных
Сами сервисы Save и cs-auth не выполняют шифрование на уровне приложения; используются возможности нижележащих компонентов:
* **Encryption at rest** обеспечивается выбранным object storage (S3 server-side encryption, MinIO encryption-at-rest) и PostgreSQL (через TDE-расширения или volume-level шифрование).
* **Encryption in transit** обеспечивается TLS на ingress / load balancer и в межсервисных соединениях.
* **Пароли пользователей и API-ключи robot-аккаунтов** хранятся как bcrypt-хэши в cs-auth.
### Аудит
* Полное логирование всех операций — единый журнал, в который пишут оба сервиса.
* Экспорт в машинно-читаемый формат (JSON) и HTML. Максимум 10 000 записей за один экспорт.
* Поддерживаемые фильтры списка/экспорта: `from`, `to`, `username`, `action`, `resource_type`, `q`, `user_id`. В web-UI доступен только поиск по имени пользователя, типу ресурса и действию.
## Производительность {#performance}
### Оптимизации
* **Кэширование:**
* In-process TTL-кэш `credential → PermissionSet` в каждом поде Save API service — устраняет round-trip в cs-auth при повторных запросах с теми же учётными данными
* Локальная валидация Bearer JWT по публичному ключу JWKS — без сетевого вызова в cs-auth на горячем пути. JWKS обновляется в фоне периодически.
* **Connection pooling:**
* Пул соединений к БД
* Переиспользование HTTP клиентов к upstream-репозиториям
* **Параллельная обработка:**
* Concurrent uploads / downloads через горутины.
* Batch (bulk) operations API
* **Streaming больших файлов:**
* Артефакты передаются через `MultiWriter` без буферизации целиком в памяти.
* Атомарная запись на диск через temp-file rename, чтобы избежать повреждения при конкурентной записи.
### Целевые показатели
Для базовой инсталляции:
* Latency (p95): < 100ms для cached requests
* Throughput: 300+ requests/sec
* Concurrent uploads: 100+
* Max artifact size: 5 GB
## Масштабирование
### Горизонтальное масштабирование
* Save API service — stateless, масштабируется добавлением реплик.
* Auth/RBAC service — stateless, масштабируется добавлением реплик. Обязательное условие: все реплики должны использовать один и тот же RSA-ключ для подписи JWT.
* PostgreSQL — масштабируется вертикально, при необходимости используются read-реплики.
* Объектное хранилище — масштабируется средствами провайдера: S3 или MinIO в кластере.
### Вертикальное масштабирование
* Увеличение ресурсов подов.
* Увеличение ресурсов PostgreSQL.
* Расширение объектного хранилища.
## Мониторинг и наблюдаемость
### Метрики (Prometheus)
Save экспортирует метрики в формате OpenTelemetry с Prometheus exporter'ом.
**HTTP-метрики:**
* `http_requests_total{method,path,status}` — счётчик HTTP-запросов.
* `http_request_duration_seconds{method,path,status}` — гистограмма latency.
* `http_requests_active` — gauge активных запросов.
**Метрики операций:**
* `storage_operations_total{operation,backend,success}` — операции с хранилищем.
* `artifact_uploads_total{artifact_type,repository}` — загрузки артефактов.
* `artifact_downloads_total{artifact_type,repository}` — скачивания артефактов.
* `proxy_requests_total{artifact_type,repository,cache_hit,success}` — proxy-запросы. Cache hit rate вычисляется как `rate(proxy_requests_total{cache_hit="true"}[5m]) / rate(proxy_requests_total[5m])`.
* `cleanup_operations_total{policy_type,repository,artifacts_deleted,success}` — операции очистки.
### Логирование
* Структурированные логи в формате JSON (или text, по конфигурации).
* Уровни: `debug`, `info`, `warn`, `error`.
* Вывод: stdout, stderr или файл.
* Совместимы с любым log-aggregator'ом (ELK, Loki, Vector), которые умеют JSON.
## Доступность и устойчивость
CodeScoring.Save не реализует автоматическое переключение при отказе, восстановление на конкретный момент времени и встроенное резервное копирование самостоятельно. Эти возможности обеспечиваются стандартными средствами инфраструктуры, в которой развёрнут сервис:
* **Несколько реплик Save и cs-auth** в Kubernetes за балансировщиком нагрузки обеспечивают доступность при отказе одного из подов.
* **Репликация PostgreSQL** и **резервное копирование базы данных** настраиваются средствами PostgreSQL-оператора или managed-сервиса.
* **Снапшоты и репликация объектного хранилища** выполняются средствами S3-совместимого хранилища.
* **Многоузловой Kubernetes-кластер** обеспечивает устойчивость к отказу отдельного узла.
Save не теряет данные при перезапуске, потому что всё состояние хранится во внешних компонентах: метаданные — в базе данных, артефакты — в объектном хранилище. Stateless-архитектура Save позволяет масштабировать сервис и пересоздавать поды без потери данных.
---
url: /admin-guide/save/installation-requirements.md
---
# Требования к установке CodeScoring.Save
CodeScoring.Save поддерживает два варианта установки: SQLite-вариант в k3s и PostgreSQL-вариант в Kubernetes. Оба варианта устанавливаются через Helm-чарт `save`.
## Общие требования
* Linux-based OS (Ubuntu 20.04+, CentOS 8+, RHEL 8+)
* Kubernetes-совместимый кластер: k3s для SQLite-варианта, полноценный Kubernetes-кластер для PostgreSQL-варианта
* Helm 3.x
* Доступ к реестру контейнерных образов CodeScoring.Save
## Hosted-инсталляция
**Минимальные требования:**
* 2 ядра CPU
* 4 GB RAM
* 50 GB дискового пространства (рекомендуется SSD)
**Рекомендуемые требования:**
* 4 ядра CPU
* 8 GB RAM
* 100 GB дискового пространства (SSD)
**Программное обеспечение:**
* k3s v1.25+
* SQLite 3.x (включен в дистрибутив)
## PostgreSQL-инсталляция
**Kubernetes-кластер:**
* 3+ рабочих узла
* 4 ядра CPU на узел
* 8 GB RAM на узел
* 50 GB дискового пространства на узел
**PostgreSQL:**
* 4 ядра CPU
* 8 GB RAM
* 100 GB storage (SSD рекомендуется)
* PostgreSQL 14+
**Объектное хранилище:**
* встроенный MinIO из зависимости Helm-чарта `minio` либо внешнее S3-совместимое хранилище: MinIO, AWS S3, Yandex Object Storage
* 500 GB+ хранилища, зависит от объема артефактов
---
url: /admin-guide/save/installation-options.md
---
# Варианты установки CodeScoring.Save
CodeScoring.Save поддерживает два варианта установки: SQLite-вариант в k3s и PostgreSQL-вариант в Kubernetes. Оба варианта устанавливаются через Helm-чарт `save`, но отличаются инфраструктурой и сценарием эксплуатации.
Адрес Helm-репозитория и реестра контейнерных образов CodeScoring.Save предоставляет вендор. В примерах установки используются плейсхолдеры `` и ``.
## Доступные варианты
| Вариант | Когда использовать |
|---------|--------------------|
| [Hosted-инсталляция](/admin-guide/save/installation-hosted.md) | Для тестирования, демонстраций, небольших команд и быстрого старта без отдельной инфраструктуры PostgreSQL и S3 |
| [PostgreSQL-инсталляция](/admin-guide/save/installation-postgresql.md) | Для продуктивного использования, масштабирования и эксплуатации с внешней или встроенной PostgreSQL и S3-совместимым хранилищем |
Перед выбором варианта проверьте [требования к установке](/admin-guide/save/installation-requirements.md) и подготовьте общий файл `values.yaml`. Основные параметры задаются в секциях:
* `image`
* `envs`
* `configMaps`
* `deploymentsGeneral`
* `postgres`
* `minio`
В `image` задаются общий реестр, тег и pull secret для образов backend, frontend и auth. Переменные окружения сервисов Save задаются в `envs`.
Чтобы значения из `envs` попали в Pod, включите ConfigMap `envs` и подключите его к deployments через `deploymentsGeneral.envConfigmaps`.
---
url: /admin-guide/save/installation-hosted.md
---
# Hosted-инсталляция CodeScoring.Save
Hosted-вариант разворачивается в k3s и использует SQLite-профиль. Такой вариант подходит для тестирования, демонстрации возможностей, небольших команд и быстрого старта без отдельной инфраструктуры PostgreSQL и S3.
## Установка k3s
```bash
# Установка k3s
curl -sfL https://get.k3s.io | sh -
# Проверка статуса
sudo systemctl status k3s
# Настройка kubectl
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
export KUBECONFIG=~/.kube/config
# Проверка кластера
kubectl get nodes
```
## Подготовка Helm и пространства имен
Адрес Helm-репозитория и реестра контейнерных образов CodeScoring.Save предоставляет вендор. В примерах ниже используются плейсхолдеры `` и ``.
```bash
# Добавление Helm-репозитория CodeScoring
helm repo add codescoring
helm repo update
# Создание пространства имен
kubectl create namespace codescoring-save --dry-run=client -o yaml | kubectl apply -f -
```
Создайте `imagePullSecret` для доступа к приватному реестру. Имя секрета должно совпадать со значением `image.pullSecrets` в `values.yaml`.
```bash
kubectl create secret docker-registry codescoring-pvt-regcred \
--namespace codescoring-save \
--docker-server= \
--docker-username= \
--docker-password= \
--dry-run=client -o yaml | kubectl apply -f -
```
## Конфигурация SQLite
Для SQLite-варианта отключите встроенный PostgreSQL и S3:
```yaml
postgres:
enabled: false
minio:
enabled: false
```
В `image` укажите реестр, тег и pull secret для образов Save:
```yaml
image:
registry:
tag:
pullSecrets:
- name: codescoring-pvt-regcred
```
Переменные окружения задаются в `envs`. Чтобы они попали в Pod, включите ConfigMap `envs` и подключите его к deployments:
```yaml
envs:
DATABASE_DRIVER: "sqlite"
STORAGE_TYPE: "filesystem"
DATABASE_SQLITE_PATH: "./data/repository_manager.db"
configMaps:
envs:
enabled: true
deploymentsGeneral:
envConfigmaps:
- envs
deployments:
auth:
containers:
- name: auth
image:
repository: repository-manager-auth
env:
- name: DATABASE_DRIVER
value: "sqlite"
- name: DATABASE_SQLITE_PATH
value: "/app/data/auth.db"
```
## Установка
```bash
helm install codescoring-save codescoring/save \
--namespace codescoring-save \
--create-namespace \
--values values.yaml
```
## Проверка установки
```bash
# Проверка статуса подов
kubectl get pods -n codescoring-save
# Проверка логов backend
kubectl logs -n codescoring-save -l app=backend --tail=100
# Проверка логов auth
kubectl logs -n codescoring-save -l app=auth --tail=100
# Проверка логов frontend
kubectl logs -n codescoring-save -l app=frontend --tail=100
# Проверка сервисов
kubectl get svc -n codescoring-save
# Проверка ingress
kubectl get ingress -n codescoring-save
```
## Первоначальная настройка
Пароль администратора задаётся в переменной `AUTH_ADMIN_PASSWORD`:
```yaml
envs:
AUTH_ADMIN_PASSWORD:
```
После установки откройте веб-интерфейс по адресу, указанному в настройках ingress.
## Следующие шаги
После успешной установки:
1. [Создайте первый репозиторий](/user-guide/save/repositories.md)
2. [Настройте политики очистки](/user-guide/save/repositories.md#cleanup-policies)
3. [Создайте пользователей и назначьте роли](/user-guide/save/repositories.md#permissions)
---
url: /admin-guide/save/installation-postgresql.md
---
# PostgreSQL-инсталляция CodeScoring.Save
PostgreSQL-инсталляция предназначена для продуктивного использования, больших команд, высоких требований к доступности, масштабируемости и производительности.
## Подготовка инфраструктуры
### PostgreSQL
По умолчанию PostgreSQL разворачивается как зависимость Helm-чарта. Для этого в `values.yaml` включите `postgres.enabled=true` и задайте параметры подключения:
```yaml
postgres:
enabled: true
fullnameOverride: postgres
auth:
database: save_db
username: save_user
password:
```
При использовании встроенного PostgreSQL backend и auth должны подключаться к хосту `postgres`.
Для внешней PostgreSQL отключите встроенную зависимость:
```yaml
postgres:
enabled: false
```
После этого укажите внешний хост PostgreSQL в `envs.DATABASE_HOST`.
Подготовьте базу данных и пользователя во внешней PostgreSQL:
```sql
CREATE DATABASE save_db;
CREATE USER save_user WITH PASSWORD '';
GRANT ALL PRIVILEGES ON DATABASE save_db TO save_user;
```
### Объектное хранилище
По умолчанию MinIO разворачивается как зависимость Helm-чарта. Для этого в `values.yaml` включите `minio.enabled=true`. Сервис будет доступен как `save-minio`.
```yaml
minio:
enabled: true
fullnameOverride: save-minio
auth:
rootUser:
rootPassword:
provisioning:
enabled: true
buckets:
- save
```
Для установки с сохранением данных включите persistence у PostgreSQL и MinIO:
```yaml
postgres:
persistence:
enabled: true
storageClassName: default
mountPath: /var/lib/postgresql/data
size: 5Gi
minio:
persistence:
enabled: true
storageClassName: default
mountPath: /data
size: 20Gi
```
Общий блок `pvcs` не должен использоваться для PostgreSQL и MinIO в поставляемом чарте. Если `postgres.persistence.enabled` или `minio.persistence.enabled` выключены, данные соответствующего сервиса не сохраняются после пересоздания Pod.
Для встроенного MinIO в `envs` используйте endpoint `http://save-minio:9000`. Секция `minio.provisioning` создает бакет при установке чарта, поэтому `S3_BUCKET` должен совпадать с одним из значений `minio.provisioning.buckets`.
Для внешнего S3-совместимого хранилища отключите встроенный MinIO:
```yaml
minio:
enabled: false
```
После этого задайте `S3_ENDPOINT`, `S3_BUCKET`, `S3_ACCESS_KEY` и `S3_SECRET_KEY` в `envs`.
## Конфигурация CodeScoring.Save
Используйте базовый `values.yaml` из Helm-чарта и измените нужные параметры.
Для встроенных PostgreSQL и MinIO используйте такие значения:
```yaml
image:
registry:
tag:
pullSecrets:
- name: codescoring-pvt-regcred
envs:
DATABASE_DRIVER: postgres
DATABASE_HOST: postgres
DATABASE_PORT: "5432"
DATABASE_NAME: save_db
DATABASE_USER: save_user
DATABASE_PASSWORD:
STORAGE_TYPE: s3
S3_ENDPOINT: http://save-minio:9000
S3_BUCKET: save
S3_ACCESS_KEY:
S3_SECRET_KEY:
AUTH_SERVICE_URL: http://cs-auth.example.com:9100
AUTH_JWKS_URL: http://cs-auth.example.com:9100/internal/v1/jwks
AUTH_ADMIN_PASSWORD:
AUTH_INTERNAL_SECRET:
configMaps:
envs:
enabled: true
deploymentsGeneral:
envConfigmaps:
- envs
postgres:
enabled: true
fullnameOverride: postgres
auth:
database: save_db
username: save_user
password:
persistence:
enabled: true
storageClassName: default
mountPath: /var/lib/postgresql/data
size: 5Gi
minio:
enabled: true
fullnameOverride: save-minio
auth:
rootUser:
rootPassword:
provisioning:
enabled: true
buckets:
- save
persistence:
enabled: true
storageClassName: default
mountPath: /data
size: 20Gi
```
Значение `AUTH_INTERNAL_SECRET` используется для внутреннего взаимодействия сервисов Save. Секция `minio.provisioning` создает бакет для встроенного MinIO, а `S3_BUCKET` должен совпадать с одним из значений `minio.provisioning.buckets`.
Значения `DATABASE_PASSWORD`, `S3_ACCESS_KEY` и `S3_SECRET_KEY`, а также параметры `postgres.auth.password` и `minio.auth` должны совпадать с соответствующими значениями, указанными в Helm-чарте.
## Дополнительные настройки для Argo CD
При развертывании через Argo CD необходимо добавить следующие параметры в конфигурационный файл:
```yaml
minio:
enabled: true
fullnameOverride: save-minio
annotations:
minioResources:
argocd.argoproj.io/sync-wave: "-2"
provisioningJob:
argocd.argoproj.io/sync-wave: "-1"
```
## Установка
```bash
helm install codescoring-save codescoring/save \
--namespace codescoring-save \
--create-namespace \
--values values.yaml
```
## Проверка установки
```bash
# Проверка статуса подов
kubectl get pods -n codescoring-save -w
# Проверка всех ресурсов
kubectl get all -n codescoring-save
# Проверка логов backend
kubectl logs -n codescoring-save -l app=backend --tail=100
# Проверка логов auth
kubectl logs -n codescoring-save -l app=auth --tail=100
# Проверка логов frontend
kubectl logs -n codescoring-save -l app=frontend --tail=100
# Проверка готовности
kubectl get pods -n codescoring-save -o wide
```
## Следующие шаги
После успешной установки:
1. [Создайте первый репозиторий](/user-guide/save/repositories.md)
2. [Настройте политики очистки](/user-guide/save/repositories.md#cleanup-policies)
3. [Создайте пользователей и назначьте роли](/user-guide/save/repositories.md#permissions)
---
url: /admin-guide/save/update.md
---
# Обновление системы
Обновление выполняется через Helm. Перед обновлением сохраните используемый `values.yaml`, проверьте целевую версию Helm-чарта и подготовьте резервную копию данных для PostgreSQL-инсталляции.
## Hosted-инсталляция
```bash
# Обновление Helm-чарта
helm repo update
# Обновление до новой версии
helm upgrade codescoring-save codescoring/save \
--namespace codescoring-save \
--values values.yaml \
--version
```
## PostgreSQL-инсталляция
```bash
# Резервное копирование перед обновлением
kubectl exec -n codescoring-save postgres-0 -- \
pg_dump -U save_user -d save_db > backup-$(date +%Y%m%d).sql
# Обновление
helm upgrade codescoring-save codescoring/save \
--namespace codescoring-save \
--values values.yaml \
--version
# Проверка развертываний
kubectl get deploy -n codescoring-save
# Проверка статуса обновления backend
kubectl rollout status deployment/codescoring-save -n codescoring-save
# Проверка статуса обновления auth
kubectl rollout status deployment/codescoring-save-auth -n codescoring-save
# Проверка статуса обновления frontend
kubectl rollout status deployment/codescoring-save-save-front -n codescoring-save
```
## Удаление инсталляции
:::warning Удаление пространства имен
Удаление Helm-релиза останавливает компоненты CodeScoring.Save. Удаление пространства имен дополнительно удаляет все ресурсы внутри него, поэтому перед этой операцией нужно сохранить необходимые данные и конфигурацию.
:::
```bash
# Удаление Helm-релиза
helm uninstall codescoring-save --namespace codescoring-save
# Удаление пространства имен
kubectl delete namespace codescoring-save
```
---
url: /admin-guide/save/ssl-tls.md
---
# Настройка SSL/TLS для CodeScoring.Save
SSL/TLS настраивается на уровне ingress. Эта страница описывает базовую структуру `values.yaml` и два типовых способа подключить сертификат: через cert-manager или через заранее созданный Kubernetes secret.
Параметры ingress и TLS задаются в `values.yaml` в секции `app.ingresses`. Формат секции должен соответствовать схеме `codescoring-generic`.
:::note
Точный набор аннотаций зависит от используемого ingress-контроллера и способа выпуска сертификатов.
:::
Пример структуры:
```yaml
app:
ingresses:
frontend:
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: save.example.com
paths:
- path: /
pathType: Prefix
service:
name: frontend
port:
number: 8081
tls:
- secretName: save-tls
hosts:
- save.example.com
```
## Использование cert-manager
```bash
# Установка cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
# Создание ClusterIssuer
cat < -n codescoring-save
# Логи pod
kubectl logs -n codescoring-save --previous
# Вход в pod для диагностики
kubectl exec -it -n codescoring-save -- /bin/sh
```
## Проблемы с базой данных
```bash
# Проверка подключения к PostgreSQL из postgres pod
kubectl exec -it -n codescoring-save postgres-0 -- \
psql -U save_user -d save_db
# Проверка таблиц внутри psql
\dt
\q
```
## Проблемы с хранилищем
```bash
# Проверка доступа к MinIO
kubectl port-forward -n codescoring-save svc/save-minio 9001:9001
# Откройте в браузере:
# http://localhost:9001
```
---
url: /admin-guide/index.md
---
---
url: /user-guide/general/index.md
---
# Общее
Раздел содержит базовые сценарии работы с платформой:
* настройка профиля пользователя;
* создание и настройка политик безопасности;
* подключение VCS и управление проектами;
* расширенные настройки (подразделения, уведомления, аудит-лог, метрики, webhooks, API);
* управление компонентами с помощью каталога пакетов.
Используйте навигацию слева для перехода к нужному подразделу.
---
url: /user-guide/general/user-profile.md
---
# Настройка профиля пользователя
Раздел **Профиль** позволяет пользователю просматривать и изменять персональные данные, а также настроить отображение интерфейса.
Просмотр профиля доступен по нажатию на имя пользователя в левом нижнем углу интерфейса.

На странице отображаются следующие параметры:
* **Имя пользователя** — уникальный логин, используемый для входа в систему. Не подлежит редактированию;
* **Уровень доступа** — определяет полномочия в системе. Возможные значения: `User`, `Auditor` или `Administrator`;
* **Подразделение** — организационная единица, к которой привязан пользователь (если используется);
* **Имя** – отображается в интерфейсе и отчетах;
* **Фамилия** — отображается в интерфейсе и отчетах;
* **Email** — контактный адрес, отображаемый в списках пользователей;
* **API токен** — используется для интеграции с внешними инструментами. Можно скопировать или сгенерировать новый (предыдущий станет недействительным);
* **Формат чисел** — отображение чисел в системе;
* **Формат дат** — отображение дат в системе.
**Важно**: формат чисел и дат влияет только на отображение. На ввод данных и экспорт эти настройки не распространяются.
## Редактирование профиля
По нажатию кнопки **Редактировать** открывается форма редактирования профиля. Доступно изменение следующих полей:
* Имя;
* Фамилия;
* Email.
Изменения сохраняются немедленно после нажатия кнопки **Сохранить**.
---
url: /user-guide/general/policies.md
---
# Настройка политик
## Принципы работы
**Политики** на платформе CodeScoring представляют собой механизм отслеживания и блокирования open source компонентов в процессе разработки программного обеспечения. Они могут быть связаны с проверкой безопасности, совместимости лицензий или других критериев включения сторонних компонентов в разработку.
Политики можно создавать для:
* всей организации;
* подразделения;
* группы проектов;
* проекта;
* окружения разработки;
* репозитория;
* типа компонента.
Механизм политик учитывает указанный этап разработки программного обеспечения: от поступления сторонних компонентов в периметр организации до отслеживания сборок и написания нового кода.
Политики настраиваются по условиям, объединенным логическими выражениями **И/ИЛИ**. Помимо стандартных настроек политик безопасности по уровню критичности уязвимостей, условия могут быть настроены согласно метаданным компонента: дата релиза, лицензия, автор и другим. Всего поддерживается **40+ типизированных условий**. Среди проверок также присутствует встроенная вендорская политика проверки на лицензионную чистоту.
В результате срабатывания политики в CodeScoring создаются соответствующие **алерты**. Алерты можно временно или навсегда проигнорировать, а также выгрузить их в виде отчета.
Политики могут быть **блокирующими**: при срабатывании такой политики используемые компоненты блокируются в хранилище артефактов (прокси-репозитории), либо останавливается сборка программного продукта до устранения выявленного дефекта.
Дополнительно, по срабатыванию политики может быть направлено уведомление ответственным специалистам в систему управления задачами или электронное письмо с описанием проблемы.
## Этапы работы политик
Этапы работы политик настраиваются пользователем при редактировании параметров проекта в разделе **Настройки → Проекты** в поле **Этап политики** или указываются через параметр `--stage` при запуске [консольного агента Johnny](/user-guide/agent/scan.md). Наименования стадий имеют следующие значения:
* `dev` – этап разработки;
* `stage` – промежуточный (предпромышленный) этап;
* `test` – этап тестирования;
* `prod` – промышленный контур.
При создании или редактировании политики в разделе **Настройки → Политики** необходимо указать стадии, к которым она будет применяться.
Кроме того, существуют специальные значения стадий, используемые по умолчанию для определённых задач:
* `proxy` – для плагина в модуле OSA;
* `source` – для анализа VCS-проектов;
* `build` – для консольного агента Johnny.
## Создание политики
Политики создаются в разделе `Настройки -> Политики`. Перейти на форму создания политики можно по кнопке **Создать**.

В форме создания политики задается контекст работы политики по следующим параметрам:
* **Название**;
* **Группы** — группы проектов, на которые распространяется политика. Если параметр пустой – политика применяется для всей организации;
* **Подразделения** — подразделения организации, на которого распространяется политика. Если параметр пустой – политика применяется для всей организации;
* **Проекты** — проекты, на которые применяется политика;
* **Этапы** — стадии цикла разработки, на которые применяется политика;
* **Компоненты OSA** – тип компонентов в менеджере репозиториев с плагином OSA, на который применяется политика (**Пакеты** или **Контейнерные образы**);
* **Репозитории** – список репозиториев с плагином OSA, на которые применяется политика;
* **Уровень** — уровень критичности политики (не влияет на действия в системе);
* **Блокер** — блокировка сборки или загрузки компонента из прокси-репозитория;
* **Отложенная блокировка** — задержка (в днях) от первого срабатывания политики до блокировки;
* **Активно** — состояние политики;
* **Описание** — описание политики;
* **Условия** — перечень условий в политике.
Далее настраиваются условия срабатывания политики, поддерживаются следующие параметры:
* **PURL** — [package URL](https://github.com/package-url/purl-spec), идентификатор компонента;
* **Название зависимости** — имя используемого компонента;
* **Версия зависимости** — конкретная версия компонента, обнаруженная в проекте;
* **Автор зависимости** — имя или организация, указанные как автор компонента;
* **Дата публикации зависимости** — дата первого появления версии зависимости в открытых источниках;
* **Возраст зависимости (в днях)** — количество дней с момента публикации зависимости;
* **Количество уязвимостей в зависимости** — общее число уязвимостей, связанных с компонентом;
* **Зависимость опасна** – зависимость считается опасной, если у нее есть уязвимости с:
* префиксом `MAL-` (фид вредоносных пакетов OSV);
* одним из следующих CWE:
* CWE-506: Внедренный вредоносный код;
* CWE-507: Троянское ПО;
* CWE-509: Нераспространяющийся вредоносный код;
* CWE-509: Распространяющийся вредоносный код (вирус или червь);
* CWE-510: Скрытые средства несанкционированного доступа;
* CWE-511: Логическая или временная бомба;
* CWE-512: Шпионское ПО;
* CWE-912: Скрытые функции;
* или одним из следующих значений поля Импакт в базе [Kaspersky OSS Threats Data Feed](/user-guide/general/feeds/kaspersky.md):
* Вредоносное ПО;
* Другое влияние.
* **Зависимость является протестным ПО** – зависимость считается протестным ПО, если у нее есть уязвимости из проприетарного [фида protestware](/user-guide/general/feeds/protestware.md);
* **Зависимость является ПО-вымогателем** – зависимость считается ПО-вымогателем, если у нее есть уязвимости, используемые в ПО-вымогателе по данным CISA-KEV;
* **Зависимость отозвана** - зависимость отозвана из источника;
* **Зависимость является потомком** – поиск на нижестоящих уровнях транзитивных зависимостей, относящихся к указанному родительскому компоненту. Поиск зависимости осуществляется для более глубоких уровней вложенности графа зависимостей. Например, для случая цепочки зависимостей `a<-b<-c<-d` потомками `b` будут `с` и `d`;
* **Глубина транзитивности зависимости** - контролирует глубину поиска зависимостей, где 1 - прямая зависимость, 2 и более - транзитивные. Допускается указывать только натуральные числа;
* **Технология** — язык программирования или экосистема;
* **Лицензия** – SPDX-идентификатор лицензии;
* **Категория лицензии** — классификация лицензии по типу (например, copyleft, permissive);
* **ID уязвимости** — идентификатор уязвимости;
* **Оценка CVSS2** — численная оценка угрозы по стандарту CVSS 2;
* **Уровень угрозы CVSS2** — уровень угрозы по стандарту CVSS 2;
* **CVSS2 Access Vector (AV)** – путь эксплуатации уязвимости (физический или сетевой);
* **CVSS2 Access Complexity (AC)** – сложность эксплуатация уязвимости;
* **CVSS2 Authentication (Au)** – требования аутентификации для эксплуатации уязвимости;
* **CVSS2 Availability Impact (A)** – степень потери доступности данных;
* **CVSS2 Confidentiality Impact (C)** – степень потери конфиденциальности данных;
* **CVSS2 Integrity Impact (I)** – степень потери целостности данных;
* **Оценка CVSS3** — численная оценка угрозы по стандарту CVSS 3;
* **Уровень угрозы CVSS3** — уровень угрозы по стандарту CVSS 3;
* **CVSS3 Attack Vector (AV)** — вектор атаки;
* **CVSS3 Attack Complexity (AC)** — сложность атаки;
* **CVSS3 Priviliges Required (PR)** — требуемый уровень доступа для эксплуатации уязвимости;
* **CVSS3 User Interaction (UI)** — наличие взаимодействия с пользователем;
* **CVSS3 Scope (S)** — область безопасности компонента;
* **CVSS3 Confidentiality (C)** — cтепень потери конфиденциальности данных;
* **CVSS3 Integrity (I)** — степень потери целостности данных;
* **CVSS3 Availability (A)** — степень потери доступности данных;
* **Оценка CVSS4** — численная оценка угрозы по стандарту CVSS 4;
* **Уровень угрозы CVSS4** — уровень угрозы по стандарту CVSS 4;
* **CVSS4 Attack Vector (AV)** — вектор атаки;
* **CVSS4 Attack Complexity (AC)** — сложность атаки;
* **CVSS4 Attack Requirements (AT)** — наличие требований к атаке;
* **CVSS4 Privileges Required (PR)** — требуемый уровень доступа для эксплуатации уязвимости;
* **CVSS4 User Interaction (UI)** — наличие взаимодействия с пользователем;
* **CVSS4 Confidentiality Impact to the Vulnerable System (VC)** — влияние на конфиденциальность уязвимой системы;
* **CVSS4 Confidentiality Impact to the Subsequent System (SC)** — влияние на конфиденциальность последующей системы;
* **CVSS4 Integrity Impact to the Vulnerable System (VI)** — влияние на целостность уязвимой системы;
* **CVSS4 Integrity Impact to the Subsequent System (SI)** — влияние на целостность последующей системы;
* **CVSS4 Availability Impact to the Vulnerable System (VA)** — влияние на доступность уязвимой системы;
* **CVSS4 Availability Impact to the Subsequent System (SA)** — влияние на доступность последующей системы;
* **Дата публикации уязвимости** — дата, когда уязвимость была впервые опубликована;
* **Дата обновления уязвимости** — дата последнего обновления информации об уязвимости;
* **Результат эксплуатации уязвимости (Kaspersky)** – поле Импакт в базе [Kaspersky OSS Threats Data Feed](/user-guide/general/feeds/kaspersky.md);
* **Уязвимость имеет эксплойт** – признак наличия публичного эксплойта в базе знаний уязвимостей (NVD, GHSA, БДУ ФСТЭК или другой);
* **Уязвимость имеет исправление** – признак наличия версии, на которую можно обновиться для устранения уязвимости;
* **Уязвимости достижима** – уязвимый метод компонента используется в исходном коде. Более подробно об анализе достижимость можно прочесть в [документации агента Johnny](/user-guide/agent/reachability.md).
* **Возраст уязвимости (в днях)** — количество дней с момента публикации уязвимости;
* **Окружение** — окружение разработки;
* **Способ обнаружения** — способ обнаружения зависимости (по манифесту, содержанию проекта или в результате разрешения зависимостей);
* **Связь** — связь зависимости в проекте (прямая или транзитивная);
* **CWE** — идентификатор типа уязвимости по стандарту [Common Weakness Enumeration](https://cwe.mitre.org/)
* **Категория протестного ПО** — категория протестной узявимости;
* **SSVC2 Эксплуатация** — эксплуатируемость уязвимости;
* **SSVC2 Автоматизируемо** — автоматизируемость уязвимости;
* **SSVC2 Техническое влияние** — техническое влияние на уязвимую систему;
* **EPSS процент** — вероятность использования уязвимости в реальных условиях в ближайшие 30 дней;
* **EPSS процентиль** — доля уязвимостей с таким же или более низким баллом.
Есть возможность задать списковые значения для следующих параметров:
* **Список PURL**
* **Список названий зависимостей**
* **Список email авторов зависимостей**
* **Список ID уязвимостей (CVE)**
* **Список окружений**
* **Список технологий**
* **Список лицензий**
* **Список категорий лицензий**
* **Список CWE**
* **Список уровней угрозы CVSS2**
* **Список уровней угрозы CVSS3**
* **Список уровней угрозы CVSS4**
* **Список категорий протестного ПО**
## Создание копии политики
При необходимости продублировать уже имеющуюся политику можно воспользоваться пунктом контекстного меню **Создать копию**.

Или на форме политики нажать кнопку **Создать копию**.

В случае создания копии политики выполняется создание новой политики с тем же описанием, условиями и связанными с ней действиями.
## Пример политики
Условия политики можно объединять в группы с помощью логических выражений **И/ИЛИ**. Группы не имеют ограничений по уровню вложенности и количеству условий.
Например, можно задать условия политики для следующего сценария – либо зависимость содержит уязвимость с эксплойтом и рекомендацию по исправлению, либо зависимость является директивной и содержит критическую уязвимость по стандарту CVSS 3.
Для создания такой политики необходимо добавить две группы, объединенные выражением **ИЛИ**. Это значит, что политика сработает при соответствии любой из перечисленных групп условий. Внутри группы задаются условия, объединенные выражением **И**.

Политика становится активной сразу после создания по нажатию кнопки **Создать**. Для созданной политики можно настроить действия при ее срабатывании: [уведомление на почту](/user-guide/general/notifications.md#email) или [создание задачи в Jira или Kaiten](/user-guide/general/notifications.md#kaiten).
**Важно**: политики срабатывают во время анализа, поэтому важно их создать до запуска анализа.
**Рекомендация**: если оставить поля `Подразделения`, `Группы` и `Проекты` пустыми, политика будет применяться для всех активных проектов в системе.
---
url: /user-guide/general/ignores.md
---
# Игнорирование политик
Созданные политики можно временно или навсегда проигнорировать при анализе. Условие игнорирования позволит оставить политики в системе, при этом не получая алертов о ее срабатывании, например в случае если уязвимость в компоненте не применима для конкретного проекта.
## Создание игноров
Создание и настройка условий игнорирования происходит в разделе `Настройки -> Игноры политики`.
Для создания условия игнорирования для одной или нескольких политик необходимо нажать на кнопку **Создать** и заполнить следующие поля:
* **Группы** – группы проектов, на которые применяется игнор;
* **Проекты** — проекты, на которые применяется игнор;
* **Образы контейнеров** – образы в реестрах, на которые применяется игнор;
* **Технология** - язык программирования или экосистема;
* **PURL зависимости** — [package URL](https://github.com/package-url/purl-spec), идентификатор компонента;
* **Название зависимости** - нормализованное название из package URL или название из пакетного индекса;
* **Версия зависимости** - нормализованная версия из package URL или версия из пакетного индекса;
* **Лицензия**;
* **ID уязвимости** - идентификатор уязвимости;
* **Политики**;
* **Активно** - состояние игнора;
* **Дата активации** - дата, с которой игнор начнет работать;
* **Дата окончания** - дата, после которой игнор закончит работать;
* **Заметка**.
:::warning Игнорирование по частичному совпадению
Игнорирование алерта по PURL происходит методом частичного совпадения: если в указанном PURL не хватает какого-то компонента, сравнение будет считаться положительным.
Например, алерт по зависимости с PURL `pkg:conda/setuptools@65.1.0?build=py310h2ec42d9_0&channel=conda-forge&subdir=osx-64&type=tar.bz2` при игноре по PURL `pkg:conda/setuptools@65.1.0` будет успешно проигнорирован.
При этом, для `pkg:conda/setuptools@65.1.0?subdir=foo` указанный PURL зависимости не будет учтен как подходящий, потому что квалификатор `subdir` не совпадает.
:::

## Результаты игнорирования
Политики, на которые был распространено условие игнорирование, отображаются на вкладке "Игнорированные" раздела `Алерты`.
Сработавшие активные политики также можно быстро проигнорировать из вкладки "Активные", используя кнопку **Игнорировать**.
:::warning Доступ
Пользователь может просматривать только игноры, которые связанны с доступными ему проектами.
:::
---
url: /user-guide/general/policy-results.md
---
# Алерты политик
## Раздел «Алерты»
Результаты работы политик отображаются в разделе `Алерты`. Раздел имеет три вкладки:
* **Активные** – список алертов по результатам последнего анализа (проекта, сборки или компонента в прокси-репозитории);
* **Игнорированные** – список проигнорированных алертов;
* **Решенные** – список алертов, которые были решены после последнего анализа (условие политики больше не актуально).
Причина срабатывания политики отображается в поле **Условия политики**, включая заданные условия и найденные данные о компоненте. Например, значение `django@4.2.2 has CVE-2024-38875, CVSS3 Score 7.5 >= 7.00` подразумевает, что политика блокировки компонентов с CVSS3 равным или выше 7.00 сработала на компоненте django версии 4.2.2 с оценкой уязвимости 7.5.
## Карточка алерта
Карточка алерта открывается по клику на алерт в списке. В верхней части страницы отображаются ключевые поля:
* **Актуальный** – актуальность алерта;
* **Политика** – политика, по которой сработал алерт (ссылка на карточку политики);
* **Условия политики** – совпавшие критерии, из-за которых сработала политика;
* **Уровень** – уровень критичности политики;
* **Этап** – стадия, на которой сработала политика;
* **Блокер** – признак блокирующей политики;
* **Созданные задачи** – список созданных задач (например, Jira);
* **Отправленные письма** – список получателей отправленных email-уведомлений.
Ниже показывается информация о связанных сущностях и детали, в зависимости от условий, с которыми сработал алерт:
* **Проект**/**Контейнерный образ**/**Пакет**/**Зависимость** – информация о компоненте и источнике (репозиторий, теги, лицензии);
* **Связанная уязвимость** – краткое описание, CVE, оценки CVSS и EPSS;
* **История** – события по алерту (время создания, время игнора, время решения).

## Действия с алертами
Для создания задачи или отправки email из списка алертов необходимо выбрать один или несколько алертов и нажать соответствующую кнопку.
Например, так:
* создание задач

* отправка почтовых сообщений

Связанные задачи Jira можно отвязать, используя массовое действие `Удалить ссылку на задачу`.

---
url: /user-guide/general/vcs-git.md
---
# Подключение системы контроля версий
Для добавления в систему проектов (git-репозиториев) на анализ необходимо предварительно создать подключение к системе контроля версий (VCS). CodeScoring поддерживает следующие платформы:
* GitLab
* GitHub
* BitBucket (только Data Center и Server)
* Azure DevOps Git
* GitFlic
* Другие платформы, использующие Git
Интеграция происходит через два возможных механизма: Personal Access Token или ключ SSH. Для механизма Personal Access Token возможно подключение нескольких систем контроля версий с одним адресом, но разными токенами.
**Важно**: После подключения системы контроля версий невозможно поменять ее тип и адрес подключения.
**Примечание**: в случае, если для обращения к системе контроля версий используются приватные NS сервера, их необходимо указать в настройках платформы. Для получения соответствующих шаблонов необходимо обратиться к вендору.
## Добавление SSH-ключа
1. Скопировать существующий или сгенерировать новый приватный SSH ключ в системе контроля версий по инструкции для:
* [Gitlab](https://docs.gitlab.com/ee/user/ssh.html)
* [GitHub](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
* [BitBucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
* [Azure DevOps Git](https://learn.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops)
2. В интерфейсе CodeScoring перейти в раздел `Настройки -> SSH ключи`
3. Нажать **Добавить** в правом верхнем углу.
4. Ввести название ключа в поле **Название** и сам приватный SSH ключ в поле **Приватный ключ**, после чего завершить добавление ключа.
5. Перейти в раздел `Настройки -> VCS`.
6. Нажать **Добавить** в правом верхнем углу.
7. Заполнить форму, как показано на скриншоте. SSH ключ выбирается из списка в поле **SSH key**.

8. Проверить подключение можно по кнопке **Проверить подключение**. Для создания подключения необходимо нажать на кнопку **Добавить**.
## Добавление токена для GitLab
Оригинальная инструкция для генерации токена на английском: https://docs.gitlab.com/ee/user/profile/personal\_access\_tokens.html#create-a-personal-access-token
1. Войти в свой аккаунт в GitLab.
2. Через меню пользователя в правом верхнем углу перейти в раздел **Edit profile**.

3. Далее в левом меню выбрать раздел **Access Tokens**.

4. Задать название токену, например, "*codescoring-demo*", дату можно оставить пустой
5. В секции *scopes* выбрать **read\_api** и **read\_repository**.

6. Нажать кнопку **Create personal access token**.
7. Скопировать сгенерированный токен.
8. В интерфейсе CodeScoring перейти в раздел `Настройки -> VCS`.
9. Нажать **Добавить** в правом верхнем углу.
10. Заполнить форму, как показано на скриншоте. Токен вставляется в поле **Токен доступа**.

## Добавление токена для GitHub
Оригинальная инструкция для генерации токена на английском: https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token
1. Войти в свой аккаунт в GitHub, для облачной версии логин доступен по ссылке https://github.com/login.
2. Если у аккаунта не верифицирован email, обязательно это сделать по [инструкции](https://docs.github.com/en/get-started/signing-up-for-github/verifying-your-email-address).
3. Через меню пользователя в правом верхнем углу перейти в раздел **Settings**.
4. Далее в левом меню выбрать раздел **Developer settings**.
5. В левом меню выбрать раздел **Personal access tokens**.
6. Задать название токену, например, "codescoring-demo".
7. В секции Select scopes выбрать все опции списка *repos*.
8. Нажать кнопку **Generate token**.
9. Скопировать сгенерированный токен.
10. В интерфейсе CodeScoring перейти в раздел `Настройки -> VCS`.
11. Нажать **Добавить** в правом верхнем углу.
12. Заполнить форму, как показано на скриншоте. Токен вставляется в поле **Токен доступа**.

## Добавление токена для BitBucket Data Center и Server
Оригинальная инструкция для генерации токена на английском: https://confluence.atlassian.com/bitbucketserver072/personal-access-tokens-1005335924.html
1. Войти в свой аккаунт в BitBucket.
2. Через меню пользователя в правом верхнем углу перейти в раздел **Manage account**.
3. Далее в левом меню выбрать раздел **Personal access tokens**.
4. Нажать на **Create token**.
5. Задать название токену, например, "codescoring-demo".
6. В секции **Permissions** дать права на чтение для проектов и репозиториев.
7. В секции **Expiry** при желании задать срок жизни токена.
8. Нажать кнопку **Create**.
9. Скопировать сгенерированный токен.
10. В интерфейсе CodeScoring перейти в раздел `Настройки -> VCS`.
11. Нажать **Добавить** в правом верхнем углу.
12. Заполнить форму, как показано на скриншоте. Токен вставляется в поле **Токен доступа**.

## Добавление токена для Azure DevOps Git
Оригинальная инструкция для генерации токена на английском: https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops
1. Войти в свой аккаунт в Azure DevOps.
2. Через меню пользователя в правом верхнем углу перейти в раздел **Personal access tokens**.

3. Далее нажать кнопку **New token**.
4. Задать название токену, например, "codescoring-demo", и срок действия токена.
5. В секции *Scopes* обязательно отметить доступ на **Read** для сущностей **Code** и **Identity**.
6. Нажать кнопку **Create**.
7. Скопировать сгенерированный токен.
8. В интерфейсе CodeScoring перейти в раздел `Настройки -> VCS`.
9. Нажать **Добавить** в правом верхнем углу.
10. Заполнить форму, как показано на скриншоте. Токен вставляется в поле **Токен доступа**.

## Подключение GitFlic через SSH
1. Создайте новую пару SSH-ключей без passphrase с типом **RSA\_SHA512**, **SSH\_ED25519** или **ECDSA-SHA2-nistp256**.
`bash
ssh-keygen -t ed25519 -N "" -q -f /tmp/id25519
`
2. Перейдите в веб-интерфейс GitFlic в раздел `Настройки -> Ключи` и добавьте **публичный** ключ в пул ключей GitFlic.
Посмотреть содержимое публичного ключа можно при помощи следующей команды:
`bash
cat /tmp/id25519.pub
`
3. Перейдите в интерфейс CodeScoring в раздел `Настройки -> SSH ключи`, откройте форму добавления ключа по кнопке **Добавить** и добавьте **приватный** ключ в пул ключей CodeScoring.
Посмотреть содержимое приватного ключа можно при помощи следующей команды:
`bash
cat /tmp/id25519
`
4. Перейдите в раздел `Настройки -> VCS`, откройте форму добавления VCS по кнопке **Добавить** и заполните поля создания VCS инстанса:
* **Название** – название VCS подключения;
* **Тип подключения** – тип клонирования репозитория (выбрать тип SSH);
* **Тип** – тип инстанса VCS (выбрать тип GitFlic);
* **Адрес** – адрес, по которому доступен VCS;
* **SSH key** – ключ SSH, созданный в пункте 3.
5. Перейдите в раздел `Настройки -> Проекты`, откройте форму создания нового проекта по кнопке **Создать** и заполните поля создания проекта:
* **Репозиторий** – ссылка на репозиторий в GitFlic;
* **VCS** – название инстанса VCS, созданного в пункте 6;
* **Название** – название проекта в CodeScoring.
6. Сохраните проект по кнопке **Создать**.
## Синхронизация данных из VCS
CodeScoring автоматически синхронизирует данные из систем контроля версий при добавлении проекта, запуске анализа и в рамках фоново выполняемых задач. Ниже описаны все механизмы получения и обновления данных из `git`:
1. При добавлении VCS-проекта, CodeScoring создаёт локальную копию репозитория в режиме `bare` и сохраняет её в каталоге проекта.
2. При запуске SCA, TQI или Secrets анализа система загружает актуальное состояние ветки, указанной в настройках проекта.
3. Раз в месяц CodeScoring инициирует фоновую задачу, которая синхронизирует все подключённые VCS-проекты с удалёнными репозиториями. Это профилактическое обновление, которое не заменяет синхронизацию при запуске анализа, а лишь ускоряет его на проектах, где анализ давно не выполнялся.
* Выполняется `git fetch` для всех VCS-проектов
* Задачи распределяются с помощью инструмента Huey так, чтобы равномерно распределить нагрузку по оставшимся дням месяца
**Примечание:** при необходимости досрочной синхронизации репозитория можно использовать ручной запуск обновления кода на странице проекта в разделе `Настройки -> Проекты`.
---
url: /user-guide/general/projects.md
---
# Управление проектами
Проект в CodeScoring – это часть анализируемой кодовой базы. В системе возможно создать два типа проектов:
* **VCS-проект** – связан с репозиторием в системе контроля версий;
* **CLI-проект** – не имеет привязки к репозиторию и позволяет сохранять результаты сканирования от консольного агента johnny или загрузить готовый SBOM-файл.
Управление проектами происходит в разделе `Настройки -> Проекты`.
## Создание VCS-проекта
:::warning Важно
Создать VCS-проект получится только после создания [подключения к системе контроля версий](/user-guide/general/vcs-git.md).
:::
Для перехода на форму создания VCS-проекта необходимо нажать на кнопку **Создать** и выбрать вкладку **VCS проекты**. Выбранный при создании тип проекта нельзя перевести в другой.

1. Для добавления проекта необходимо добавить в форме ссылку на репозиторий, выбрать соответствующую систему контроля версий из списка, задать название проекта и опцию запуска SCA анализа сразу после клонирования.
2. После добавления происходит первоначальное клонирование проекта, время которого будет зависеть от размера репозитория.
3. После клонирования проект будет доступен для редактирования и новых анализов.
Система принимает ссылки на репозитории в следующих форматах:
* GitLab
* `:////`
* GitHub
* `https://github.com//`
* BitBucket
* `:///scm//`
* Azure DevOps Git
* `https://.visualstudio.com//_git/`
* `https://dev.azure.com///_git/`
* `://///_git/`
После добавления репозитория на странице настроек VCS-проекта доступно ручное обновление кода проекта по кнопке **Обновить код проекта**.
**Внимание!** Если анализируемый проект коммерческий, то рекомендуется указать для него категорию лицензии **Commercial License** для корректной работы политики по лицензионной совместимости компонентов.
## Создание CLI-проекта
Для перехода на форму создания CLI-проекта необходимо нажать на кнопку **Создать** и выбрать вкладку CLI проекты.
Для добавления проекта достаточно заполнить его название в поле **Название**.
## Создание категорий проектов
Категории используются для группировки проектов системы по смысловым группам.
Управление категориями происходит в разделе `Настройки -> Категории`. Перейти на форму создания категории можно по кнопке **Создать**. Для создания категории достаточно задать ей название.
## Управление версиями
Управление версиями происходит в настройках проекта, в разделе `Репозиторий`.

Добавить новую версию можно по кнопке **Добавить версию**. Для создания версии в CLI проекте достаточно задать ей название, а для VCS проекта необходимо указать метаданные тега или вертки репозитория.

Добавить новую версию также можно при запуске сканирования проекта, воспользовавшись соответствующим меню.
Установить версию по умолчанию можно в контекстном меню по кнопке **Установить по умолчанию**.

Удалить версию можно в контекстном меню записи версии по кнопке **Удалить**. Удалить версию по умолчанию нельзя.
При редактирование версии можно изменить название и метаданные.
---
url: /user-guide/general/proprietors.md
---
# Настройка подразделений
Подразделения — это абстрактные сущности в рамках организации. Они упрощают группировку проектов по принадлежности к разным группам ответственных [пользователей](/admin-guide/users.md).
Управление подразделениями происходит в разделе `Настройки -> Подразделения`. Перейти на форму создания подразделения можно по кнопке **Создать**. В форме необходимо обязательно заполнить поле названия подразделения **Название** и опциональные поля по желанию.

## Привязка авторов
В рамках системы имеется возможность создать связь между автором кода и конкретным подразделением. Для этого необходимо перейти на список авторов по кнопке **Изменить сопоставление авторов** и выбрать нужное подразделение в поле **Подразделение**.

---
url: /user-guide/general/notifications.md
---
# Настройка уведомлений
Для каждой политики можно настроить дополнительные уведомления о срабатывании политик, помимо просмотра результатов в разделе `Алерты`. На данный момент доступно три способа оповещения: через **email** и через таск-менеджеры **Jira** и **Kaiten**.
## Уведомления через email
Отправка email оповещений осуществляется через интеграцию по протоколу SMTP.
Для отправки уведомлений через email необходимо предварительно настроить почтовый сервер в разделе `Настройки -> Уведомления -> Email`. Для этого нужно заполнить все обязательные параметры и установить чек-бокс **Активный**.
Проверить правильность конфигурации можно по кнопке **Проверить подключение**.

После настройки почтового сервера на вкладке `Действия` на странице политики можно добавить email адрес, на который будет осуществляться рассылка писем с результатами работы политики:

* **Email** — почтовый адрес;
* **Режим** — режим отправки писем:
* Отправить каждое оповещение отдельно;
* Отправить все оповещения вместе;
* **Шаблон** - название [шаблона](#template-management). Если не указано, будет использован стандартный шаблон;
* **Группы** — группы проектов, на которые делается оповещение. Если не указано, подразумеваются все группы;
* **Проекты** — конкретные проекты, на которые делается оповещение. Если не указано, подразумеваются все проекты.
Если указаны и группы, и проекты, то оповещения будут включать в себя информацию по всем проектам из указанных групп и по всем указанным проектам.
Письмо с результатами работы политики отправляется **по завершении сканирования проекта**. Содержимое письма зависит от выбранного шаблона.
## Интеграция с таск-менеджерами
CodeScoring поддерживает интеграцию с таск-менеджерами Jira и Kaiten для формирования задач по сработавшим политикам. Настройка интеграции происходит в разделе `Настройки -> Уведомления -> Менеджеры задач`.
Для создания новой интеграции используется форма по кнопке **Добавить**.
* **Название** - название интеграции;
* **Тип** - тип таск-менеджера;
* **URL** - адрес, по которому доступен таск-менеджер;
* **Тип аутентификации** - аутентификация через токен доступа или логин и пароль.
:::note Тип аутентификации для Kaiten
Kaiten поддерживает аутентификацию только через токен доступа.
:::
После заполнения полей можно проверить соединение с сервером по кнопке **Проверить подключение**, или завершить создание по кнопке **Добавить**.

## Создание задач в таск-менеджерах
После настройки интеграции на вкладке `Действия` на странице политики можно добавить сервер Jira или Kaiten, на котором будет создаваться задача с результатами работы политики:
### Создание задач в Kaiten

* **Режим** — режим отправки:
* Отправить каждое оповещение отдельно;
* Отправить все оповещения вместе.
* **Группы** — группы проектов, на которые делается оповещение. Если не указано, подразумеваются все группы;
* **Проекты** — конкретные проекты, на которые делается оповещение. Если не указано, подразумеваются все проекты;
* **Сервер** — таск-менеджер (в данном случае Kaiten);
* **Проект/Доска** — доска в Kaiten;
* **Тип задачи** — тип карточки доступный в Kaiten;
### Создание задач в Jira

* **Режим** — режим отправки:
* Отправить каждое оповещение отдельно;
* Отправить все оповещения вместе.
* **Группы** — группы проектов, на которые делается оповещение. Если не указано, подразумеваются все группы;
* **Проекты** — конкретные проекты, на которые делается оповещение. Если не указано, подразумеваются все проекты;
* **Сервер** — таск-менеджер (в данном случае Jira);
* **Проект/Доска** — проект в Jira;
* **Тип задачи** — тип карточки: *Task*, *Story* или *Bug*;
* **Приоритет задачи** - приоритет карточки. Если не указан, будет использован приоритет по умолчанию на стороне Jira;
* **Шаблон** - название [шаблона](#template-management). Если не указано, будет использован стандартный шаблон.
Если указаны и группы, и проекты, то оповещения будут включать в себя информацию по всем проектам из указанных групп и по всем указанным проектам.

## Управление шаблонами {#template-management}
В CodeScoring поддерживается возможность использования собственных шаблонов для уведомлений по email или создания Jira-задач.
Управление шаблонами доступно в разделе `Настройки -> Уведомления -> Шаблоны`.
Для создания нового шаблона используется форма со следующими полями:
* Наименование;
* Тип - шаблоны в зависимости от использования разделяются по типам [Markdown для Jira-задач](https://jira.atlassian.com/secure/WikiRendererHelpAction.jspa?section=all) и [HTML для email-оповещений](https://templates.mailchimp.com/);
* Шаблон - содержимое шаблона в формате [jinja2](https://jinja.palletsprojects.com/).
:::warning Важно
Используйте только безопасные структуры.
:::
Прежде чем завершить создание шаблона убедитесь в безопасности своих данных.

При заполнении поля **Шаблон** формы, необходимо учитывать, что шаблон может использоваться как для режима отправки "Отправить каждое оповещение отдельно", так и для "Отправить все оповещения вместе".
Содержимое email или jira-задачи формируется на основании шаблона и `контекста алертов`.
В контексте предоставляется `коллекция алертов` (в режиме раздельной отправки в коллекции будет один алерт).
Для каждого `алерта` можно использовать следующие переменные:
* policy\_alert\_level: str - уровень критичности алерта;
* policy\_alert\_stage: str - стадия цикла разработки;
* policy\_alert\_matched\_criteria\_list: list\[str] - список условий политики;
* policy\_name: str - название политики;
* policy\_blocks\_build: bool - блокировка сборки или загрузки компонента из прокси-репозитория;
* policy\_block\_delay: int - задержка (в днях) от первого срабатывания политики до блокировки;
* policy\_is\_block\_delayed: bool - использование отложенной блокировки;
* dependency\_name: str - название зависимости;
* dependency\_link: str - ссылка на зависимость;
* dependency\_technology: str - язык программирования или экосистема;
* vulnerability\_code: Optional\[str] - идентификатор уязвимости из внешней базы;
* vulnerability\_link: Optional\[str] - ссылка на уязвимость;
* max\_fixed\_version: Optional\[str] - максимальная исправленная версия;
* license\_code: Optional\[str] - лицензия;
* project\_name: Optional\[str] - название проекта;
* container\_image\_name: Optional\[str] - название образа контейнера;
* container\_image\_link: Optional\[str] - ссылка на образ контейнера.
:::note Примечание
Все ссылки ведут на ту платформу, на которой были сформированы данные для email или задачи в Jira.
:::
---
url: /user-guide/general/audit-log.md
---
# Работа с аудит-логом
Аудит-лог – это журнал событий в системе **CodeScoring**. Он находится в разделе `Настройки -> Аудит лог`.
В аудит-логе фиксируются события системы, действия пользователей и произошедшие ошибки. Каждое событие содержит следующие данные:
* **Время события** – дата и время события;
* **Инициатор** – имя пользователя или `system` для действий системы;
* **Сообщение** – сообщение с деталями события;
* **Длительность** – продолжительность событий по этапам анализа и работе с внешними источниками.
Журнал можно отфильтровать по периоду или инициатору, а также найти в нем конкретное событие, используя поле `Поиск`. Также доступен экспорт журнала в формате CSV.
События в аудит-логе разделяются на несколько категорий. Ниже приведен полный список возможных событий по каждой из категорий с расшифровками.
## Активация лицензии
| Текст события | Расшифровка |
|----------------|--------------|
|*Object \ created* | Активация лицензии на ПО с указанием владельца ключа и ограничения по количеству авторов|
|*No activation key* | Отсутствует ключ активации |
|*Problem with activation key: {status.lower()}* | Проблема с ключом активации |
## Аутентификация пользователя
| Текст события | Расшифровка |
|----------------|--------------|
|*User logged in*|Пользователь успешно аутентифицировался в системе|
|*User logged out*|Пользователь вышел из системы|
|*Failed login attempt {username}*|Введен неверный пароль при попытке аутентификации|
## Управление объектами
| Текст события | Расшифровка |
|----------------|--------------|
|*Object {instance!r} created*|Создание любого объекта в системе пользователем через интерфейс|
|*Object {instance!r} updated*|Обновление любого объекта в системе пользователем через интерфейс|
|*Object {instance!r} deleted*|Удаление любого объекта в системе пользователем через интерфейс|
## Запуск SCA анализа
| Текст события | Расшифровка |
|----------------|--------------|
|*\[SCA]\[{analysis\_run.project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Analysis started*|SCA анализ проекта запущен|
|*\[SCA]\[{analysis\_run.project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Analysis finished*|SCA анализ проекта окончен|
|*\[SCA]\[{analysis\_run.project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Analysis failed. Check server logs.*|SCA анализ проекта завершился с ошибкой. Необходимо проверить логи сервера.|
|*Failed to clone for repository {repository.name}.*|Клонирование репозитория не удалось|
|*Failed to detect branch for repository "{repository.name}*|Не удалось обнаружить ветку для репозитория|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Clone source code*|Клонирование исходного кода проекта запущено|
|*SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Collect files data*|Поиск данных о файлах проекта запущен|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Collect manifests*|Поиск манифестов проекта запущен|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Create pipeline*|Создание pipeline для SCA анализа проекта запущено|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Check policies*|Проверка политик SCA анализа проекта запущена|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Update project metrics*|Обновление метрик проекта для SCA анализа проекта запущено|
|*\[SCA]\[{project.name}]\[{analysis\_run.sequence}/{analysis\_run.pk}] Analyze dependencies*|Анализ зависимостей проекта для SCA анализа проекта запущен|
|*\[\[SCA]\[{project.name}] Analysis didn't start (Reason: {err.message})]*|SCA анализ проекта не запустился из-за ошибки|
|*Overall SCA run started for {len(projects)} project(s)*|Запущен общий SCA анализ для проектов|
Каждое событие SCA анализа содержит последовательный номер анализа в проекте и **UUID** запуска.
## Запуск TQI анализа
| Текст события | Расшифровка |
|----------------|--------------|
|*Rebuild author {primary\_email}*|Обновление информации по автору на основании правил объединения по основному email|
|*Generate authors merge rules*|Создание правил слияния авторов|
|*(Run #{run\_id}) Collect commits data for project {project.name}*|Сбор данных коммитов для проекта запущен|
|*(Run #{run\_id}) Create authors*|Создание авторов|
|*(Run #{run\_id}) Load authors OSS contributions*|Загрузка вклада авторов в OSS|
|*(Run #{run\_id}) Authors analysis started*|Начался анализ авторов|
|*(Run #{run\_id}) Authors analysis completed*|Анализ авторов успешно завершен|
|*(Run #{run\_id}) Authors analysis failed. Check server logs.*|Анализ авторов завершен с ошибкой. Необходимо проверить логи сервера|
|*(Run #{run\_id}) Authors analysis cancelled*|Анализ авторов отменен|
|*(Run #{run\_id}) Update project {project.name}*|Обновление проекта|
|*(Run #{run\_id}) Clones analysis started*|Запущен анализ клонированного кода запущен|
|*(Run #{run\_id}) Clones analysis completed*|Завершен анализ клонированного кода|
|*(Run #{run\_id}) Clones analysis failed. Check server logs.*|Анализ клонированного кода завершен с ошибкой. Необходимо проверить логи сервера|
|*(Run #{run\_id}) Clones analysis cancelled*|Анализ клонированного кода отменен|
|*(Run #{run\_id}) Clone source code for project {project.name}*|Клонирование репозитория исходного кода проекта запущено|
Каждое событие TQI анализа содержит **UUID** запуска.
## Управление политиками
| Текст события | Расшифровка |
|----------------|--------------|
|*Policy ignore {policy\_ignore} created*|Создание правила игнорирования политики|
|*Policy ignore {policy\_ignore} activated*|Активация правила игнорирования политики|
|*To Policy ignore {policy\_ignore} added Policy {policy\_alert.policy}*|Добавлена политика в существующее правило игнорирования|
| *Policy "{policy.name}" (id: {policy.pk}) skipped. Reason: {err!r}* | Политика пропущена по причине ошибки |
## Анализ секретов
| Текст события | Расшифровка |
|--------------|------------|
| *\[Secrets]\[{analysis\_run.analysis\_object}] Analysis started* | Запущен анализ секретов |
| *\[Secrets] Training run started* | Запущено обучение пользовательской модели на основе результатов разметки |
| *\[Secrets]\[{analysis\_run.analysis\_object}] Analysis finished* | Завершен анализ секретов |
| *\[Secrets] Training run finished* | Завершено обучение пользовательской модели на основе результатов разметки |
| *\[Secrets]\[{analysis\_run.analysis\_object}] Analysis failed. Check server logs.* | Ошибка анализа секретов |
| *\[Secrets] Training run failed. Check server logs.* | Ошибка обучения пользовательской модели |
## Анализ контейнерных образов
| Текст события | Расшифровка |
|--------------|------------|
| *In container image {container\_image} dependency {dep\_name\_and\_version} was changed* | В контейнерном образе изменена зависимость |
| *Updating images list for registry {container\_registry} triggered via update button.* | Запущено принудительное обновление списка образов из реестра |
## Работа с LDAP
| Текст события | Расшифровка |
|--------------|------------|
| *Applying all LDAP group mapping rules triggered* | Запуск применения всех правил сопоставления групп LDAP |
| *{message} While processing, failed to apply some of rules related to following LDAP servers: {', '.join(ldap\_servers\_mapping\_failed\_for)}. Check server logs.* | Ошибка применения правил сопоставления групп для указанных LDAP-серверов |
## Прочее
| Текст события | Расшифровка |
|----------------------------------------------------------------------------------|---------------------------------------------------------------------|
| *(Run #{task.id}) Analysis started via API* | Анализ запущен через API |
| *Some tasks in analysis failed* | Некоторые задачи при анализе не выполнены |
| *Could not connect to OSS Index, reason: {err}* | Не удалось подключиться к индексу OSS из-за ошибки |
| *Could not connect to OSS Index, reason: {err}* | Ошибка подключения к OSS Index |
| *There is already running analysis* | Анализ уже запущен |
| *Another analysis in progress. Parallel execution forbidden.* | Запрещен параллельный запуск анализа |
| *Repo path for {project} does not exist, setting status to Not cloned* | Путь к репозиторию не найден, статус установлен как "Не клонирован" |
| *Failed to clone for repository {project.repo\_name} because project was deleted* | Не удалось клонировать репозиторий, так как проект был удален |
| *Updating {update\_type} since {updated\_after} / Updating all {update\_type}* | Информация об обновлении лицензий, уязвимостей |
---
url: /user-guide/general/metrics.md
---
# Настройка метрик
CodeScoring хранит метрики в формате, поддерживаемом инструментом мониторинга **Prometheus**. На данный момент доступны метрики с платформе CodeScoring и плагинов в прокси-репозиториях.
## Cбор метрик платформы
Метрики платформы доступны в **CodeScoring API** по адресу `{platform-url}/api/metrics`. Для того, чтобы настроить отслеживание метрик в Prometheus, необходимо выполнить следующие шаги:
1. Открыть файл конфигурации `prometheus.yml` и добавить параметры для мониторинга метрик. Ниже приведен пример:
```yaml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'demo-codescoring'
metrics_path: '/api/metrics'
static_configs:
- targets: ['{platform-url}'] # Адрес хоста платформе
- job_name: 'osa'
metrics_path: '/api/osa/metrics'
static_configs:
- targets: ['{platform-url}'] # Адрес хоста платформы
```
2. Перезапустить Prometheus, чтобы изменения вступили в силу.
3. Открыть интерфейс Prometheus и перейти на страницу **Graph**. В поле запроса ввеcти название одной из метрик:
### Метрики очередей
* **codescoring\_tasks\_queue\_size\_total** – общее количество задач, ожидающих выполнения;
* **codescoring\_tasks\_schedule\_queue\_size\_total** – общее количество запланированных задач, ожидающих выполнения;
* **codescoring\_tasks\_running\_tasks\_total** – общее количество задач, выполняющихся в данный момент;
* **codescoring\_celery\_queue\_size\_total** – общее количество задач в Celery-очередях;
* **codescoring\_celery\_running\_tasks\_total** – общее количество выполняющихся задач в Celery-очередях.
Данные метрики можно отфильтровать по лейблу `queue` со следующими возможными значениями:
#### Основные очереди:
* **ipcs** - основная очередь для исполнения асинхронных задач;
* **osa-container-image-scan** - очередь для сканирования контейнерных образов;
* **osa-package-scan** - очередь для сканирования пакетов, запрошенных через модуль OSA;
* **policy** - очередь для расчёта политик;
* **tqi** - очередь для задач в рамках анализов модуля TQI;
* **sca-external-scan** - очередь для SCA, запущенного с помощью консольного агента Johnny;
* **secrets** - очередь для задач в рамках анализов модуля Secrets.
#### Очереди Celery:
* **default** - основная очередь для исполнения асинхронных задач;
* **webhooks** - очередь для работы с вебхукам;
* **secrets-external-scan** - очередь для анализов секретов, запущенных с помощью консольного агента Johnny;
* **osa-maintenance** - очередь для периодических задач модуля OSA;
* **osa-background-update** - очередь для фонового обновления сущностей модуля OSA;
* **oss-index** - очередь для загрузки данных из OSS Index, используется в случае, если интеграция инсталляции с ним включена;
* **migration-background-tasks** - очередь для фонового выполнения задач, связанных с перерасчётом данных после миграций схемы БД;
* **media** - очередь для асинхронной генерации отчётов;
* **media-cleaner** - очередь для периодического удаления сгенерированных отчётов;
* **sca-tasks** - очередь для анализов в рамках модуля SCA.
### Метрики анализа
**codescoring\_running\_analyses\_total** – общее количество выполняющихся анализов.
Данную метрику можно отфильтровать по лейблу `analysis_type` со следующими возможными значениями:
* `sca` – анализ зависимостей;
* `authors` – анализ авторов кода;
* `clones` – поиск клонов кода.
### Метрики запросов от плагинов OSA
* **codescoring\_registration\_packages\_queue\_size** – очередь регистрации пакетов из OSA;
* **codescoring\_registration\_container\_images\_queue\_size** – очередь регистрации контейнерных образов из OSA.
Пример визуализации метрик:

## Сбор метрик OSA
Метрики OSA содержат информацию о состоянии соединений, количестве и времени запросов, а также о статусах сканирования и блокировки компонентов в менеджерах репозиториев. Метрики доступны в **CodeScoring API** по адресу `{platform-url}/api/osa/metrics`.
### Метрики соединений
**codescoring\_osa\_api\_db\_connection\_pool** – состояние пула соединений к базе данных.
Метрику можно отфильтровать по лейблу `measure` со следующими возможными значениями:
* `pool_min` – минимальный размер пула;
* `pool_max` – максимальный размер пула;
* `pool_size` – текущий размер пула;
* `pool_available` – доступные соединения;
* `requests_waiting` – количество ожидающих запросов;
* `pool_used` – используемые соединения.
**codescoring\_osa\_api\_redis\_connection\_pool** – состояние пула соединений к Redis.
Метрику можно отфильтровать по лейблу `measure` со следующими возможными значениями:
* `available_connections` – доступные соединения;
* `in_use_connections` – используемые соединения;
* `total_connections` – общее количество соединений.
### Метрики запросов компонентов
**codescoring\_osa\_api\_http\_request\_duration\_seconds** – продолжительность HTTP-запросов в секундах.
Метрика представлена в виде гистограммы и включает:
* `codescoring_osa_api_http_request_duration_seconds_sum` – общее время запросов;
* `codescoring_osa_api_http_request_duration_seconds_bucket` – распределение времени запросов по временным интервалам;
* `codescoring_osa_api_http_request_duration_seconds_count` – общее количество запросов.
Метрику можно отфильтровать по лейблам:
* `handler` – обработчик запроса (например, `/api/osa/packages/`);
* `method` – метод запроса (например, `POST`);
* `status` – HTTP-статус ответа (например, `2xx`, `4xx`, `5xx`).
Пример:
```
codescoring_osa_api_http_request_duration_seconds_bucket{handler="/api/osa/packages/",le="0.01",method="POST",status="2xx"} 0.0
```
**codescoring\_osa\_api\_http\_requests\_total** – общее количество HTTP-запросов.
Метрику можно отфильтровать по тем же лейблам, что и `codescoring_osa_api_http_request_duration_seconds`.
### Метрики статусов компонентов
**codescoring\_osa\_api\_requested\_component\_block\_status\_total** – количество компонентов в различных статусах блокировки.
Метрику можно отфильтровать по лейблам:
* `block_status` – статус блокировки (например, `not_blocked`, `blocked_by_policies`, `blocked_scan_failed`);
* `object_type` – тип объекта (например, `package`, `container_image`).
Пример:
```
codescoring_osa_api_requested_component_block_status_total{block_status="blocked_by_policies",object_type="package"} 1.0
```
**codescoring\_osa\_api\_requested\_component\_scan\_status\_total** – количество компонентов в различных статусах сканирования.
Метрику можно отфильтровать по лейблам:
* `scan_status` – статус сканирования (например, `not_scanned`, `scanned`);
* `object_type` – тип объекта (например, `package`, `container_image`).
Пример:
```
codescoring_osa_api_requested_component_scan_status_total{object_type="container_image",scan_status="not_scanned"} 0.0
```
### Метрики соединения с Index API
**index\_api\_failure\_rate** - количество неуспешных запросов к Index API подряд.
---
url: /user-guide/general/webhooks.md
---
# Подключение вебхуков
CodeScoring поддерживает систему оповещений на базе вебхуков. При возникновении событий отправляется `POST` HTTP-запрос на указанный URL.
## Добавление нового вебхука
Для добавления нового вебхука на платформе необходимо выполнить следующие действия:
1. Перейти в раздел `Настройки -> Вебхуки`.
2. Нажать на кнопку **Добавить**.
3. Заполнить поля в форме:
* **Название** – название в системе CodeScoring;
* **URL** – адрес с указанием протокола. Например: `http://webhook.com/`;
* **Проекты** - список проектов, для которых будут применяться вебхуки. Если поле пустое, будут учитываться все проекты;
* **События** – список событий, на которые сработает оповещение;
* **Токен** – токен, который передается в HTTP-запросе (заголовок `X-CodeScoring-Authentication`);
4. Проверить подключение после заполнения данных по кнопке **Проверить подключение**. При тестировании используется триггер `test` с пустым payload.
После создания нового подключения по кнопке **Добавить** вебхук отобразится в списке раздела с возможностью посмотреть детальную информацию, отредактировать или удалить его.
## Структура тела запроса
```json
{
"events": [
{
"created_at": "datetime_in_iso_format",
"trigger": "trigger_name",
"payload": {
...
}
},
...
]
}
```
## Механизм отправления запросов
Запросы обрабатываются каждые 5 секунд, согласно периодической задаче, выполняемой системой.
Вебхук обычно отправляет одно событие за запрос. Однако в следующих случаях может быть отправлен массив событий:
* **Отправка накопленных событий:** если за единицу времени (по умолчанию – 5 секунд) произошло несколько событий, они будут отправлены одним запросом;
* **Ретраи (повторные попытки):** если сервер не ответил или вернул ошибку на предыдущую попытку, все неуспешные события отправляются повторно единым запросом.
Коды HTTP в диапазоне \[200; 299] считаются успешными. Если ответ сервера не входит в этот диапазон, событие считается неуспешным, накапливается и отправляется повторно по следующему расписанию: 1 минута → 5 минут → 30 минут → 3 часа → 12 часов → 24 часа → 48 часов.
Если хотя бы один запрос остается безуспешным через 48 часов, вебхук отключается, и события больше не отправляются.
## Управление вебхуками через API
Для управления вебхуками предоставляется API по эндпоинту `/api/settings/webhooks` со следующими командами:
* `GET /api/settings/webhooks/` — получить список всех вебхуков;
* `POST /api/settings/webhooks/` — создать новый вебхук;
* `GET /api/settings/webhooks/{id}/` — получить информацию по ID;
* `PUT /api/settings/webhooks/{id}/` — полностью обновить данные;
* `PATCH /api/settings/webhooks/{id}/` — частично обновить данные;
* `DELETE /api/settings/webhooks/{id}/` — удалить вебхук по ID;
* `POST /api/settings/webhooks/{id}/refresh_availability_status/` — обновить статус доступности;
* `POST /api/settings/webhooks/test/` — протестировать подключение;
* `GET /api/settings/webhooks/triggers/` — получить список доступных триггеров.
## Доступные события
| Название события |
Описание события |
Значение trigger в запросе |
Схема payload в запросе |
| SCA Policy has been triggered |
Сработала политика при SCA-анализе |
sca_policy_has_been_triggered |
```
"alert_id": 0,
"stage": "dev|source|build|stage|test|prod|proxy",
"level": "info|warning|critical",
"policy_id": 0,
"policy_name": 0,
"dependency_id": 0,
"dependency_purl": "purl",
"matched_criteria": ["matched_criteria", ...],
"project_id": 0
```
|
| OSA Policy has been triggered |
Сработала политика при OSA-анализе |
osa_policy_has_been_triggered |
```
"alert_id": 0,
"stage": "dev|source|build|stage|test|prod|proxy",
"level": "info|warning|critical",
"policy_id": 0,
"policy_name": 0,
"dependency_id": 0,
"dependency_purl": "purl",
"matched_criteria": ["matched_criteria", ...],
"container_image_id": 0,
"artifact_repository_id": 0
```
|
| Project SCA analysis started |
SCA-анализ проекта был запущен |
project_sca_analysis_started |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Project SCA analysis finished |
SCA-анализ проекта был завершён |
project_sca_analysis_finished |
```
"project_id": 0,
"project_name": "project_name",
"vulnerabilities_count": 0,
"dependencies_count": 0
```
|
| Project SCA analysis cancelled |
SCA-анализ проекта был отменён |
project_sca_analysis_cancelled |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Project SCA analysis failed |
SCA-анализ проекта был завершён с ошибкой |
project_sca_analysis_failed |
```
"project_id": 0,
"project_name": "project_name",
"error": "error_description"
```
|
| Container Image SCA analysis started |
SCA-анализ контейнерного образа был запущен |
container_image_sca_analysis_started |
```
"container_image_id": 0,
"container_image_name": "container_image_name"
```
|
| Container Image SCA analysis finished |
SCA-анализ контейнерного образа был завершён |
container_image_sca_analysis_finished |
```
"container_image_id": 0,
"container_image_name": "container_image_name",
"vulnerabilities_count": 0,
"dependencies_count": 0
```
|
| Container Image SCA analysis cancelled |
SCA-анализ контейнерного образа был отменён |
container_image_sca_analysis_cancelled |
```
"container_image_id": 0,
"container_image_name": "container_image_name"
```
|
| Container Image SCA analysis failed |
SCA-анализ контейнерного образа был завершён с ошибкой |
container_image_sca_analysis_failed |
```
"container_image_id": 0,
"container_image_name": "container_image_name",
"error": "error_description"
```
|
| Clone analysis started |
Анализ дубликатов проекта был запущен |
clones_analysis_started |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Clone analysis finished |
Анализ дубликатов проекта был завершён |
clones_analysis_finished |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Clone analysis cancelled |
Анализ дубликатов проекта был отменён |
clones_analysis_cancelled |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Clone analysis failed |
Анализ дубликатов проекта был завершён с ошибкой |
clones_analysis_failed |
```
"project_id": 0,
"project_name": "project_name",
"error": "error_description"
```
|
| Authors analysis started |
Анализ авторов проекта был запущен |
authors_analysis_started |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Authors analysis finished |
Анализ авторов проекта был завершён |
authors_analysis_finished |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Authors analysis failed |
Анализ авторов проекта был завершён с ошибкой |
authors_analysis_failed |
```
"project_id": 0,
"project_name": "project_name",
"error": "error_description"
```
|
| Authors analysis cancelled |
Анализ авторов проекта был отменён |
authors_analysis_cancelled |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Cloning of repository started |
Клонирование репозитория было запущено |
cloning_of_repository_started |
```
"project_id": 0,
"project_name": "project_name",
"repo_url": "repo_url",
"repo_ref_name": "repo_ref_name"
```
|
| Cloning of repository finished |
Клонирование репозитория было завершено |
cloning_of_repository_finished |
```
"project_id": 0,
"project_name": "project_name",
"repo_url": "repo_url",
"repo_ref_name": "repo_ref_name"
```
|
| Cloning of repository failed |
Клонирование репозитория было завершено с ошибкой |
cloning_of_repository_failed |
```
"project_id": 0,
"project_name": "project_name",
"repo_url": "repo_url",
"repo_ref_name": "repo_ref_name",
"error": "error_description"
```
|
| Project Secrets analysis started |
Начался анализ секретов проекта |
project_secrets_analysis_started |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Project Secrets analysis finished |
Завершился анализ секретов проекта |
project_secrets_analysis_finished |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Project Secrets analysis cancelled |
Анализ секретов проекта был отменен |
project_secrets_analysis_cancelled |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Project Secrets analysis failed |
Анализ секретов проекта был завершен с ошибкой |
project_secrets_analysis_failed |
```
"project_id": 0,
"project_name": "project_name"
```
|
| Secrets ML model user training run started |
Началось обучение ML-модели для модуля Секретов |
ml_model_user_secrets_training_run_started |
```
Пустой payload
```
|
| Secrets ML model user training run finished |
Обучение ML-модели для модуля Секретов завершено |
ml_model_user_secrets_training_run_finished |
```
Пустой payload
```
|
| Secrets ML model user training run cancelled |
Обучение ML-модели для модуля Секретов отменено |
ml_model_user_secrets_training_run_cancelled |
```
Пустой payload
```
|
| Secrets ML model user training run failed |
Обучение ML-модели для модуля Секретов завершено с ошибкой |
ml_model_user_secrets_training_run_failed |
```
Пустой payload
```
|
| Secrets ML model user accepted |
ML-модель для модуля Секретов принята |
ml_model_user_secrets_accepted |
```
Пустой payload
```
|
| Secrets ML model user purged |
ML-модель для модуля Секретов очищена |
ml_model_user_secrets_purged |
```
Пустой payload
```
|
:::tip Пример простого приложения на Flask
```python
import json
from flask import Flask, request
app = Flask(__name__)
events = []
@app.get('/')
def show_events():
return f'{json.dumps(events, indent=2)}'
@app.post('/')
def handle_events():
received_events = request.json.get('events', [])
events.extend(received_events)
return 'OK'
```
:::
---
url: /user-guide/general/api.md
---
# Работа с API
CodeScoring имеет открытый API, который позволяет программно взаимодействовать с системой. Для описания команд API используется инструмент Swagger, доступный по ссылке **\[platform-url]/api/swagger**.
## Начало работы
Чтобы начать работу с CodeScoring API, необходим токен для аутентификации запросов. Получить токен можно в разделе `Профиль` по нажатию кнопки **Сгенерировать** в поле `API токен`.
Для аутентификации запросов вне Swagger необходимо прописать токен в header следующим образом:
`Authorization: Token `
## Структура API
Открытый API предоставляет ряд эндпоинтов, которые позволяют выполнять основные операции в системе. Эндпоинты объединены в разделы, соответствующие объектам в системе CodeScoring — зависимостям, лицензиям, уязвимостям, авторам и т.д.
## Пагинация
Для постраничного вывода результатов используется параметр `page` для указания номера страницы и параметр `per_page` для указания количества элементов на странице.
Значение параметра `per_page` регулируется переменной окружения `CODESCORING_API_MAX_PAGE_SIZE`, по умолчанию равно 100.
:::warning Рекомендация по значению переменной CODESCORING\_API\_MAX\_PAGE\_SIZE
Установка значения выше 100 может ухудшить производительность системы.
:::
Некоторые эндпоинты работают **только** в режиме постраничного вывода, подробности можно получить на странице документации API **\[platform-url]/api/swagger**.
## Примеры использования
* Запустить анализ всех проектов:
```bash
curl -X 'POST' \
'[platform_url]/api/analyses/overall_sca/start/' \
-H 'accept: application/json' \
-H 'Authorization: token '
```
* Добавить политику:
```bash
curl -X 'POST' \
'[platform_url]/api/policies/' \
-H 'accept: application/json' \
-H 'Authorization: token ' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"stages": [
"dev"
],
"level": "info",
"proprietors": [
0
],
"projects": [
0
],
"conditions": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"conditions_connector": "and",
"is_active": true,
"is_blocks_build": true,
"description": "string"
}'
```
* Получить информацию об отдельном проекте:
```bash
curl -X 'GET' \
'[platform_url]/api/projects/340/' \
-H 'accept: application/json' \
-H 'Authorization: token '
```
* Получить список доступных лицензий:
```bash
curl -X 'GET' \
'[platform_url]/api/licenses/' \
-H 'accept: application/json' \
-H 'Authorization: token '
```
:::note Примечание
Команды создания и изменения основных сущностей в системе, таких как проекты, находятся в разделах с приставкой **settings >**.
:::
---
url: /user-guide/general/catalog.md
---
# Использование каталога
Каталог объединяет сведения о пакетах, доступных пользователю в CodeScoring, и показывает их использование в проектах SCA, пакетах OSA и образах контейнеров. Состав данных зависит от подключенных модулей и прав пользователя.
## Просмотр каталога пакетов
Чтобы открыть каталог, перейдите в раздел `Каталог -> Пакеты`. Таблица содержит следующую информацию:
* **Пакет** — название и версия пакета со ссылкой на его детальную страницу;
* **Технология** — язык программирования или технология сборки;
* **Лицензии** — лицензии пакета;
* **Уязвимости** — количество найденных уязвимостей;
* **Проекты SCA** — количество актуальных вхождений пакета в доступных проектах SCA;
* **Пакеты OSA** — количество связанных пакетов OSA;
* **Образы контейнеров** — количество образов контейнеров, в которых найден пакет.
Пакеты можно найти по названию, версии или PURL, а также отфильтровать по технологии, лицензии и наличию уязвимостей. Фильтры **В проекте SCA**, **В пакете OSA** и **В образе контейнера OSA** позволяют показать пакеты, которые используются или не используются в соответствующих компонентах.

Для перехода на детальную страницу нажмите на название пакета. Также детальную страницу каталога можно открыть по ссылке в поле **PURL** на странице зависимости SCA или пакета OSA.
## Просмотр информации о пакете
В верхней части детальной страницы отображается основная информация о пакете:
* **PURL** — уникальный идентификатор пакета, который можно скопировать;
* **Технология**, **Лицензии** и **Версия**;
* **Авторы**, **Домашняя страница**, **VCS** и **Index URL**, если эти данные доступны;
* **Выпущено** — дата публикации версии;
* **Статус** — признак отозванного пакета, если пакет устарел или отозван в пакетном индексе.
Ниже приведены дополнительные характеристики безопасности: риски (протестное/вредоносное ПО), источник дистрибутива, поверхность атаки, функция безопасности, поставщик и признак внутреннего источника.

## Просмотр связанных данных
На детальной странице находятся следующие блоки:
* **Уязвимости** — найденные уязвимости с оценками CVSS, данными SSVC, EPSS и CWE, а также версией исправления. При подключенном потоке Kaspersky также отображаются данные о влиянии уязвимости;
* **Пакеты OSA** — связанные пакеты OSA, их актуальность, технология, статус блокировки, даты публикации и последнего запроса, репозиторий и менеджер репозиториев;
* **Проекты** — актуальные вхождения пакета в проектах SCA с типом связи, способом обнаружения, окружением, требованием, файлами, родительскими зависимостями и лицензиями;
* **Образы контейнеров** — образы, в которых найден пакет, с информацией о реестре, количестве зависимостей и уязвимостей, статусе блокировки и дате последнего сканирования.
Для списков проектов, пакетов OSA и образов контейнеров доступны поиск и фильтрация. В таблицах связанных данных также предусмотрены сортировка и постраничный просмотр. Названия проектов, пакетов OSA и образов контейнеров ведут на их детальные страницы. Блоки **Пакеты OSA** и **Образы контейнеров** отображаются только при наличии соответствующих прав.
---
url: /user-guide/general/feeds/index.md
---
# Потоки данных
Для эффективного поиска угроз в open source компонентах CodeScoring интегрирует данные из более **20** источников знаний (фидов). Записи из всех источников дедуплицируются и объединяются под универсальными идентификаторами в системе.
Источники знаний об угрозах дополняют единую базу данных **CodeScoring Index** с информацией об опубликованных компонентах, включая собственные фиды CodeScoring Cloned Vulnerabilities и [CodeScoring Protestware Feed](/user-guide/general/feeds/protestware.md).
CodeScoring Cloned Vulnerabilities (CSCV) связывает Maven-пакеты, в которых обнаружены заимствованные фрагменты уязвимого кода, с исходной CVE и библиотекой. Это позволяет находить уязвимость в других компонентах, даже если открытые источники указывают только исходную библиотеку.
Данный раздел содержит детальное описание отдельных фидов и процесса работы с ними.
Ниже приведена таблица с источниками данных и частотой их обновления.
| Источник | Ссылка | Частота обновления |
|----------|--------|------------------|
| CodeScoring Cloned Vulnerabilities | - | по мере публикации новых данных |
| CodeScoring Protestware Feed | - | раз в сутки |
| Банк данных угроз безопасности информации ФСТЭК России | | каждые 30 минут |
| Kaspersky Open Source Software Data Feed | | каждые 30 минут |
| Astra Linux Security Advisories | | каждые 4 часа |
| ALT Linux Security Tracker CVE | | каждые 4 часа |
| Red OS Security Advisories | | раз в сутки |
| CVE.org (MITRE CVE Program) | | раз в сутки |
| CISA Known Exploited Vulnerabilities Catalog | | раз в сутки |
| National Vulnerability Database (NVD, NIST) | | раз в час |
| Open Source Vulnerabilities (OSV) | | каждые 20 минут |
| GitHub Advisory Database | | каждые 10 минут |
| GitHub Security Repositories (Более 2000 репозиториев) | | раз в час |
| OpenSSF Malware Database (OSSF Malicious Packages) | | раз в час |
| Go Vulnerability Database (Golang) | | каждые 30 минут |
| GitLab Security Advisory Database | | раз в сутки |
| Packagist PHP Package Security Advisories | | каждые 30 минут |
| PyPI Security Advisories (PySec) | | каждые 30 минут |
| Ubuntu Security Notices | | каждые 30 минут |
| Alpine Linux Security Advisories | | каждые 30 минут |
| Debian Security Tracker | | каждые 30 минут |
| Red Hat Security Advisory | | каждые 30 минут |
---
url: /user-guide/general/feeds/protestware.md
---
# Работа с фидом protestware
С апреля 2022 года команда CodeScoring начала отслеживать случаи включения protestware в открытые программные компоненты. В дополнение к открытым данным, дополнительные механизмы идентификации подобных пакетов были внедрены в версии **CodeScoring 2022.49.0**.
Начиная с версии [2025.21.0](/changelog/on-premise-changelog/index.md#2025210-2025-05-21), платформа поддерживает собственный централизованный фид на уровне базы знаний **CodeScoring Index** для обнаружения protestware. Этот фид регулярно обновляется и позволяет автоматически выявлять подобные компоненты в рамках модулей [CodeScoring.OSA](/user-guide/osa.md) и [CodeScoring.SCA](/user-guide/sca.md).
## Что такое protestware?
**Protestware** – это компоненты, содержащие компрометирующие противоправные конструкции, представленные в исходном коде или сопутствующих данных. Такое ПО может изменять свое поведение или являться предпосылкой к появлению недекларированных возможностей.
Open Source Initiative [рассматривает](https://opensource.org/blog/open-source-protestware-harms-open-source) protestware как угрозу нейтральности и воспроизводимости открытого ПО.
## Настройка политики
Для проверки protestware в сторонних компонентах CodeScoring имеет встроенную политику безопасности.
Для ее активации необходимо зайти на форму в разделе `Настройки -> Политики` и указать условие **Зависимость является протестным ПО**

При необходимости можно установить признак **Блокер**, чтобы сделать политику блокирующей – при срабатывании такого условия сборка ПО и загрузка компонента из прокси-репозитория будут прерваны.
:::warning Важно
Применение блокирующего признака рекомендуется только после предварительной оценки влияния (проведения инвентаризации компонентов), так как это может повлиять на процесс разработки.
:::
## Результаты анализа
Угрозы, связанные с protestware, помечаются идентификатором **CSPW** в разделе `Уязвимости`. Перейдя на страницу отдельной записи, можно увидеть детальную информацию о компоненте, характере угрозы и затронутой части кодовой базы.
Если настроена соответствующая политика безопасности, срабатывания по ней фиксируются в разделе `Алерты`. В поле **Условия политики** отображается конкретное основание для срабатывания, например:
```
es5-ext@0.10.64 is protestware
```
---
url: /user-guide/general/feeds/kaspersky.md
---
# Использование Kaspersky Open Source Software Threats Data Feed
CodeScoring интегрирует фид [Kaspersky Open Source Software Threats Data Feed](https://www.kaspersky.ru/open-source-feed) (Kaspersky OSSTDF) в модули CodeScoring.SCA и CodeScoring.OSA, предоставляя доступ к информации об угрозах в обнаруженных open source компонентах. Фид полезен не только как источник данных о новых уязвимостях, но и как инструмент обогащения уже известных записей из других источников.
Фид интегрирован на уровне базы знаний CodeScoring Index, что обеспечивает дедупликацию обнаруженных уязвимостей и единое представление данных для пользователя.
## Проверка подключения
Ключ активации CodeScoring содержит в себе данные о доступности частных фидов.
При успешном подключении Kaspersky OSSTDF, в разделе `Настройки -> Активационный ключ` поле "Частные базы уязвимостей" имеет значение “Kaspersky open source software threats data feed”.

## Результаты анализа
CodeScoring не только интегрирует фид с точки зрения данных, но и предлагает контекстные расширения функциональности. В частности, с подключением фида в списке уязвимостей и на их страницах появляется поле **Импакт**, на которое можно настроить отдельную политику безопасности. Значение поля обозначает то влияние на систему, которое оказывает угроза.
Например, аббревиатура **RLF** означает Read Local Files – такая уязвимость позволяет получить доступ к чтению файлов на устройстве пользователя. Эта информация помогает понять контекст уязвимости и определить направление потенциальной атаки.
Список возможных значений переменной:
* Исполнение произвольного кода (ACE);
* Инъекция кода (CI);
* Отказ в обслуживании (DoS);
* Утрата целостности (LoI);
* Перезапись произвольных файлов (OAF);
* Получение чувствительной информации (OSI);
* Эскалация привилегий (PE);
* Чтение локальных файлов (RLF);
* Обход безопасности (SB);
* Подмена пользовательского интерфейса (SUI);
* Запись локальных файлов (WLF);
* Межсайтовый скриптинг (XSS/CSS).
В случае скомпрометированных пакетов это поле принимает значение `Other`.
Для пакетов с вредоносным кодом возможны в том числе следующие значения:
* Вредоносное ПО (Malware);
* Cредства взлома (Hacktool).
Более подробно о доступных полях можно прочитать в [документации OSSTDF](https://tip.kaspersky.com/Help/TIDF/ru-RU/FieldStructure.htm).
## Данные об уязвимости
На странице уязвимости, полученной из фида Kaspersky OSSTDF появляется дополнительная информация. В таблице с основными данными содержится поле Kaspersky, по которому можно определить идентификатор уязвимости, и поле **Импакт (Kaspersky)**.
## Настройка политик
Данные из фида можно использовать для создания политик безопасности как для анализа текущей кодовой базы, так и для проверки поступающих компонентов.
Поле Импакт позволяет точно указать те типы уязвимостей, которые требуют внимания. Например, для настройки политики, блокирующей использование компонентов с вредоносным кодом, необходимо составить условие `Импакт (Kaspersky) -> полностью соответствует -> Вредоносное ПО`.
---
url: /user-guide/general/feeds/oss-index.md
---
# Интеграция OSS Index
В дополнение к внутренней базе данных **CodeScoring Index** для расширенного анализа можно также подключить сторонний фид [Sonatype OSS Index](https://ossindex.sonatype.org/).
Интеграция осуществляется в разделе `Настройки -> OSS Index`. Для подключения необходимо заполнить Email и API токен, полученный при регистрации пользователя в Sonatype OSS Index.

:::warning Дисклеймер по качеству данных
Интеграция OSS Index использует сторонний фид Sonatype OSS Index. Данные этого источника могут содержать ложноположительные срабатывания и неточности, поэтому рекомендуется использовать его как дополнительный источник и отдельно проверять результаты перед принятием блокирующих решений.
:::
**Важно**:
1. OSS Index используется только во время запуска SCA.
2. OSS Index будет ссылаться на сторонний URL-адрес: .
3. Скорость SCA может снизиться при использовании OSS Index.
4. При использовании OSS Index без токена система может возвращать данные, отличные от авторизованных запросов.
---
url: /user-guide/save/index.md
---
# CodeScoring.Save
## Общее описание
CodeScoring.Save — это менеджер репозиториев артефактов для Maven, npm, NuGet, PyPI, Go, Deb, RPM, Docker / OCI и raw-файлов. Сервис разворачивается в Kubernetes и интегрируется с другими модулями платформы CodeScoring.
Сервис выполняет три задачи:
* **Прокси и кэш** для внешних артефактов с возможностью применения политик безопасности при маршрутизации загрузок через [OSA Proxy](/user-guide/save/osa-integration.md).
* **Hosted-хранилище** для внутренних библиотек, образов и произвольных файлов организации.
* **Унифицированный контур доступа** ко всем артефактам через выделенный сервис аутентификации и авторизации **cs-auth**.
## Поддерживаемые форматы
Maven, npm, NuGet, PyPI, Go, Deb (APT), RPM (YUM/DNF), Docker / OCI, raw.
Описание возможностей модуля приведено на странице [Функциональные характеристики](/functionality.md#codescoring-save).
## Безопасность
Для контроля доступа используется выделенный сервис аутентификации и авторизации `cs-auth`.
## Дополнительные разделы
* [Функциональные характеристики](/functionality.md#codescoring-save) — возможности платформы и отдельных модулей.
* [Установка и эксплуатация CodeScoring.Save](/admin-guide/save/architecture.md) — архитектура, требования, развертывание, обновление и настройка SSL/TLS.
* [Управление репозиториями](/user-guide/save/repositories.md) — практическое руководство по работе с proxy- и hosted-репозиториями, аутентификацией и политиками очистки.
* [Интеграция с CodeScoring.OSA](/user-guide/save/osa-integration.md) — настройка проверок безопасности через OSA Proxy.
---
url: /user-guide/save/repositories.md
---
# Управление репозиториями и артефактами
## Контекст
CodeScoring.Save хранит и раздаёт артефакты для команды разработки: сборщик публикует пакет, а IDE, CI-агенты и пользователи скачивают его по тому же URL, не выходя за периметр компании.
Все артефакты лежат в **репозиториях**, репозитории сгруппированы в **проекты**. Это та же иерархия, что и в интерфейсе:
```tree
Project (например, backend-team)
└── Repository (например, maven-central)
└── Artifact (например, commons-lang3:3.12.0)
```
Проект — это контейнер, в котором живут репозитории команды. Репозиторий — конкретное хранилище одного формата (Maven, npm, Docker и т.д.) одного из двух типов. Артефакт — то, что в нём лежит и что качают клиенты.
### Два типа репозиториев
CodeScoring.Save поддерживает только два типа репозиториев, и каждый решает свою задачу.
**Proxy-репозиторий** — кэширующий прокси к внешнему источнику (например, Maven Central или npmjs.com). Когда клиент впервые запрашивает артефакт, Save качает его из upstream, кэширует и отдаёт. Все последующие запросы идут уже из кэша — это ускоряет сборки и снижает зависимость от внешних сервисов. На proxy-репозитории дополнительно работают политики безопасности OSA Proxy (если он настроен), которые могут заблокировать скачивание небезопасных компонентов.
**Hosted-репозиторий** — собственное хранилище, в которое команда публикует свои артефакты. Сюда попадают внутренние библиотеки, проверенные сторонние компоненты и build-artifacts.
В одном проекте может быть произвольное количество репозиториев обоих типов.
### URL-схема доступа
Внешний клиент (Maven, npm, Docker и т.д.) обращается к репозиторию по URL вида:
```text
https://save.example.com/cs-save////
```
| Формат | Шаблон |
| ------------ | ------------------------------------------------------------------------------------------- |
| Maven | `https://save.example.com/cs-save/maven//////` |
| npm | `https://save.example.com/cs-save/npm///` |
| NuGet | `https://save.example.com/cs-save/nuget///v3/index.json` |
| PyPI | `https://save.example.com/cs-save/pypi///simple/` |
| Go | `https://save.example.com/cs-save/go//` (как `GOPROXY`) |
| Raw | `https://save.example.com/cs-save/raw///` |
| Deb | `https://save.example.com/cs-save/deb//` |
| RPM | `https://save.example.com/cs-save/rpm//` |
| OCI / Docker | `https://save.example.com/v2////...` |
Для OCI / Docker используется стандартный префикс `/v2/`, как требует OCI Distribution Spec. Дополнительно поддерживается Nexus-совместимая маршрутизация плоских URL — см. [Работа с OCI / docker](/user-guide/save/repositories-oci.md).
## Структура веб-интерфейса
Слева расположена вертикальная навигация со следующими разделами:
* **Projects** — основной раздел: список проектов, внутри каждого — список репозиториев, внутри каждого репозитория — дерево артефактов;
* **Cleanup** — политики автоматической очистки ненужных артефактов;
* **Settings** — управление учётными записями, ролями, сервисными аккаунтами, конфигурацией и журналом аудита.
В верхней части интерфейса находится **глобальный поиск** — открывается по клавише `/` и ищет одновременно по проектам, репозиториям и артефактам с подсказками в реальном времени.
## Базовый сценарий: подключить свой первый репозиторий
### Шаг 1. Создайте проект
Проект — это контейнер, в котором будут жить репозитории. Удобно делить проекты по командам, продуктам или окружениям.
1. В боковом меню выберите **Projects**.
2. Нажмите кнопку **Create project** в правом верхнем углу.
3. Заполните форму:
* **Name** — человеко-читаемое название проекта (например, `Backend Team`);
* **Color** — цвет для визуального различения проектов в списке;
* **Key** — URL-safe идентификатор проекта (например, `backend-team`). Если оставить пустым, будет сгенерирован автоматически из Name, даже если Name не использует латиницу. **Изменить Key после создания нельзя**;
* **Description** — необязательное описание проекта;
* **Cleanup policy** — раздел двухпанельного селектора с уже созданными политиками очистки. Можно оставить пустым и привязать политики позже.
4. Нажмите **Create project**.
После создания откроется страница проекта со списком репозиториев (пока пустым) и его метаданными в шапке.
:::note Key и Name
Name отображается в интерфейсе и может быть изменено в любой момент. Key участвует во всех URL и API-путях, поэтому его смена потребовала бы переподписки клиентов.
:::
### Шаг 2. Создайте репозиторий в проекте
Внутри проекта создаётся репозиторий — конкретное хранилище для артефактов одного формата.
1. Откройте только что созданный проект.
2. Нажмите **Create repository** в правом верхнем углу страницы проекта.
3. Заполните общие поля:
* **Name** — человеко-читаемое название (например, `Maven Central (proxy)`);
* **Color** — цвет для удобства;
* **Key** — URL-safe идентификатор (например, `maven-central`). Изменить после создания нельзя;
* **Description** — необязательное описание.
4. Выберите **Format** — один из поддерживаемых пакетных форматов: `maven`, `npm`, `docker` (OCI), `nuget`, `pypi`, `go`, `deb` (APT), `rpm` (YUM/DNF), `raw`. После создания формат поменять нельзя.
5. Выберите **Type**:
* **Proxy** — для проксирования внешнего реестра;
* **Hosted** — для собственного хранилища.
6. Если выбран тип **Proxy**, появятся дополнительные поля:
* **Proxy URL** — адрес upstream-репозитория (например, `https://repo1.maven.org/maven2/`);
* **Cache TTL, seconds** — время жизни кэша метаданных в секундах. Для типичных внешних реестров достаточно `86400` (сутки).
7. При необходимости привяжите **Cleanup policy** — список уже созданных политик автоматической очистки.
8. Нажмите **Create repository**.
После создания откроется страница репозитория. В шапке отображается статус (Enabled/Disabled), формат, тип, даты создания и обновления, а для proxy-репозитория — кликабельная ссылка **Remote URL**, ведущая на upstream.
:::note Изменение статуса репозитория
Статус (Enabled/Disabled) задаётся на форме редактирования: откройте репозиторий, нажмите **Edit repository** в шапке, переключите верхний радио-переключатель **Status**, нажмите **Save**. Disabled-репозиторий не отдаёт и не принимает запросы, но не удаляется и не теряет своих артефактов.
:::
### Шаг 3. Получите готовые сниппеты для подключения клиентов
На странице репозитория в правой части шапки находится кнопка со значком «звено цепи». По клику она открывает popover **Useful snippets** — набор готовых фрагментов конфигурации и команд, который зависит от формата репозитория.
1. Нажмите кнопку **звено цепи** в шапке репозитория.
2. В появившейся карточке прокрутите список сниппетов:
* каждый сниппет состоит из **заголовка** (например, `settings.xml`, `.npmrc`, `pip.conf`, `docker login`), блока кода с подсветкой синтаксиса и краткого описания;
* набор сниппетов формируется на стороне сервера по формату и типу репозитория. Для Maven обычно показывается фрагмент `` для `settings.xml` и `` для `pom.xml`; для Docker — `docker login` и `docker pull`; для npm — строка для `.npmrc`; и так далее.
3. Нажмите кнопку **Copy** справа от нужного сниппета — он скопируется в буфер обмена.
4. Вставьте сниппет в конфигурационный файл клиента или выполните команду в терминале.
### Шаг 4. Опубликуйте и скачайте первый артефакт
Дальше всё происходит уже на стороне клиента — Save принимает стандартные запросы пакетного менеджера. Для hosted-репозитория обычный путь — публикация через `mvn deploy`, `npm publish`, `twine upload` или `docker push`. Для proxy-репозитория — обычный pull, после которого артефакт окажется в кэше Save.
При первой загрузке может потребоваться аутентификация — см. раздел [Подключение клиентов и аутентификация](#authentication).
После того, как клиент впервые что-то загрузит или скачает, артефакт появится в дереве на странице репозитория.
## Работа с артефактами в репозитории
Страница репозитория состоит из двух колонок: слева — дерево артефактов с поиском и сортировкой, справа — детали выбранного артефакта.
### Просмотр дерева
Дерево показывает структуру репозитория: папки и файлы с иконками. Файлы со значком «замок» — это «защищённые» (locked/release) артефакты, которые нельзя удалить или перезаписать без дополнительных шагов. Раскрытие папок происходит лениво: дочерние элементы подгружаются по клику.
При клике на файл его детали открываются справа: имя, размер, путь, контрольная сумма, метаданные формата (например, Maven `groupId`/`artifactId`/`version` или Docker tags).
### Поиск, сортировка и фильтры
Над деревом расположено поле **Search artifacts**: введите подстроку и нажмите Enter — появится плоский список найденных артефактов с подсветкой контекста. Клик по строке откроет деталки соответствующего артефакта.
Рядом с поиском расположены две кнопки.
Кнопка **Sort** управляет сортировкой дерева:
* **Sort by** — `Name`, `Date added` или `Date modified`;
* **Sort direction** — `A to Z` или `Z to A`.
Кнопка-фильтр (иконка воронки) для proxy-репозиториев открывает дополнительный переключатель **Show uncached artifacts**. По умолчанию дерево показывает только то, что уже лежит в локальном кэше. С включённым флагом Save также подгружает в дерево артефакты, известные upstream, но ещё не скачанные — это удобно, чтобы предварительно посмотреть, что доступно в проксируемом источнике, не запуская реальный pull. *Это доступно **не** для всех форматов репозиториев* из-за различия протоколов.
### Действия над одним артефактом
После выбора артефакта в правой панели доступны:
* **Download** — скачивание файла локально;
* **Lock artifact** — пометить артефакт как `release`. После lock артефакт нельзя удалить или перезаписать обычным `upload` — это нужно, чтобы выпущенные версии не могли быть подменены;
* **Delete artifact** — удалить файл из репозитория (для hosted) или из кэша (для proxy).
:::warning Lock — необратимая операция в UI
Снять флаг release можно только через API: `PUT /api/v1/artifacts/release?id=` с `{"is_release": false}`.
:::
### Групповые действия
Слева от каждой строки дерева есть чекбокс. После выделения нескольких файлов в верхней части появляется панель с действиями:
* **Lock** — массово зафиксировать выделенные артефакты;
* **Delete** — массово удалить.
Обе операции атомарны для всей выборки.
## Подключение клиентов и аутентификация {#authentication}
Save поддерживает несколько способов аутентификации, чтобы покрыть как интерактивные клиенты, так и CI-конвейеры. Конкретный способ выбирается клиентом самостоятельно через заголовок `Authorization` (или специальные заголовки формата).
| Способ | Заголовок | Тип в cs-auth | Когда применять |
| -------------------------- | -------------------------------------------------------- | -------------- | ------------------------------------------------------------------------------------------------ |
| Basic Auth (пользователь) | `Authorization: Basic base64(:)` | `basic` | Интерактивная работа из IDE, ручные `curl` и `mvn`/`pip`/`npm` от имени конкретного пользователя |
| Basic Auth (robot-аккаунт) | `Authorization: Basic base64(sa$:)` | `api_key` | **CI/CD-пайплайны**, runners сборки, любые сервисные интеграции |
| Bearer JWT | `Authorization: Bearer ` | `bearer_jwt` | Сессионные запросы из веб-интерфейса и других сервисов после логина через cs-auth |
| Bearer (opaque token) | `Authorization: Bearer ` | `npm_token` | Любой не-JWT bearer-токен; на практике — npm-клиент после `npm adduser` / `npm login` |
| `X-NuGet-ApiKey` | `X-NuGet-ApiKey: ` | `nuget_key` | Только NuGet-формат, для совместимости с `dotnet nuget push` |
| Docker v2 token | `Authorization: Bearer ` | `docker_token` | OCI-клиенты после прохождения цикла `401 → retry → 200` |
Bearer-токен с тремя сегментами через точку классифицируется как JWT, остальные — как opaque npm-токен. Префикс `sa$` в Basic Auth — это маркер service-аккаунта (robot).
### Получение JWT администратора {#admin-jwt}
Административные примеры ниже используют заголовок `Authorization: Bearer $ADMIN_JWT`. Этот токен выдаёт cs-auth в обмен на логин и пароль администратора и живёт по умолчанию 15 минут.
#### Шаг 1. Узнайте пароль администратора
Учётная запись `admin` создаётся автоматически при первом запуске. Источник её пароля зависит от того, как развёрнут сервис:
| Ситуация | Где взять пароль |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Задана переменная окружения `AUTH_ADMIN_PASSWORD` | Значение этой переменной. Смена пароля при первом входе не требуется |
| Переменная не задана | Пароль генерируется случайно и **один раз** выводится в лог cs-auth при первом старте. При первом входе система заставит его сменить |
| Задана переменная `AUTH_ADMIN_PASSWORD_FILE` | Тот же сгенерированный пароль дополнительно записывается в указанный файл с правами `0600` |
Сгенерированный пароль выводится отдельным блоком, который легко найти в логах:
```text
************************************************************************
CodeScoring.Save — INITIAL ADMIN CREDENTIALS (shown once)
username: admin
password: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
You will be required to change this password on first login.
************************************************************************
```
```bash
# Kubernetes
kubectl logs deploy/cs-auth | grep -A 3 "INITIAL ADMIN CREDENTIALS"
```
:::warning Пароль показывается один раз
Блок печатается только в тот запуск, в котором учётная запись была создана. Если логи первого старта уже ротировались, а `AUTH_ADMIN_PASSWORD_FILE` не задавался, восстановить пароль нельзя.
:::
#### Шаг 2. Получите access-токен
```bash
curl -sS -X POST https://save.example.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": ""}'
```
Ответ:
```json
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "a1b2c3d4e5f6...",
"token_type": "Bearer",
"expires_in": 900,
"must_change_password": false,
"permissions": {
"uid": 1,
"usr": "admin",
"adm": true,
"g": ["users.create", "users.list", "config.update", "..."]
}
}
```
Для удобства сохраните токен в переменную окружения: во всех примерах далее используется именно она:
```bash
export ADMIN_JWT=$(curl -sS -X POST https://save.example.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "'"$ADMIN_PASSWORD"'"}' | jq -r .access_token)
```
#### Шаг 3. Смените пароль, если это требуется
Если в ответе `must_change_password: true`, токен получен, но почти всё закрыто: любой эндпоинт `/api/v1/admin/*` вернёт `403` с телом `{"code": "password_change_required"}`. До смены пароля доступны только `GET /api/v1/auth/me`, `PUT /api/v1/auth/me/password` и сами эндпоинты входа / обновления / выхода.
```bash
curl -sS -X PUT https://save.example.com/api/v1/auth/me/password \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{"old_password": "<текущий-пароль>", "new_password": "<новый-пароль>"}'
```
Минимальная длина нового пароля — 8 символов. Флаг `must_change_password` зашит в уже выданный токен, поэтому **после смены пароля нужно войти заново** (шаг 2) — старый токен так и останется ограниченным до истечения срока.
#### Шаг 4. Проверьте права
```bash
curl -sS https://save.example.com/api/v1/auth/me \
-H "Authorization: Bearer $ADMIN_JWT"
```
В ответе должно быть `"is_admin": true` — администратор проходит все проверки разрешений. Если `is_admin: false`, у учётной записи нет роли `system-admin`, и административные вызовы будут возвращать `403`.
#### Обновление токена
Время жизни access-токена — 900 секунд (настраивается переменной `AUTH_JWT_EXPIRY`), opaque refresh-токена — 7 суток (`AUTH_REFRESH_TOKEN_TTL`). Когда access-токен истёк, получите новую пару, не вводя пароль:
```bash
curl -sS -X POST https://save.example.com/api/v1/auth/refresh \
-H "Content-Type: application/json" \
-d '{"refresh_token": ""}'
```
Refresh-токен ротируется: предъявленный токен гасится, а в ответе приходит новый — сохраняйте его на каждой итерации. Заголовок `Authorization` для этого запроса не нужен.
:::warning Не используйте учётную запись администратора в CI
Пароль администратора и его короткоживущий токен не предназначены для пайплайнов. Для автоматизации создавайте [robot-аккаунты](#robot-accounts) с ограниченным набором разрешений — их ключи не привязаны к сотруднику и отражаются в журнале аудита под собственной личностью.
:::
### Robot-аккаунты для CI/CD {#robot-accounts}
Для интеграции с CI/CD не рекомендуется использовать личные пароли — они привязаны к сотруднику и быстро устаревают. Вместо этого создаётся **robot-аккаунт** — служебная учётная запись с отдельной ролью и долгоживущим API-ключом.
#### Создание через веб-интерфейс
1. В боковом меню откройте `Settings -> Robot accounts`.
2. Нажмите **Create robot account** в правом верхнем углу.
3. Заполните поля:
* **Login** — служебное имя для аутентификации (например, `ci-builder`). Save сам добавит к введённому значению префикс для service-аккаунта;
* **Name** — человеко-читаемое название (например, `CI Builder Bot`);
* **Description** — необязательное описание;
* **Expires in** — дата истечения ключа. Под полем доступны быстрые пресеты `Week`, `Month`, `Year`. Если ключ должен жить вечно, поставьте флаг **Never** справа от выбора даты — поле выбора даты автоматически блокируется;
* **Global permissions** — глобальные разрешения для робота;
* **Scoped permissions** — разрешения, ограниченные одним, несколькими (или всеми сразу) проектами или репозиториями. Переключатель **Scope** выбирает уровень (Projects / Repositories), затем для каждого scope добавляются записи `Add project permissions` / `Add repository permissions`.
4. Нажмите **Create robot account**.
После успешного создания на экране автоматически открывается модальное окно с API-ключом — это пароль для Basic Auth.
#### Окно с API-ключом
После нажатия **Create robot account** Save открывает окно с API-ключом. В тем доступны:
* **API key** — поле в режиме «только для чтения» с самим значением ключа и кнопкой **Copy**, копирующей его в буфер обмена;
* **Key prefix** — короткий префикс ключа. По нему можно опознать ключ в журнале аудита, не раскрывая полный секрет;
* **Expires at** — дата истечения (если она задана);
* **Warning** — текст с сервера, например `Store this API key securely — it cannot be retrieved again.`
Под секретом находится кнопка **I have copied the key**, которая закрывает окно и переводит на страницу деталей созданного robot-аккаунта.
:::warning API-ключ показывается только один раз
После закрытия окна посмотреть или восстановить тот же ключ нельзя — Save хранит только хэш. Скопируйте ключ и сохраните его в secret-storage CI (GitLab CI variables, GitHub Actions secrets, HashiCorp Vault) до того, как закроете окно. Если ключ утерян, перевыпустите его (вручную в форме редактирования robot-аккаунта или через API `POST /api/v1/admin/robots//api-keys/rotate`) — после ротации старое значение становится недействительным.
:::
#### Создание через API
Вызов требует токена администратора в переменной `ADMIN_JWT` (см. [Получение JWT администратора](#admin-jwt)).
```bash
curl -X POST https://save.example.com/api/v1/admin/robots \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{
"username": "ci-builder",
"display_name": "CI Builder Bot",
"description": "Robot account for CI/CD pipelines",
"permissions": {
"project": {
"backend-team": ["project_artifacts.download", "project_artifacts.upload"]
}
},
"key_expires_in_seconds": 7776000
}'
```
В ответе вернётся `api_key`, который выдаётся **только один раз** при создании — сохраните его в secret-storage CI.
#### Использование в клиенте
`username = sa$`, `password = ` — обычный Basic Auth:
```bash
curl -u "sa\$ci-builder:" https://save.example.com/...
```
:::note Экранирование `$` в shell
В bash символ `$` в одинарных кавычках сохраняется как есть, а в двойных — экранируется как `\$`. В YAML / TOML / XML конфигах экранирование не требуется.
:::
:::note API-ключ NuGet — особенность реализации
Заголовок `X-NuGet-ApiKey` поддерживается напрямую: cs-auth классифицирует его как тип `nuget_key` и валидирует по 12-символьному префиксу ключа. Для NuGet работают оба варианта, но мы рекомендуем Basic Auth с robot-аккаунтом — это единообразно с остальными форматами, и в журнале аудита явно отражается личность robot'а.
:::
### Анонимный доступ на чтение {#anonymous-read}
Если включён глобальный флаг `AllowAnonymousRead`, неаутентифицированным запросам выдаётся `PermissionSet` с правами `projects.view`, `project_repos.view`, `project_artifacts.view`, `project_artifacts.download` для всех проектов. Для Docker / OCI этот режим всё равно требует цикла `401 → /v2/token → 200`, иначе Docker-клиент не сможет работать (см. [Работа с OCI / docker](/user-guide/save/repositories-oci.md)).
Текущее значение флага видно в `Settings -> Configuration`. Изменение значения выполняется через API. Для всех вызовов ниже нужен токен администратора (см. [Получение JWT администратора](#admin-jwt)):
```bash
curl -sS -X PUT https://save.example.com/api/v1/admin/config \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{"auth.allow_anonymous_read": "true"}'
```
## Политики очистки {#cleanup-policies}
Чтобы хранилище не разрасталось бесконечно, на репозитории привязываются **политики очистки** — правила автоматического удаления (или удержания) артефактов. Save поддерживает пять типов политик; для большинства задач достаточно простых, для сложных AND/OR-условий используется тип `expression`.
### Создание политики
1. В боковом меню откройте **Cleanup**.
2. Нажмите **Create policy**.
3. Заполните общие поля: **Display name**, **Description**, при необходимости — **Schedule** (cron-выражение из пяти полей: минуты, часы, день, месяц, день недели).
4. Выберите **Policy type** — определяет основное правило очистки:
| Тип политики | Назначение | Параметр `value` |
| ----------------------------- | ------------------------------------------------------------------------ | ----------------------------------------------- |
| `delete-snapshots-older-than` | Удалять SNAPSHOT/dev-версии старше N дней | количество дней, например `30` |
| `keep-latest-versions` | Оставлять только N последних версий каждого артефакта, остальное удалять | N, например `5` |
| `delete-by-age` | Удалять любые артефакты старше N дней | количество дней |
| `delete-by-size` | Удалять самые старые артефакты при превышении лимита размера | размер в гигабайтах целым числом, например `50` |
| `expression` | Гибкое DSL-правило с AND/OR-комбинацией критериев | вместо `value` передаётся объект `expression` |
5. Укажите **Formats**, к которым применяется политика. Если оставить пустым, политика будет применяться ко всем форматам.
6. Для типа `expression` дополнительно соберите дерево критериев — каждый критерий это сочетание `type`, оператора сравнения (`eq`, `ne`, `gt`, `lt`, `matches`, `contains`) и значения; критерии можно объединять группами с логическим оператором `AND` или `OR`.
7. Нажмите **Create policy**.
### Доступные критерии для `expression`
Полный список — `GET /api/v1/enums/cleanup-criterion-types`.
| Группа | `type` | Назначение |
| --------- | -------------------------------------------- | -------------------------------------------------------- |
| Возраст | `created_before` | Возраст артефакта (дней) |
| | `last_downloaded_days` | Дней с момента последней загрузки |
| | `not_downloaded_since` | Никогда не скачивался или не скачивался с указанной даты |
| Версия | `version_pattern` | Glob-паттерн по версии |
| | `is_snapshot`, `is_prerelease`, `is_release` | Маркеры snapshot / pre-release / release |
| Имя/путь | `name_pattern`, `path_pattern` | Glob-паттерны |
| Размер | `size_greater_than`, `size_less_than` | Размер артефакта |
| Docker | `docker_tag`, `docker_untagged` | Тег / отсутствие тега |
| Maven | `maven_classifier`, `maven_packaging` | Classifier / packaging |
| npm | `npm_scope` | Скоуп пакета |
| PyPI | `pypi_package_type` | `sdist`, `bdist_wheel`, … |
| NuGet | `nuget_is_prerelease` | NuGet-флаг pre-release |
| OCI | `oci_artifact_type` | Тип OCI-артефакта (Helm, Cosign, SBOM, …) |
| Retention | `keep_latest` | Оставлять N последних версий |
### Привязка политики к репозиторию
Привязка происходит на форме создания или редактирования репозитория (или проекта — тогда политика каскадно применяется ко всем его репозиториям).
1. Откройте репозиторий и нажмите **Edit** в шапке.
2. Прокрутите до раздела **Cleanup policy**.
3. В левой колонке (**Available**) — все существующие политики, в правой (**Applied**) — уже привязанные. Перенесите нужные политики стрелкой между колонками.
4. Сохраните изменения.
### Ручной запуск и предварительный просмотр через API
```bash
# Сухой прогон — посмотреть, что было бы удалено, без сохранения политики
curl -X POST https://save.example.com/api/v1/cleanup/preview \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"repository_id": 42,
"policy_type": "delete-snapshots-older-than",
"value": "30"
}'
```
```bash
# Запуск уже сохранённых политик (с опциональным dry_run)
curl -X POST "https://save.example.com/api/v1/cleanup/execute?project=backend-team" \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"policies": ["delete-old-snapshots", "keep-latest-5"],
"dry_run": true
}'
```
## Управление доступом
Управление пользователями, ролями и правами на проекты и репозитории выполняется отдельным сервисом **cs-auth**. API проксируется через Save под префиксами `/api/v1/auth/*` и `/api/v1/admin/*`. Способы аутентификации описаны выше в разделе [Подключение клиентов и аутентификация](#authentication).
В веб-интерфейсе нужные разделы находятся в `Settings`:
* **Roles** — описания ролей с набором разрешений;
* **Users** — учётные записи людей;
* **Robot accounts** — служебные учётные записи (см. выше).
:::note API cs-auth
Конкретные эндпоинты для управления пользователями, ролями и project membership — это поверхность API сервиса cs-auth. Save прозрачно их форвардит, но в своём swagger не описывает.
:::
### Уровни доступа {#permissions}
Права в CodeScoring.Save гранулярны, в формате `.`. Роли в cs-auth определяются пользователем и представляют собой набор таких разрешений.
**На уровне репозитория (артефакты внутри репозитория):**
| Permission | Что разрешает |
| -------------------- | -------------------------------------------- |
| `artifacts.view` | Просмотр списка и метаданных артефактов |
| `artifacts.download` | Скачивание артефактов |
| `artifacts.upload` | Публикация артефактов (актуально для hosted) |
| `artifacts.delete` | Удаление артефактов |
| `artifacts.lock` | Lock/unlock одного или всех артефактов |
**На уровне репозитория (сам репозиторий):**
| Permission | Что разрешает |
| -------------- | ------------------------------------------ |
| `repos.view` | Просмотр настроек репозитория и статистики |
| `repos.edit` | Изменение настроек репозитория |
| `repos.delete` | Удаление репозитория |
**На уровне проекта** (cascade-permissions, распространяются на все репозитории и артефакты проекта):
| Permission | Что разрешает |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| `projects.view`, `projects.create`, `projects.edit`, `projects.delete` | Управление проектами |
| `project_repos.view`, `project_repos.create`, `project_repos.delete`, `project_repos.edit` | Управление всеми репозиториями проекта |
| `project_artifacts.view`, `project_artifacts.upload`, `project_artifacts.download`, `project_artifacts.delete`, `project_artifacts.lock`, `project_artifacts.unlock` | Все операции с артефактами в любом репозитории проекта |
**Глобальные** (только через global scope роли):
| Permission | Что разрешает |
| ------------------------------------------------ | -------------------------------------- |
| `cleanup.view`, `cleanup.edit`, `cleanup.delete` | Управление политиками очистки |
| `roles.create`, `roles.delete` | Управление ролями |
| `users.create`, `users.delete` | Управление пользователями |
| `config.view`, `config.manage` | Просмотр и редактирование конфигурации |
| `audit.view` | Просмотр журнала аудита |
:::note Cascade-логика
Project-scope permissions автоматически cascade на repository-scope: пользователь с `project_artifacts.download` на проекте получит право `artifacts.download` на любой репозиторий внутри этого проекта. Для wildcard-доступа ко всем проектам / репозиториям используется ключ `*`.
:::
### Привязка пользователя или robot-аккаунта к проекту {#project-membership}
Привязка участника к проекту — это назначение конкретной роли конкретному пользователю или robot-аккаунту в рамках одного проекта. Назначенный участник получает все разрешения роли, а в шапке проекта он отображается как member.
#### Через веб-интерфейс
:::warning Раздел в разработке
Раздел **Members** на странице проекта пока находится в разработке. Backend поддерживает все необходимые операции (`/api/v1/admin/projects//members`), но в UI вкладки **Members** на странице проекта ещё нет.
До появления вкладки выполните операции через API ниже.
:::
#### Через API
Все вызовы ниже требуют токена администратора в переменной `ADMIN_JWT` (см. [Получение JWT администратора](#admin-jwt)).
Добавление участника:
```bash
curl -X POST https://save.example.com/api/v1/admin/projects/backend-team/members \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{
"user_id": 5,
"role_id": 2
}'
```
Для пользователей `role_id` обязателен, для robot-аккаунтов (флаг `is_service=true`) может быть опущен.
Просмотр списка участников:
```bash
curl -sS -H "Authorization: Bearer $ADMIN_JWT" \
"https://save.example.com/api/v1/admin/projects/backend-team/members?limit=50"
```
Смена роли существующему участнику:
```bash
curl -X PUT https://save.example.com/api/v1/admin/projects/backend-team/members/5 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{"role_id": 3}'
```
Удаление участника из проекта:
```bash
curl -X DELETE https://save.example.com/api/v1/admin/projects/backend-team/members/5 \
-H "Authorization: Bearer $ADMIN_JWT"
```
## Те же действия через API
Каждое действие, описанное выше для интерфейса, доступно и через REST API. Это полезно для скриптов первоначальной настройки, инфраструктуры как кода (Terraform / Ansible) и интеграционных тестов.
### Создание проекта
```bash
curl -X POST https://save.example.com/api/v1/projects \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"name": "backend-team",
"display_name": "Backend Team",
"description": "Backend services and microservices",
"color": "#4A90D9"
}'
```
### Создание Proxy-репозитория
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend-team",
"name": "maven-central",
"display_name": "Maven Central (proxy)",
"format": "maven",
"repository_type": "proxy",
"remote_url": "https://repo1.maven.org/maven2/",
"cache_ttl": 86400
}'
```
### Создание Hosted-репозитория
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend-team",
"name": "internal-maven",
"display_name": "Internal Maven",
"format": "maven",
"repository_type": "hosted"
}'
```
### Назначение политики очистки
```bash
curl -X POST "https://save.example.com/api/v1/cleanup/assignments?project=backend-team" \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"policies": [
{"policy_name": "delete-old-snapshots", "priority": 10, "enabled": true}
]
}'
```
### Создание политики очистки
```bash
curl -X POST https://save.example.com/api/v1/cleanup/policies \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"name": "delete-old-snapshots",
"display_name": "Delete Old Maven Snapshots",
"description": "Удалять SNAPSHOT-версии Maven старше 30 дней",
"policy_type": "delete-snapshots-older-than",
"value": "30",
"formats": ["maven"],
"enabled": true,
"schedule": "0 2 * * *"
}'
```
### Создание политики на основе выражения
```bash
curl -X POST https://save.example.com/api/v1/cleanup/policies \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"name": "clean-old-prereleases",
"display_name": "Clean Old Pre-releases",
"policy_type": "expression",
"formats": ["maven", "npm"],
"expression": {
"action": "delete",
"logical_operator": "and",
"criteria": [
{"type": "is_prerelease", "value": "true"},
{"type": "created_before", "value": "14"}
]
},
"enabled": true
}'
```
## Мониторинг
### Журнал аудита
Журнал аудита фиксирует все изменения в проектах, репозиториях, артефактах, ролях и robot-аккаунтах. В UI он доступен:
* **Глобально** — `Settings -> Audit log`;
* **По проекту** — на странице проекта в шапке справа есть иконка журнала, ведущая на отфильтрованный по проекту журнал.
Каждая запись содержит время события, инициатора, тип ресурса и его идентификатор, тип действия и набор полей с подробностями (имя загруженного артефакта, изменённые параметры репозитория и т.п.). Записи группируются по дням и отображаются в виде таймлайна, а ссылки внутри записи кликабельны (открывается соответствующий проект, репозиторий, политика, пользователь или роль).
Журнал можно выгрузить за период через кнопку **Export** в шапке (форматы `JSON` или `HTML`).
```bash
# Аудит-журнал по конкретному репозиторию через API
curl -u ":" \
"https://save.example.com/api/v1/admin/audit?resource_type=repository&q=maven-central&limit=50"
```
### Статистика репозитория
Текущие агрегированные показатели по репозиторию доступны через API:
```bash
curl https://save.example.com/api/v1/repos//stats \
-u ":"
```
Ответ:
```json
{
"id": 42,
"name": "maven-central",
"project_name": "backend-team",
"artifact_count": 1523,
"total_size": 16413032448,
"cache_hit_ratio": 0.85,
"last_activity": "2026-03-17T10:30:00Z"
}
```
:::note Поля статистики
Эндпоинт возвращает только агрегированные показатели. Поле `cache_hit_ratio` присутствует только для proxy-репозиториев.
:::
### Состояние сервиса
```bash
curl https://save.example.com/health
```
Глобальный health-check сервиса. Отдельных health-эндпоинтов на репозиторий нет: доступность upstream проверяется фоновыми воркерами и отражается через метрики Prometheus.
### Логи
Логи централизованные, в формате JSON. Фильтрация по конкретному репозиторию — через стандартные средства log-aggregator'а.
---
url: /user-guide/save/repositories-go.md
---
# Работа с Go
CodeScoring.Save реализует **Go Module Proxy Protocol** с префиксом `/go///`. Совместим со стандартным Go toolchain (`go mod`, `go build`, `go install`).
## Proxy-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend",
"name": "go-proxy",
"format": "go",
"repository_type": "proxy",
"remote_url": "https://proxy.golang.org",
"cache_ttl": 86400
}'
```
## Hosted-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend",
"name": "go-hosted",
"format": "go",
"repository_type": "hosted"
}'
```
Hosted-репозиторий принимает PUT-загрузку модулей по URL вида:
```text
PUT /go//go-hosted//@v/.zip
```
Module paths используют case-encoding согласно Go Module Proxy spec: заглавные буквы заменяются на `!` + соответствующую строчную (например, `Acme` → `!acme`).
## Настройка клиента
```bash
# Установка GOPROXY
export GOPROXY="https://save.example.com/cs-save/go//go-proxy"
# Если используется Basic Auth — credentials передаются через .netrc:
cat >> ~/.netrc << EOF
machine save.example.com
login
password
EOF
chmod 600 ~/.netrc
```
:::note Цепочка прокси
`GOPROXY` может содержать несколько URL через запятую: `GOPROXY="https://save.example.com/cs-save/go//go-proxy,direct"`. Go toolchain попробует каждый прокси по очереди; `direct` означает обращение напрямую к VCS.
:::
:::note Robot-аккаунты в CI
Для CI/CD используйте robot-аккаунт: `login = sa$`, `password = ` в `~/.netrc`. Подробнее — в общем разделе [Аутентификация](/user-guide/save/repositories.md#authentication).
:::
:::note GOPRIVATE для внутренних модулей
Если в репозитории хранятся внутренние модули, отсутствующие в публичном sumdb, добавьте их паттерны в `GOPRIVATE`.
```bash
export GOPRIVATE="git.example.com/*"
# При необходимости можно полностью отключить sumdb:
# export GOSUMDB=off
```
:::
## Миграция URL репозитория
**Сценарий использования:** миграция Go-прокси с Nexus / Artifactory на CodeScoring.Save.
| Источник | `GOPROXY` до миграции | `GOPROXY` после миграции |
| ----------------- | -------------------------------------------------- | -------------------------------------------------------- |
| Nexus | `https://nexus.host.ru/repository/go-remote` | `https://save.example.com/cs-save/go//go-proxy` |
| Artifactory | `https://jfrog.host.ru/artifactory/api/go/go-virt` | `https://save.example.com/cs-save/go//go-proxy` |
| Официальный proxy | `https://proxy.golang.org` | `https://save.example.com/cs-save/go//go-proxy` |
## Устранение неполадок
### Проверка списка версий
```bash
curl -u ":" \
https://save.example.com/cs-save/go//go-proxy/github.com/gin-gonic/gin/@v/list
```
### Состояние сервиса
```bash
curl https://save.example.com/health
```
### Аудит по репозиторию
```bash
curl -u ":" \
"https://save.example.com/api/v1/admin/audit?resource_type=repository&q=go-proxy&limit=50"
```
---
url: /user-guide/save/repositories-maven.md
---
# Работа с Maven
CodeScoring.Save поддерживает Maven 2 layout и совместим с любым JVM-инструментарием поверх него: `mvn`, `gradle`, `ant` + Ivy / `maven-ant-tasks`, sbt и т. д.
## Proxy-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend",
"name": "maven-central-proxy",
"format": "maven",
"repository_type": "proxy",
"remote_url": "https://repo1.maven.org/maven2/"
}'
```
## Hosted-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "backend",
"name": "internal-maven",
"format": "maven",
"repository_type": "hosted"
}'
```
## Настройка клиента
### mvn
В `~/.m2/settings.xml`:
```xml
save-maven
CodeScoring Save Maven
https://save.example.com/cs-save/maven//maven-central-proxy/
central
save-maven
```
Публикация артефактов (deploy в hosted) — добавьте в `pom.xml`:
```xml
save-maven
https://save.example.com/cs-save/maven//internal-maven/
```
```bash
mvn deploy
```
### gradle
В `build.gradle`:
```groovy
repositories {
maven {
url 'https://save.example.com/cs-save/maven//maven-central-proxy/'
credentials {
username = project.findProperty('saveUser') ?: System.getenv('SAVE_USER')
password = project.findProperty('savePassword') ?: System.getenv('SAVE_PASSWORD')
}
}
}
publishing {
repositories {
maven {
name = 'codescoring-save'
url = 'https://save.example.com/cs-save/maven//internal-maven/'
credentials {
username = project.findProperty('saveUser') ?: System.getenv('SAVE_USER')
password = project.findProperty('savePassword') ?: System.getenv('SAVE_PASSWORD')
}
}
}
}
```
Или в Kotlin DSL (`build.gradle.kts`):
```kotlin
repositories {
maven {
url = uri("https://save.example.com/cs-save/maven//maven-central-proxy/")
credentials {
username = (findProperty("saveUser") ?: System.getenv("SAVE_USER")) as String
password = (findProperty("savePassword") ?: System.getenv("SAVE_PASSWORD")) as String
}
}
}
```
Credentials удобно хранить в `~/.gradle/gradle.properties`:
```properties
saveUser=
savePassword=
```
:::note Robot-аккаунты в CI
Для CI/CD используйте robot-аккаунт: `username = sa$`, `password = `. Структура `settings.xml` и `gradle.properties` не меняется — отличаются только значения. Подробнее — в общем разделе [Аутентификация](/user-guide/save/repositories.md#authentication).
:::
### ant
Подход 1 — через `maven-ant-tasks`:
```xml
```
Подход 2 — через Apache Ivy с `ivysettings.xml`:
```xml
```
### sbt
В `~/.sbt/1.0/global.sbt`:
```scala
resolvers += "codescoring" at "https://save.example.com/cs-save/maven//maven-central-proxy/"
credentials += Credentials(
"CodeScoring Save",
"save.example.com",
sys.env.getOrElse("SAVE_USER", ""),
sys.env.getOrElse("SAVE_PASSWORD", "")
)
```
## Миграция URL репозитория
**Сценарий использования:** миграция Maven-репозитория с Nexus / Artifactory на CodeScoring.Save.
| Источник | URL в settings.xml до миграции | URL в settings.xml после миграции |
| ----------------------- | ------------------------------------------------ | ----------------------------------------------------------------------- |
| Nexus | `https://nexus.host.ru/repository/maven-remote` | `https://save.example.com/cs-save/maven//maven-central-proxy/` |
| Artifactory | `https://jfrog.host.ru/artifactory/maven-remote` | `https://save.example.com/cs-save/maven//maven-central-proxy/` |
| Официальный репозиторий | `https://repo.maven.apache.org/maven2` | `https://save.example.com/cs-save/maven//maven-central-proxy/` |
Параметры аутентификации (имя пользователя, пароль) и ``-блок переносятся без изменений.
## Устранение неполадок
### Проверка метаданных пакета
```bash
curl -u ":" \
https://save.example.com/cs-save/maven//maven-central-proxy/org/apache/commons/commons-lang3/maven-metadata.xml
```
### Состояние сервиса
```bash
curl https://save.example.com/health
```
### Аудит по репозиторию
```bash
curl -u ":" \
"https://save.example.com/api/v1/admin/audit?resource_type=repository&q=maven-central-proxy&limit=50"
```
---
url: /user-guide/save/repositories-npm.md
---
# Работа с NPM
CodeScoring.Save реализует npm Registry API с префиксом `/npm///`. Совместим со стандартными клиентами `npm`, `yarn` и `pnpm`.
## Proxy-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "frontend",
"name": "npmjs-proxy",
"format": "npm",
"repository_type": "proxy",
"remote_url": "https://registry.npmjs.org",
"cache_ttl": 3600
}'
```
## Hosted-репозиторий
```bash
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u ":" \
-d '{
"project": "frontend",
"name": "npm-hosted",
"format": "npm",
"repository_type": "hosted"
}'
```
## Настройка клиента
### npm
```bash
# Установка registry в текущем проекте
echo "registry=https://save.example.com/cs-save/npm//npmjs-proxy/" > .npmrc
# Аутентификация (npm 7+, _auth — base64(username:password))
NPM_AUTH=$(echo -n ":" | base64)
cat >> .npmrc << EOF
//save.example.com/cs-save/npm//npmjs-proxy/:_auth=${NPM_AUTH}
//save.example.com/cs-save/npm//npmjs-proxy/:always-auth=true
EOF
# Установка зависимости
npm install lodash
```
:::note Robot-аккаунты в CI
Для CI/CD используйте robot-аккаунт: `username = sa$`, `password = `. Структура `.npmrc` не меняется — отличается только значение `_auth` (base64 от `sa$:`). Подробнее — в общем разделе [Аутентификация](/user-guide/save/repositories.md#authentication).
:::
:::note Opaque bearer-токены
npm-клиент после `npm adduser` / `npm login` сохраняет полученный opaque-токен и далее использует его как `Authorization: Bearer `. cs-auth классифицирует любой не-JWT bearer-токен (Bearer-значение без трёх сегментов через точку) как `npm_token` и валидирует через сервис-аккаунты, привязанные к API-ключам.
:::
Публикация в hosted-репозиторий:
```bash
cat > .npmrc << EOF
registry=https://save.example.com/cs-save/npm//npm-hosted/
//save.example.com/cs-save/npm//npm-hosted/:_auth=${NPM_AUTH}
//save.example.com/cs-save/npm//npm-hosted/:always-auth=true
EOF
npm publish
```
### yarn
#### Yarn Classic (1.x)
Yarn 1.x использует тот же `.npmrc`, что и npm:
```bash
echo "registry=https://save.example.com/cs-save/npm//npmjs-proxy/" > .npmrc
yarn install
```
#### Yarn 2+ (Berry)
В `.yarnrc.yml`:
```yaml
npmRegistryServer: "https://save.example.com/cs-save/npm//npmjs-proxy/"
npmRegistries:
"https://save.example.com/cs-save/npm//npmjs-proxy/":
npmAlwaysAuth: true
npmAuthIdent: ":"
```
### pnpm
pnpm читает тот же `.npmrc`:
```bash
echo "registry=https://save.example.com/cs-save/npm//npmjs-proxy/" > .npmrc
pnpm install
```
Для scoped-пакетов можно настроить отдельный registry:
```bash
echo "@mycompany:registry=https://save.example.com/cs-save/npm//npm-hosted/" >> .npmrc
```
## Миграция URL репозитория
**Сценарий использования:** миграция npm-репозитория с Nexus / Artifactory на CodeScoring.Save.
| Источник | `.npmrc` `registry=` до миграции | `.npmrc` `registry=` после миграции |
| ----------------------- | ------------------------------------------------------ | ------------------------------------------------------------- |
| Nexus | `https://nexus.host.ru/repository/npm-proxy` | `https://save.example.com/cs-save/npm//npmjs-proxy/` |
| Artifactory | `https://jfrog.host.ru/artifactory/api/npm/npm-remote` | `https://save.example.com/cs-save/npm//npmjs-proxy/` |
| Официальный репозиторий | `https://registry.npmjs.org` | `https://save.example.com/cs-save/npm//npmjs-proxy/` |
При миграции достаточно заменить URL в `.npmrc`/`.yarnrc.yml`. Существующие credentials Nexus/Artifactory можно переиспользовать как Basic Auth.
## Устранение неполадок
### Проверка метаданных пакета
```bash
curl -u ":" \
https://save.example.com/cs-save/npm//npmjs-proxy/lodash | jq .
```
### Whoami / ping
```bash
curl -u ":" \
https://save.example.com/cs-save/npm//npmjs-proxy/-/whoami
curl -u ":" \
https://save.example.com/cs-save/npm//npmjs-proxy/-/ping
```
### Состояние сервиса
```bash
curl https://save.example.com/health
```
### Аудит по репозиторию
```bash
curl -u "