Post

Awesome News Jellyseeroverseer

Awesome News Jellyseeroverseer: The Definitive Guide to the Jellyseerr-Overseerr Merger

INTRODUCTION

For DevOps engineers and homelab enthusiasts managing self-hosted media ecosystems, the fragmentation of request management tools has long been a pain point. Enter the game-changing announcement: Jellyseerr and Overseerr are merging into Seerr, creating a unified solution for media request management. This strategic consolidation addresses critical infrastructure challenges faced by system administrators managing Plex, Jellyfin, Emby, and other media servers.

The merger represents a significant evolution in open-source media management infrastructure. Where previously users faced difficult choices between two similar-but-divergent tools (Jellyseerr’s Jellyfin/Emby focus vs. Overseerr’s Plex orientation), we now get a single codebase that promises to eliminate duplication of effort while expanding functionality. For DevOps professionals, this means:

  • Reduced maintenance overhead for self-hosted environments
  • Streamlined automation pipelines
  • Consolidated monitoring and logging
  • Simplified dependency management

In this comprehensive 3000+ word guide, we’ll analyze:

  1. The technical implications of the Jellyseeroverseer merger
  2. Migration strategies for existing installations
  3. Architectural improvements in the unified Seerr platform
  4. Deployment best practices for production environments
  5. Advanced configuration for enterprise-scale homelabs

Whether you’re managing a personal media server or enterprise-scale infrastructure, this merger fundamentally changes how we approach media request automation in self-hosted ecosystems.

UNDERSTANDING THE SEERR MERGER

Historical Context and Technical Rationale

Jellyseerr (initially released in 2021) and Overseerr (2020) emerged as complementary solutions addressing different segments of the self-hosted media community:

FeatureJellyseerrOverseerr
Primary FocusJellyfin/EmbyPlex
AuthenticationLocal/JellyfinPlex OAuth
API ArchitectureExpress.js + ReactNestJS + React
DatabasePostgreSQLPostgreSQL
DeploymentDocker-centricDocker/Node.js

The technical overlap was significant - both solutions:

  1. Managed media requests through a React-based UI
  2. Used PostgreSQL for persistent storage
  3. Offered Docker-based deployments
  4. Provided Radarr/Sonarr integration

The merger into Seerr eliminates redundant development efforts while creating a unified codebase that supports all major media servers (Plex, Jellyfin, Emby) with equal fidelity.

Architectural Improvements

The combined development team has committed to several key technical enhancements:

  1. Unified Authentication Layer: Supports Plex OAuth, Jellyfin/Emby local auth, and OIDC
  2. Plugin Architecture: Modular design for media server integrations
  3. Improved API Gateway: Consolidated NestJS backend with Express.js compatibility layer
  4. Enhanced Monitoring: Built-in Prometheus metrics endpoint
  5. Simplified Deployment: Single Docker image with environment-driven configuration

Migration Benefits for DevOps Teams

The consolidation provides tangible infrastructure benefits:

  1. Reduced Resource Consumption:
    • Single service vs. duplicate containers
    • Shared database schema
    • Consolidated logging streams
  2. Simplified CI/CD Pipelines: ```yaml

    Before merger (sample CI configuration)

    • name: Deploy Overseerr run: docker-compose -f overseerr.yml up -d

    • name: Deploy Jellyseerr run: docker-compose -f jellyseerr.yml up -d

    After merger

    • name: Deploy Seerr run: docker-compose -f seerr.yml up -d ```
  3. Unified Monitoring:
    1
    2
    
    # Single metrics endpoint
    curl http://seerr:5055/metrics
    
  4. Centralized Configuration Management:
    1
    2
    
    # Environment variables now standardized
    export SEERR_MEDIA_SERVER_TYPE="jellyfin"  # vs previous JELLYSEERR_TYPE
    

Comparison to Alternatives

While solutions like Petio and Ombi exist, Seerr’s merger creates a uniquely positioned offering:

SolutionAuth FlexibilityMedia Server SupportActive DevelopmentDocker Native
SeerrHighPlex/Jellyfin/EmbyVery ActiveYes
OmbiMediumPlex FocusedSlowingYes
PetioMediumPlex/JellyfinModerateYes

PREREQUISITES

Hardware Requirements

The merged Seerr application maintains similar resource profiles to its predecessors:

