Skip to main content

Self-hosted cloud

The Enterprise plan includes a self-hosted edition: the JodaPrint cloud, the dashboard and the agent releases on your own server. Agents, SDKs and integrations work the same way; you only point them to your URL.

Install​

One command, as root, on a clean Ubuntu 24.04 LTS or Debian 12 server whose DNS names point to it:

curl -fsSL https://raw.githubusercontent.com/jodelin93/jodaprint/main/selfhost/install.sh \
| sudo bash -s -- --domain print.example.com --email [email protected] --license /path/license.jwt

It installs Node 22, PostgreSQL 16, Redis 7 and Caddy (automatic TLS), creates the systemd services, generates the secrets once into /etc/jodaprint/*.env, runs the database migrations and creates the first administrator. Everything listens on localhost except Caddy (ports 80 and 443).

OptionWhat it does
--domain NAMEAPI and agent gateway host name (required the first time)
--dashboard-domain NAMEDashboard host name (default app.<domain>)
--email ADDRESSLet's Encrypt contact and first administrator (required the first time)
--license FILEYour self-hosted license (JWT)
--smtp-url URLsmtp://user:pass@host:587; without it, emails go to the log
--open-signupLet anyone create an account (default: invitations only)
--demoAlso create a demo organization, activation code and jp_test_ key
--dry-runPrint every command instead of running it

Upgrade (keeps secrets and data, backs up first, rolls back if the new version is unhealthy):

sudo jodaprint-install --upgrade --version v1.4.0

Operate​

  • Backups: backup.sh and restore.sh (installed as commands), with a nightly backup timer.
  • Agent releases: mirror-releases.sh copies the signed agent releases to your server, so agents update from it.
  • Files (job content, logs) are stored on the local disk.

License​

The offline license sets the plan of every organization and caps the devices and organizations on the server. After it expires, the server keeps working for 30 days of grace. GET /admin/license shows its state.

When you order the license, send JodaPrint your server's device license key (curl -s https://print.example.com/agent/v1/license-key | jq -r .publicKey). The license then certifies it, and agents apply your plan instead of the free plan's device limits. The server logs a warning when its key is missing from the license.

Point agents and SDKs to your server​

ComponentSetting
Windows MSICLOUD_URL=https://print.example.com
macOS profileCloudURL
Linux packagesJODAPRINT_CLOUD_URL
Android MDMcloud_url
Command linejodaprint-agent activate <code> --cloud https://print.example.com
Node SDKnew JodaPrintClient({ apiKey, baseUrl: "https://print.example.com" })
Integrations"API base URL" in their settings

The browser SDK talks to the local agent and needs no change.

The full operator guide is docs/self-hosted.md in the JodaPrint repository.