Last updated October 14, 2026
On this page
Self-Hosted Deployment
A self-hosted deployment runs the same product as the cloud service, in a Docker Compose stack on servers you control. Your users still sign in through the portal, and the stack checks in with the portal for licensing. Boards, sources, chat, and the database stay inside your network.
Self-hosting is available on the Enterprise plan. Once your organization is on Enterprise, our team provisions and approves an on-premises deployment for it. The approval unlocks the Self-hosted page in the portal and lets your servers pull images.
How it works
The container images live in a private registry. Once running, the stack keeps working for up to 24 hours if the portal is unreachable.
If the subscription lapses, running containers keep running, but the portal refuses the next registry sign-in and you can't pull a new release until billing is resolved.
What you'll need
The images target linux/amd64. Docker Desktop on Apple Silicon runs them under emulation, which works for evaluation. Linux ARM64 servers are not supported.
You bring your own PostgreSQL: the compose file doesn't run a database. Before you start the stack, prepare a reachable managed or self-run instance and its credentials.
Outbound access
The host needs HTTPS (port 443) to all three of these. A firewall that allows the first two and blocks the third makes a pull stall at 0%.
Get your deployment credentials
- Our team provisions an on-premises deployment for your organization and approves it. Until then, the portal's Self-hosted page shows a contact card instead of the installer.
- Sign in to portal.provenmap.com as an organization admin and open Self-hosted.
- Select Create secret. Copy the App ID and the secret into your secrets manager.
The page shows the secret once. Recreate secret on the same page invalidates the old one for both the heartbeat and registry sign-in. After recreating it, update .env and run the sign-in script again.
Install
Installing takes about ten minutes on a host that meets the requirements.
When your deployment is approved, our team sends you the install kit: the compose file, nginx.conf, .env.template, the sign-in scripts, and the pre-flight script.
1. Unpack the kit. Put its files in ~/provenmap.
2. Check the host. The script verifies Docker, memory, disk, port 80, jq, and whether all three outbound hosts are reachable.
3. Configure. Copy the template, then set the three required values.
4. Sign in to the image registry. The script exchanges your credentials for 12 hours of pull access and, on first run, pins PMAP_VERSION to the current release.
5. Start the stack.
The first start downloads roughly 1 GB of images and takes two to three minutes.
1. Unpack the kit. Put its files in %USERPROFILE%\provenmap.
2. Check the host. There is no PowerShell pre-flight script. Confirm Docker Desktop is running and that PowerShell can reach the three outbound hosts:
3. Configure.
4. Sign in to the image registry.
If PowerShell refuses to run it, use powershell -ExecutionPolicy Bypass -File .\registry-login.ps1.
5. Start the stack.
The PowerShell scripts mirror the bash ones but have had less field use. If one misbehaves, tell us at support@provenmap.com.
Pull access lasts 12 hours. Run the sign-in script again before any docker compose pull. Starting or restarting containers you already have does not need it.
Verify the installation
All three containers (provenmap-proxy, provenmap-web, and provenmap-server) report Up (healthy). The health check returns {"status":"ok"}, and the status endpoint reports "license": { "status": "active" } after the server checks in with the portal.
Open http://localhost (or your configured port), select Sign In, and sign in with your portal account. Every user needs a portal account and membership in your organization.
Configuration
Settings live in .env next to the compose file. Restart the affected container after a change: docker compose -f docker-compose.production.yml up -d --force-recreate server.
Required
There is no latest tag. Releases are immutable, and your deployment runs exactly the release named here until you change it.
Database
The server runs migrations automatically when it starts. They are forward-only and hold an advisory lock, so several restarts in a row are safe.
Connection pool and platform behavior
Optional
Chat and in-app insight generation use a model provider, connected once from Settings → Connectors. Plugin commands such as /analyze, /sync, and /insights do not require one.
You can move icon storage from the local filesystem to S3; see Organization Settings. Plugins and MCP clients point at your instance with PMAP_BASE_URL and PMAP_MCP_URL; see Authentication.
On request, we provide trial credits for early usage before you connect your own model provider. We bill them to you, not your users.
Upgrade and roll back
The Self-hosted page in the portal shows the current release and whether your deployment is up to date. To upgrade, change PMAP_VERSION in .env:
Back up the database first (below). Expect one to two minutes of downtime while containers restart.
To roll back, set PMAP_VERSION to the previous release and run the same pull and start. Database migrations don't roll back. If a release's migration fails, restore your pre-upgrade backup, pin the previous release, and contact us.
We keep recent releases in the registry, not every release ever shipped. If your deployment is pinned to a release that has aged out, you can't pull it onto a new host. Upgrade before you migrate hosts, or contact support.
Back up
Two things hold state: your PostgreSQL database and the provenmap-data volume (sessions, cache, and the cached license).
Back the database up with your usual PostgreSQL process. From the host:
Back the data volume up as a tar archive:
If you lose the data volume, the stack rebuilds it from the portal on the next start. Nothing rebuilds the database, so back it up daily and before every upgrade.
SSL and reverse proxies
The stack includes an nginx container on port 80. You have two options for HTTPS:
- Terminate TLS on your load balancer and forward to port 80. Nothing in the stack changes.
- Replace
nginx.confwith your own configuration, or route straight to the containers from your existing proxy (Traefik, Caddy, HAProxy). Use this routing table:
Keep ports 3000 and 3001 off the public internet; only the proxy should reach them.
Troubleshooting
The sign-in script prints FAIL … [code]
The portal refused registry access. The code in brackets says why.
Invalid deployment credentials means PMAP_APP_ID or PMAP_APP_SECRET is wrong, or someone recreated the secret in the portal. Too many requests means more than ten sign-ins a minute from one address; wait a minute.
denied: Your authorization token has expired
Pull access lasts 12 hours from sign-in. Sign in again and retry:
… did not answer as the Portal API
PMAP_PORTAL_URL points at https://portal.provenmap.com, which is the web app. Remove the line from .env so the default applies, or set it to the API host from the outbound access table. Then recreate the server container so it picks up the change:
Pull stalls at 0% after a successful sign-in
The registry answered, but image layers download from S3 and your firewall blocks it. Allow HTTPS to *.s3.us-east-1.amazonaws.com, the regional pattern, not only *.s3.amazonaws.com. Confirm from the host: any HTTP status means S3 is reachable, and a connection error means it is still blocked:
The server exits at startup with "Portal unreachable"
The server needs the portal API on its first start and whenever its cached license is older than PMAPP_OFFLINE_TTL. Check outbound access to the API host from inside the container:
A 200 means the network is fine and the credentials are the problem. Anything else is a firewall or proxy rule.
Port 80 is already in use
Set PMAP_PORT in .env to a free port and run docker compose -f docker-compose.production.yml up -d. The stack is then at http://localhost:<port>.
What's next
Enterprise SSO
Connect Okta, Entra ID, or any SAML/OIDC provider for your self-hosted users.
Authentication
Point the plugins and MCP clients at your instance with PMAP_BASE_URL and PMAP_MCP_URL.
Organization Settings
Roles, archetypes, and the S3 icon storage backend for self-hosted deployments.
Permissions & Access
Control who can view and edit boards once your team is signed in.







