ReelPortal Server: A Complete Setup GuideReelPortal Server is a scalable, media-focused server platform designed to host, stream, and manage video content with low latency and high reliability. This guide walks you through the entire setup process — from system requirements and installation to configuration, optimization, security, and monitoring — so you can deploy a production-ready ReelPortal Server tailored to your needs.
What you’ll need
- A server (cloud or on-prem) with at least:
- 4 CPU cores (8+ recommended for production)
- 8 GB RAM (16+ GB recommended)
- 100 GB SSD (or larger depending on media storage)
- 1 Gbps network interface for streaming-heavy workloads
- OS: Ubuntu 22.04 LTS (this guide uses Ubuntu; steps for other distributions are noted where relevant)
- Root or sudo access
- Domain name with DNS control (for TLS)
- SSL certificate (Let’s Encrypt recommended)
- Optional: hardware GPU for transcoding (NVIDIA with NVENC) for performance
1. Architecture overview
ReelPortal Server typically has the following components:
- Ingest endpoints: receive uploads, live streams, or batch imports.
- Storage: local filesystem, object storage (S3-compatible), or hybrid.
- Transcoding: convert to multiple bitrates/resolutions (CPU/GPU).
- CDN edge or origin: deliver content with caching.
- Authentication & API: manage users, tokens, and programmatic access.
- Monitoring & logging: metrics, alerts, and logs for operations.
This guide covers a single-node production-capable setup with recommendations for scaling to multi-node and CDN-backed deployments.
2. Preparing your server
-
Update and install essentials:
sudo apt update sudo apt upgrade -y sudo apt install -y curl wget git ufw build-essential ca-certificates software-properties-common
-
Create a dedicated user:
sudo adduser --system --group --no-create-home reelportal
-
Set up swap (if needed):
sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
-
Configure firewall (example with UFW):
sudo ufw allow OpenSSH sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
3. Install dependencies
ReelPortal Server requires several components: a database (PostgreSQL), a media processing toolchain (FFmpeg), Redis for caching/queues, and a web server (Nginx). Install them:
-
PostgreSQL:
sudo apt install -y postgresql postgresql-contrib sudo -u postgres createuser --pwprompt reelportal_user sudo -u postgres createdb -O reelportal_user reelportal_db
-
Redis:
sudo apt install -y redis-server sudo systemctl enable --now redis-server
-
FFmpeg (for transcoding):
sudo add-apt-repository -y ppa:jonathonf/ffmpeg-4 sudo apt update sudo apt install -y ffmpeg
-
Nginx:
sudo apt install -y nginx sudo systemctl enable --now nginx
For GPU-accelerated transcoding with NVIDIA:
- Install NVIDIA drivers and nvidia-docker (if using containers), and the NVIDIA Video Codec SDK or configure FFmpeg with nvenc support. Specifics depend on GPU and OS.
4. Install ReelPortal Server
Note: ReelPortal Server may be distributed as a binary, Docker image, or package. This guide covers a Docker-based install for portability.
-
Install Docker & Docker Compose:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER sudo apt install -y docker-compose
-
Create a project directory and a docker-compose.yml (example): “`yaml version: ‘3.8’ services: db: image: postgres:14 environment: POSTGRES_USER: reelportal POSTGRES_PASSWORD: your_strong_password POSTGRES_DB: reelportal volumes:
- db_data:/var/lib/postgresql/data
redis: image: redis:7 volumes:
- redis_data:/data
reelportal: image: reelportal/server:latest environment: DATABASE_URL: postgres://reelportal:your_strong_password@db:5432/reelportal REDIS_URL: redis://redis:⁄0
SECRET_KEY: replace_with_a_strong_random_value STORAGE_PATH: /media volumes:- ./media:/media
ports:
- "8000:8000"
depends_on:
- db - redis
volumes: db_data: redis_data: “`
-
Start services:
docker-compose up -d
-
Run database migrations and create an admin user (commands depend on ReelPortal tooling — common examples):
docker-compose exec reelportal reelportal manage migrate docker-compose exec reelportal reelportal manage createsuperuser --username admin --email [email protected]
5. Configure Nginx as a reverse proxy and TLS
-
Create Nginx site config (/etc/nginx/sites-available/reelportal):
server { listen 80; server_name your.domain.example; location / { proxy_pass http://127.0.0.1:8000; 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; } location /static/ { alias /path/to/reelportal/static/; } }
-
Enable site and reload Nginx:
sudo ln -s /etc/nginx/sites-available/reelportal /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
-
Obtain TLS certificates with Certbot:
sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your.domain.example
6. Storage options and configuration
- Local filesystem: simple, fast for single-node deployments. Ensure disk I/O and available space.
- S3-compatible object storage: recommended for scalability. Configure ReelPortal to use S3 by setting environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET, S3_ENDPOINT).
- Hybrid: store originals in S3, keep frequently accessed derived files on local SSD.
Example env for S3:
- AWS_ACCESS_KEY_ID=AKIA…
- AWS_SECRET_ACCESS_KEY=…
- S3_BUCKET=reelportal-media
- S3_REGION=us-west-2
- S3_ENDPOINT=https://s3.amazonaws.com
7. Transcoding pipelines
- Define profiles for resolutions/bitrates (e.g., 1080p/6 Mbps, 720p/3 Mbps, 480p/1.2 Mbps).
- Use FFmpeg with H.264/H.265 and AAC. For HLS/DASH, create segmenting and manifest steps.
- Example FFmpeg command for HLS:
ffmpeg -i input.mp4 -c:v libx264 -preset fast -b:v 3000k -maxrate 3180k -bufsize 6000k -vf "scale=-2:720" -g 48 -sc_threshold 0 -c:a aac -b:a 128k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename "720p_%03d.ts" 720p.m3u8
For GPU NVENC replace -c:v libx264 with -c:v h264_nvenc and tune parameters accordingly.
8. Authentication, API keys, and webhooks
- Use strong secrets for API tokens and SECRET_KEY.
- Implement short-lived access tokens for ingest and playback where possible.
- Use webhooks to notify external systems when uploads finish, transcodes complete, or CDN purges are necessary.
- Rotate API keys periodically and log usage.
9. Security hardening
- Keep OS and packages updated.
- Run services with least privilege; avoid running as root.
- Use HTTPS everywhere; HSTS configured in Nginx.
- Limit upload sizes and validate input file types to avoid malicious content.
- Configure rate limiting in Nginx to mitigate brute force and DoS.
- Regular backups of database and object storage.
- Use fail2ban to block suspicious SSH attempts.
Example Nginx rate-limiting:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; ... } server { location /api/ { limit_req zone=one burst=20 nodelay; proxy_pass http://127.0.0.1:8000; } }
10. Monitoring, logging, and alerts
- Metrics: Prometheus + Grafana for app, system, and FFmpeg/transcoder metrics.
- Logs: centralize with Loki, Elasticsearch, or a hosted log provider. Ship container logs.
- Alerts: CPU, memory, disk usage, queue backlogs, and failed transcodes.
- Health checks: configure Kubernetes/Docker health checks for service restarts.
Prometheus node exporter and cAdvisor are useful for container metrics.
11. Scaling and CDN integration
- Horizontal scale: separate web, worker (transcode), and storage services. Use a message queue (Redis/RabbitMQ) for task distribution.
- Use object storage as the single source of truth for media files.
- Place a CDN (Cloudflare, Fastly, AWS CloudFront) in front of static HLS/DASH endpoints for low-latency delivery and to offload origin.
- For live streaming, use an ingest cluster (RTMP/SRT) and fragmented CMAF/HLS output to CDNs.
12. Backup and disaster recovery
- Regular DB dumps (pg_dump) with offsite storage.
- Versioned backups for S3 (enable bucket versioning).
- Test restores periodically.
- Keep infrastructure-as-code (Terraform/Ansible) to redeploy quickly.
Example cron for daily DB dump:
0 2 * * * pg_dump -U reelportal_user reelportal_db | gzip > /backups/reelportal-$(date +%F).sql.gz
13. Troubleshooting common issues
- Service won’t start: check container logs (docker-compose logs), ensure DB reachable, inspect env vars.
- Slow transcoding: check CPU/GPU utilization, tune FFmpeg presets, add more worker nodes or use GPU.
- Playback buffering: inspect network, CDN cache settings, manifest correctness, and segment durations.
- Disk fills up: configure automatic cleanup for temp/transcode directories and use lifecycle rules for object storage.
14. Example production checklist
- [ ] Use a dedicated domain and valid TLS certs.
- [ ] Secrets stored in a secrets manager (Vault/Secret Manager).
- [ ] Monitoring & alerting in place.
- [ ] Backups configured and tested.
- [ ] CDN enabled for media delivery.
- [ ] Rate limiting and firewall configured.
- [ ] Transcoder autoscaling or GPU instances available.
15. Further enhancements
- Add DRM support (Widevine/FairPlay) for protected content.
- Implement adaptive bitrate ladder automation based on content analysis.
- Use machine learning for thumbnail selection, scene detection, or automatic captions.
- Integrate analytics for viewership and quality metrics.
If you want, I can: set up a tailored docker-compose.yml for your environment, write Nginx configs for multiple domains, or produce FFmpeg pipelines for specific target bitrates/resolutions.
Leave a Reply