Skip to content

Operations

buzzqw edited this page Oct 30, 2026 · 1 revision

Operations

Backup and restore, maintenance, statistics, logs and security.

Backup and restore

The indexarr backup contains the SQLite database, not the downloaded files. Backups are kept in backups/ next to the database (data/backups/ with the user service): automatic ones as indexarr-<timestamp>.db, the copies taken before a restore as pre-restore-*.db and those of scripts/upgrade.sh as pre-upgrade-*.db.

The vault key is not in the database: it must be kept separately (INDEXARR_MASTER_KEY, vault_key_path or the user file ~/.config/indexarr/master.key). Without that key the stored secrets cannot be opened. Details in Vault.

From Settings → Backup you can create a backup, download it, delete it and restore it. Restore loads a validated .db, copies it to indexarr.db.restore, the service restarts and the file is applied before opening the database. The current database is copied to backups/pre-restore-*.db. The systemd unit uses Restart=always to complete the restart; without systemd, restart manually.

Maintenance and diagnostics

  • Database report: sizes, free pages, WAL/SHM, row counts and release breakdown.
  • Integrity check, quick check, foreign key check.
  • Vacuum, optimize/checkpoint, analyze, rebuild indexes.
  • Deduplication by infohash, .torrent cleanup, retention, cleanup of releases without links or hidden, purge per indexer.
  • Automatic backups with rotation and restore from the UI.
  • Source health with errors, failures and Test/Run buttons.
  • Clear source errors, reset API usage, recount source items.
  • Prometheus metrics on GET /metrics (indexarr_releases, indexarr_indexers, indexarr_runs_24h, indexarr_errors_24h, indexarr_blocklist_rules, indexarr_db_bytes, uptime…), without authentication like /healthz.
  • Runs → detail: counts, duration and full error of a single run.
  • Cancel in the row of a running source cancels the run.

Statistics and log

Statistics has six tabs: Requests (incoming requests with outcome and timings), Overview (per app and per indexer), Downloads (grabs served per source, with a source filter and a chip that copies the magnet, eD2k link or .torrent link of the release), Runs, New releases and Network (per-host counters). Logs holds only the system log: the last 2000 messages of the process, most recent first. Old links (/logs?tab=requests, /activity?tab=logs, …) redirect to the new place. The system log offers:

  • filter by level (debug, info, warning, error), by origin (indexarr, indexer/Torznab, RSS/HTML, notifications) and search in the message and in the attributes;
  • Problems button with the count of warnings and errors matching the current filters;
  • row limit (100/300/1000) and auto-refresh every 10 seconds;
  • Download .txt and Clear of the buffer;
  • the outcomes of Test all and Test FlareSolverr also arrive here.

Each source error reports source, kind, host and the original message. Internal errors use component=indexarr, indexer errors component=indexer and feed errors component=rss. The same lines go to stdout (journal with systemd) and to the rotating log file logs/indexarr.log next to indexarr.json: 5 files of at most 10 MB by default.

tail -f data/logs/indexarr.log          # rotating file
journalctl --user -u indexarr -f        # systemd journal

Verbosity is changed from Logs → Runtime verbosity (debug, info, warn, error): it is applied immediately, saved in the database and kept across restarts. log_level in indexarr.json is only the initial value. API keys, passwords and tokens are redacted in the buffer shown by the UI.

Security

  • The Torznab API key is mandatory for search and download. t=caps also answers without a key, like other Torznab clients. Additional keys can be revoked individually and the rate limit is per key.
  • The UI accepts HTTP Basic if you set a username and password in Settings. Without credentials it is open to anyone who can reach the port: use it on a trusted network or put it behind a reverse proxy with TLS.
  • GET /healthz, GET /metrics and /static/* do not go through Basic auth: protect the network or the reverse proxy. /metrics does not contain release data, only counts.
  • All POST forms require a CSRF token tied to the browser; uploading a multipart backup uses the same token in the query, without reading the file before the check.
  • Passwords are stored as pbkdf2-sha256$iterations$salt$hash.
  • Indexer, proxy, app, client and notification secrets are in the vault, not in clear text in the database.
  • The server does not execute code uploaded by the indexers: XML and JSON are only data.
  • FlareSolverr receives the full indexer URL, including the API key, and a single resolution can take up to ~60 seconds.

Part of the indexarr documentation.

Clone this wiki locally