Installation guide
This guide covers the full path from purchasing an on-premise license on the Veilio SaaS to running a self-hosted instance with Docker and a license.jwt file.
Two separate planes
Control plane = the Veilio SaaS (app.veilio.xyz). You sign up here, pay via Stripe, and download your license and deployment kit. Veilio never sees your tokenized data.
Your on-premise instance = what you deploy on your own servers. It contains only the public key and validates the license offline. No business data leaves your infrastructure.
1. Prerequisites (your server)
Before deploying on your infrastructure, make sure you have:
Docker ≥ 24 and Docker Compose ≥ 2.20
2 CPUs, 2 GB RAM minimum
A Linux host (or VM) with outbound HTTPS access only if you want automatic license renewal or the in-app update banner (optional)
No Docker registry login — the application image is public on Docker Hub (
veilio/app:latest)
You will obtain license.jwt and the deployment kit from the Veilio SaaS — see section 2.
2. Purchase workflow (Veilio SaaS)
Everything in this section happens on the control plane (the Veilio web app), not on your on-premise server.
2.1 Create your account
Open app.veilio.xyz and click Sign up.
Register with your work email and set a password.
Confirm your email if prompted, then sign in.
You do not need a cloud (SaaS) subscription to buy an on-premise license. On-premise is a separate product, purchased from Billing.
2.2 Buy an on-premise license
Go to Dashboard → Billing (
/dashboard/billing).Scroll to the Veilio On-Premise block.
Choose an annual license:
On-Premise Standard
€1,690 / year
Teams with annual quotas (users, tokens, API requests)
On-Premise Pro
€2,990 / year
High-volume deployments with no token or request caps
Click Start 1-month free trial on the plan you want.
Enter your company name (embedded in the signed license).
Complete Stripe checkout. A card is required, but you are not charged during the 1-month trial.
2.3 What you receive after purchase
license.jwt attached to the delivery email
Email (optional)
vlr_... refresh token for automatic license renewal (shown once — save it)
Billing page
Download deployment kit and Download my license buttons
The first delivery is a trial license (30 days). When the trial ends and Stripe confirms payment, you receive a full annual license by email.
2.4 Download the deployment kit and license
Download deployment kit →
veilio-onpremise-kit.zipcontainingdocker-compose.yml,.env.onpremise.example,README.mdDownload my license →
license.jwt
license.jwtis not inside the zip. Place it in theveilio/folder next todocker-compose.ymlon your server.
2.5 Prepare files on your server
3. Configure the environment
Edit .env and set at least:
DB_PASSWORD
Strong PostgreSQL password
ENCRYPTION_KEY
openssl rand -base64 32 — back it up: without it, tokens cannot be recovered
NEXTAUTH_SECRET
openssl rand -base64 32
APP_URL
Public URL (e.g. https://veilio.acme.internal)
VEILIO_IMAGE
Docker image (default: veilio/app:latest)
SMTP_HOST / SMTP_PORT / SMTP_FROM
Outbound email
BOOTSTRAP_EMAIL / BOOTSTRAP_PASSWORD
First admin on empty database
VEILIO_LICENSE_FILE
Default: /veilio/license.jwt (file mode)
VEILIO_LICENSE_KEY
Full JWT inline (Coolify / secret managers) — overrides file
VEILIO_CRON_SECRET
Bearer secret for internal jobs (auto-shred). Required if you use retention / TTL. Generate with openssl rand -base64 32
Automatic renewal (optional):
VEILIO_LICENSE_AUTO_REFRESH
true to enable
VEILIO_LICENSE_CONTROL_PLANE_URL
https://app.veilio.xyz
VEILIO_LICENSE_REFRESH_TOKEN
vlr_... from delivery email
VEILIO_LICENSE_REFRESH_THRESHOLD_DAYS
Default 45
4. Configure the license
Option A — File (default)
For auto-refresh persistence, mount ./veilio read-write (remove :ro in docker-compose.yml).
Option B — Environment variable (Coolify, PaaS)
5. Start
On startup the instance: applies migrations, verifies the license, creates bootstrap admin if configured, and optionally refreshes the license.
6. Check status
For license details, send header X-Metrics-Secret with your METRICS_SECRET value.
SDK / API base URL for your instance: https://your-domain.com/api
7. Retention & auto-shred (required if you use TTL)
If your apps pass retention.ttlDays or retention.retentionUntil when tokenizing, you must schedule the auto-shred job yourself. Setting retention alone does not destroy data.
Set
VEILIO_CRON_SECRETin.envand restart the app if needed.Schedule an hourly call (crontab, systemd timer, or your orchestrator):
Confirm a
200JSON response with aprocessedfield.
Full details: Data Lifecycle: Retention and Crypto Shredding.
8. Update the application
PostgreSQL volumes and license.jwt are preserved.
9. Create an admin manually (alternative)
10. Coolify deployment
New Resource → Docker Compose (image on Docker Hub, do not build from Git).
Deploy the kit's
docker-compose.yml.Set environment variables (section 3), including
VEILIO_CRON_SECRETif you use retention.Set
VEILIO_LICENSE_KEYas a secret (option B, section 4).Assign domain to
veilio-app, port 3000.APP_URL= Coolify HTTPS URL.Configure an external cron / Coolify scheduled job for auto-shred (section 7).
Verify: curl -s https://your-domain/api/health?db=1
License lifecycle
Valid
Everything works
30 days before expiry
Warning banner + health: expiring_soon
Expired (0–30 days)
Grace period: read-only, no new tokens
Expired > 30 days
Instance refuses to start
Automatic renewal — add to .env:
Manual swap (air-gap):
Re-download anytime from Dashboard → Billing → Download my license.
Backups
You must back up:
Both PostgreSQL volumes (
veilio-data,clients-data)The
ENCRYPTION_KEYvariable (off-server, in a secrets vault)VEILIO_CRON_SECRET(same vault — rotating it without updating the cron job breaks auto-shred)
TLS / reverse proxy (recommended)
Terminate HTTPS in front of the container:
Set APP_URL to your public HTTPS URL.
Last updated
Was this helpful?
