Skip to Content
Seerr

Seerr

Unified request management for Plex, Jellyfin, and Emby

Overview

Seerr is the unified media request manager that merges Overseerr and Jellyseerr into a single application, maintained by the seerr-team. It provides native support for Plex, Jellyfin, and Emby media servers with an intuitive interface for users to discover and request movies and TV shows. Requests are automatically forwarded to Sonarr and Radarr for download. User quota management, approval workflows, and extensive notification support (Discord, Slack, email, Telegram, Pushover) make Seerr the definitive content request tool for shared media servers.

QuickBox Pro installs Seerr per user from the official seerr-team/seerr GitHub repository, building with Node.js 22.11.0 and pnpm 10.24.0. The installer creates isolated virtual environments, configures a per-user systemd service (seerr@username), and allocates a unique public port and internal port for each user so multiple users on the same server can run Seerr side by side without collisions.

Replaces Overseerr and Jellyseerr

Seerr is the canonical replacement for both Overseerr and Jellyseerr in QuickBox Pro. Running qb update overseerr -u username or qb update jellyseerr -u username automatically migrates to Seerr. New installations should use qb install seerr -u username directly.

Multi-user and group-gated

Seerr is a multi-user installable application — each user on the server can have their own Seerr instance with its own port, data directory, and optional subdomain. Whether a given non-admin user is permitted to install Seerr is controlled by their assigned user group. Your server administrator decides which user groups are allowed to install Seerr; administrators can install Seerr for any user regardless of group. If a user attempts to install Seerr and their group does not include it, the install will be blocked with a “package not allowed for user’s group” message.

Key features

Multi-Server Support

Native integration with Plex, Jellyfin, and Emby with automatic library scanning

Sonarr/Radarr Integration

Automatic request forwarding to media management tools with quality profile selection

User Management

Request quotas, approval workflows, and granular permissions per user

Rich Notifications

Discord, Slack, email, Telegram, and Pushover notifications for requests and approvals

Media Discovery

Browse popular, trending, and upcoming content from TMDb with rich metadata

Built-in Migration

Migrate from Overseerr or Jellyseerr with --migrate --from preserving settings, database, and ports

Per-User Service

systemd unit seerr@username with isolated Node.js venv and a unique randomized public port per user

Multi-User Installable

Multiple users on the same server can each run their own Seerr instance without port collisions

Reverse Proxy Ready

nginx fronts each user's public port and proxies to an internal localhost port with automatic path rewriting

TLS Domain Support

Optional per-user subdomain via the v4 dashboard <strong>SSL Control</strong> page (or qb install lecert --seerr -d domain -u username)

When to use it

Prerequisites

  • Need a unified media request app supporting Plex, Jellyfin, and Emby
  • Want to consolidate separate Overseerr and Jellyseerr installations
  • Require user quota management and approval workflows for content requests
  • Need automated notifications for request status updates across multiple channels

What you get

  • Install via qb install seerr -u username to clone seerr-team/seerr and build with pnpm
  • Each user is assigned a unique public port (randomized from the 5055 base) and a derived internal port for the Node.js process
  • Optional per-user subdomain via the v4 dashboard SSL Control page, or directly with qb install seerr -u username -d domain / qb install lecert --seerr -d domain -u username
  • Per-user systemd service seerr@username with Node.js 22.11.0 venv and auto-start on boot

Installation

Who can install Seerr

Administrators can install Seerr for any user at any time. Non-admin users can install Seerr themselves only if their assigned user group includes Seerr in its allowed software list. If you are a regular user and the install command returns “package not allowed for user’s group”, ask your server administrator to add Seerr to your group’s software permissions. Installs triggered from the v4 dashboard’s Package Management page enforce the same group-based access rules.

Install from the QuickBox CLI

qb install seerr -u username
Command
qb install seerr -u username
Description
Install Seerr for the user; accepts -d domain for nginx + SSL
Command
qb install seerr -u username -d domain
Description
Install with domain and TLS certificate support
Command
qb reinstall seerr -u username
Description
Reinstall while preserving database and settings
Command
qb update seerr -u username
Description
Update to the latest tagged release from seerr-team/seerr
Command
qb remove seerr -u username
Description
Stop service, clean nginx, and remove files
Command
qb install seerr -u username --migrate --from jellyseerr
Description
Install Seerr and migrate settings/database from Jellyseerr
Command
qb install seerr -u username --migrate --from overseerr
Description
Install Seerr and migrate settings/database from Overseerr
Command
qb help seerr
Description
Show CLI help for flags and examples

