Seanime -- Setup
Anime auto-downloader and AniList tracker. Browse seasonal anime, create download rules, and auto-grab new episodes via qBittorrent. Runs on a dedicated Debian LXC (134) with PocketID SSO at the proxy level. Downloaded anime flows into Jellyfin via Shoko/Shokofin.
Links
- GitHub: https://github.com/5rahim/seanime
- Docker image: https://hub.docker.com/r/ju1js/seanime (community)
- Docs: https://seanime.app/docs
Infrastructure
| Host | LXC ID | Internal | External | CPU | RAM | Disk |
|---|---|---|---|---|---|---|
| Debian LXC | 134 | 192.168.1.134:43211 | https://seanime.eva-00.network | 2 cores | 2 GiB | 4 GiB |
How It Works
Seanime is an AniList-first anime manager. The workflow:
- AniList OAuth -- Log in with your AniList account. Seanime syncs your watching list and seasonal calendar.
- Browse seasonal anime -- See what's airing this season via the built-in calendar.
- Create auto-download rules -- Select shows, configure quality/release group filters. Rules can be batch-created.
- Auto-download -- Seanime polls torrent sources (Nyaa) every 20 min, matches against rules, and sends to qBittorrent. With
library.autoScan: trueSeanime's own UI also re-reads/downloads/seasonalso each show's page reflects the latest downloaded episode without a manual rescan. - Media flow -- Downloaded files land in
/dlbox/normal/seasonalon LXC 110 (seedbox). Shoko indexes them and emits a SignalR event, Shokofin creates VFS entries in response, and Jellyfin's RealtimeMonitor on the Seasonal library picks up the new symlink. End-to-end latency is seconds, not the next scheduled scan.
AniList watchlist --> Seanime auto-downloader --> qBit-normal (LXC 110, seasonal category)
--> /dlbox/normal/seasonal --> Shoko WatchForNewFiles indexes
--> Shoko SignalR --> Shokofin (SignalR_AutoConnectEnabled + RefreshEnabled) regenerates VFS
--> Jellyfin RealtimeMonitor --> "Seasonal" library
Required settings for the pipeline to be seamless:
| Layer | Setting | Value |
|---|---|---|
| Seanime | autoDownloader.downloadAutomatically |
true (else torrents pile up in the queue) |
| Seanime | library.autoScan |
true (else the show page lags behind disk) |
| Shoko | Import folder WatchForNewFiles |
true for /seasonal (default) |
| Shokofin | SignalR_AutoConnectEnabled |
true (else new files only show after a manual library scan) |
| Shokofin | SignalR_RefreshEnabled |
true |
| Shokofin | per-library IsFileEventsEnabled |
true (else SignalR file event doesn't regenerate VFS symlink) |
| Shokofin | per-library IsRefreshEventsEnabled |
true (else Shokofin regenerates the VFS but doesn't tell Jellyfin to scan it) |
| Jellyfin | Library EnableRealtimeMonitor |
true (default for libraries created via the playbook) |
See services/jellyfin/setup.md "Realtime anime pipeline" for the deeper explanation of each setting and services/jellyfin/runbook.md for step-by-step troubleshooting when episodes don't appear.
Authentication
Seanime has no native OIDC/SSO. External access is gated entirely at the proxy layer:
- Proxy level (PocketID): oauth2-proxy on LXC 119 gates external access. Only authenticated PocketID users can reach Seanime. Caddy uses
forward_authto check auth before proxying. - App level (password): Intentionally empty. The playbook keeps
password = ''inconfig.tomland the API stops requiring theX-Seanime-Tokenheader in that state. The Vaultsecret/seanimepath was removed. With no password set, Seanime's local-security middleware rejects API calls unless the Host/Origin is loopback, private IP, or inServer.AccessAllowlist— the playbook seeds the allowlist withseanime.eva-00.networkplus the seanime and oauth2-proxy LXC IPs (192.168.1.134, 192.168.1.119). - AniList OAuth: Required for the app to function. Users authenticate via AniList's OAuth flow in the browser.
The Caddy config passes /oauth2/* requests to the proxy and uses forward_auth for everything else.
qBittorrent Integration
Seanime connects to qbittorrent-normal on LXC 110 (the seedbox instance behind ProtonVPN/Gluetun).
Configure in the Seanime web UI under torrent client settings:
| Setting | Value |
|---|---|
| Client | qBittorrent |
| Host | 192.168.1.110 |
| Port | 8080 (qBit WebUI port inside Gluetun network) |
| Username | From Vault: secret/gluetun/protonvpn-normal |
| Password | From Vault: secret/gluetun/protonvpn-normal |
Downloads are saved to /data/normal/seasonal on LXC 110, which maps to /dlbox/normal/seasonal on LXC 134 (Seanime) and LXC 116 (Shoko) via bind mounts.
Observability
Logs
Container logs are collected via Alloy Docker discovery and shipped to Loki.
| Query | Purpose |
|---|---|
{container_name="seanime"} |
All container output |
{container_name="seanime"} \|= "error" |
Errors only |
{container_name="seanime"} \|= "download" |
Download activity |
{job="seanime"} |
All containers on this LXC |
Access: Grafana > Explore > Loki > Enter query
IaC
| Artifact | Path |
|---|---|
| Playbook | ansible/playbooks/seanime.yml |
| Workflow | .forgejo/workflows/seanime.yml |
| Docker Compose | services/seanime/docker-compose.yml |
| Caddy entry | services/caddy/Caddyfile > seanime.eva-00.network |
| OAuth2 proxy | services/external-proxies/docker-compose.yml > oauth2-proxy-seanime |
| Glance entry | services/glance/glance.yml > Media section + monitor |
The playbook manages the full lifecycle:
- Provisions LXC 134 on Proxmox (via create-lxc.yml)
- Installs Docker
- Deploys Seanime container
- Deploys Alloy for log collection
Secrets
| Vault Path | Key | Purpose |
|---|---|---|
secret/external-oauth2-proxies |
seanime_client_id |
PocketID OIDC client ID |
secret/external-oauth2-proxies |
seanime_client_secret |
PocketID OIDC client secret |
secret/external-oauth2-proxies |
seanime_cookie_secret |
oauth2-proxy cookie encryption (16/24/32 raw chars) |
Backup
- PBS: LXC 134 included in weekly non-critical backup job (Monday 4am)
- Data: Config stored at
/opt/seanime/configon the LXC rootfs (backed up by PBS) - Media: Downloaded anime lives on LXC 110's
/data/normal/seasonal-- backed up with the seedbox LXC, not this one - AniList: Watch history synced to AniList cloud, no local backup needed
First-Run Setup
After deployment, complete the initial setup in the web UI:
- Navigate to
https://seanime.eva-00.network - Authenticate via PocketID (proxy level — that's the only password)
- Log in with AniList OAuth (required)
- Set library path to
/data/seasonal - Configure qBittorrent connection (see table above)
- Browse seasonal anime and create auto-download rules