The self-hosted bundle isn't available to download yet. QorVertex is in its early adopter program. Apply for early access; if you're accepted, we'll work through this guide with you. Everyone else hears from us when QorVertex opens to all.

Getting help

Email support@qorvertex.com. To get you an answer faster, include:

  • what you were doing and what you expected, and the exact error text;
  • the QorVertex version (the bundle's file name, e.g. qorvertex-v1.2.0) and your Linux distribution;
  • the output of sudo docker compose --env-file deploy.env -f docker-compose.yml ps;
  • the last lines of the log for any service that looks wrong (see Troubleshooting).

Never send deploy.env or the passwords and secrets in it. We will never ask for them. You don't need to send your license key either: the email address you registered with is enough for us to find it.

Requirements

Server

  • 64-bit Linux: Debian/Ubuntu or RHEL/Fedora families are tested. The installer adds Docker if it is missing; on other distributions, install Docker and Docker Compose v2 first.
  • Root or sudo access.
  • curl or wget, and openssl. These are present on almost every base image.
ScenariovCPURAMFree disk
Trial / a few repositories24 GB20 GB
Team / dozens of repositories48 GB50–100 GB
Hundreds of repositories, monorepos8+16 GB+200 GB+

Scanning uses up to all but two CPU cores, so more cores mean faster scans. Repositories are cloned, scanned and removed, so leave room for the largest one plus the growing catalog.

Network

  • Inbound: port 80, and 443 if you use the built-in HTTPS. Nothing else is published; the database and internal services stay on a private Docker network.
  • Outbound HTTPS (443) to your source-control hosts (GitHub, GitLab, Bitbucket, Azure DevOps) and to api.qorvertex.com for the daily license check-in. Let's Encrypt is also needed if you use built-in HTTPS.

Install

Copy the bundle to the server, then:

tar xzf qorvertex-v1.2.0.tar.gz
cd qorvertex-v1.2.0
sudo ./install.sh

The installer:

  1. checks it is on Linux and running as root;
  2. installs and starts Docker if needed;
  3. loads the QorVertex images from the bundle (no registry or account needed);
  4. asks for the first admin's email and password, and whether to enable HTTPS (see HTTPS);
  5. generates the database password and internal secrets into deploy.env, readable only by root;
  6. sets up the database and starts everything, then prints the address to open.
==> QorVertex is up.
   URL:   http://<server-ip>:80
   Login: you@yourcompany.com  (password from install)

Unattended installs: copy deploy.env.example to deploy.env, fill it in (generate secrets with openssl rand -hex 32), chmod 600 deploy.env, then run sudo ./install.sh --config deploy.env. It won't prompt.

Add your license key

Your key is in the email that told you your application was accepted. Without it you can log in and browse, but scans stay paused.

  1. In the bundle directory, edit deploy.env and set LICENSE_KEY= to your key.
  2. Apply it:
    sudo docker compose --env-file deploy.env -f docker-compose.yml up -d
  3. In QorVertex, open Settings → License and click Refresh license. It should show your tier and line-of-code limit.

A key works on one installation. Check-ins happen about once a day and carry only your line-of-code total, version and an installation ID, never your code (see the Privacy Policy). An install that cannot reach api.qorvertex.com keeps scanning for up to 30 days from its last successful check-in. An evaluation license from the early adopter program ends on the date in your acceptance email; after that, new scans pause (your data stays) until you move to a paid license. A Free key lapses after a year with no check-ins, and registering again with the same email issues a new one. To move a key to a new server, email support.

HTTPS

The built-in HTTPS uses a free Let's Encrypt certificate. Before you start, point a DNS record for your chosen name at the server, and make sure port 80 is reachable from the internet, which is how Let's Encrypt checks you own the name. Answer y at the install prompt, or set:

TLS_ENABLED=true
TLS_DOMAIN=qorvertex.yourcompany.com
TLS_EMAIL=you@yourcompany.com

HTTP then redirects to HTTPS, and the certificate renews automatically; you don't need a cron job. If a load balancer or proxy in front of QorVertex already handles HTTPS, leave TLS_ENABLED=false and point it at port 80.

Restricting access

To allow only your office or VPN ranges, list them in deploy.env and re-apply with the up -d command above:

ADMIN_ALLOW_CIDR=203.0.113.0/24, 198.51.100.0/24

Everyone else gets "403 Forbidden". The Let's Encrypt check stays reachable, so HTTPS keeps renewing. If your own address changes between connections, list every range you connect from.

Verify the install

sudo docker compose --env-file deploy.env -f docker-compose.yml ps

postgres should read healthy and the application services running. migrate shows exited (0), which is expected: it sets up the database and stops. Then open the printed address in a browser.

First login and first scan

  1. Log in with the admin email and password you chose at install.
  2. Optionally add people under Admin → Users. Admins manage configuration and users; Users can browse repositories, dependencies, shared data and search.
  3. Add a Source Connection to GitHub, GitLab, Bitbucket or Azure DevOps. A read-only access token is enough, and it is stored encrypted.
  4. Open Repositories, pick the repositories to include, and start a scan. Cross-repository links appear once the scan finishes.

Upgrading

Your data lives in Docker volumes and is kept across upgrades. Extract the new bundle next to the old one, copy your deploy.env into it, and run the upgrade:

tar xzf qorvertex-v1.3.0.tar.gz
sudo cp qorvertex-v1.2.0/deploy.env qorvertex-v1.3.0/
cd qorvertex-v1.3.0
sudo ./install.sh --upgrade

It loads the new images, applies any database changes, and restarts only what changed. Take a backup first.

Backup and restore

# back up the database
sudo docker compose --env-file deploy.env -f docker-compose.yml exec -T postgres \
  pg_dump -U chevelle chevelle2 > qorvertex-$(date +%F).sql

# restore into a fresh install
cat qorvertex-YYYY-MM-DD.sql | sudo docker compose --env-file deploy.env -f docker-compose.yml \
  exec -T postgres psql -U chevelle chevelle2

Keep a copy of deploy.env somewhere safe and separate. It holds the secrets that unlock your stored source-control tokens; without it, a restored database can't use them.

Troubleshooting

Logs for every service: sudo docker compose --env-file deploy.env -f docker-compose.yml logs --tail 200, or add a service name such as scanner or repo-service.

What you seeWhat to do
Installer says "Run as root"Run it with sudo.
"Docker daemon is not running"sudo systemctl start docker, then run the installer again.
The page won't load on port 80Check ps (is admin-ui running?), your cloud firewall or security group, and HTTP_PORT.
"403 Forbidden" for everyoneYour address isn't in ADMIN_ALLOW_CIDR. Add it, or remove the line, and re-apply.
Certificate setup failedThe DNS name must point at this server and port 80 must be open to the internet. The installer falls back to HTTP; fix it and run again.
Scans are paused, or Settings → License shows a problemCheck LICENSE_KEY is set and applied, and that the server can reach https://api.qorvertex.com; then click Refresh license. The message there says which it is. If it says the key is in use elsewhere, email us.
Scans stay queuedCheck the scanner log and that a Source Connection exists; restart the workers with sudo docker compose --env-file deploy.env -f docker-compose.yml restart scanner.
Logged out unexpectedlySessions last 12 hours by default (JWT_EXPIRES_IN). Log in again.

Still stuck? Email support@qorvertex.com with the details listed under Getting help.

Settings reference (deploy.env)

After changing a setting, re-apply with sudo docker compose --env-file deploy.env -f docker-compose.yml up -d.

SettingWhat it does
LICENSE_KEYYour license key. Required to scan.
BOOTSTRAP_ADMIN_EMAIL / _PASSWORDThe first admin, created on first start. Changing these later doesn't change an existing account.
TLS_ENABLED, TLS_DOMAIN, TLS_EMAILBuilt-in HTTPS (see above).
ADMIN_ALLOW_CIDROnly these address ranges may reach QorVertex.
HTTP_PORT / HTTPS_PORTHost ports (default 80 / 443).
AUTO_RESCAN_ENABLED, AUTO_RESCAN_POLL_MINUTESRescan repositories when their default branch changes (on, every 5 minutes).
JWT_EXPIRES_INHow long a login lasts (default 12h).
LOG_LEVELinfo by default; debug when support asks.
DB_HOST and other DB_*Point at your own PostgreSQL 16 instead of the bundled one.
DB_PASSWORD, JWT_SECRET, SERVICE_TOKEN, CREDENTIALS_KEYGenerated at install. Don't change them on a running install. Changing CREDENTIALS_KEY makes stored source-control tokens unreadable.