Questo repository contiene una collezione di provider italiani per lo streaming di Film, Serie TV e Anime. Il progetto è progettato per essere versatile e può essere utilizzato in due modi diversi:
- Come Plugin per Nuvio
- Come Addon per Stremio
- AnimeUnity (Anime)
- AnimeWorld (Anime)
- AnimeSaturn (Anime)
- GuardoSerie (Film & Serie TV)
- StreamingCommunity (Film & Serie TV)
- AltadefinizioneStreaming (Film & Serie TV)
- VidxGo (Film & Serie TV - solo Addon Stremio con EasyProxy)
- Partite (Film , Serie TV & Anime)
- Mediaset Infinity (TV & VOD - solo Addon Stremio con EasyProxy)
- RaiPlay (TV & VOD - solo Addon Stremio con EasyProxy)
- WittyTV (TV & VOD - solo Addon Stremio con EasyProxy)
- Cinejoy (Film & Serie TV - link diretti, senza EasyProxy)
- EasyJack (solo addon Stremio: catalogo torrent PostgreSQL con arricchimento asincrono tramite Jackett)
Per installare i provider su Nuvio, basta seguire questi semplici passaggi:
- Apri Nuvio.
- Vai nelle Impostazioni > Plugin.
- Incolla il seguente link nel campo apposito per aggiungere un plugin esterno:
https://raw.githubusercontent.com/realbestia1/easystreams/refs/heads/main/manifest.json - I provider saranno immediatamente attivi.
Puoi trasformare questi provider in un Addon per Stremio che gira in locale o su un server.
Poiché molti siti italiani bloccano gli IP dei server cloud (AWS, Heroku, ecc.), l'esecuzione locale è spesso la soluzione migliore.
- Apri il terminale nella cartella del progetto.
- Avvia l'addon:
npm start
- L'addon si avvierà su
http://localhost:7000. - Apri il browser a quell'indirizzo.
- Clicca sul pulsante "INSTALL ADDON" per aggiungerlo automaticamente al tuo Stremio.
Il pacchetto Docker è autosufficiente: include l'addon Stremio, PostgreSQL,
Jackett, FlareSolverr, il worker EasyJack, il backup e Watchtower. Database,
API key, collegamento tra Jackett e FlareSolverr, migration e indexer vengono
preparati automaticamente. Non è necessario configurare manualmente né il
database né Jackett: il pannello amministrativo opzionale è protetto da una
password esplicita e viene attivato soltanto quando viene impostata
EASYJACK_ADMIN_TOKEN.
Su una VPS appena preparata:
cd /opt
git clone -b dev https://github.com/WhiteGiso/easystreams.git easystreams
cd /opt/easystreams
docker compose config
docker compose up -d --buildL'addon sarà disponibile di default su http://IP_DELLA_VPS:7000. Nella
configurazione principale dell'addon Stremio l'utente deve soltanto lasciare
EasyJack attivo o disattivarlo insieme alle altre fonti. Se EasyJack è attivo
ma uno dei servizi non è ancora pronto, la sorgente restituisce zero risultati
senza bloccare gli altri provider.
Per aggiornare il codice e le immagini in modo esplicito:
cd /opt/easystreams
git pull --ff-only origin dev
docker compose pull flaresolverr jackett watchtower
docker compose build --pull
docker compose up -d --buildSu Coolify, per un commit che contiene codice o migration, eseguire un nuovo
Deploy/Redeploy della risorsa Compose usando il branch aggiornato. Il job
easyjack-bootstrap applica le migration pendenti, comprese le riparazioni dei
componenti, prima che partano addon e worker; non eliminare i volumi PostgreSQL.
Per un semplice riavvio senza aggiornare l'immagine è sufficiente:
docker compose restart easystreams easyjack-workerI servizi con restart: "no" (torque-init, jackett-init ed
easyjack-bootstrap) possono risultare Exited (0): è il
comportamento corretto, perché sono procedure di inizializzazione terminate con
successo.
Per controllare lo stack:
docker compose ps
docker compose logs --tail=200 postgres flaresolverr jackett \
easyjack-bootstrap easystreams easyjack-worker easyjack-backup
curl -fS http://127.0.0.1:7000/manifest.jsonPer una reinstallazione completamente vuota, il comando seguente elimina anche database, password, configurazione Jackett, impostazioni EasyJack e backup locali. Usarlo solo quando si desidera davvero ripartire da zero:
docker compose down --remove-orphans -v
docker compose up -d --buildPuoi caricare questo repository su servizi come HuggingFace. Tuttavia, tieni presente che alcuni provider potrebbero non funzionare a causa dei blocchi geografici o dei blocchi IP dei datacenter imposti dai siti sorgente.
Quando l'addon viene eseguito su un server remoto (non in locale), alcuni provider potrebbero riscontrare problemi tecnici dovuti alle protezioni dei siti sorgente.
Il pannello è disponibile su /easyjack/admin quando il servizio easystreams
riceve EASYJACK_ADMIN_TOKEN con almeno 16 caratteri. La variabile è la
password del pannello: non inserirla nel repository, nel link Stremio o nella
configurazione del browser. Il Compose la inoltra al solo container HTTP
easystreams; dopo averla aggiunta al file .env ricreare il servizio:
EASYJACK_ADMIN_TOKEN=imposta-qui-una-password-lunga-e-casuale
EASYJACK_ADMIN_JACKETT_TIMEOUT_MS=120000docker compose up -d --build easystreamsLa sezione EasyJack Jackett mostra soltanto gli indexer attivi come chip
orizzontali. Il pulsante Aggiungi indexer apre un popup multiselezione con
gli indexer non configurati; l’aggiunta usa i valori predefiniti di Jackett e
poi ogni indexer può essere completato dal form ufficiale, testato o rimosso.
La ricerca manuale parte in background e invia una sola query titolo agli
indexer attivi e selezionati, direttamente tramite le API Torznab dei singoli
indexer; non attende più la risposta aggregata all durante la richiesta HTTP.
Il POST risponde subito con un job e la pagina mostra avanzamento, errori e
risultati parziali per indexer, evitando il 502 del proxy sulle ricerche lente.
Il risultato passa dalla stessa normalizzazione della ricerca EasyJack, quindi
vengono persistiti soltanto film/serie con locator e info hash validi. La lingua
non viene filtrata in scrittura: resta una proiezione della lettura Stremio. La
API key di Jackett e le password restano server-side.
La directory docker/jackett-seed è montata in sola lettura nel job
jackett-init. Può contenere jackett-config.tar.gz, un archivio della
directory persistente Jackett/ con ServerConfig.json e tutte le
configurazioni degli indexer. Per esportare la configurazione attuale senza
modificarla:
docker compose exec -T jackett sh -c 'tar -czf - -C /config Jackett' > docker/jackett-seed/jackett-config.tar.gzL’archivio contiene segreti (API key, password e possibili cookie) ed è
ignorato da Git: non va committato né pubblicato. Può essere caricato nella
directory del progetto sul server Coolify. Per conservarlo in uno storage
persistentemente montato da Coolify, impostare nel .env o nelle variabili
Compose JACKETT_CONFIG_SEED_HOST_PATH=/home/ubuntu/easystreams/data/jackett-seed:
JACKETT_CONFIG_SEED_HOST_PATH=/home/ubuntu/easystreams/data/jackett-seed
JACKETT_CONFIG_SEED_FILE=/seed/jackett-config.tar.gzIl nome del file nel mount può essere cambiato impostando
JACKETT_CONFIG_SEED_FILE. Il seed viene importato
solo quando /home/ubuntu/easystreams/data/jackett è vuota; se esiste già un
ServerConfig.json o una configurazione di indexer, il job non sovrascrive
nulla. Dopo l’import viene creato il marker persistente
.easyjack-jackett-seed-imported: i riavvii successivi mantengono il profilo
importato e saltano il bootstrap predefinito degli indexer.
Per usare il profilo su un’installazione nuova, copiare l’archivio in
docker/jackett-seed/jackett-config.tar.gz oppure nel percorso host indicato
da JACKETT_CONFIG_SEED_HOST_PATH prima del deploy.
La sezione Ricerca veloce in EasyJackDB è la prima del pannello: interroga il catalogo con full-text PostgreSQL indicizzato e cerca i termini nel titolo, nell'indexer e nei titoli dei sottotorrent, anche quando i termini sono distribuiti tra torrent padre e componente. Ogni riga torrent si può espandere per vedere tutte le colonne del padre e, tramite relazione esterna, tutte le colonne dei figli.
La sezione Gestione Database mostra l'albero delle tabelle public e delle
relative colonne. Il click su una tabella carica ed esegue automaticamente gli
ultimi 200 record ordinati per la prima data disponibile (created_at,
first_seen_at, applied_at o updated_at) e lascia la query visibile nel
campo SQL. Le query manuali accettano solo letture (SELECT, WITH, EXPLAIN
e SHOW), usano una transazione read-only, hanno timeout configurabile con
EASYJACK_DATABASE_ADMIN_TIMEOUT_MS e restituiscono al massimo 2.000 righe.
La sezione Gestione EasyJack Jackett resta in fondo e contiene le
funzionalità ufficiali di Jackett già disponibili nel pannello.
- Struttura: Ogni provider ha la sua cartella in
src/. - Build: Lo script
build.jscompila i provider per Nuvio ed esclude i provider disponibili soltanto nell'addon Stremio. - Stremio: Il file
stremio_addon.jsfunge da server e adattatore per convertire i risultati dei provider nel formato Stremio.
EasyJack interroga in parallelo il catalogo locale PostgreSQL e Torrentio usando
la configurazione hardcoded
https://torrentio.strem.fun/sort=qualitysize/manifest.json. I risultati
Torrentio validi vengono deduplicati per info hash, salvati nel catalogo e
restituiti immediatamente insieme ai record già presenti. Nel deployment Compose
le sole richieste Torrentio passano dal proxy interno Torque/Tor, limitato dalla
policy a torrentio.strem.fun:443, senza porte pubblicate: l'upstream non vede
l'IP domestico/VPS. EASYJACK_TORRENTIO_PROXY_REQUIRED=true rende il percorso
fail-closed: se Torque non è pronto, EasyJack usa cache e catalogo locale senza
ripiegare silenziosamente sull'IP reale o su FlareSolverr. Disattivando
esplicitamente tale opzione resta disponibile il precedente fallback diretto.
In entrambi i casi resta attiva la configurazione Torrentio globale, senza
filtri lingua applicati a monte.
Le richieste identiche simultanee vengono unificate. La cache fresca dura per
default cinque minuti e la copia stale sei ore; le chiamate upstream sono
distanziate di 200 ms e protette da concorrenza/coda limitate. Un 429 non viene
inoltrato a un altro proxy: EasyJack rispetta Retry-After, entra in cooldown e
serve cache/DB, evitando retry sincronizzati. I valori sono configurabili con
EASYJACK_TORRENTIO_CACHE_TTL_MS, EASYJACK_TORRENTIO_STALE_CACHE_TTL_MS,
EASYJACK_TORRENTIO_MIN_REQUEST_INTERVAL_MS e
EASYJACK_TORRENTIO_RATE_LIMIT_COOLDOWN_MS. Camoufox non viene usato per
Torrentio. La stessa richiesta viene poi deduplicata in public.jobs e processata
da un unico worker separato dal processo HTTP con Jackett in background. Il worker
usa un lock advisory PostgreSQL per impedire l'avvio di più istanze sullo
stesso catalogo; la concorrenza interna riguarda job asincroni nello stesso
processo, non processi worker aggiuntivi.
Torrentio viene sempre interrogato senza filtro linguistico. Anche Jackett riceve una sola query primaria, il titolo normalizzato senza stagione, episodio o lingua; il filtro lingua viene applicato dopo il recupero. In questo modo la stessa ricerca acquisisce ITA e tutte le altre lingue, indipendentemente dal flag selezionato in Stremio. Se il database EasyJack non è configurato, la sorgente EasyJack resta vuota e addon e provider precedenti continuano a funzionare normalmente.
Nel configuratore principale dell’addon, quando EasyJack è attivo, Lingua risultati consente di selezionare una o più lingue, oltre a Multi e Unknown; Tutte le lingue rimuove il filtro. Multi include i file che dichiarano MULTI/DUAL o più lingue audio, mentre Unknown include i file senza lingua verificabile o con metadati defaultati. L’ordine delle lingue selezionate è manuale: i risultati che corrispondono alla prima lingua vengono mostrati prima, poi quelli della seconda e così via; la lista si può riordinare trascinandola oppure usando le frecce. Il filtro viene applicato alla proiezione finale destinata a Stremio, dopo aver unito i risultati Torrentio freschi con la lettura del catalogo PostgreSQL: Torrentio mantiene la configurazione globale e il worker salva i risultati di tutte le lingue. languages contiene la proiezione delle lingue audio usabili da Stremio, mentre reported_languages conserva tutti i codici/bandiere ricevuti dalla sorgente e subtitle_languages conserva le lingue dei sottotitoli. Un nuovo recupero aggiorna la classificazione anche quando l’info hash è già presente. Le liste Torrentio molto ampie e generiche vengono conservate come evidenza non verificata ma non vengono trattate automaticamente come tracce audio: in assenza di un’indicazione audio esplicita il fallback è ENG. Prima della persistenza EasyJack ricontrolla la lingua italiana sui dati Torrentio: accetta i marker tecnici nel titolo/nome file, le lingue strutturate e le liste di bandiere non generiche; una lista densa di bandiere non dimostra da sola una traccia audio. Accetta inoltre un titolo o nome episodio chiaramente localizzato in italiano, senza considerare parole-titolo come It o Italian in un titolo inglese. Stremio mostra quindi le lingue audio classificate (per esempio ENG / ITA / FRE) e ammette la riga se la proiezione audio contiene almeno una lingua selezionata.
Per Jackett, EasyJack legge tutti gli attributi Torznab language (non soltanto il primo) e mantiene separati gli attributi subs. Se l’indexer non espone lingue audio strutturate, il parser usa titolo e description, rimuovendo prima forme come SUB-ITA, SUB ENG, French Subs e Sottotitoli Italiano; le lingue così riconosciute finiscono in subtitle_languages, non nella proiezione audio. Durante l’arricchimento del metainfo .torrent, la valutazione dei pack considera il nome del torrent padre e il basename di ogni file: un file con un proprio marker audio non eredita lingue del padre che lo contraddicono, mentre un file senza marker può ereditare le lingue audio esplicite del padre. Soltanto quando attributi, titolo, descrizione, padre e file non forniscono alcuna indicazione viene assegnato ENG. La migration impone array languages e reported_languages non vuoti sia sui torrent sia sui componenti.
I pack di serie conservano anche la copertura dichiarata nel titolo. Forme come S04E01-16, S04E01-S04E16, 4x01-16, S04 01-16 ed elenchi come S03E(14-15-16) indicano gli episodi coperti da una stagione; S01-11, S01-S11, Season 1-11, Saison 1-11, Temporada 1-11 e Sezon 01-11 indicano invece un pack multi-stagione. PostgreSQL usa questi insiemi prima di restituire il risultato, quindi un pack S04E01-16 è valido per S04E13 ma non per S04E17. Se il metainfo contiene componenti, il file dell’episodio richiesto resta la prova più precisa. Nella notazione ITA ENG SubS, ITA e ENG sono audio e SubS è un marker generico; forme esplicite come SUB-ITA, English Subs o Sottotitoli Italiano restano invece sottotitoli e non qualificano il filtro audio italiano.
Quando EasyJack è selezionato, i suoi stream vengono presentati prima delle fonti esistenti; al suo interno l’ordinamento può essere configurato con i criteri Resolution, Quality, Language, Audio Tag, Audio Channel ed Encode. Il primo criterio ha precedenza sugli altri; ogni criterio ha una lista Preferred Order riordinabile manualmente. I risultati non riconosciuti finiscono in fondo e, a parità di preferenza, restano i fallback qualità/dimensione precedenti. L’ordinamento relativo delle fonti precedenti resta invariato.
Nel configuratore Config EasyJack è possibile aggiungere più servizi Debrid (Real-Debrid, AllDebrid, Debrid-Link, Premiumize, TorBox, EasyDebrid, Debrider, PikPak, Offcloud e Torrin), in ordine di failover. Il collegamento usa StremThru: il checkbox Solo risultati cached dai Debrid esegue il controllo cache prima di mostrare i risultati; se disattivato, il servizio può avviare il download del magnet al primo playback e attende che sia pronto. L’URL pubblico dell’addon viene salvato automaticamente nella configurazione per il callback di playback. I token sono credenziali sensibili e finiscono nel link di configurazione Stremio: non condividere quel link.
Il catalogo non salva seeders, leechers, peers o stato Debrid. Conserva l'hash, il magnet/download locator, titolo, tipo, release kind, identificativi media, dimensione, qualità, indexer e date stabili. I pack sono rappresentati da release_kind e dalla tabella opzionale public.torrent_members per le associazioni esatte dei singoli film/episodi. Per un pack il padre mantiene la dimensione totale del payload, mentre il worker prova ad acquisire il metainfo .torrent dal download locator di Jackett e salva per ogni file video il percorso, il titolo e la dimensione propria; Stremio usa questi dati del componente. Un magnet da solo non contiene la lista file: senza .torrent il componente resta non arricchito e non viene inventata una dimensione.
EasyJack è opzionale a livello di sorgente: se l'utente lo disattiva dalla
configurazione Stremio, l'addon continua a usare tutte le fonti precedenti.
Se il Compose non viene usato o il catalogo non è disponibile, EasyJack
restituisce zero risultati senza bloccare gli altri provider. EasyJack è
intenzionalmente server-side: viene caricato da stremio_addon.js e non viene
incluso nel manifest o nel bundle del plugin Nuvio.
Il bootstrap Docker:
- crea automaticamente il database
easyjackcon utente dedicato e schema PostgreSQLpublic; - genera una password casuale persistente nel bind mount
/home/ubuntu/easystreams/data/secrets; - configura Jackett con l'URL interno di FlareSolverr e gli indexer pubblici richiesti, senza importare cookie o credenziali del test locale;
- configura Jackett con FlareSolverr in rete Docker; il proxy di Jackett è disabilitato per impostazione predefinita;
- salva le impostazioni automatiche nel bind mount
/home/ubuntu/easystreams/data/settings; - applica le migration prima dell'avvio dell'addon e del worker;
- esegue un backup custom compresso al giorno, conservando di default 14 giorni.
I 32 indexer predefiniti sono: 1337x, 52bt, aniRena, bangumi-moe,
BTdirectory, DaMagNet, E-Hentai, ExtraTorrent.st, EZTV, FileMood,
Internet Archive, kickasstorrents.to, kickasstorrents.ws, Knaben,
LimeTorrents, Magnetz, nekoBT, Nyaa.si, Shana Project, showRSS,
SubsPlease, The Pirate Bay, TheRARBG, Torrent Downloads,
TorrentByte, TorrentDownload, TorrentGalaxyClone, TorrentKitty,
TorrentProject2, Torrents.csv, UIndex e YTS.
La porta PostgreSQL viene esposta sul solo loopback dell'host come
127.0.0.1:5433. Per una connessione dalla rete della VPS, impostare prima
del Compose EASYJACK_POSTGRES_BIND=0.0.0.0 e limitare l'accesso con il
firewall. La password generata può essere letta solo dall'amministratore
Docker:
docker compose exec postgres cat /run/easyjack-secrets/postgres-passwordPer cambiare porta, bind, retention dei backup o intervallo Watchtower si
possono usare EASYJACK_POSTGRES_PORT, EASYJACK_POSTGRES_BIND,
EASYJACK_JACKETT_PORT, EASYJACK_JACKETT_BIND,
JACKETT_OMDB_API_KEY, FLARESOLVERR_LOG_LEVEL,
FLARESOLVERR_LOG_HTML, EASYJACK_FLARESOLVERR_URL,
EASYJACK_BACKUP_RETENTION_DAYS e
WATCHTOWER_INTERVAL_SECONDS. Jackett e
FlareSolverr vengono aggiornati automaticamente da Watchtower tramite label;
PostgreSQL resta sul major version 16 per evitare upgrade automatici
incompatibili.
JACKETT_OMDB_API_KEY è opzionale e viene applicata al campo OMDb di Jackett
dal servizio jackett-init. Dopo averla aggiunta al file .env, ricreare
jackett-init e Jackett:
docker compose up -d --force-recreate jackett-init jackettPer impostazione predefinita Jackett e FlareSolverr effettuano le richieste
direttamente dalla rete Docker, senza passare da Torque. Torque resta
disponibile per le richieste proxy del processo EasyStreams tramite
PROVIDER_PROXY.
Jackett viene pubblicato sull'host soltanto quando il Compose è avviato con la
porta configurata. Il default è 127.0.0.1:9117, quindi non è raggiungibile
da altri computer. Per consentire l'accesso dalla LAN, individuare prima
l'indirizzo privato della VPS e aggiungere nel file .env:
EASYJACK_JACKETT_BIND=192.168.1.50
EASYJACK_JACKETT_PORT=9117Sostituire 192.168.1.50 con l'indirizzo LAN reale della VPS, poi ricreare
solo il container Jackett:
docker compose up -d --force-recreate jackett
docker compose ps jackettDal computer nella stessa rete aprire quindi
http://192.168.1.50:9117. Se la VPS non ha un indirizzo LAN raggiungibile,
si può usare temporaneamente EASYJACK_JACKETT_BIND=0.0.0.0, ma soltanto con
una regola firewall limitata all'IP del computer autorizzato: Jackett non va
lasciato esposto pubblicamente.
Il Compose usa una rete Docker interna. Sono esposte sull'host soltanto la porta HTTP dell'addon e, opzionalmente, le porte PostgreSQL e Jackett; Jackett resta sul loopback per impostazione predefinita e FlareSolverr resta raggiungibile solo dai container del progetto.
Il container HTTP dell'addon avvia anche WARP per i provider che ne hanno
bisogno. Durante l'avvio entrypoint.sh cattura gli indirizzi dei servizi
Docker (postgres, jackett, flaresolverr e torque) in /etc/hosts, poi lascia
attivo il resolver WARP per le destinazioni pubbliche come Torrentio e TMDB.
Se una combinazione WARP/container lascia attivo il resolver Docker ma non
risolve i domini pubblici, applica automaticamente un fallback DNS pubblico.
Le porte di PostgreSQL, Jackett e FlareSolverr non vengono esposte per questo
meccanismo.
| Servizio | Funzione | Persistenza / comportamento |
|---|---|---|
postgres |
Database PostgreSQL dedicato a EasyJack (easyjack, schema public) |
/home/ubuntu/easystreams/data/postgres; password in /home/ubuntu/easystreams/data/secrets |
flaresolverr |
Risoluzione delle challenge usata da Jackett e fallback Torrentio | Nessuna porta pubblica; API interna su 8191; aggiornato da Watchtower |
torque-init |
Corregge proprietario e permessi della directory dati di Torque | Job una tantum; imposta /home/ubuntu/easystreams/data/torque a 0700 |
torque |
Proxy Torrentio/Torznab con stato persistente | /home/ubuntu/easystreams/data/torque; processo non-root |
jackett-init |
Inizializzazione idempotente di ServerConfig.json e degli indexer |
Job una tantum; termina con Exited (0) |
jackett |
Endpoint Torznab usato da EasyJack; UI/API pubblicabile opzionalmente sull'host | /home/ubuntu/easystreams/data/jackett; aggiornato da Watchtower |
easyjack-bootstrap |
Scrive le impostazioni locali e verifica l'API di Jackett | Job una tantum; termina con Exited (0) |
easystreams |
Processo HTTP dell'addon Stremio e fonte EasyJack | /home/ubuntu/easystreams/data/settings; porta host 7000 |
easyjack-worker |
Unico worker persistente per le ricerche Jackett e lo scraping recente | Lock advisory PostgreSQL contro duplicati |
easyjack-backup |
Esegue pg_dump periodici |
/home/ubuntu/easystreams/data/backups; dump custom compressi |
watchtower |
Aggiorna le immagini marcate | Controllo giornaliero, cleanup delle immagini precedenti |
container_name è prefissato easystreams- per i servizi ausiliari; il
container HTTP principale si chiama semplicemente easystreams.
Il primo docker compose up -d --build segue questa sequenza:
- PostgreSQL crea il database
easyjack, l'utente dedicato e una password casuale persistente, poi attende il proprio healthcheck. torque-initprepara la directory persistente di Torque con proprietario65532e permessi0700; Torque parte dopo il completamento del job.- FlareSolverr viene avviato internamente e deve rispondere su
/health. jackett-initprepara Jackett e collega FlareSolverr. Se trova un seed nella directorydocker/jackett-seede il volume è vuoto, importa il profilo completo; in assenza di seed usa soltanto il fallback degli indexer pubblici predefiniti. Un volume già popolato non viene sovrascritto.- Jackett viene avviato e attende il proprio healthcheck HTTP.
easyjack-bootstraplegge la API key presente nelServerConfig.jsondi Jackett, crea il file locale condivisoeasyjack-settings.jsone verifica gli indexer tramite l'API Torznab. Quando è stato importato un seed, conserva gli indexer del profilo senza applicare il fallback hardcoded.- Addon HTTP e worker partono dopo il completamento del bootstrap. Il database
contiene già le migration applicate in
public.schema_migrations; le tabelle applicative sonopublic.torrents,public.torrent_membersepublic.jobs.
Se il container del worker o dell'addon viene riavviato, i dati persistenti restano nei volumi e le procedure idempotenti non duplicano il catalogo.
Quando EasyJack è selezionato e arriva una ricerca:
- L'addon legge subito PostgreSQL e interroga in parallelo Torrentio.
- I risultati Torrentio validi vengono deduplicati per info hash, proiettati secondo il flag italiano e restituiti insieme ai record locali già disponibili.
- Anche se il database contiene già risultati, la richiesta accoda comunque
un job
searchdi aggiornamento in background. Il cooldown predefinito è 60 secondi per la stessa chiave di ricerca, così richieste simultanee non generano una raffica duplicata di query. - Il worker chiede a Jackett l'elenco degli indexer configurati e lancia una
sola ricerca logica per titolo, in parallelo sugli indexer attivi. Ogni
chiamata usa l'endpoint Torznab diretto del relativo indexer con
t=search,q=<titolo>,limit=0,extended=1ecache=false. Non vengono aggiunti token lingua, stagione o episodio: pack, episodi e tutte le lingue restano recuperabili e vengono filtrati localmente dopo il parsing. - Se Stremio non fornisce un titolo ma solo un identificativo, EasyJack legge
una volta le capability
t=capsdel singolo indexer e usat=movieper un film oppuret=tvsearchper serie/anime soltanto quando la modalità e un parametro ID compatibile (imdbid,tmdbidotvdbid) sono dichiarati. In quel caso invia una sola ricerca ID per indexer, con stagione, episodio, anno e categoria solo se supportati; altrimenti salta quell'indexer senza fare una ricerca vuota potenzialmente non correlata. Le capability restano in cache per 6 ore (EASYJACK_JACKETT_CAPABILITIES_CACHE_MS), quindi questo controllo non aggiunge richieste al normale percorso per titolo. - Quando una risposta Torznab dichiara un totale superiore ai risultati già ricevuti, EasyJack segue automaticamente gli offset fino al totale, a una pagina vuota, a una pagina ripetuta o a un errore dell'indexer. Se il totale non è dichiarato, con una ricerca illimitata continua comunque fino a pagina vuota o ripetuta: non esiste un numero massimo di pagine imposto da EasyJack. Gli errori di un indexer non cancellano i risultati degli altri e vengono esposti come stato parziale.
limit=0elimina il tetto locale di EasyJack e l'uso degli indexer diretti evita il limite globale dell'aggregatoreall. Non può però rendere infinita una definizione Cardigann che espone solo percorsi fissi, né inventare pagine quando il sito upstream è bloccato o non implementa offset. Per EXT Torrents la definizione Jackett espone le 10 pagine pubblicate dal sito: EasyJack non esegue più un crawler HTML esterno per acquisire i risultati.- Il worker arricchisce i risultati quando è disponibile un file
.torrent: ricava l'info hash verificato, i file video componenti, i titoli e le dimensioni dei singoli episodi. I valori inferiori a 1 MiB vengono trattati come non validi e non vengono mostrati come dimensioni reali.
Le categorie Torznab sono filtri, non ricerche aggiuntive: 2000 identifica i
film, 5000 le serie/TV e 5070 gli anime. Le sottocategorie descrivono
principalmente formato o qualità (2030 SD, 2040 HD, 2045 UHD, 2050
Blu-ray, 2080 WEB-DL per i film; equivalenti sotto 5000 per la TV). EasyJack
non invia queste categorie nella ricerca per titolo, perché un indexer può non
esporle o classificare male un pack. Le usa soltanto nella ricerca ID-only
quando compaiono nella risposta t=caps; per anime, se 5070 non è dichiarata,
non forza il filtro e mantiene la ricerca ID più ampia.
9. Il catalogo viene aggiornato con upsert su info hash. Un torrent senza
info hash verificato non viene persistito come nuova identità, evitando le
duplicazioni tra indexer e refresh.
Il flag solo torrent italiani è quindi una proiezione in lettura. Cerca
marcatori come IT, ITA, Italian e titoli chiaramente italiani, controlla
anche i componenti di serie e pack e non considera SUB-ITA come audio
italiano. Disattivando il flag vengono restituiti tutti i risultati presenti.
La coda è nella tabella public.jobs e contiene due tipi di lavoro:
search: aggiornamento Jackett accodato dalle richieste Stremio. È deduplicato per identità e titolo normalizzato, indipendentemente da episodio, stagione o lingua, perché una ricerca titolo completa riempie il catalogo per tutte le proiezioni successive. Usacache=falseverso Jackett, così un risultato vuoto precedente non blocca l'arrivo di torrent nuovi.recent: scraping incrementale periodico. Parte una volta subito all'avvio del worker e poi di default ogni ora. Esegue una ricerca recente per film e una per serie sugli indexer configurati, con massimo 100 risultati per tipo e una finestra di 90 minuti. È un'importazione incrementale distinta dalla ricerca titolo illimitata; la sovrapposizione di 90 minuti copre ritardi e sovrapposizioni tra due esecuzioni consecutive.
Il job recent non applica titoli o ID Stremio: importa torrent pubblicati di
recente e li associa solo quando i metadati disponibili lo consentono. Anche
questi risultati passano da arricchimento, verifica dell'info hash e upsert.
Il Compose avvia un solo processo easyjack-worker. Il worker può processare
più job asincroni nello stesso processo, ma il lock advisory PostgreSQL fa
terminare una seconda istanza che tentasse di lavorare sullo stesso catalogo.
I valori predefiniti sono:
- fino a 8 job applicativi contemporaneamente (
EASYJACK_WORKER_CONCURRENCY); - fino a 4 chiamate dirette agli indexer Jackett concorrenti
(
EASYJACK_JACKETT_CONCURRENCY); la concorrenza limita il fan-out simultaneo, non il numero di pagine percorse per una ricerca; - timeout di 90 secondi per singola richiesta upstream
(
EASYJACK_JACKETT_TIMEOUT_MS); le ricerche manuali del pannello sono job asincroni e quindi non restano legate al timeout HTTP del proxy; - i nomi legacy
EASYJACK_JACKETT_VARIANT_*restano accettati solo per compatibilità dei vecchi payload, ma non riattivano ricerche multiple; - lease di 5 minuti per un job in esecuzione;
- massimo 4 tentativi per job, con backoff progressivo;
- pulizia oraria dei job conclusi o falliti più vecchi di 14 giorni.
La pulizia riguarda soltanto la coda public.jobs, non elimina torrent dal
catalogo. Un job fallito viene riprovato; se supera il numero massimo di
tentativi resta failed con l'ultimo errore in last_error. Durante le
ricerche lunghe il worker rinnova periodicamente il lease del job, evitando che
un'altra iterazione lo consideri scaduto mentre Jackett sta ancora rispondendo.
Per osservare il worker e la coda:
docker compose logs -f easyjack-worker
docker compose exec postgres psql -U easyjack -d easyjack -c \
"SELECT job_type, status, count(*) FROM public.jobs GROUP BY job_type, status ORDER BY job_type, status;"/home/ubuntu/easystreams/data/postgres dati PostgreSQL e catalogo torrent
/home/ubuntu/easystreams/data/secrets password PostgreSQL generata dal bootstrap
/home/ubuntu/easystreams/data/settings configurazione locale condivisa da addon e worker
/home/ubuntu/easystreams/data/jackett ServerConfig.json e configurazioni degli indexer
/home/ubuntu/easystreams/data/backups file easyjack-YYYYMMDDTHHMMSSZ.dump
/home/ubuntu/easystreams/data/torque stato persistente di Torque
I bind mount sono configurati nel Compose con Source Path sotto
/home/ubuntu/easystreams/data/, quindi i dati sono visibili direttamente
sull'host e non dentro i named volume Docker. Per vedere le dimensioni:
sudo du -sh /home/ubuntu/easystreams/data/*
sudo ls -lh /home/ubuntu/easystreams/data/backupsPrima del primo avvio con il Compose a bind mount, ferma il progetto senza
usare down -v e copia i dati dai named volume esistenti. Lo script interrompe
la procedura se trova container attivi, destinazioni già popolate o più volumi
possibili, e non elimina mai i named volume originali:
docker compose down
bash ./docker/migrate-named-volumes.sh --project-name NOME_COMPOSE
sudo chown -R 65532:65532 /home/ubuntu/easystreams/data/torque
sudo chmod 0700 /home/ubuntu/easystreams/data/torque
docker compose up -d --buildSu Coolify, NOME_COMPOSE è il project name usato nel deploy, per esempio
mnjbxijdgmytm1mv3hueyxtk. Se il progetto non viene gestito dalla directory
locale, eseguire lo script da una copia del repository con lo stesso Compose e
indicare comunque il project name del deploy.
easyjack-backup usa pg_dump --format=custom --no-owner --no-acl e crea un
dump atomico ogni 24 ore. Prima scrive un file temporaneo, poi lo rinomina
solo quando pg_dump termina correttamente. Il default conserva 14 giorni e
scarta i dump più vecchi; il catalogo PostgreSQL non viene mai cancellato dal
job di backup.
Impostazioni opzionali:
EASYJACK_BACKUP_INTERVAL_SECONDS=86400
EASYJACK_BACKUP_RETENTION_DAYS=14Per modificare questi valori senza cambiare il Compose, inserirli in un file
.env nella directory del progetto prima di ricreare il servizio:
cat > .env <<'EOF'
EASYJACK_BACKUP_INTERVAL_SECONDS=43200
EASYJACK_BACKUP_RETENTION_DAYS=30
EOF
docker compose up -d --build easyjack-backupUn bind mount locale non è un backup off-site: la perdita del disco o la rimozione della directory elimina anche i dump. Copiare periodicamente almeno un dump fuori dalla VPS:
docker compose exec easyjack-backup sh -c 'ls -1t /backups/easyjack-*.dump | head -n 1'
docker compose cp easyjack-backup:/backups/NOME_DEL_DUMP.dump /var/backups/La lista interna del dump si può verificare prima di archiviarlo:
docker compose exec easyjack-backup sh -c \
'pg_restore --list "$(ls -1t /backups/easyjack-*.dump | head -n 1)" >/dev/null && echo backup-ok'Il ripristino deve essere eseguito con addon, worker e backup fermi, per
evitare scritture durante pg_restore. Il database PostgreSQL resta acceso:
docker compose cp easyjack-backup:/backups/NOME_DEL_DUMP.dump /tmp/easyjack-restore.dump
docker compose stop easystreams easyjack-worker easyjack-backup
docker compose exec -T postgres pg_restore \
-U easyjack -d easyjack --clean --if-exists --no-owner --no-acl \
< /tmp/easyjack-restore.dump
rm -f /tmp/easyjack-restore.dump
docker compose up -d easystreams easyjack-worker easyjack-backupDopo il ripristino controllare i log di addon e worker. Il backup
deve provenire dalla stessa installazione o da una versione compatibile; dopo
un ripristino da una versione precedente, applicare manualmente le migration
mancanti con npm run easyjack:migrate prima di avviare l'addon.
Watchtower viene avviato con --label-enable --cleanup --interval 86400 usando
nickfedor/watchtower, il fork mantenuto compatibile con le versioni recenti
della Docker API. Aggiorna soltanto i container marcati, cioè Jackett e FlareSolverr,
e rimuove le immagini precedenti dopo la sostituzione.
PostgreSQL resta vincolato al major 16 e l'immagine EasyStreams viene
aggiornata tramite git pull e docker compose build --pull, non
automaticamente da Watchtower.
# stato e dipendenze
docker compose ps
docker compose config
# log del percorso di avvio
docker compose logs --tail=200 postgres flaresolverr jackett \
jackett-init easyjack-bootstrap
# log applicativi
docker compose logs -f easystreams easyjack-worker
# stato database e migration
docker compose exec postgres pg_isready -U easyjack -d easyjack
docker compose exec postgres psql -U easyjack -d easyjack -c \
"SELECT version, applied_at FROM public.schema_migrations ORDER BY version;"Se il worker segnala che il database o Jackett non sono configurati, verificare
prima che easyjack-bootstrap sia terminato con codice 0. Se Jackett è sano ma
alcuni indexer falliscono, EasyJack conserva i risultati degli indexer che
rispondono e registra l'errore nei log: FlareSolverr non garantisce che ogni
sito sia sempre raggiungibile. Non esporre direttamente né la porta 9117 di
Jackett né la 8191 di FlareSolverr.
Powered by realbestia1