Self-Hosted Docker Deployment
Complete step-by-step guide to installing, configuring, and running your self-hosted instance using Docker Compose and our private image registry.
Important
Self-hosting still requires a license key, as well as valid credentials to pull our private Docker images from our registry, which can be obtained by following our onboarding process.
Get Credentials
Prerequisites Check
Before starting this guide, ensure you have administrative access (sudo or
root) on your target server and have your deployment credentials and license
key readily accessible.
Operating System & Server Guidance
Our platform is packaged using Docker containers, meaning it can technically run on any environment that supports Docker.
However, for production reliability, security, and performance, we strongly recommend running a dedicated Linux Server distribution.
| Recommended Operating System | Minimum System Requirements | Recommended Requirements |
|---|---|---|
| Ubuntu Server (24.04 LTS or above) Red Hat Enterprise Linux (RHEL) (9 or above) Debian (13 or above) | 4 vCPU Cores 8 GB RAM SSD Storage | 8 vCPU Cores 16+ GB RAM NVMe SSD Storage |
Note
The system requirements above are recommended guidelines rather than strict hard limits. While the platform can technically run on lower-spec hardware, system responsiveness and CRUD performance will degrade - particularly during resource-intensive tasks like document ingestion and embedding pipelines. Similarly, while the platform may function on older Linux releases, running an End-of-Life (EOL) distribution is strongly discouraged. Operating systems no longer receiving active maintainer updates miss critical security patches, leaving your environment vulnerable to unpatched exploits.
Installing Prerequisites (Docker & Docker Compose)
To run the application, your server must have Docker Engine and Docker Compose (V2) installed.
Because package managers and installation commands frequently change per operating system version, please follow the official setup guide for your specific platform below:
Follow the official Docker installation guide for Ubuntu: Official Ubuntu Docker Installation Guide
Verify that Docker Compose is functional by executing docker compose version
in your server terminal before proceeding.
Deployment Steps
3.1 Create a Working Directory
Create a directory on your server to house your configuration files and application database volume:
mkdir -p /opt/app-platform && cd /opt/app-platform3.2 Configure Environment Variables
Create a .env file in /opt/app-platform to securely hold your license key and third-party API credentials.
nano .envPaste and edit the following parameters:
# License Authorization
LICENSE_KEY=<ENTER_YOUR_LIVE_LICENSE_KEY_HERE>
# Internal PostgreSQL Password
DB_PASSWORD=<ENTER_YOUR_LIVE_DATABASE_PASSWORD_HERE>
# Storage Provider Configuration
STORAGE_PROVIDER=LOCAL # Options: LOCAL, AWS_S3, AZURE_BLOB, GCP_STORAGE
3.3 Configure Blob Storage Provider
The platform requires a file storage backend to store user uploads, generated artifacts, and attachments. You can configure either a local volume or a cloud blob storage provider using environment variables in your .env file.
Select your preferred provider tab below to see the required environment keys:
For single-node or development deployments, files can be stored directly on
the host server's disk using Docker volumes. Set STORAGE_PROVIDER=LOCAL in
your .env file:
STORAGE_PROVIDER=LOCAL
STORAGE_LOCAL_PATH=/app/data/storageStorage Persistence Notice
If you choose LOCAL storage, ensure you map a persistent host directory to /app/data/storage
inside your docker-compose.yml so uploaded assets are preserved across container recreations.
3.4 Authenticate with Private Registry
Log in to our private container registry using the deployment token provided in your onboarding materials:
docker login registry.yourcompany.com -u <YOUR_DEPLOY_TOKEN_USERNAME>When prompted, paste your registry access password/token.
3.5 Publish with docker-compose
Create the main composition file that manages the app binary container and database dependency:
nano docker-compose.ymlPaste the following configuration:
version: '3.8'
services:
app-platform:
image: [registry.yourcompany.com/enterprise/platform:latest](https://registry.yourcompany.com/enterprise/platform:latest)
container_name: app_platform_api
restart: always
ports:
- "8080:8080"
environment:
- ConnectionStrings__DefaultConnection=Host=postgres;Database=appdb;Username=postgres;Password=${DB_PASSWORD}
- License__Key=${LICENSE_KEY}
- Storage__Provider=${STORAGE_PROVIDER}
- Storage__LocalPath=${STORAGE_LOCAL_PATH:-/app/data/storage}
- Storage__AwsBucketName=${STORAGE_AWS_BUCKET_NAME}
- Storage__AwsRegion=${STORAGE_AWS_REGION}
- Storage__AwsAccessKeyId=${STORAGE_AWS_ACCESS_KEY_ID}
- Storage__AwsSecretAccessKey=${STORAGE_AWS_SECRET_ACCESS_KEY}
- Storage__AzureContainerName=${STORAGE_AZURE_CONTAINER_NAME}
- Storage__AzureConnectionString=${STORAGE_AZURE_CONNECTION_STRING}
- Storage__GcpBucketName=${STORAGE_GCP_BUCKET_NAME}
- Storage__GcpProjectId=${STORAGE_GCP_PROJECT_ID}
- Storage__GcpCredentialsJson=${STORAGE_GCP_CREDENTIALS_JSON}
volumes:
- appdata:/app/data/storage
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:16-alpine
container_name: app_platform_db
restart: always
environment:
POSTGRES_DB: appdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
pgdata:
driver: local
appdata:
driver: localPull images from the private registry and spin up services in detached background mode:
docker compose up -dVerification & Maintenance
Confirm Container Status
Verify that both containers are running and healthy:
docker compose psView Application Logs
Check runtime logs to ensure database connections and license validation succeeded:
docker compose logs -f app-platformNetwork Configuration
Ensure port 8080 is allowed through your firewall (e.g., sudo ufw allow 8080 or via AWS Security Groups). If exposing to the public web, set up an ingress reverse proxy such as Nginx, Caddy, or Traefik with TLS/SSL encryption.