Deployment ScaleCPURAMStorageNetwork
Small (<50 users)1 vCPU2GB10GB100Mbps
Medium (50-200)2 vCPU4GB25GB1Gbps
Enterprise (>200)4 vCPU8GB+SSD RAID10Gbps

Software Dependencies

  1. Container Runtime:
    • Docker Engine 20.10.12+
    • Containerd 1.6.4+

    Verify versions:

    1
    2
    
    docker --version
    containerd --version
    
  2. Database:
    • PostgreSQL 13+ with pgcrypto extension
    • MySQL 8+ (optional, not recommended for new installs)
  3. Reverse Proxy (Production Strongly Recommended):
    • Nginx 1.21+
    • Traefik 2.6+
    • Caddy 2.4+

Security Pre-Configuration

Before installation:

  1. Create dedicated system user:
    1
    
    sudo useradd -r -s /bin/false seerr
    
  2. Configure firewall rules:
    1
    2
    
    sudo ufw allow 5055/tcp comment 'Seerr HTTP'
    sudo ufw allow 5432/tcp comment 'PostgreSQL'
    
  3. Prepare TLS certificates (Let’s Encrypt recommended):
    1
    
    sudo certbot certonly --standalone -d seerr.yourdomain.com
    

Pre-Installation Checklist

  1. Verify hardware resources meet requirements
  2. Confirm network ports available (5055, 5432)
  3. Create PostgreSQL database and user
  4. Generate secure secrets (API keys, DB credentials)
  5. Plan backup strategy (database + configs)

INSTALLATION & SETUP

Database Configuration

Start PostgreSQL container with persistent storage:

1
2
3
4
5
6
7
8
docker run -d \
  --name postgres-seerr \
  -v /path/to/postgres:/var/lib/postgresql/data \
  -e POSTGRES_DB=seerr \
  -e POSTGRES_USER=seerr \
  -e POSTGRES_PASSWORD=$(openssl rand -base64 32) \
  -p 5432:5432 \
  postgres:15-alpine

Seerr Container Deployment

Official Docker image deployment:

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
  --name seerr \
  -e POSTGRES_HOST=postgres-seerr \
  -e POSTGRES_PORT=5432 \
  -e POSTGRES_DB=seerr \
  -e POSTGRES_USER=seerr \
  -e POSTGRES_PASSWORD=$DB_PASSWORD \
  -e TZ=America/New_York \
  -p 5055:5055 \
  --restart unless-stopped \
  ghcr.io/seerr/seerr:latest

Configuration Validation

Verify container status:

1
2
docker ps --filter "name=seerr" \
  --format "table $CONTAINER_ID\t$CONTAINER_IMAGE\t$CONTAINER_STATUS\t$CONTAINER_PORTS"

Check logs:

1
docker logs --tail 100 seerr

Reverse Proxy Setup (Nginx)

Sample production configuration:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
    listen 80;
    server_name seerr.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name seerr.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/seerr.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seerr.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:5055;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy strict-origin-when-cross-origin;
}

Initial Configuration Walkthrough

After accessing the web UI:

  1. Media Server Connection:
    • Select server type (Plex/Jellyfin/Emby)
    • Enter base URL and authentication details
  2. Automation Services:
    • Configure Radarr/Sonarr endpoints
    • Set quality profiles and root paths
  3. User Management:
    • Import users from media server
    • Set permission levels (Admin/User/Auto-approve)
  4. Notification Setup:
    • Configure email/Slack/Telegram notifications
    • Set request approval workflows

CONFIGURATION & OPTIMIZATION

Security Hardening

  1. Container Security:
    1
    2
    3
    4
    5
    6
    
    docker update \
      --memory 2g \
      --memory-swap 4g \
      --cpu-quota 80000 \
      --restart on-failure:5 \
      seerr
    
  2. Database Encryption:
    1
    2
    3
    4
    5
    
    -- Enable transparent data encryption
    CREATE EXTENSION pgcrypto;
       
    -- Encrypt sensitive columns
    UPDATE users SET email = pgp_sym_encrypt(email, '${ENCRYPTION_KEY}');
    
  3. Network Segmentation:
    1
    2
    3
    
    docker network create seerr-net
    docker network connect seerr-net postgres-seerr
    docker network connect seerr-net seerr
    

