Skip to main content

Multi-Instance Deployment Guide

Deploy Plugged.in with horizontal scaling for high availability and load distribution across multiple application instances.
Critical: Multi-instance deployments require Redis for distributed rate limiting. In-memory rate limiting is NOT SAFE for production with multiple instances.

Architecture Overview

Critical Requirements

1. Redis (REQUIRED)

Redis is mandatory for multi-instance deployments to ensure consistent rate limiting across all instances.
1

Install Redis

Docker Compose:
Standalone:
2

Install Redis Client

3

Configure Connection

Update .env for each instance:

2. Shared Database

All instances must connect to the same PostgreSQL database.

3. Session Management

Ensure NextAuth sessions are stored in the database, not in-memory.

Production Deployment

docker-compose.production.yml:

Nginx Load Balancer Configuration

nginx.conf:

Security Configuration

1. Metrics Endpoint Protection

Metrics endpoint exposes sensitive operational data. Restrict to Prometheus server IP only.
Update .env for all instances:
Security Features:
  • ✅ IPv4 CIDR validation
  • ✅ IPv6 CIDR validation (NEW)
  • ✅ Exact IP matching
  • ✅ Default: localhost + Docker networks only

2. Rate Limiting Configuration

With Redis configured, rate limits are enforced across all instances:
Verification:

3. OAuth Security (OAuth 2.1)

Multi-instance deployments inherit all OAuth 2.1 security features:
  • ✅ PKCE with S256 challenge
  • ✅ Refresh token rotation
  • ✅ Token reuse detection (works across instances via database)
  • ✅ State integrity validation
  • ✅ 10-second timeout on OAuth API calls (NEW)

Monitoring & Health Checks

Instance Health Endpoint

Each instance exposes a health check endpoint:
Response:

Load Balancer Health Checks

Configure Nginx to automatically remove unhealthy instances:

Prometheus Monitoring

Monitor all instances with Prometheus:

Performance Optimizations

1. Database Connection Pooling

Configure optimal connection pool per instance:
3 instances × 20 connections = 60 total connections to PostgreSQL

2. OAuth Config Caching (NEW)

Each instance caches OAuth configurations for 5 minutes:
Impact: Significantly reduces database queries for OAuth token refresh operations.

3. Server Ownership Validation (NEW)

Optimized JOIN query reduces latency by 60-70%:

Scaling Guidelines

Horizontal Scaling

When to add instances:
  • CPU usage consistently > 70%
  • Response time p95 > 2 seconds
  • Queue depth increasing
  • Expected traffic spike
Instance sizing:
  • Minimum: 2 instances (high availability)
  • Recommended: 3 instances (fault tolerance)
  • Maximum: Limited by database connections

Vertical Scaling

Per-instance resources:
  • Minimum: 2 CPU cores, 4GB RAM
  • Recommended: 4 CPU cores, 8GB RAM
  • Optimal: 8 CPU cores, 16GB RAM

Auto-Scaling

Kubernetes Horizontal Pod Autoscaler:

Troubleshooting

Symptom: Users can bypass rate limits by hitting different instancesSolution:
  1. Verify Redis is configured:
  2. Check Redis connection:
  3. Expected log: [RateLimit] Using Redis backend for distributed rate limiting
  4. If seeing warning: ⚠️ WARNING: Using in-memory rate limiting in production!
    • Configure REDIS_URL immediately
Symptom: Users logged out when hitting different instanceSolution:
  1. Verify all instances use same NEXTAUTH_SECRET
  2. Check database adapter is enabled (default in Plugged.in)
  3. Verify JWT strategy is used (default)
Symptom: OAuth works sometimes, fails other timesSolution:
  1. Verify all instances connect to same database
  2. Check PKCE state storage:
  3. Verify state cleanup is working (15-minute interval)
Symptom: Prometheus can’t scrape metricsSolution:
  1. Check Prometheus server IP is in allowlist:
  2. Test CIDR validation:
  3. For IPv6:
Symptom: PostgreSQL running out of connectionsSolution:
  1. Calculate total connections: instances × max_per_instance
  2. Adjust PostgreSQL max_connections:
  3. Reduce per-instance pool size:

Deployment Checklist

Pre-Deployment Checklist

Infrastructure:
  • Redis cluster configured and tested
  • PostgreSQL connection pooling configured
  • Load balancer health checks enabled
  • SSL certificates installed
Security:
  • REDIS_URL configured for all instances
  • NEXTAUTH_SECRET identical across instances
  • METRICS_ALLOWED_IPS restricted to Prometheus IP
  • Rate limiting verified with Redis
Monitoring:
  • Prometheus scraping all instances
  • Grafana dashboards configured
  • Loki log aggregation enabled
  • Alerts configured for instance failures
Testing:
  • Load test with multiple instances
  • Verify rate limiting across instances
  • Test instance failure handling
  • Verify OAuth flows work across instances

Docker Deployment

Single-instance Docker setup

OAuth Migration

OAuth 2.1 migration guide

Observability

Monitoring and logging

Security Best Practices

OAuth 2.1 security implementation