Агрегатор торрент-трекеров с API в формате Jackett. Хранит данные в файловой БД (fdb), поддерживает синхронизацию с удалённой базой и самостоятельный парсинг трекеров по cron.
- 🔍 Агрегация торрентов с множества трекеров в единый API
- 📦 Файловая БД (fdb) для быстрого доступа к данным
- 🔄 Синхронизация с удалёнными серверами или самостоятельный парсинг
- 🎯 API Jackett — полная совместимость с форматом Jackett
- 🌐 Веб-интерфейс для просмотра и управления
- 🔐 Поддержка прокси и Tor для доступа к .onion доменам
- 📊 Статистика по трекерам и торрентам
- 🎵 Модуль tracks для сбора метаданных треков (опционально)
- ⚡ Кеширование для высокой производительности
- 🐳 Docker поддержка для простого развёртывания
💲 YooMoney (RUB): https://yoomoney.ru/fundraise/1FRDH2NBCE3.260210
💰 TON / USDT: UQAFGIN19ZDeUQFC4SpHMg2dhjliSXq_vzUWYZMDJ8w_zSqo
💴 MIR (RUB): 2204120115029460
💸 YooMoney (прямой перевод): https://yoomoney.ru/to/410015186713710
- .NET 9.0 (для запуска из исходников)
- Для установки скриптом: Linux (systemd, cron), рекомендуется Debian/Ubuntu
- libicu — на Linux (.NET использует ICU для глобализации). При запуске бинарника напрямую (без Docker) установите пакет:
- Debian/Ubuntu:
apt install libicu-devилиlibicu76/libicu72(имя пакета зависит от версии дистрибутива) - Alpine:
apk add icu-libs(в Docker-образе уже включено)
- Debian/Ubuntu:
Установка одной командой (запускать от любого пользователя, при необходимости запросится sudo):
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh | bashСкрипт устанавливает приложение в /opt/jacred, создаёт пользователя и systemd-сервис jacred, добавляет cron для сохранения БД и при первом запуске по желанию скачивает готовую базу.
Опции:
| Опция | Описание |
|---|---|
--no-download-db |
Не скачивать и не распаковывать базу (только при установке) |
--pre-release |
Установить или обновить из последнего pre-release (например, 2.0.0-dev1) |
--update |
Обновить приложение с последнего релиза (сохранить БД, заменить файлы, перезапустить) |
--remove |
Полностью удалить JacRed (сервис, cron, каталог приложения) |
-h, --help |
Показать справку |
Примеры:
# Обычная установка (одна команда)
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh | sudo bash
# Установка без загрузки базы (одна команда)
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh | sudo bash -s -- --no-download-db
# Скачать скрипт и запустить с аргументами
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh -o jacred.sh
chmod +x jacred.sh
sudo ./jacred.sh --no-download-db
# Установка pre-release версии
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh | bash -s -- --pre-release
# Или скачать и запустить pre-release
curl -s https://raw.githubusercontent.com/jacred-fdb/jacred/main/jacred.sh -o jacred.sh
chmod +x jacred.sh
sudo ./jacred.sh --pre-release
# Обновление уже установленного приложения
sudo /opt/jacred/jacred.sh --update
# Обновление до pre-release версии
sudo /opt/jacred/jacred.sh --update --pre-release
# Удаление
sudo /opt/jacred/jacred.sh --removeУстановка/обновление/удаление под конкретным пользователем (cron будет добавлен или удалён для этого пользователя):
sudo -u myservice ./jacred.sh
sudo -u myservice ./jacred.sh --update
sudo -u myservice ./jacred.sh --removeПосле установки:
- Настройте конфиг:
/opt/jacred/init.yamlили/opt/jacred/init.conf - Перезапуск:
systemctl restart jacred - Полный crontab для парсинга:
crontab /opt/jacred/Data/crontab
Важно: по умолчанию синхронизация отключена: скрипт установки скачивает базу, парсинг — по cron (
Data/crontab). Чтобы подтягивать базу с внешнего сервера, укажитеsyncapiи включите нужные опции синхронизации в конфиге.
Приоритет файлов: init.yaml > init.conf. Если существуют оба, используется init.yaml. Конфиг перечитывается автоматически каждые 10 секунд.
Примеры полного конфига: Data/example.yaml, Data/example.conf. В рабочем конфиге указывайте только те параметры, которые нужно изменить.
| Параметр | Описание | По умолчанию |
|---|---|---|
listenip |
IP для прослушивания (any — все интерфейсы) |
any |
listenport |
Порт HTTP | 9117 |
apikey |
Ключ авторизации API (пусто — без проверки). Передаётся через ?apikey=..., заголовок X-Api-Key или Authorization: Bearer. Без ключа доступны: /, /stats, /health, /version, /lastupdatedb, /api/v1.0/conf, /sync/* |
— |
devkey |
Ключ для доступа к /dev/, /cron/, /jsondb за туннелем/прокси (пусто — только локальная сеть). Передаётся через заголовок X-Dev-Key или параметр ?devkey=... |
— |
mergeduplicates |
Объединять дубликаты в выдаче | true |
mergenumduplicates |
Объединять дубликаты по номеру (серии и т.п.) | true |
openstats |
Открыть доступ к /stats/* |
true |
opensync |
Разрешить синхронизацию базы через sync API | false |
opensync_v1 |
Разрешить старый формат sync v1 | false |
web |
Раздавать статику (веб-интерфейс) | true |
maxreadfile |
Макс. число открытых файлов за один поисковый запрос | 200 |
evercache |
Кеш открытых файлов (рекомендуется при высокой нагрузке) | см. ниже |
fdbPathLevels |
Уровни вложенности каталогов fdb (влияет на структуру хранения данных) | 2 |
Кеш открытых файлов БД для повышения производительности при высокой нагрузке:
| Параметр | Описание | По умолчанию |
|---|---|---|
enable |
Включить кеш | false |
validHour |
Время жизни кеша в часах | 1 |
maxOpenWriteTask |
Максимальное число открытых задач записи | 200 |
dropCacheTake |
Количество элементов для удаления из кеша при переполнении | 200 |
Пример конфигурации:
evercache:
enable: true
validHour: 1
maxOpenWriteTask: 200
dropCacheTake: 200| Параметр | Описание | По умолчанию |
|---|---|---|
syncapi |
URL сервера с открытым opensync для загрузки базы (пусто — не использовать) |
"" |
synctrackers |
Список трекеров для синхронизации с syncapi | см. example |
disable_trackers |
Трекеры, не участвующие в синке (RIP и др.) | hdrezka, anifilm, anilibria |
timeSync |
Интервал синхронизации с syncapi, мин | 120 |
timeSyncSpidr |
Интервал синхронизации Spidr, мин | 360 |
syncsport |
Включить синхронизацию по спорту | false |
syncspidr |
Включить синхронизацию Spidr | false |
| Параметр | Описание | По умолчанию |
|---|---|---|
log |
Устаревший: включить логи fdb и парсеров | false |
logFdb |
Писать лог добавлений/обновлений в Data/log/fdb.*.log | false |
logFdbRetentionDays |
Хранить логи fdb не более N дней (0 — без ограничения) | 7 |
logFdbMaxSizeMb |
Макс. суммарный размер логов fdb, МБ (0 — без ограничения) | 0 |
logFdbMaxFiles |
Макс. число файлов логов fdb (0 — без ограничения) | 0 |
logParsers |
Включить логи парсеров по трекерам (Data/log/{tracker}.log) | false |
| Параметр | Описание | По умолчанию |
|---|---|---|
timeStatsUpdate |
Интервал обновления статистики, мин | 90 |
tracks |
Включить сбор метаданных треков (tsuri) | false |
trackslog |
Включить логи модуля tracks (Data/log/tracks.log) | false |
trackscategory |
Категория для торрентов из jacred (рекомендуется задавать уникально для каждого инстанса) | jacred |
tracksatempt |
Количество неудачных попыток извлечь дорожки, после этого торрент исключается из tracks | 20 |
tracksmod |
Режим треков: 0 — все, 1 — только за текущие сутки | 0 |
tracksdelay |
Задержка между запросами к tsuri, мс | 20000 |
tracksinterval |
Интервалы запуска задач tracks (task1 — за последние сутки, task0 — остальные), мин | task1: 60, task0: 180 |
tsuri |
URL сервиса анализа треков (массив) | ["http://127.0.0.1:8090"] |
Для каждого трекера можно задать следующие параметры:
| Параметр | Описание | Пример |
|---|---|---|
host |
Основной URL трекера | https://rutracker.org |
alias |
Альтернативный URL (например, .onion адрес) | http://rutracker....onion |
useproxy |
Использовать прокси для этого трекера | true / false |
reqMinute |
Максимальное число запросов в минуту | 8 |
parseDelay |
Задержка между запросами при парсинге, мс | 7000 |
log |
Включить логи парсера для этого трекера | true / false |
login |
Учётные данные (u — username, p — password) | {u: "user", p: "pass"} |
cookie |
Cookie для аутентификации | "session=value" |
Полный список трекеров и значения по умолчанию — в Data/example.yaml / Data/example.conf.
Настройки прокси позволяют маршрутизировать запросы через прокси-серверы.
Используются для всех запросов, если не переопределены в globalproxy:
| Параметр | Описание | Пример |
|---|---|---|
pattern |
Регулярное выражение для сопоставления URL | "\\.onion" |
list |
Список прокси-серверов | ["socks5://127.0.0.1:9050"] |
useAuth |
Использовать аутентификацию | true / false |
username |
Имя пользователя для прокси | "user" |
password |
Пароль для прокси | "pass" |
BypassOnLocal |
Обходить прокси для локальных адресов | true / false |
Массив правил для применения к определённым доменам/паттернам. Правила проверяются по порядку, используется первое совпадение.
Пример для доменов .onion через Tor:
globalproxy:
- pattern: "\\.onion"
list:
- socks5://127.0.0.1:9050
useAuth: false
BypassOnLocal: falselistenport: 9120
syncapi: https://jacred.example.com
NNMClub:
alias: http://nnmclub....onion
globalproxy:
- pattern: "\\.onion"
list:
- socks5://127.0.0.1:9050Эквивалент в JSON (init.conf):
{
"listenport": 9120,
"syncapi": "https://jacred.example.com",
"NNMClub": { "alias": "http://nnmclub....onion" },
"globalproxy": [
{ "pattern": "\\.onion", "list": ["socks5://127.0.0.1:9050"] }
]
}Активные (парсинг и/или синхронизация):
Kinozal, NNMClub, Rutor, TorrentBy, Bitru (в т.ч. Bitru API), Rutracker, Megapeer, Selezen, Toloka, Mazepa, Baibako, Lostfilm, Animelayer.
RIP (отключены по умолчанию, только синхронизация со старых баз):
Anifilm, AniLibria, HDRezka.
Список для synctrackers и настройки по трекерам см. в Data/example.yaml.
Для самостоятельного парсинга трекеров:
-
Настроить
init.yamlилиinit.conf(примеры вData/example.yaml,Data/example.conf).- Убедитесь, что для нужных трекеров указаны правильные
host,login(если требуется) илиcookie. - Настройте прокси, если требуется доступ к .onion доменам.
- Убедитесь, что для нужных трекеров указаны правильные
-
Выберите режим работы:
- Парсинг через cron: По умолчанию база скачивается при установке, парсинг выполняется по расписанию из
Data/crontab. Активируйте:crontab /opt/jacred/Data/crontab - Синхронизация: Укажите
syncapiв конфиге, чтобы подтягивать базу с удалённого сервера. Включитеopensync: trueдля участия в синхронизации.
- Парсинг через cron: По умолчанию база скачивается при установке, парсинг выполняется по расписанию из
-
Важно: В crontab по умолчанию используется порт 9117 — при смене порта измените URL в crontab или используйте переменную окружения.
-
Мониторинг парсинга:
- Логи парсеров:
Data/log/{tracker}.log(еслиlogParsers: trueилиlog: trueдля конкретного трекера) - Логи БД:
Data/log/fdb.*.log(еслиlogFdb: true) - Статистика:
GET /stats/*(еслиopenstats: true)
- Логи парсеров:
- Запустить Tor на порту 9050.
- В конфиге задать для трекера
aliasс .onion-адресом и вglobalproxyправило сpattern: "\\.onion"иlist: ["socks5://127.0.0.1:9050"](как в примере выше).
GET /— веб-интерфейс (еслиweb: true).GET /health— проверка работы. Ответ JSON:{"status":"OK"}.GET /version— версия приложения. Ответ JSON:{"version":"1.0.0"}.GET /lastupdatedb— дата/время последнего обновления БД (UTC). Ответ JSON:{"lastupdatedb":"dd.MM.yyyy HH:mm"}.
GET /api/v2.0/indexers/{status}/results— поиск в формате Jackett (совместимость с Jackett API).- Параметры:
Query(поисковый запрос),Category(категория),Tracker(трекер),apikey(если настроен).
- Параметры:
GET /api/v1.0/torrents— поиск торрентов (собственный API).- Параметры:
query(поисковый запрос),tracker(трекер),category(категория),quality(качество).
- Параметры:
GET /api/v1.0/qualitys— список доступных качеств.
GET /api/v1.0/conf— проверка apikey (?apikey=...).GET /jsondb/save— сохранить БД на диск (при использовании syncapi скрипт установки не вызывает save; при собственном парсинге cron вызывает save по расписанию).- Доступ: только из локальной сети или с
devkey(заголовокX-Dev-Keyили параметр?devkey=...).
- Доступ: только из локальной сети или с
GET /dev/*— инструменты разработки и отладки БД (только localhost или сdevkey).- Доступ: только из локальной сети или с
devkey(заголовокX-Dev-Keyили параметр?devkey=...).
- Доступ: только из локальной сети или с
| Эндпоинт | Описание |
|---|---|
/dev/UpdateSize |
Пересчитывает поле size (байты) из sizeName для всех торрентов. Обновляет updateTime. |
/dev/ResetCheckTime |
Сбрасывает checkTime на вчера для всех торрентов (для повторной проверки). |
/dev/UpdateDetails |
Обновляет детали торрентов через updateFullDetails (качество, сезоны и т.п.). |
/dev/UpdateSearchName |
Пересчитывает _sn и _so из name/originalname, мигрирует торренты при смене ключа бакета. |
/dev/FixKnabenNames |
Нормализует имена торрентов Knaben: убирает метаданные из title, оставляет базовое имя. Исправляет поиск в API v1/v2. Возвращает { ok, processed, updated, migrated }. |
/dev/FixBitruNames |
Нормализует name/originalname торрентов Bitru: убирает сезон, эпизод, качество. Исправляет поиск в API v1/v2. Возвращает { ok, processed, updated, migrated }. |
/dev/FindCorrupt |
Сканирует БД на повреждённые записи (null Value, пустые name/originalname/trackerName). Только чтение. Параметр: ?sampleSize=20. |
/dev/RemoveNullValues |
Удаляет записи, где torrent.Value == null (битые ссылки). |
/dev/FindDuplicateKeys |
Ищет дубликаты ключей вида X:X (например ponies:ponies). Параметры: ?tracker=lostfilm, ?excludeNumeric=false. |
/dev/RemoveBucket |
Удаляет бакет по ключу. Параметры: ?key=ponies:ponies — удалить; ?key=...&migrateName=...&migrateOriginalname=... — перенести торренты в новый бакет. |
/dev/FindEmptySearchFields |
Ищет торренты с пустыми _sn или _so. Только чтение. Параметр: ?sampleSize=20. |
/dev/FixEmptySearchFields |
Заполняет пустые _sn/_so из name/originalname/title, мигрирует при смене ключа. Пересобирает fastdb. |
/dev/MigrateAnilibertyUrls |
Мигрирует торренты Aniliberty на URL с хешем из magnet (?hash=...). |
/dev/RemoveDuplicateAniliberty |
Удаляет дубликаты Aniliberty по хешу magnet, оставляет запись с последним updateTime. |
/dev/FixAnimelayerDuplicates |
Устраняет дубликаты Animelayer: нормализует HTTP→HTTPS, удаляет HTTP-дубликаты. |
GET /stats/*— статистика (еслиopenstats: true).GET /sync/*— эндпоинты синхронизации (еслиopensync: true).- Поддерживаются форматы v1 и v2 (v1 требует
opensync_v1: true).
- Поддерживаются форматы v1 и v2 (v1 требует
GET /cron/{tracker}/parse— запуск парсинга трекера.GET /cron/{tracker}/ParseAllTask— парсинг всех задач трекера.GET /cron/{tracker}/UpdateTasksParse— обновление задач парсинга.GET /cron/{tracker}/parseMagnet— парсинг магнет-ссылок (для поддерживающих трекеров).- Дополнительные параметры:
parseFrom,parseTo,parseFromDate(зависит от трекера). - Доступ: только из локальной сети или с
devkey(заголовокX-Dev-Keyили параметр?devkey=...).
Примечания:
- Для использования API с авторизацией укажите
apikeyв конфиге. Ключ можно передать:?apikey=..., заголовокX-Api-KeyилиAuthorization: Bearer. Пути/,/stats,/health,/version,/lastupdatedb,/api/v1.0/conf,/sync/*доступны без ключа.- Эндпоинты
/cron/*,/dev/*,/jsondb/*доступны только из локальной/приватной сети (по IP клиента). При работе за туннелем/прокси (когда все запросы выглядят локальными) используйтеdevkeyдля защиты этих эндпоинтов.
- .NET 9.0 SDK (см.
JacRed.csproj) - Git (для генерации версии из тегов)
- Bash (для скрипта сборки)
./build.sh./build.sh --allПоддерживаемые платформы:
- Linux: amd64, arm64
- Windows: x64
- macOS: arm64, amd64
Результат сборки находится в каталоге dist/<platform>/ (single-file, self-contained).
- Single-file публикация (один исполняемый файл)
- Self-contained (включает .NET runtime)
- Оптимизация для скорости выполнения
- Сжатие в single-file
- Версия генерируется автоматически из Git тегов через
generate-version.sh
Образ можно запускать через Docker или Docker Compose. Конфигурация (init.yaml или init.conf) и данные (база fdb, логи) хранятся в томах или bind-монтированных каталогах. При первом запуске конфиг по умолчанию копируется автоматически (поддерживаются и named volumes, и bind mounts).
docker run -d \
--name jacred \
-p 9117:9117 \
-v jacred-config:/app/config \
-v jacred-data:/app/Data \
--restart unless-stopped \
ghcr.io/jacred-fdb/jacred:latestВариант с named volumes (рекомендуется):
name: jacred
services:
jacred:
image: ghcr.io/jacred-fdb/jacred:latest
container_name: jacred
restart: unless-stopped
ports:
- "9117:9117"
volumes:
- jacred-config:/app/config
- jacred-data:/app/Data
environment:
- TZ=Europe/London
- UMASK=0027
healthcheck:
test: ["CMD", "curl", "-f", "-s", "--max-time", "10", "http://127.0.0.1:9117/health"]
interval: 30s
timeout: 15s
retries: 3
start_period: 45s
deploy:
resources:
limits:
memory: 2048M
volumes:
jacred-config:
jacred-data:Вариант с bind mounts (удобно для доступа к файлам на хосте) — замените блок volumes в сервисе на:
volumes:
- ./config:/app/config
- ./data:/app/DataГотовые примеры: docker/docker-compose.yml (bind mounts), docker-compose.example.yml (named volumes).
Полезно:
- Конфиг: после первого запуска настройте
init.yamlилиinit.confв томеjacred-configили каталоге./config(при bind mount). Конфиг автоматически копируется из/app/config/в/app/при старте контейнера. - Порты: веб-интерфейс и API доступны на порту 9117 (при необходимости измените маппинг
portsиlistenportв конфиге). - Память: при большой базе или активном парсинге увеличьте лимит
memoryвdeploy.resources.limits(рекомендуется минимум 2GB). - Тома:
jacred-config— хранит конфигурацию (init.yamlилиinit.conf)jacred-data— хранит базу данных (fdb/), логи (log/), временные файлы (temp/) и треки (tracks/)
- Healthcheck: контейнер включает встроенный healthcheck, проверяющий доступность
/healthэндпоинта. - Сборка своего образа: в корне репозитория выполните
docker build -t jacred .и в примерах выше замените образ наjacred:latest. - Переменные окружения: поддерживаются
TZ(часовой пояс) иUMASK(права на файлы, по умолчанию0027).
В каталоге router/ находится Cloudflare Worker для маршрутизации запросов по хосту/пути на разные бэкенды (домашний сервер, Tailscale, туннели, Pages, Vercel) с кешированием и заголовками.
Возможности:
- Маршрутизация по хосту, пути и query-параметрам
- Поддержка нескольких типов источников
- Индивидуальные заголовки и политики кэширования для каждого маршрута
- Перезапись пути (path rewriting)
- Подстановочные символы в хосте и пути
Документация и настройка — в router/README.md.
- Ошибка «Couldn't find a valid ICU package» — .NET требует библиотеку ICU на Linux. Установите:
apt install libicu-dev(Debian/Ubuntu) илиlibicu76/libicu72(имя зависит от версии). Проверьте доступные пакеты:apt-cache search libicu. Подробнее: aka.ms/dotnet-missing-libicu - Проверьте наличие конфигурационного файла (
init.yamlилиinit.conf) - Убедитесь, что порт не занят другим процессом:
netstat -tuln | grep 9117 - Проверьте логи systemd:
journalctl -u jacred -f - Для Docker: проверьте логи контейнера:
docker logs jacred
- Проверьте, что cron настроен правильно:
crontab -l - Убедитесь, что
syncapiуказан корректно (если используется синхронизация) - Проверьте логи парсеров:
tail -f Data/log/{tracker}.log - Убедитесь, что трекер доступен и учётные данные верны
- Проверьте, что приложение запущено:
systemctl status jacred - Проверьте health endpoint:
curl http://localhost:9117/health - Убедитесь, что
apikeyуказан правильно (если используется авторизация) - Проверьте настройки
listenipиlistenportв конфиге
- Убедитесь, что Tor запущен на порту 9050:
netstat -tuln | grep 9050 - Проверьте правильность регулярного выражения в
globalproxy.pattern - Убедитесь, что формат прокси корректен:
socks5://127.0.0.1:9050 - Проверьте логи для ошибок подключения
- Включите
evercacheдля оптимизации работы с файлами - Уменьшите
maxreadfileв конфиге - Настройте ротацию логов через
logFdbRetentionDays,logFdbMaxSizeMb,logFdbMaxFiles - Для Docker: увеличьте лимит памяти в
deploy.resources.limits.memory
JacRed построен на ASP.NET Core (.NET 9.0) и использует:
- Файловая БД (fdb) — структурированное хранение данных в файловой системе
- Асинхронные задачи — фоновые процессы для парсинга, синхронизации и статистики
- Автоматическая перезагрузка конфига — изменения применяются без перезапуска (каждые 10 секунд)
- Модульная архитектура — отдельные контроллеры для каждого трекера
- ModHeaders — middleware: ограничение по IP (локальная/приватная сеть для
/cron/,/dev/,/jsondb), проверкаdevkeyиapikey, CORSAccess-Control-Allow-Private-Network, логирование cron - FileDB — управление файловой базой данных
- SyncCron — синхронизация с удалёнными серверами
- TrackersCron — планирование и выполнение парсинга трекеров
- StatsCron — сбор и обновление статистики
- TracksCron — сбор метаданных треков (опционально)
- ApiController — обработка API запросов
- SyncController — эндпоинты синхронизации
MIT License. См. файл LICENSE для подробностей.
