История изменений
- Слои совместимости: интерфейс GitHub (/api/v3) и GitLab (/api/v4) - gh, octokit, glab, python-gitlab и провайдер Terraform работают со сменой адреса узла и токена
- Встроенный SSH-сервер: клонирование и push по SSH без системного sshd, ключи и настройки из админки без перезапуска
- Выдача пакетов через посредника: кеш внешних реестров для всех форматов, прогрев, вытеснение, отчёты, работа в закрытом контуре
- Слой знания: записи в .gitriver/knowledge/, черновики, сборка пачки черновиков в пулл-реквест, вкладка репозитория, проверка записей на секреты при приёме
- Помощник на языковых моделях: разбор упавшей сборки CI и разбор изменений пулл-реквеста - Pro
- Указатель по коду: вкладка «Символы», переходы к определению и к вызывающим - Pro
- Реестр пакетов Composer (Packagist v2) - седьмой формат публикации; репозиторий может работать зеркалом внешнего реестра образов
- Перенос с GitHub, GitLab и Gitea забирает и пулл-реквесты; отчёт о переносе в настройках репозитория
- Ветки обсуждения в пулл-реквесте: ответы, пометка решённой, счётчик нерешённых, правило слияния «все ветки решены»
- Проверка подписи коммитов ключами учётных записей со сверкой почты автора; правило защиты ветки «только подписанные»; веб-редактор подписывает коммиты ключом узла
- Чужой код в CI ждёт разрешения человека, прежде чем занять раннеры; ожидание переживает перезапуск сервера
- Внешние раннеры догнали встроенный: журнал задачи, переменные окружения, if, retry, services, reports, max-parallel, артефакты, повтор и ручной запуск
- Кеш между запусками на внешних раннерах, отдельные квоты для кеша CI и вложений релизов, вытеснение забытого кеша
- Установка без Docker: вся очередь уходит внешним раннерам, отключённый встроенный раннер виден в админке и мастере настройки
- Расписания CI материализованы в базе; страница сборок называет причину, по которой расписание молчит
- Группа одновременности CI держит обещание ожиданием, а не отменой задания; раннер группы обслуживает всё её поддерево
- Срез ресурсов CI: пределы считают весь расход исполнителя, а не одного контейнера задания — в общий срез попадают и службы задания, и контейнеры действий, и уборка рабочей копии. О срабатываниях срез говорит в журнале задания, на экране настроек и метриками, а предел ему задаёт systemd
- Число одновременных заданий по умолчанию считается от доступного процессорного времени с учётом предела среза: там, где предел задан, заданий разом пойдёт меньше прежнего
- Сканирование образов реестра на уязвимости по требованию и доступ Trivy к приватному содержимому
- Правила реестра образов заводятся в настройках репозитория, а не только через API: к каким образам правило относится, сколько самых свежих тегов хранить, с какого возраста удалять, какие теги не трогать вовсе и что защищено от перезаписи. Исключающая маска нужна подвижным тегам: buildcache, latest и nightly перезаписываются каждой сборкой, и защита от перезаписи им не годится
- Правила репозитория теперь считают так же, как ограничения установки: тег удаляется, только если он и не входит в число самых свежих, и старше срока. У кого в правиле репозитория заданы оба числа, удаляться будет меньше прежнего; прежнюю чистку по возрасту возвращает нулевое «хранить последних»
- Восемь каналов уведомлений: добавлен Matrix, канал Max приведён к действующему Bot API, исход доставки виден владельцу репозитория
- Пакеты deb и rpm, чарт Helm для Kubernetes, работа в нескольких репликах с лидерством фоновых задач на блокировках PostgreSQL
- Зеркала синхронизируются по заданному интервалу, а не только по кнопке
- Узел как поставщик OIDC: id_token с проверяемой подписью (JWKS), UserInfo отвечает и на POST
- Вход через LDAP с поднятием ldap:// до TLS через StartTLS - Max
- SCIM: грамматика фильтров RFC 7644, externalId у групп, передача группы провижинингу отдельным действием - Max
- Журнал аудита пополнен: появление и отключение учётной записи, изменения защиты веток, административные изменения, действия раннеров, внешние входы - Max
- Редакция Max - возможности уровня установки: SAML, SCIM, LDAP, журнал аудита, назначение квот, IP-правила уровня установки, оформление под свою марку, пределы черновиков знания
- Места Pro работают: платные разделы открыты участникам с назначенным местом; докупка мест доезжает до установки сама
- Подтверждение права: подписанный ответ активации годен ограниченное время, предупреждение письмом и в ленте, отпечаток базы отличает клон от реплики
- Временная блокировка учётной записи вместо безвозвратного удаления; смена роли участника группы одним действием
- Обсуждения, пакеты и версии читаются страницами с догрузкой по прокрутке; выбор ветки ищет на сервере
- Крупные файлы (пакеты, вложения релизов, резервные копии, LFS) передаются потоком, а не читаются в память целиком
- Безопасность входа и прав: проверка областей токена на всех операциях записи и у push/LFS, устранение подъёма прав через устаревший токен, сверка пароля со списком утёкших, шифрование паролей LDAP и SMTP в базе
- Документация API работает без выхода в интернет; текст лицензионного соглашения отдаётся из поставки, а не с сайта издателя
- Переход с 1.0.0: комментарии задач и пулл-реквестов, пакеты и сводные списки квот отдаются страницами вместо массива
- Переход с 1.0.0: неизвестное поле в теле запроса /api/v1 отвергается (400 validation), а не отбрасывается молча
- Переход с 1.0.0: GITRIVER_RATE_LIMIT_DISABLED больше не действует - замена rate_limit_exempt_cidrs с перечнем освобождённых адресов
- Один бинарник на Rust 67 МБ, 46 МБ памяти в покое, 30 крейтов, 584 вызова /api/v1
- Git-хостинг (HTTP + SSH, LFS, GPG, веб-редактор, пакетный коммит)
- Пулл-реквесты с ревью кода, CODEOWNERS и тредами комментариев
- Очередь слияния с CI-интеграцией и временными ветками
- Задачи с Kanban-досками, вехами и шаблонами
- CI/CD (YAML, DAG, матрица, артефакты, кеш, повторы, веб-терминал)
- Удалённые раннеры + автомасштабирование в Kubernetes
- Реестр контейнеров (OCI v2, мультиархитектура, политики хранения, GC)
- Реестр пакетов (npm, PyPI, Cargo, Maven, NuGet, Generic)
- GitOps-деплой RiverCD (канареечный, сине-зелёный, drift detection, волны синхронизации)
- Уведомления - 8 каналов: Email, Telegram, Slack, Discord, Teams, Matrix, вебхуки, встроенные
- Безопасность: поиск секретов (17 + пользовательские regex), SARIF, DORA-метрики
- Проверка лицензий зависимостей (SPDX, CycloneDX SBOM)
- Аутентификация: OAuth2, SAML 2.0, SCIM 2.0, LDAP, 2FA (TOTP)
- Настраиваемые роли, IP-ограничения, квоты хранилища
- Резервное копирование (AES-256-GCM, инкрементальное, S3)
- Статические сайты (Pages) и Wiki
- Релизы с бинарными артефактами
- Импорт из GitHub, GitLab, Bitbucket + зеркалирование
- REST API (500+ эндпоинтов) с OpenAPI 3.1
- Журнал аудита (логины, имперсонация, изменение прав, лицензии)
- Вебхуки (HMAC-SHA256, retry с backoff, история доставки, SSRF-защита)
- Защита веток (паттерны, обязательные ревью, CI-проверки, подписанные коммиты)
- Мастер настройки при первом запуске
- Лицензирование (Ed25519, Pro Seats, Heartbeat)
- Брендирование инстанса (название, логотип, CSS, футер)
- Один бинарник на Rust, ~100 МБ RAM в покое