|
|
||
|---|---|---|
| .github | ||
| .vscode | ||
| Controllers | ||
| Data | ||
| Engine | ||
| Models | ||
| Properties | ||
| router | ||
| wwwroot | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| AppInit.cs | ||
| appsettings.Production.json | ||
| backup.sh | ||
| build.sh | ||
| docker-compose.example.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| generate-version.sh | ||
| JacRed.csproj | ||
| jacred.sh | ||
| JacRed.sln | ||
| LICENSE | ||
| Program.cs | ||
| README.md | ||
| Startup.cs | ||
JacRed
Агрегатор торрент-трекеров с API в формате Jackett. Хранит данные в файловой БД (fdb), поддерживает синхронизацию с удалённой базой и самостоятельный парсинг трекеров по cron.
Основные возможности
- 🔍 Агрегация торрентов с множества трекеров в единый API
- 📦 Файловая БД (fdb) для быстрого доступа к данным
- 🔄 Синхронизация с удалёнными серверами или самостоятельный парсинг
- 🎯 API Jackett — полная совместимость с форматом Jackett
- 🌐 Веб-интерфейс для просмотра и управления
- 🔐 Поддержка прокси и Tor для доступа к .onion доменам
- 📊 Статистика по трекерам и торрентам
- 🎵 Модуль tracks для сбора метаданных треков (опционально)
- ⚡ Кеширование для высокой производительности
- 🐳 Docker поддержка для простого развёртывания
AI Документация
📥 Поддержать проект
💲 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 |
Настройки кеша (evercache)
Кеш открытых файлов БД для повышения производительности при высокой нагрузке:
| Параметр | Описание | По умолчанию |
|---|---|---|
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.
Прокси
Настройки прокси позволяют маршрутизировать запросы через прокси-серверы.
Общие настройки прокси (proxy)
Используются для всех запросов, если не переопределены в globalproxy:
| Параметр | Описание | Пример |
|---|---|---|
pattern |
Регулярное выражение для сопоставления URL | "\\.onion" |
list |
Список прокси-серверов | ["socks5://127.0.0.1:9050"] |
useAuth |
Использовать аутентификацию | true / false |
username |
Имя пользователя для прокси | "user" |
password |
Пароль для прокси | "pass" |
BypassOnLocal |
Обходить прокси для локальных адресов | true / false |
Глобальные правила прокси (globalproxy)
Массив правил для применения к определённым доменам/паттернам. Правила проверяются по порядку, используется первое совпадение.
Пример для доменов .onion через Tor:
globalproxy:
- pattern: "\\.onion"
list:
- socks5://127.0.0.1:9050
useAuth: false
BypassOnLocal: false
Пример минимального конфига (YAML)
listenport: 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для участия в синхронизации. - Docker: в образе нет cron — расписание выносится на хост, отдельный контейнер или оркестратор; см. раздел «Docker → Самостоятельный парсинг и расписание (cron) в Docker».
- Парсинг через cron: По умолчанию база скачивается при установке, парсинг выполняется по расписанию из
-
Важно: В crontab по умолчанию используется порт 9117 — при смене порта измените URL в crontab. Если в конфиге задан
apikey, добавьте его в каждый вызовcurlк/cron/*и/jsondb/save(см. раздел «Парсинг трекеров»). -
Мониторинг парсинга:
- Логи парсеров:
Data/log/{tracker}.log(еслиlogParsers: trueилиlog: trueдля конкретного трекера) - Логи БД:
Data/log/fdb.*.log(еслиlogFdb: true) - Статистика:
GET /stats/*(еслиopenstats: true)
- Логи парсеров:
Доступ к доменам .onion
- Запустить Tor на порту 9050.
- В конфиге задать для трекера
aliasс .onion-адресом и вglobalproxyправило сpattern: "\\.onion"иlist: ["socks5://127.0.0.1:9050"](как в примере выше).
API
Основные эндпоинты
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"}.
API поиска
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 по расписанию).- Доступ: только из локальной/приватной сети (по IP); при заданном
devkey— заголовокX-Dev-Keyили?devkey=...; при заданномapikey— такжеapikey(как для/cron/*, см. таблицу в «Парсинг трекеров»).
- Доступ: только из локальной/приватной сети (по IP); при заданном
Разработка и отладка
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(зависит от трекера).
Доступ и ключи (важно различать apikey и devkey):
| Условие | Поведение |
|---|---|
| Клиент не в локальной/приватной сети (по IP) | /cron/*, /dev/*, /jsondb/* — 403, ключи не помогают. |
Клиент в локальной/приватной сети, в конфиге задан devkey |
Нужен devkey: заголовок X-Dev-Key или ?devkey=... (иначе 401). Смысл — защита, когда за туннелем/прокси все запросы приходят с «локального» IP. |
В конфиге задан apikey |
Для /cron/* (как и для поиска и остальных путей вне белого списка) нужен apikey: ?apikey=..., заголовок X-Api-Key или Authorization: Bearer (иначе 401). apikey не заменяет devkey — при необходимости передавайте оба. |
В конфиге не заданы ни apikey, ни devkey |
Для /cron/* достаточно, чтобы клиент был в локальной/приватной сети (по IP). |
Белый список путей без apikey (если ключ задан): /, /stats, /health, /version, /lastupdatedb, /api/v1.0/conf, /sync/*. Путь /cron/* в этот список не входит.
Пример curl при включённых apikey и devkey:
curl -s -H "X-Api-Key: YOUR_API_KEY" -H "X-Dev-Key: YOUR_DEV_KEY" \
"http://127.0.0.1:9117/cron/rutor/parse"
Примечания:
- Для использования API с авторизацией укажите
apikeyв конфиге. Ключ можно передать:?apikey=..., заголовокX-Api-KeyилиAuthorization: Bearer. Пути/,/stats,/health,/version,/lastupdatedb,/api/v1.0/conf,/sync/*доступны без ключа.- Эндпоинты
/cron/*,/dev/*,/jsondb/*сначала проверяются по IP (только локальная/приватная сеть), затем поdevkey(если задан), затем поapikey(если задан). Для cron-задач на хосте при необходимости добавьте вcurlзаголовки или query-параметры для обоих ключей.
Сборка
Требования для сборки
- .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 или Docker Compose. Конфигурация (init.yaml или init.conf) и данные (база fdb, логи) хранятся в томах или bind-монтированных каталогах. При первом запуске конфиг по умолчанию копируется автоматически (поддерживаются и named volumes, и bind mounts).
Docker Run
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
Docker Compose
Вариант с 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).
Самостоятельный парсинг и расписание (cron) в Docker
В образе нет планировщика cron (и нет установки заданий в crontab внутри контейнера). Фоновые циклы приложения (синхронизация по syncapi, статистика и т.д.) работают сами; периодический вызов HTTP-эндпоинтов /cron/... и /jsondb/save нужно организовать снаружи контейнера.
Типовые варианты:
- Cron на хосте (чаще всего) — в crontab пользователя на машине, где крутится Docker, вызывать
curlна опубликованный порт (напримерhttp://127.0.0.1:9117/...). Запрос с хоста в контейнер обычно приходит с адреса из приватной подсети (в т.ч. шлюз Docker172.x), что удовлетворяет проверке «локальная/приватная сеть» в приложении. - Отдельный контейнер с cron — маленький образ (например
curl+cron), в том же Docker Compose, который по расписанию дергает сервис JacRed по внутреннему имени и порту (напримерhttp://jacred:9117/...). Убедитесь, что с точки зрения JacRed IP источника остаётся в приватном диапазоне (типично так и есть в user-defined bridge-сети). - Kubernetes CronJob, systemd timer на хосте — по сути то же, что п.1: периодический HTTP-запрос к JacRed.
Ориентир по расписанию: в репозитории лежит пример Data/crontab (парсинг по трекерам и */5 * * * * для /jsondb/save). Скопируйте нужные строки в свой crontab на хосте (или в свой шаблон для контейнера с cron) и:
- замените хост/порт на ваши (
127.0.0.1:9117или имя сервиса в Compose); - если в
init.yaml/init.confзаданapikey— добавьте в каждыйcurlключ (-H "X-Api-Key: ..."или?apikey=...), иначе запросы к/cron/*и/jsondb/saveполучат 401; - если задан
devkeyи запрос считается «локальным» — добавьте-H "X-Dev-Key: ..."или?devkey=....
Подробнее про ключи для /cron/* — в разделе «Парсинг трекеров» выше.
Синхронизация вместо своего парсинга: можно указать syncapi и не вызывать /cron/* вовсе; тогда достаточно конфигурации и встроенных циклов приложения (плюс при необходимости /jsondb/save по расписанию, если вы ведёте локальную запись БД).
Роутер (Cloudflare Worker)
В каталоге 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(на хосте или в отдельном контейнере с планировщиком; внутри образа JacRed cron нет) - Для Docker: убедитесь, что по расписанию вызываются
/cron/...и при необходимости/jsondb/save, с учётомapikey/devkeyвcurl, если они заданы в конфиге - Убедитесь, что
syncapiуказан корректно (если используется синхронизация) - Проверьте логи парсеров:
tail -f Data/log/{tracker}.log - Убедитесь, что трекер доступен и учётные данные верны
API не отвечает
- Проверьте, что приложение запущено:
systemctl status jacred - Проверьте health endpoint:
curl http://localhost:9117/health - Убедитесь, что
apikeyуказан правильно (если используется авторизация) - Проверьте настройки
listenipиlistenportв конфиге
Проблемы с прокси/Tor
- Убедитесь, что 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 для подробностей.
