This section is only relevant to Enterprise customers who acquired an on-prem license.
Installation Guide
Complete step-by-step installation guide for deploying Permit Platform in your environment.
Make sure you've completed the prerequisites setup before starting.
Installation Overview
The Permit Platform on-premise installation uses a unified installer that deploys all services as a single Kubernetes application. The installation requires minimal configuration - you only need to set your frontend domain and Policy Sync configuration.
Package Contents
Your installer package includes:
- Installation script:
scripts/install-permit-platform.sh - Helm chart: Unified chart that deploys all services
- Docker images: All required images as tar files (airgapped deployment)
- Configuration files: values.yaml with examples and documentation
What the Install Script Does
Understanding what happens during installation helps you troubleshoot issues and customize your deployment.
Helm Chart Architecture
The installation deploys 3 separate Helm charts in a specific order:
third-party-services- Infrastructure components (PostgreSQL, Redis, OpenSearch, RabbitMQ, Keycloak)migrations- Database schema setup (backend schema, OPAL relay schema, indices)permit-platform- All Permit services (35 services total: backend, frontend, OPAL, policy enforcement)
This 3-phase approach ensures proper dependency management and allows for independent scaling and management of each component layer.
Complete Installation Process Breakdown
The install-permit-platform.sh script is a comprehensive deployment orchestrator that handles:
1. Pre-Installation Validation (1-2 minutes)
What it checks:
- ✅ Kubernetes cluster connectivity - Validates
kubectlaccess and cluster health - ✅ Required tools - Verifies
docker,helm,kind(if needed) are installed and working - ✅ Frontend domain configuration - Ensures
values.yamlhas valid frontend domain (not CHANGEME_FRONTEND_DOMAIN) - ✅ Policy Sync configuration - Validates that
CHANGEME_GIT_REPO_URLandCHANGEME_SSH_PRIVATE_KEYplaceholders have been replaced with actual values - ✅ Storage requirements - Checks available disk space for image loading
- ✅ Network connectivity - Tests Docker registry access and image pull capabilities
Script commands:
# Validates cluster connectivity
kubectl cluster-info --request-timeout=10s
# Checks frontend domain configuration
grep -q "CHANGEME_FRONTEND_DOMAIN" charts/permit-platform/values.yaml && exit 1
# Validates Git repository configuration
grep -q "CHANGEME_GIT_REPO_URL" charts/permit-platform/values.yaml && exit 1
grep -q "CHANGEME_SSH_PRIVATE_KEY" charts/permit-platform/values.yaml && exit 1
# Validates required tools
which docker helm kubectl || exit 1
2. Image Management (3-5 minutes)
What it does:
- 📦 Loads Docker images from tar files in the package (airgapped deployment)
- 🏷️ Tags images for target registry (Docker Hub, ECR, private registry)
- 🔐 Handles registry authentication (automatically for ECR, manually for private registries)
- 📊 Reports image status - Shows which images loaded successfully
Complete image list (35 services total):
# Core Platform Services (7 images)
permit-backend-v2 # Main API and business logic
permit-frontend # React web application
opal-server # Policy management (permitio/opal-server:0.7.5-rc.7)
permit-policy-sync-v2 # Git policy synchronization
permit-bundled-opa # Open Policy Agent engine
celery-general # Background task processing
permit-celery-beat # Scheduled task processing
# Policy Enforcement & Relay Services (8 images)
permit-opal-interface-v2 # OPAL interface
permit-opal-relay-api-v2 # Policy relay API
permit-opal-relay-consumer-v2 # Policy update consumer
permit-opal-relay-reports-consumer-v2 # Report processing
permit-opal-relay-statistics-api-v2 # Statistics API
permit-opal-relay-watcher-v2 # Policy watcher
permit-relay-jwt-api # JWT authentication
permit-cache-rebuilder # Cache optimization
# Data Processing Services (9 images)
permit-data-generator # Data generation
permit-data-generator-heavy # Heavy data processing
permit-decision-logs # Decision logging
permit-dl-enricher-v2 # Log enrichment
permit-pdp-cache-builder # PDP cache building
permit-pdp-data # PDP data management
permit-pdp-deltas # PDP delta processing
permit-webhook-transmitter-v2 # Webhook delivery
permit-scim-okta # SCIM integration
# Infrastructure Services (11 images)
postgres # Main database
postgres-read-replica # Read replica database
pgbouncer # Connection pooling
redis # Cache and session storage
opensearch # Audit logs and analytics
opensearch-dashboards # Search dashboard
rabbitmq # Message queue
keycloak # Authentication server
keycloak-postgres # Auth database
permit-foaz-proxy # Proxy service
permit-proxy # Application proxy
3. Kubernetes Environment Setup (30 seconds)
What it creates:
- 🏗️ Namespace creation - Creates
permit-platformnamespace (or custom namespace) - 🔐 RBAC configuration - Sets up service accounts and permissions
- 📋 Secret generation - Auto-generates secure passwords and tokens:
- PostgreSQL database password
- RabbitMQ message queue password
- Keycloak admin password
- OPAL authentication tokens
- JWT signing keys for services
Example secret generation:
# Auto-generates secure 32-character passwords
POSTGRES_PASSWORD=$(openssl rand -hex 16)
RABBITMQ_PASSWORD=$(openssl rand -hex 16)
KEYCLOAK_ADMIN_PASSWORD=$(openssl rand -hex 16)
Once generated, these passwords are stored in Kubernetes secrets and automatically reused on subsequent installations or upgrades. The installer checks for existing secrets before generating new passwords, ensuring your services maintain the same credentials across platform updates.
4. Infrastructure Services Deployment (2-3 minutes)
What it deploys (in order):
Step 4a: Database Layer
- 🗄️ PostgreSQL - Primary database for all platform data
- Database:
permit - User:
permit - Storage: 20GB persistent volume
- Configured with performance tuning for production
- Database:
Step 4b: Cache and Message Queue
-
⚡ Redis - Session storage, caching, and Celery task queue
- Port: 6379
- Storage: 5GB persistent volume
- No authentication (internal network only)
-
📨 RabbitMQ - Message queue for asynchronous processing
- Ports: 5672 (AMQP), 15672 (Management UI)
- Storage: 5GB persistent volume
- Management UI accessible via ingress
Step 4c: Search and Analytics
- 🔍 OpenSearch - Audit logs, decision logs, and analytics
- Port: 9200
- Storage: 15GB persistent volume (3 shards default)
- Dashboard accessible via ingress
- Index State Management (ISM) for log retention
Step 4d: Authentication
- 🔑 Keycloak - Identity and access management
- Port: 8080
- Realm:
permit-platform - Admin console accessible via ingress
- Integrated with PostgreSQL for user storage
5. Database Schema Initialization (1-2 minutes)
What it runs:
-
📊 Backend migrations - Creates core platform tables and schema
- User accounts and organizations
- Projects and environments
- Roles, resources, and policies
- Audit trails and decision logs
-
🔄 OPAL relay migrations - Sets up policy synchronization tables
- Policy distribution state
- PDP (Policy Decision Point) management
- Message queuing for policy updates
# Migration commands executed
cd /opt/permit/backend && alembic upgrade head
cd /opt/permit/opal_relay && alembic upgrade head
6. Platform Services Deployment (2-4 minutes)
What it deploys:
Core Backend Services:
-
🏢 permit-backend-v2 - Main API server
- REST API for frontend and integrations
- Policy management and evaluation
- User and organization management
- Integrated with all infrastructure services
-
👥 celery-general - Background task processing
- Async operations (email, reports, data processing)
- Policy cache rebuilding
- Audit log processing
Policy Management: