Installation Guide
October 13, 2025 ยท View on GitHub
This guide provides detailed installation instructions for ListSync, covering both Docker and manual installation methods.
๐ Table of Contents
- Prerequisites
- Docker Installation (Recommended)
- Manual Installation
- Post-Installation Setup
- Verification
- Updating
- Troubleshooting
๐ง Prerequisites
For Docker Installation
- Docker: Version 20.10 or higher
- Docker Compose: Version 2.0 or higher
- System Requirements:
- 2GB RAM minimum (4GB recommended)
- 1GB free disk space
- Internet connection for fetching lists
For Manual Installation
- Python: Version 3.8 or higher
- Node.js: Version 18 or higher (for web interface)
- System Requirements:
- 4GB RAM minimum
- 2GB free disk space
- Chrome/Chromium browser (for Selenium)
- Internet connection
Common Requirements
- Overseerr Instance: Running and accessible
- Network Access: To IMDb, Trakt, Letterboxd, MDBList, and other list providers
๐ณ Docker Installation (Recommended)
Docker installation provides the easiest setup with all dependencies pre-configured.
Quick Start
-
Clone the repository:
git clone https://github.com/Woahai321/list-sync.git cd list-sync -
Create environment file:
cp env.example .env -
Configure your settings:
nano .env # or use your preferred editorMinimum required configuration:
OVERSEERR_URL=https://your-overseerr-url.com OVERSEERR_API_KEY=your_api_key_here IMDB_LISTS=top # Start with just one list -
Deploy:
docker-compose up -d -
Access the application:
- Web Dashboard: http://localhost:3222
- API Backend: http://localhost:4222
Deployment Decision Guide
flowchart TD
Start[Choose Deployment] --> UseCase{What's your goal?}
UseCase -->|Production use| Prod[Production Setup]
UseCase -->|Development| Dev[Development Setup]
UseCase -->|Just testing| Test[Quick Test]
Prod --> NeedDashboard{Need web<br/>dashboard?}
NeedDashboard -->|Yes| FullDocker[Full Stack<br/>docker-compose.yml<br/>โ Dashboard :3222<br/>โ API :4222<br/>โ Core Sync]
NeedDashboard -->|No| CoreDocker[Core Only<br/>docker-compose.core.yml<br/>โ API :4222<br/>โ Core Sync]
Dev --> LocalOrDocker{Docker or<br/>native?}
LocalOrDocker -->|Docker| DevDocker[Local Build<br/>docker-compose.local.yml<br/>Build from source]
LocalOrDocker -->|Native| ManualSetup[Manual Installation<br/>Python + Node.js<br/>Full control]
Test --> QuickDocker[Core Deployment<br/>Fastest setup<br/>API access only]
FullDocker --> DeployFull[docker-compose up -d]
CoreDocker --> DeployCore[docker-compose -f<br/>docker-compose.core.yml up -d]
DevDocker --> DeployDev[docker-compose -f<br/>docker-compose.local.yml up -d]
QuickDocker --> DeployCore
ManualSetup --> ManualSteps[Follow manual<br/>installation steps]
DeployFull --> Success[โ Deployment complete]
DeployCore --> Success
DeployDev --> Success
ManualSteps --> Success
Success --> Access{Can access?}
Access -->|Yes| TestIt[Test sync operation]
Access -->|No| TroubleshootInstall[See Troubleshooting]
TestIt --> Working{Works?}
Working -->|Yes| Done[Ready to use!]
Working -->|No| TroubleshootInstall
style Start fill:#4CAF50
style Done fill:#4CAF50
style FullDocker fill:#2196F3
style CoreDocker fill:#2196F3
style TroubleshootInstall fill:#FF9800
Docker Deployment Options
Production Deployment
Uses the pre-built image from GitHub Container Registry:
# Use the main docker-compose.yml file
docker-compose up -d
Local Development
Builds the image locally for development:
# Use the local development compose file
docker-compose -f docker-compose.local.yml up -d
Component-Specific Deployment
Deploy only specific components:
# Core sync functionality only (no web UI)
docker-compose -f docker-compose.core.yml up -d
# Full application (recommended)
docker-compose up -d
Note: With Nuxt 3's CORS-free architecture, you only need the standard docker-compose.yml for production deployments. The frontend's built-in Nitro proxy eliminates the need for complex CORS configurations.
Docker Configuration
Environment Variables
All configuration is done through environment variables in your .env file. See our Configuration Guide for complete details.
Volume Mapping
The default Docker setup includes these volume mappings:
volumes:
- ./data:/usr/src/app/data # Data persistence
- ./.env:/usr/src/app/.env # Configuration
- ./logs:/var/log/supervisor # Logs (optional)
Port Configuration
Default ports:
- 3222: Web Dashboard (Nuxt 3 frontend)
- 4222: API Backend (FastAPI)
To change ports, modify the docker-compose.yml:
services:
listsync-full:
ports:
- "8080:3222" # Web dashboard on port 8080
- "8081:4222" # API on port 8081
๐ป Manual Installation
For advanced users who prefer manual installation or need custom configurations.
System Preparation
Ubuntu/Debian
# Update package list
sudo apt update
# Install Python and dependencies
sudo apt install python3 python3-pip python3-venv git
# Install Node.js (for web interface)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install nodejs
# Install Chrome (for Selenium)
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
sudo apt update
sudo apt install google-chrome-stable
CentOS/RHEL/Fedora
# Install Python and dependencies
sudo dnf install python3 python3-pip git nodejs npm
# Install Chrome
sudo dnf install google-chrome-stable
macOS
# Install Homebrew if not installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install dependencies
brew install python3 node git
brew install --cask google-chrome
Backend Installation
-
Clone and setup:
git clone https://github.com/Woahai321/list-sync.git cd list-sync -
Create Python virtual environment:
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
Install Python dependencies:
pip install -r requirements.txt -
Configure environment:
cp envsample.txt .env # Edit .env with your configuration -
Initialize database:
python -m list_sync.database
Frontend Installation
-
Navigate to frontend directory:
cd listsync-nuxt -
Install Node.js dependencies:
npm install -
Configure environment:
# Nuxt 3 uses runtime config, main configuration is in .env at root # API URL is configured via nuxt.config.ts proxy settings -
Build frontend:
npm run build
Manual Service Setup
Using Systemd (Linux)
Create service files for automatic startup:
Backend Service (/etc/systemd/system/listsync-backend.service):
[Unit]
Description=ListSync Backend Service
After=network.target
[Service]
Type=simple
User=your-username
WorkingDirectory=/path/to/list-sync
Environment=PATH=/path/to/list-sync/venv/bin
ExecStart=/path/to/list-sync/venv/bin/python -m list_sync
Restart=always
[Install]
WantedBy=multi-user.target
Frontend Service (/etc/systemd/system/listsync-frontend.service):
[Unit]
Description=ListSync Frontend Service
After=network.target
[Service]
Type=simple
User=your-username
WorkingDirectory=/path/to/list-sync/listsync-nuxt
ExecStart=/usr/bin/npm start
Restart=always
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Enable and start services:
sudo systemctl enable listsync-backend listsync-frontend
sudo systemctl start listsync-backend listsync-frontend
Using PM2 (Node.js Process Manager)
# Install PM2
npm install -g pm2
# Start backend
pm2 start "python -m list_sync" --name listsync-backend --cwd /path/to/list-sync
# Start frontend
pm2 start npm --name listsync-frontend --cwd /path/to/list-sync/listsync-nuxt -- start
# Save PM2 configuration
pm2 save
pm2 startup
๐ง Post-Installation Setup
Initial Configuration
-
Test Overseerr connection:
# Using curl curl -H "X-Api-Key: your-api-key" http://your-overseerr-url/api/v1/status -
Add your first list:
- Via environment variable: Add
IMDB_LISTS=topto your.env - Via web interface: Navigate to http://localhost:3222/dashboard/lists
- Via environment variable: Add
-
Configure sync interval:
# Set in .env file SYNC_INTERVAL=24 # Sync once per day
Optional Setup
Discord Notifications
- Create a Discord webhook in your server
- Add to your
.envfile:DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your-webhook-url
Reverse Proxy Setup
Example Nginx configuration:
server {
listen 80;
server_name your-domain.com;
# Frontend
location / {
proxy_pass http://localhost:3222;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# API
location /api/ {
proxy_pass http://localhost:4222;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
โ Verification
Post-Installation Verification Workflow
flowchart TD
Start[Installation Complete] --> Step1[Check container status]
Step1 --> Docker{Using Docker?}
Docker -->|Yes| CheckPS[docker-compose ps<br/>All services Up?]
Docker -->|No| CheckProc[Check processes<br/>ps aux grep listsync]
CheckPS --> AllUp{All up?}
AllUp -->|No| StartServices[docker-compose up -d]
AllUp -->|Yes| TestAPI[Test API Health]
CheckProc --> TestAPI
StartServices --> TestAPI
TestAPI --> CURL1[curl localhost:4222/api/system/health]
CURL1 --> APIWorks{API responds?}
APIWorks -->|No| CheckAPIPort[Check port 4222<br/>Check firewall]
APIWorks -->|Yes| TestDB[Test Database]
TestDB --> CURL2[curl localhost:4222/api/lists]
CURL2 --> DBWorks{Database OK?}
DBWorks -->|No| CheckDBFile[Check ./data/list_sync.db<br/>exists & writable]
DBWorks -->|Yes| TestDashboard[Test Dashboard]
TestDashboard --> OpenBrowser[Open localhost:3222<br/>in browser]
OpenBrowser --> DashWorks{Dashboard loads?}
DashWorks -->|No| CheckFrontend[Check port 3222<br/>Check frontend logs]
DashWorks -->|Yes| TestOverseerr[Test Overseerr Connection]
TestOverseerr --> ConfigOverseerr[Check .env:<br/>OVERSEERR_URL<br/>OVERSEERR_API_KEY]
ConfigOverseerr --> ConnTest{Connection OK<br/>in dashboard?}
ConnTest -->|No| FixCreds[Update credentials<br/>Restart: docker-compose restart]
ConnTest -->|Yes| AddList[Add Test List]
AddList --> AddIMDB[Add IMDb Top list<br/>via dashboard or .env]
AddIMDB --> TriggerSync[Trigger manual sync]
TriggerSync --> SyncWorks{Sync completes<br/>successfully?}
SyncWorks -->|No| CheckLogs[Check logs:<br/>docker-compose logs]
SyncWorks -->|Yes| VerifyResults[Verify results<br/>in dashboard]
VerifyResults --> ItemsReq{Items<br/>requested?}
ItemsReq -->|Yes| AllGood[โ Installation verified!<br/>Ready for production]
ItemsReq -->|No| CheckWhy[Check why:<br/>- Already available?<br/>- Matching issues?]
CheckAPIPort --> FixPort[Fix and retry]
CheckDBFile --> FixDB[Fix and retry]
CheckFrontend --> FixFrontend[Fix and retry]
FixCreds --> TestOverseerr
CheckLogs --> FixIssues[Fix issues]
CheckWhy --> ReviewConfig[Review configuration]
FixPort --> TestAPI
FixDB --> TestDB
FixFrontend --> TestDashboard
FixIssues --> TriggerSync
ReviewConfig --> Docs[Check documentation]
style Start fill:#4CAF50
style AllGood fill:#4CAF50
style CheckAPIPort fill:#FF9800
style CheckDBFile fill:#FF9800
style CheckFrontend fill:#FF9800
style CheckLogs fill:#FF9800
Health Checks
-
Check system health:
curl http://localhost:4222/api/system/health -
Verify database:
curl http://localhost:4222/api/lists -
Test web interface: Open http://localhost:3222 in your browser
Manual Sync Test
-
Trigger a manual sync:
curl -X POST http://localhost:4222/api/sync/trigger -
Check sync results:
curl http://localhost:4222/api/processed?limit=10
Log Verification
Check logs for any errors:
# Docker
docker-compose logs -f listsync-full
# Manual installation
tail -f data/list_sync.log
๐ Updating
Docker Update
# Pull latest image
docker-compose pull
# Restart with new image
docker-compose up -d
Manual Update
# Backup your configuration
cp .env .env.backup
# Pull latest code
git pull origin main
# Update Python dependencies
source venv/bin/activate
pip install -r requirements.txt --upgrade
# Update frontend dependencies
cd listsync-nuxt
npm install
npm run build
cd ..
# Restart services
sudo systemctl restart listsync-backend listsync-frontend
๐ง Troubleshooting
Common Installation Issues
Docker Issues
Port already in use:
# Check what's using the port
sudo netstat -tlnp | grep :3222
# Change port in docker-compose.yml
ports:
- "8080:3222"
Permission denied:
# Add user to docker group
sudo usermod -aG docker $USER
# Log out and back in
Container won't start:
# Check logs
docker-compose logs listsync-full
# Check container status
docker-compose ps
Manual Installation Issues
Python version too old:
# Check Python version
python3 --version
# Install newer Python (Ubuntu)
sudo apt install python3.9
Chrome/Selenium issues:
# Install Chrome dependencies
sudo apt install libxss1 libappindicator1 libindicator7
# Test Chrome headless
google-chrome --headless --no-sandbox --disable-gpu --dump-dom https://google.com
Node.js build failures:
# Clear npm cache
npm cache clean --force
# Delete node_modules and reinstall
rm -rf node_modules package-lock.json
npm install
Performance Issues
High memory usage:
- Reduce
TRAKT_SPECIAL_ITEMS_LIMIT - Increase
SYNC_INTERVAL - Use fewer concurrent lists
Slow list fetching:
- Check network connectivity
- Verify list URLs are accessible
- Enable debug logging to identify bottlenecks
Network Issues
Cannot connect to Overseerr:
# Test connectivity
curl -v http://your-overseerr-url/api/v1/status
# Check Docker networking
docker network ls
docker network inspect list-sync_default
CORS errors in web interface:
- Verify
CORS_ALLOWED_ORIGINSincludes your domain - Check
NEXT_PUBLIC_API_URLis correct
Getting Help
If you encounter issues not covered here:
- Check logs for detailed error messages
- Search existing issues on GitHub
- Create a new issue with:
- Installation method (Docker/manual)
- Operating system
- Error messages
- Configuration (sanitized)
For more troubleshooting help, see our Troubleshooting Guide.