Skip to main content

Self-Hosting OpenCLM

OpenCLM is fully open source (AGPL v3) and designed to be self-hosted. Your contracts, users, and data stay on your own infrastructure.

Architecture Overview

┌─────────────────────────────────┐
│ Your Users │
└────────────┬────────────────────┘
│ HTTPS
┌────────────▼────────────────────┐
│ Reverse Proxy │
│ (Nginx / Caddy / Traefik) │
└────┬───────────┬────────────────┘
│ │
┌─────────▼──┐ ┌───▼──────────┐
│ Frontend │ │ Keycloak │
│ React SPA │ │ (port 8080) │
│ (port 3000)│ └──────────────┘
└─────────────┘

┌────▼────────┐
│ API Server │
│ Node.js/Hono │
│ (port 4000) │
└──────┬──────┘

┌──────▼──────┐
│ PostgreSQL │
│ (port 5432)│
└─────────────┘

Stack Components

ComponentTechnologyPurpose
FrontendReact 18 + Vite + TypeScriptContract management UI
API ServerNode.js + Hono frameworkREST API and business logic
DatabasePostgreSQL 15+All application data
ORM & MigrationsPrismaSchema management
IdentityKeycloak 22+SSO, LDAP/AD federation, MFA
E-SignatureOpenSignContract signing workflow
ContainerDocker + Docker ComposeDeployment packaging

Deployment Options

All components run as Docker containers on a single server.
Docker Compose Setup

Option 2: Kubernetes

For high-availability production deployments. Helm chart available in the GitHub repository (/deploy/helm).

Option 3: Manual / Bare Metal

Run each service natively on your server. Suitable for environments where Docker is not available.
→ See server/DEPLOYMENT.md in the repository for bare-metal instructions.

Minimum Server Requirements

TiervCPUsRAMDiskUsers
Small (dev/testing)24 GB20 GB< 20
Medium (production)48 GB50 GB20 – 200
Large (enterprise)816 GB100 GB200 +

Ports Used

PortService
3000React frontend (proxied via Nginx in production)
4000API server
5432PostgreSQL
8080Keycloak admin & auth

In production, expose only 443 (HTTPS) via your reverse proxy. All other ports should be firewalled.

TLS / HTTPS

Always run OpenCLM behind a TLS-terminating reverse proxy in production:

  • Caddy — automatic certificate provisioning via Let's Encrypt (Caddyfile example in /deploy/caddy/).
  • Nginx — manual or Certbot (nginx.conf example in /deploy/nginx/).
  • Traefik — recommended for Kubernetes / Docker Swarm.

Next Steps