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).
| Option | What it does |
|---|---|
--domain NAME | API and agent gateway host name (required the first time) |
--dashboard-domain NAME | Dashboard host name (default app.<domain>) |
--email ADDRESS | Let's Encrypt contact and first administrator (required the first time) |
--license FILE | Your self-hosted license (JWT) |
--smtp-url URL | smtp://user:pass@host:587; without it, emails go to the log |
--open-signup | Let anyone create an account (default: invitations only) |
--demo | Also create a demo organization, activation code and jp_test_ key |
--dry-run | Print 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.shandrestore.sh(installed as commands), with a nightly backup timer. - Agent releases:
mirror-releases.shcopies 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
| Component | Setting |
|---|---|
| Windows MSI | CLOUD_URL=https://print.example.com |
| macOS profile | CloudURL |
| Linux packages | JODAPRINT_CLOUD_URL |
| Android MDM | cloud_url |
| Command line | jodaprint-agent activate <code> --cloud https://print.example.com |
| Node SDK | new 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.