Publish Seerr on a per-user subdomain

Each user can optionally have Seerr published on its own subdomain (e.g. https://seerr.user.example.com). The recommended workflow is the SSL Control page in the v4 dashboard, which an administrator uses to issue a Let’s Encrypt certificate and generate a per-user nginx vhost in one step. Under the hood, SSL Control invokes:

qb install lecert --seerr -d domain -u username

The same command is available directly from the CLI, and you can also pass -d at install time:

qb install seerr -u username -d 'seerr.example.com'

The lecert workflow reads the user’s internal port from /opt/username/Seerr/env.conf, copies the subdomain.nginx.conf template, and writes /etc/nginx/sites-enabled/username.seerr.conf with the provided domain and certificate paths. When DNS credentials are configured (for example Cloudflare, Route53, or DigitalOcean), the installer detects them automatically and uses DNS challenge validation.

Migrate from Overseerr or Jellyseerr

Seerr includes a built-in migration utility that preserves your settings, database, port assignment, nginx configuration, and URL overrides:

# Migrate from Jellyseerr qb install seerr -u username --migrate --from jellyseerr # Migrate from Overseerr qb install seerr -u username --migrate --from overseerr

The migration process:

  1. Backs up the source application
  2. Stops the old service
  3. Copies settings.json and db.sqlite3 to the new Seerr install
  4. Preserves the original port assignment
  5. Creates new nginx configs from Seerr templates
  6. Migrates URL override entries
  7. Removes old database entries, service files, and install directories
  8. Reloads systemd and nginx
Automatic Migration on Update

Running qb update jellyseerr -u username or qb update overseerr -u username automatically triggers migration to Seerr. No manual intervention is needed.

Initial Configuration

First-Time Setup

On first access, Seerr prompts you to connect your media server:

  1. Open Seerr web interface at http://host:port
  2. Select Media Server Type: Choose Jellyfin, Emby, or Plex
  3. Authenticate: Sign in with your media server account
  4. Select Server: Pick your media server from the list
  5. Library Sync: Seerr automatically scans your media libraries
  6. Admin Assignment: First user to sign in becomes the administrator
QuickBox Dashboard Integration

Seerr is automatically integrated into your QuickBox dashboard. Find it in the Service Control panel with port and status information. Click the LAUNCH icon to open the web interface.

Connect Sonarr and Radarr

Configure media management integrations for automatic request handling:

  1. Navigate to Settings > Services in Seerr
  2. Add Radarr Server:
    • Default Server - Enable for primary Radarr instance
    • Server Name - Descriptive name (e.g., “QuickBox Radarr”)
    • Hostname or IP - localhost
    • Port - Your Radarr port (default 7878)
    • Use SSL - Uncheck (reverse proxy handles SSL)
    • API Key - Copy from Radarr > Settings > General > API Key
    • Quality Profile - Select default profile
    • Root Folder - Select default media path
    • Minimum Availability - Released, In Cinemas, or Announced
    • Click Test to verify connection, then Save
  3. Add Sonarr Server:
    • Follow same steps as Radarr
    • Port - Your Sonarr port (default 8989)
    • API Key - Copy from Sonarr > Settings > General > API Key
    • Quality Profile - Select default profile (e.g., “HD-1080p”)
    • Root Folder - Select TV shows path
    • Season Folder - Enable for organized library structure
    • Click Test, then Save

Configure Notifications

Set up notification channels for request updates:

  1. Go to Settings > Notifications
  2. Discord Integration (recommended):
    • Create Discord webhook in your server
    • Enter Webhook URL
    • Enable notification types: Media Requested, Media Approved, Media Available, Media Failed
    • Click Test to send test notification
    • Save Changes
  3. Email Notifications (optional):
    • Configure SMTP Settings (host, port, credentials)
    • Set From Email Address
    • Enable desired notification types
    • Save Changes

Access and authentication

URL / route

  • Default: https://host:<your-public-port> — nginx in /etc/nginx/apps-http/username.seerr.conf listens on the user’s randomized public port and proxies to the internal Node.js port on 127.0.0.1. The exact public port is unique per user and recorded in the QuickBox database.
  • Path-based access: some installations also expose Seerr at /seerr through /etc/nginx/software/username.seerr.conf alongside the per-user public port listener.
  • With a subdomain: https://domain/ served by /etc/nginx/sites-enabled/username.seerr.conf when installed with -d domain from lecert or via the v4 dashboard’s SSL Control page.
Dashboard Quick Access

Find Seerr in the v4 dashboard under Package Management and in the Service Control tile on your app landing page. The tile shows your assigned port and a direct LAUNCH link. You can also read your assigned port from the software_port column of the user_software table or directly from /opt/username/Seerr/env.conf (which stores the internal Node.js port — add or subtract 10000 to map between internal and public).

Security notes

  • The service runs as username via seerr@username.service and reads environment settings from /opt/username/Seerr/env.conf
  • Each user gets a unique public port and a unique internal port; the internal port is public_port + 10000
  • TLS is provisioned when lecert installs certificates into /etc/nginx/ssl/domain/ and binds them in the generated vhost
  • First user to sign in becomes the administrator with full permissions
  • Additional users inherit permissions based on their media server role
  • Webpush notifications are enabled by default during installation

Configuration and files

/opt/username
Seerr/# Application root
├── env.conf# Holds PORT=<internal> — the localhost port the Node.js process binds (public port + 10000)
├── config/# Persistent app data
│ ├── settings.json# Primary application settings
│ └── db/# SQLite database storage
│ │ └── db.sqlite3# Application database
└── dist/# Built application served by Node
lib/# Isolated runtime environments
├── nodejs/
│ └── Seerr/
│ │ └── .venv/# Node.js 22.11.0 environment with pnpm 10.24.0
└── python/
│ └── Seerr/
│ │ └── .venv/# Python 3.11 helper venv for nodeenv
/home/username/.config
Seerr/# Symlinks to /opt/username/Seerr/config/ contents
/etc/nginx
apps-http/
└── username.seerr.conf# Per-user public port listener; proxies to the internal Node.js port on 127.0.0.1
software/
└── username.seerr.conf# Optional path-based reverse proxy (exposes Seerr at /seerr)
sites-enabled/
└── username.seerr.conf# Domain vhost created by lecert (when -d domain is used)
/etc/systemd/system
seerr@username.service# Per-user systemd service unit

Common tasks

Service Management

Seerr runs as a per-user systemd service seerr@username:

# Start/stop/restart service systemctl start seerr@username systemctl stop seerr@username systemctl restart seerr@username # Check service status systemctl status seerr@username # View live logs journalctl -u seerr@username -f # Enable/disable auto-start on boot systemctl enable seerr@username systemctl disable seerr@username

Application Management

Use QuickBox CLI for application updates and maintenance:

# Update to latest release qb update seerr -u username # Reinstall (preserves database) qb reinstall seerr -u username # Remove application qb remove seerr -u username # View help qb help seerr
How `qb update seerr` protects your port assignment

Every Seerr update needs to know which public port your instance already owns so nginx, the database row, and the running service stay consistent. The updater resolves that port from multiple sources in priority order and refuses to proceed if none of them yield a valid value:

  1. /opt/username/Seerr/env.conf — the PORT= value written by the last successful install or update. This is the most authoritative source because it is exactly what the running seerr@username service binds to.
  2. QuickBox database (user_software.software_port for this user) — used when env.conf is missing or unreadable.
  3. /etc/nginx/apps-http/username.seerr.conf — the public port parsed from the listen directive. Fallback of last resort.

Each candidate is validated as a positive integer before it is accepted. If all three sources are missing, empty, or invalid, the update aborts cleanly — no files are rewritten, no services are restarted, and the install lock is released so you can retry after investigating. This guarantees qb update seerr will never silently re-assign your port or corrupt your deployment if the state on disk is partially damaged.

nginx Management

Reload nginx after configuration changes:

# Test configuration sudo nginx -t # Reload nginx sudo systemctl reload nginx

FAQ

Each user gets a unique public port randomized at install time (seeded from the default 5055) and a derived internal port equal to the public port plus 10000. The public port is recorded in the user_software.software_port database column and surfaced in the v4 dashboard's app tile. The internal port is written to /opt/username/Seerr/env.conf as PORT= — that's the port the Node.js process actually binds on localhost, and nginx proxies the public port to it. When migrating from Overseerr or Jellyseerr, the original port is preserved.
Yes. Seerr is multi-user installable — each user gets their own systemd unit (seerr@username), data directory (/opt/username/Seerr/), public port, internal port, and nginx configs. Whether a specific non-admin user is allowed to install Seerr depends on their assigned user group's software permissions; administrators can install Seerr for any user.
Your user account belongs to a group whose software allowlist does not include Seerr. Ask your server administrator to add Seerr to your group's software permissions (Group Management in the v4 dashboard), or to install Seerr for you. Administrators bypass this check entirely.
Systemd unit: /etc/systemd/system/seerr@username.service. Nginx public-port listener: /etc/nginx/apps-http/username.seerr.conf. Optional path-based proxy: /etc/nginx/software/username.seerr.conf. When installed with -d domain, the subdomain vhost lives at /etc/nginx/sites-enabled/username.seerr.conf.
QuickBox clones seerr-team/seerr, checks out the latest tagged release, installs Node.js 22.11.0 with pnpm 10.24.0 inside /opt/username/lib/nodejs/Seerr/.venv, runs pnpm install --frozen-lockfile, builds with pnpm build, and starts the application under the target user.
Seerr supports Jellyfin, Emby, and Plex, but you choose one media server type during initial setup. You can connect to multiple Sonarr and Radarr instances for content management. To switch media server types, reconfigure or reinstall.
Use the built-in migration: qb install seerr -u username --migrate --from overseerr or --from jellyseerr. This preserves your settings, database, port, nginx config, and URL overrides. Alternatively, running qb update jellyseerr or qb update overseerr automatically triggers the migration.
Seerr is the official merger of Jellyseerr and Overseerr into a single application maintained by seerr-team. It combines Jellyseerr's Jellyfin/Emby support with Overseerr's Plex support. Both Jellyseerr and Overseerr are deprecated in QuickBox Pro and will auto-migrate to Seerr on update.
The QuickBox installer automatically enables webpush notifications in settings.json to allow browser push notifications for request updates. You can disable this in Seerr settings if not needed.
The migration copies settings.json and db.sqlite3 from the old application, preserves the port assignment, creates new nginx configs from Seerr templates, and removes the old install. A backup of the source application is created before any changes are made.
The updater refuses to proceed if it cannot recover a valid public port from env.conf, the QuickBox database, or the existing nginx listener. This is an intentional safety guard — it prevents a corrupt or zero-valued port from being written into your nginx config, env.conf, and database row. The install lock is released automatically on abort, so you can retry after repairing the broken source. See the Troubleshooting section above for the exact files to check and how to recover.

Best practices

Do

  • Use qb install seerr -u username for new installations (add -d domain when needed)
  • Run qb update jellyseerr -u username or qb update overseerr -u username to auto-migrate existing installations to Seerr
  • Check service health with systemctl status seerr@username and tail logs with journalctl -u seerr@username -f
  • Reload nginx after adding or removing a domain: sudo systemctl reload nginx
  • Set up Discord or email notifications for request updates to keep users informed
  • Configure user quotas to prevent request spam (5-10 requests per week is a good starting point)
  • Enable approval workflows for non-admin users to moderate content requests
  • Regularly sync media server libraries to keep Seerr metadata updated
  • Take a manual backup before major changes: use the Backups panel on the v4 dashboard's <a href="/docs/dashboard/app-management">App Management</a> page, or run qb manage software -o backup -u username -s seerr. The install/reinstall/update-triggered copy in /home/username/.QuickBox/software/seerr/backup/ is a safety net, not a substitute for user-scheduled backups.

Don't

  • Avoid editing generated nginx files by hand -- rerun qb reinstall seerr -u username to refresh templates
  • Do not swap the PORT= value in env.conf directly — the internal port must stay in sync with the public port stored in the database and the nginx apps-http listener; use qb reinstall seerr -u username instead
  • Don't install both Seerr and Jellyseerr/Overseerr for the same user -- use migration instead
  • Don't grant admin access to all users -- use request quotas and approval workflows
  • Don't configure multiple default servers in Sonarr/Radarr settings -- causes request routing conflicts
  • Don't ignore failed notifications -- check logs and fix webhook/SMTP issues
  • Don't forget to configure root folders in Sonarr/Radarr -- requests will fail without valid paths

Troubleshooting

Install hangs waiting for settings.json

Timed out waiting for /opt/username/Seerr/config/settings.json after 60s

Symptom: qb install seerr -u username or qb update seerr -u username aborts with Timed out waiting for /opt/username/Seerr/config/settings.json after 60s. The install lock is released automatically — no database rows are written and nginx is left untouched.

What this means: Right after building the app, the installer starts seerr@username and waits up to 60 seconds for Seerr’s first launch to generate /opt/username/Seerr/config/settings.json. If the Node.js process crashes before that file is written (missing dependency, corrupted build, bad prior state in the config directory, or insufficient memory/disk to complete the first boot), the wait trips and the install aborts.

Checks (run in this order):

  1. Service state — look at why the first-boot attempt died:

    systemctl status seerr@username journalctl -u seerr@username -n 100 --no-pager

    Common signals: MODULE_NOT_FOUND, Cannot find module, EACCES, ENOSPC (disk full), or a Node-level stack trace.

  2. Installer log — the build step pipes its output here:

    tail -n 200 /opt/quickbox/logs/seerr.log

    Look at the final lines before the timeout. A failed pnpm install or pnpm build (network flake, locked pnpm cache, out-of-memory kill) will show up here and explains why the service could not start cleanly.

  3. Config directory — confirm the first-boot attempt did not leave a partial file behind:

    ls -la /opt/username/Seerr/config/

    A zero-byte settings.json, a leftover settings.json.tmp, or a pre-existing settings.json owned by root is the bad-state signal. The installer’s jq step writes settings.json.tmp then renames it over settings.json, so a stranded .tmp means the rename never happened.

  4. Node runtime — the installer pins Node 22.11.0 inside a per-user venv. Confirm that venv exists:

    /opt/username/lib/nodejs/Seerr/.venv/bin/node --version

    should print v22.11.0. If the venv path is missing, the dependency step failed earlier and the service could never start.

  5. Disk space and permissions — a full /opt partition or a wrong owner on /opt/username/Seerr will both surface as a service that exits before writing settings.json:

    df -h /opt ls -ld /opt/username/Seerr

    The install directory must be owned by username:username.

Resolution:

  • If the journal shows a module/build error, do a full clean reinstall:

    qb remove seerr -u username qb install seerr -u username

    This tears down the systemd unit, nginx configs, Node/Python venvs, and the install directory, then rebuilds everything from scratch with a fresh Node venv and a clean settings.json.

  • If the journal shows a disk, permission, or memory problem, fix the underlying cause first (free space, correct ownership, add swap for low-RAM servers), then reinstall as above.

  • If the failure happened during a qb update (including the auto-migration that runs when you update overseerr or jellyseerr), your original Seerr / source-app data is still on disk. A plain reinstall is safe because the installer will rebuild the config directory; if you want to preserve your existing settings.json and db.sqlite3, copy them out of /opt/username/Seerr/config/ before the remove step and drop them back in after the reinstall completes.

  • If every step above checks out clean and the install still trips the 60-second wait, collect systemctl status seerr@username, journalctl -u seerr@username -n 200 --no-pager, and the tail of /opt/quickbox/logs/seerr.log, and open a Discord support ticket  with those three pastes attached.

General install and update troubleshooting

The same five-step flow works for any Seerr install or update failure, not just the settings.json timeout:

  1. Service statesystemctl status seerr@username shows whether the unit exists, whether it is enabled, and the exit code of its last attempt to start.
  2. Journaljournalctl -u seerr@username -n 100 --no-pager surfaces the actual Node.js error that killed the process. Re-run with -f to watch a live restart.
  3. Installer logtail -n 200 /opt/quickbox/logs/seerr.log captures the output of every npm, pnpm, and git command the installer ran. Most “failed to install” symptoms trace back to a single red line here.
  4. Disk spacedf -h /opt and df -h /home. A full partition can silently break pnpm install (the Seerr node_modules tree is large) or prevent db.sqlite3 from being written on first boot.
  5. Ownershipls -ld /opt/username/Seerr /home/username/.config/Seerr. Both must be owned by username:username. If a prior run was interrupted mid-chown, the service will fail to read its own config.

Service will not start

Seerr service fails to start or crashes immediately

Checks:

  1. Check status: systemctl status seerr@username
  2. View logs: journalctl -u seerr@username -f
  3. Verify Node.js venv: /opt/username/lib/nodejs/Seerr/.venv/bin/node --version (should show v22.11.0)
  4. Check permissions: ls -la /opt/username/Seerr (should be owned by username:username)
  5. Verify the assigned internal port is free: ss -tuln | grep "$(grep -oP 'PORT=\K\d+' /opt/username/Seerr/env.conf)" (only seerr@username should be bound there)

Resolution: If Node environment is missing or corrupted, reinstall with qb reinstall seerr -u username to rebuild the virtual environment.

404 on the Seerr URL

404 on Seerr URL

Symptom: Accessing Seerr through the reverse proxy returns 404 Not Found.

Checks:

  1. Verify the apps-http nginx config exists: ls -la /etc/nginx/apps-http/username.seerr.conf
  2. Look up the user’s internal port: grep PORT /opt/username/Seerr/env.conf
  3. Confirm the nginx config’s proxy_pass target matches that internal port
  4. Test nginx config: sudo nginx -t
  5. Check service status: systemctl status seerr@username (should be active)
  6. Verify the Node.js process is listening on its internal port: ss -tuln | grep "$(grep -oP 'PORT=\K\d+' /opt/username/Seerr/env.conf)"

Resolution: Reload nginx with sudo systemctl reload nginx. If the internal or public port drifted (for example after a manual edit of env.conf), run qb reinstall seerr -u username to rebuild the nginx templates against the database-stored port. If a domain was installed, ensure /etc/nginx/sites-enabled/username.seerr.conf references the active certificate paths under /etc/nginx/ssl/domain.

Cannot connect to Sonarr or Radarr

Cannot connect to Sonarr/Radarr

Symptom: Seerr reports “Failed to connect to Radarr” or “Failed to connect to Sonarr”.

Checks:

  1. Verify services are running:
    systemctl status sonarr@username systemctl status radarr@username
  2. Test API connectivity:
    curl http://localhost:7878/api/v3/system/status?apikey=YOUR_RADARR_API_KEY curl http://localhost:8989/api/v3/system/status?apikey=YOUR_SONARR_API_KEY
  3. Verify API keys match in Seerr settings
  4. Check hostname configuration: use localhost (not 127.0.0.1 or server IP)

Resolution: Update Seerr connection settings with correct API keys and ensure “Default Server” is checked for your primary Sonarr/Radarr instance.

Requests not sending to Sonarr or Radarr

Requests not sending to Sonarr/Radarr

Symptom: User requests are approved but not appearing in Sonarr/Radarr.

Checks:

  1. View Seerr logs: journalctl -u seerr@username -f | grep -i error
  2. Verify “Default Server” is configured: Settings > Services > Radarr/Sonarr > Check ‘Default Server’
  3. Ensure quality profiles exist and are selected
  4. Verify root folders are configured and paths are valid

Resolution: Test manual request from Seerr UI and watch logs. Ensure quality profile and root folder are properly configured.

qb update seerr aborted with a port resolution error

`qb update seerr` aborted — could not determine port

Symptom: Running qb update seerr -u username stops early with a message that the public port could not be resolved. The install lock is released automatically — you can retry once the underlying state is fixed.

What this means: The updater intentionally refuses to continue if it cannot recover a valid public port from any of its trusted sources. This is a safety guard that prevents a partially-corrupt deployment from being rewritten with an invalid port (for example, listen 0 ssl; in nginx or a 0 in the database). No files are touched when this guard fires.

Checks:

  1. Check env.conf: cat /opt/username/Seerr/env.conf — expect a line like PORT=15055. If the file is missing, empty, or the value is 0, the first source has failed.
  2. Check the database port: inspect user_software.software_port for this user in the QuickBox database. A value of 0, NULL, or a missing row means the second source has failed.
  3. Check the nginx listener: grep -E '^\s*listen' /etc/nginx/apps-http/username.seerr.conf — expect a real port followed by ssl. A listen 0 ssl; line means the third fallback is also corrupt.
  4. Look for a prior failed install/update that may have left partial state behind.

Resolution:

  • If at least one source has a valid (non-zero) port, repair the others to match and retry qb update seerr -u username.
  • If all three sources are corrupt, the safest path is to back up /opt/username/Seerr/config/ (your settings and database) and run qb reinstall seerr -u username. The reinstall will allocate a fresh port and rebuild nginx, systemd, and env.conf from a clean state while preserving your configuration directory. Open a Discord support ticket  if you would like a staff member to walk through recovery with you.

Recover from an update wipe

Fixed in QuickBox Pro 3.2.2.4178 — safe from here on

The update-wipe scenario below only affects servers running a QuickBox Pro CLI release older than 3.2.2.4178. If your server is on 3.2.2.4178 or newer, you do not need to worry about this failure mode — every qb install seerr and qb update seerr now runs the following safeguards automatically:

  • Backup first: your current settings.json and db.sqlite3 are copied to ~/.QuickBox/software/seerr/backup/ before anything on the live install is touched.
  • Build in staging: the new Seerr version is built in a separate staging directory. Your live install keeps running the whole time.
  • Atomic swap: the live install is only replaced after the staging build finishes cleanly.
  • Auto-rollback: if the service fails to start on the new version, the entire install is rolled back to the previous state. You never end up with a missing /opt/username/Seerr directory.

Check your CLI version with qb -v. If it is 3.2.2.4178 or higher, the recovery steps below are historical — keep reading only if you need to recover from a failure that happened on an earlier build.

`cd: /opt/username/Seerr: No such file or directory` after a failed update

Symptom: A failed qb update seerr -u username on a CLI build older than 3.2.2.4178 has left your install directory gone. Subsequent commands that try to enter /opt/username/Seerr fail with cd: /opt/username/Seerr: No such file or directory, and the Seerr URL returns 502 or connection refused. A fresh install attempt may also surface Timed out waiting for /opt/username/Seerr/config/settings.json after 60s if the rebuild can’t finish cleanly.

What this means: Older versions of the update path removed /opt/username/Seerr before cloning the new release. If the clone, build, or first-boot failed mid-flight, the directory was never restored. From QuickBox Pro 3.2.2.4178 onward, the update is fully transactional (see the green callout above), so new runs cannot reach this state — but installs that were already bitten on earlier builds need to be recovered from the QuickBox backup.

What is in /home/username/.QuickBox/software/seerr/backup/: QuickBox automatically writes settings.json and db.sqlite3 into this directory at specific moments. The directory lives in the user’s home — it is outside /opt/username/Seerr/ and is not touched by an update wipe — but what it contains depends on which of the following triggers ran most recently:

  • After qb install seerr -u username — the copy is taken just after Seerr’s first boot writes a default settings.json. If you had not yet opened Seerr in your browser and completed first-time setup, this snapshot is a blank-default settings.json and an essentially empty db.sqlite3. It is a safety net, not your configured state.
  • After qb reinstall seerr -u username — the copy captures the post-reinstall state, not your pre-reinstall state. Useful only if you took a manual backup before reinstalling.
  • After qb update seerr -u username on CLI 3.2.2.4178 or newer — the copy is taken before the new version touches the live install, so it is a true pre-update snapshot of your running configuration and request database. This is the case that matters for recovery.

Fresh installs — the backup folder is not your data: if you hit this error on a brand-new install that never reached first-time setup, the backup/ folder contains default settings only. There is nothing meaningful to restore. Skip the restore steps below and run a clean install (qb install seerr -u username). For guaranteed point-in-time snapshots going forward, take a manual backup from the dashboard or CLI before major changes — see Take a manual backup below.

Verify your backup exists and contains real data before doing anything else:

ls -la /home/username/.QuickBox/software/seerr/backup/ stat -c '%s %y %n' /home/username/.QuickBox/software/seerr/backup/settings.json stat -c '%s %y %n' /home/username/.QuickBox/software/seerr/backup/db.sqlite3

Expect to see settings.json and db.sqlite3 with a modification time and byte size that match a moment when your install was actually working. A db.sqlite3 that is only a few KB typically indicates first-boot defaults rather than real request history.

Recovery steps:

  1. Rebuild the install directory from scratch:

    qb install seerr -u username

    This reclones seerr-team/seerr, rebuilds the Node.js venv, allocates a fresh port, writes a new env.conf, regenerates the nginx config, and starts the service with a clean first-boot settings.json. Wait for the installer to finish and confirm the service is up:

    systemctl status seerr@username
  2. Stop the service so the restore is atomic:

    systemctl stop seerr@username
  3. Restore settings.json and db.sqlite3 from the backup on top of the fresh install:

    cp -p /home/username/.QuickBox/software/seerr/backup/settings.json /opt/username/Seerr/config/settings.json cp -p /home/username/.QuickBox/software/seerr/backup/db.sqlite3 /opt/username/Seerr/config/db/db.sqlite3 chown -R username:username /opt/username/Seerr/config/
  4. Start the service and confirm it’s healthy:

    systemctl start seerr@username systemctl status seerr@username journalctl -u seerr@username -n 50 --no-pager
  5. Open Seerr in your browser — your previous settings, media server connection, Sonarr/Radarr links, user list, and request history should all be present.

If you never took a manual backup and the automatic backup is only defaults, a clean reinstall is the only path forward. This is unavoidable on CLI releases older than 3.2.2.4178 because those builds never captured a pre-update snapshot of your configured state — the backup/ folder on those servers only holds what was copied at install or reinstall time, which for most users is a blank-default settings.json and an empty db.sqlite3. Concretely, if any of the following is true:

  • The backup/ directory is empty or the .QuickBox directory was manually deleted.
  • backup/settings.json exists but was written by a fresh qb install seerr before you configured Seerr (default settings only — not your data).
  • backup/db.sqlite3 exists but is only a few kilobytes in size (empty database, not your request history).

Then your configuration and request database are unrecoverable from this folder. The only path forward is a clean install (qb install seerr -u username) followed by reconfiguring from scratch: reconnect your media server, re-add Sonarr and Radarr, re-invite your users, and rebuild request history as those users place new requests. Open a Discord support ticket  with the output of ls -la /home/username/.QuickBox/software/seerr/ attached if you want a staff member to confirm there is no alternate backup source before you rebuild.

To avoid this class of loss in the future, take a manual backup from App Management in the v4 dashboard, or run qb manage software -o backup -u username -s seerr, before any major change. See Take a manual backup below for the full flow. From CLI 3.2.2.4178 onward, updates also capture a pre-update snapshot automatically — but that does not replace a user-scheduled backup cadence.

If step 1 itself fails with the 60-second timeout: see Install hangs waiting for settings.json above to diagnose the first-boot failure, then return to step 2 once the service is running.

Take a manual backup

For guaranteed point-in-time snapshots, take a manual backup

The automatic copy written to /home/username/.QuickBox/software/seerr/backup/ only runs at install, reinstall, and (on CLI 3.2.2.4178+) at the start of an update. If you want a snapshot of your Seerr configuration and request database on demand — before editing settings, before a reinstall, or just on a schedule — take a manual backup.

From the v4 dashboard: open App Management, expand the Seerr row, and use the Backups panel to create a configuration backup, nginx backup, or full backup. The same panel lets you restore from or delete any previous backup. See App Management for the full dashboard flow.

From the CLI: run qb manage software with the backup operation:

# Back up Seerr's configuration files (settings.json, db.sqlite3) qb manage software -o backup -u username -s seerr # Back up the entire application (install directory + config) as timestamped tarballs qb manage software -o backup -o app -u username -s seerr

Both variants write to /home/username/.QuickBox/software/seerr/backup/ with a timestamped filename, so they do not overwrite the install/reinstall/update-triggered copy. Use qb manage software -o restore -u username -s seerr to restore the most recent configuration backup, or -o rollback -o app to restore a full-application backup.

Media Servers

Media Management

Resources


Join the Community

Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.

Dedicated Support
Feature Previews
Community Configs
Active Discussions
Join Discord Server
Last updated on