Skip to main content

Self-hosted vs PaaS platform modes

Understand the difference between Nora’s selfhosted and paas modes, how resource limits and Stripe billing apply to each, and how to switch between them.
Nora operates in one of two platform modes, controlled by the PLATFORM_MODE environment variable. In selfhosted mode (the default), you define the resource envelope your users can draw from and no billing system is involved. In paas mode, Stripe plan tiers control agent-count and managed-backup entitlements while the operator sets one platform-wide vCPU, RAM, and requested-disk default for new agents. Choose the mode that matches how you intend to operate Nora. Settings — subscription / platform-mode card at the bottom of the Settings page
You can check which mode is currently active by calling the /config/platform endpoint on your backend API. It returns a JSON object with the current mode value.

Comparing modes

Self-hosted mode

Self-hosted is the default mode. When PLATFORM_MODE=selfhosted, Nora reads a set of maximum resource values from environment variables and enforces them for every user on the platform. There is no billing system involved.

Configuring resource limits

Set the following variables to define what users can allocate when deploying agents:
Size these limits to your host’s available capacity. On a modest server, reducing MAX_VCPU and MAX_RAM_MB prevents any single user from exhausting shared resources.
When a user reaches MAX_AGENTS, the deployment request is rejected with the message:
Agent limit reached (N/N). Contact your administrator.
To increase the limit, update MAX_AGENTS in your .env and restart the stack.

PaaS mode

PaaS mode is designed for operators who want to offer Nora as a hosted service with metered billing. When PLATFORM_MODE=paas, Stripe billing applies plan-specific agent-count and managed-backup entitlements. New-agent compute specs come from the operator-managed platform deployment defaults rather than the user’s plan tier.

Plan tiers

Three tiers are defined in the billing module:
vCPU, RAM, and disk are not differentiated by plan tier. Every PaaS subscription receives the platform-wide deployment defaults (default_vcpu / default_ram_mb / default_disk_gb) configured in Admin Settings — only the per-tier agent limit (and managed-backup limits) differ. The shipped fallback defaults are 1 vCPU / 1024 MB / 10 GB.
New users are automatically placed on the free plan when they first deploy an agent.

Required Stripe variables

You must configure all four Stripe variables before enabling billing:
Set BILLING_ENABLED=false while testing in PaaS mode. With billing disabled, users in PaaS mode can deploy unlimited agents and the Stripe limit enforcement is bypassed. Only set BILLING_ENABLED=true when your Stripe integration is fully configured and tested.

How billing enforcement works

When PLATFORM_MODE=paas and BILLING_ENABLED=true:
  1. Each deployment request checks the user’s active subscription plan.
  2. If the user has no subscription, a free-tier record is created automatically.
  3. If the user has reached their plan’s agent limit, the deployment is rejected with an upgrade prompt.
  4. Successful Stripe Checkout completions create or update the subscription via webhook.
  5. Canceled subscriptions downgrade the user to the free plan automatically.

Switching modes

To switch from selfhosted to paas (or back), update PLATFORM_MODE in your .env and restart the stack:
Drain Remote Docker workloads before switching to paas. Hosted mode disables Remote Docker registration, new placement, start/restart, live runtime access, and credential-bearing host operations. Existing records remain visible, and authorized users retain only Stop or Delete cleanup for an already-running remote workload when the original trusted SSH pin is still stored. Other operations require switching back to selfhosted. Docker, Kubernetes, and Proxmox agent records are otherwise retained; the new mode controls which future operations and deployment limits are accepted.