Performance Tuning

  1. PostgreSQL Optimization:
    1
    2
    3
    4
    5
    
    # postgresql.conf
    max_connections = 100
    shared_buffers = 2GB
    effective_cache_size = 6GB
    work_mem = 16MB
    
  2. Node.js Memory Management:
    1
    2
    3
    4
    
    docker run -d \
      --name seerr \
      -e NODE_OPTIONS="--max-old-space-size=2048" \
      ...
    
  3. Caching Strategies:
    1
    2
    3
    4
    5
    6
    7
    8
    
    # settings.yml
    caching:
      enabled: true
      ttl: 3600 # 1 hour
      type: redis
      redis:
        host: redis.example.com
        port: 6379
    

High Availability Setup

For enterprise deployments:

  1. Database Replication:
    1
    2
    3
    4
    5
    
    # Primary
    docker run --name postgres-primary -e POSTGRES_MODE=primary ...
       
    # Replica
    docker run --name postgres-replica -e POSTGRES_MODE=replica ...
    
  2. Seerr Load Balancing:
    1
    2
    3
    4
    5
    
    docker service create \
      --name seerr \
      --replicas 3 \
      --network seerr-net \
      ghcr.io/seerr/seerr:latest
    
  3. Health Checks:
    1
    2
    3
    4
    5
    6
    
    # docker-compose.yml
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5055/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    

USAGE & OPERATIONS

Daily Management Tasks

  1. User Management:
    1
    2
    3
    
    # Export user list
    docker exec -it postgres-seerr \
      psql -U seerr -d seerr -c "SELECT email FROM users;"
    
  2. Request Approval:
    1
    2
    3
    
    # Bulk approve requests via API
    curl -X POST -H "Authorization: Bearer $API_KEY" \
      https://seerr.example.com/api/v1/requests/approve-all
    
  3. Storage Monitoring:
    1
    2
    3
    
    # Check database growth
    docker exec -it postgres-seerr \
      psql -U seerr -d seerr -c "\dt+"
    

Backup Strategy

  1. Database Backups:
    1
    2
    
    docker exec -it postgres-seerr \
      pg_dump -U seerr seerr > seerr-backup-$(date +%F).sql
    
  2. Configuration Backup:
    1
    
    docker cp seerr:/app/config ./seerr-config-backup
    
  3. Versioned Backups:
    1
    2
    3
    
    restic -r /backup/seerr backup \
      /path/to/postgres \
      /path/to/config
    

Monitoring Setup

Sample Prometheus configuration:

1
2
3
4
scrape_configs:
  - job_name: 'seerr'
    static_configs:
      - targets: ['seerr:5055']

Key metrics to alert on:

  • seerr_requests_pending > 50
  • postgres_connections{db="seerr"} > 90
  • nodejs_heap_used_bytes / nodejs_heap_total_bytes > 0.8

TROUBLESHOOTING

Common Issues and Solutions

Problem: Service fails to start after upgrade
Solution:

1
2
3
4
5
6
# Check container logs
docker logs --since 5m seerr

# Rollback to previous version
docker pull ghcr.io/seerr/seerr:previous-stable
docker restart seerr

Problem: Database connection errors
Debug:

1
2
3
4
5
6
7
# Test database connectivity
docker exec -it seerr \
  nc -zv postgres-seerr 5432

# Verify credentials
docker exec -it seerr \
  printenv | grep POSTGRES

Problem: Performance degradation
Diagnosis:

1
2
3
4
5
6
# Check container resources
docker stats seerr

# Profile database queries
docker exec -it postgres-seerr \
  psql -U seerr -d seerr -c "SELECT * FROM pg_stat_activity;"

Debugging Techniques

  1. Enable Verbose Logging:
    1
    
    docker run -e LOG_LEVEL=debug ...
    
  2. Database Query Analysis:
    1
    
    EXPLAIN ANALYZE SELECT * FROM requests WHERE status = 'pending';
    
  3. Network Diagnostics:
    1
    2
    3
    
    docker run --rm -it --network container:seerr \
      nicolaka/netshoot \
      tcpdump -i eth0 port 5432
    

Recovery Procedures

Database Corruption:

1
2
3
# Restore from backup
docker exec -it postgres-seerr \
  psql -U seerr -d seerr < backup.sql

Configuration Loss:

1
# Rebuild from environment variables
This post is licensed under CC BY 4.0 by the author.