6 KiB
6 KiB
Философия каталога Indexium - Open Source Only, Zero Storage
Тезис: Indexium - не хостинг файлов. Ты даёшь свой GitHub, мы даём индексацию, поиск и доверие. Все моды в каталоге обязаны быть open source.
1. Принцип Zero Storage
| Храним у себя | НЕ храним у себя |
|---|---|
Метаданные fabric.mod.json / mods.toml |
.jar / .zip артефакты |
README.md, LICENSE, иконка (кэш) |
Скомпилированный байткод |
SHA256, file_size, game_versions, loaders |
Исходники (берём с GitHub) |
search_vector для FTS |
Логи скачиваний с IP |
Как работает:
- Релиз публикуется в
github.com/<owner>/<repo>/releases→ webhook → воркер делает 2-3Range Requestк CDN (objects.githubusercontent.com) → парсит только центральную директорию ZIP → сохраняет метаданные в Postgres → отдаёт клиенту прямую ссылкуhttps://github.com/.../releases/download/... - Трафик не идёт через нас. Мы не платим за egress, не упираемся в лимиты хранения.
Почему это круто:
- Дешёво: VPS $5 + managed Postgres, без S3.
- Честно: автор контролирует файлы, может удалить релиз - он пропадёт и у нас (через webhook
release.deleted). - Устойчиво к DMCA: мы - индексатор, а не дистрибьютор (как
crates.iovsGitHub).
2. Open Source Only - честь и правило
Что значит "обязан быть open source"
Мод принимается в каталог только если:
- Репозиторий публичный (
private: falseчерез GitHub API). - Есть файл лицензии в корне:
LICENSE/COPYING/LICENSE.md. Проверяем черезGET /repos/{owner}/{repo}/license- полеlicense.spdx_id != nullиlicense.spdx_id != "NOASSERTION". - Лицензия из allow-list OSI:
MIT,Apache-2.0,GPL-2.0,GPL-3.0,LGPL-2.1,LGPL-3.0,MPL-2.0,BSD-2/3-Clause,CC0-1.0,Unlicense,EUPL-1.2,AGPL-3.0. Список расширяется через ADR. - Исходники соответствуют артефакту (best-effort): проверяем что в репо есть
fabric.mod.json/gradle.propertiesс тем жеmod_id/versionчто и в.jar. Полная reproducible-build проверка - в backlog. - Нет обфускации/шифрования в релизе без исходников: если воркер находит
Runtime.execбез открытого кода - флагsuspicious.
На MVP достаточно п.1 + п.2 (любая распознанная лицензия GitHub). Строгий OSI allow-list включаем после первых 100 модов.
Как проверяем при импорте
POST /mods/import { repo: "owner/repo" }
→ GitHub API: GET /repos/{repo} → private? reject 422
→ GET /repos/{repo}/license → null? reject 422 "LICENSE required - open source only"
→ GET /repos/{repo}/contents/fabric.mod.json?ref=main → not found? reject
→ Создаём mods + ставим webhook
При каждом release.published повторно проверяем лицензию - если автор сменил на NOASSERTION/сделал приватным → мод помечается deprecated, скрывается из поиска, но старые версии доступны (кэш).
Что показываем пользователю
- Бейдж
OSI: MITна карточке мода, ссылка наLICENSEна GitHub. - Фильтр
license:MITв поиске. - Страница
/manifesto- манифест: "Почему только open source" (прозрачность, безопасность, форки, обучение).
Edge cases
- Форки: разрешены, но
slugуникален, показываемfork_of: owner/repo. Оригинал помечаетсяupstream. - Мульти-мод репо (монорепо): на MVP 1 репо = 1 мод. Позже - поддержка
mods.tomlс несколькимиmodId. - Организация vs личный акк: оба ок, если репо публичное и лицензия есть.
- Что если автор закрыл репо? Webhook
repository.privatized→ скрываем мод, чистим кэш, храним метаданные 30 дней для восстановления.
3. Что это даёт экосистеме
- Доверие: любой может
git clone, проверить код, собрать самому - нет "левый jar с майнером". - Долговечность: даже если Indexium умрёт, моды живут на GitHub.
- Культура: стимулируем PR'ы, а не "скачал и забыл". Профили показывают контрибьюторов, а не только owner.
4. Что НЕ делаем
- Не принимаем бинарники без исходников (даже если автор "обещает" открыть позже).
- Не зеркалируем закрытые репозитории, даже с токеном.
- Не храним
.jarу себя даже кэшем (кроме 64KB хвоста для парсинга - эфемерно).
См. также: docs/auth-profiles.md - как профили усиливают open source (контрибьюторы, верификация), docs/adr/004-open-source-only.md.