Ortelius
Overview
Ortelius is an open source software supply chain intelligence platform and a Continuous Delivery Foundation project. It ingests Software Bills of Materials (SBOMs) at build time and matches every deployed component against the OSV.dev vulnerability database on a 15 minute refresh cycle. It tracks each CVE across its full lifecycle, from the moment a release introduces it, through detection in a running environment, to remediation.
This SecureAnyCloud image installs Ortelius v12.0.515 (the Go/Fiber backend API) and its companion frontend v12.0.1632 (Next.js) from the official upstream source on Ubuntu 24.04, with all data held in ArangoDB 3.12. All three run on a single VM as native systemd services, with no Docker or compose layer at runtime.
What you get:
- Ortelius v12.0.515 (Go/Fiber API) and frontend v12.0.1632 (Next.js dashboard), holding data in ArangoDB 3.12
ortelius-backend.serviceserving the REST and GraphQL API on port 3000ortelius-frontend.serviceserving the web dashboard on port 8080arangodb3.serviceholding every release, SBOM, CVE and dependency-graph record, bound to127.0.0.1:8529and never exposed to the network- Continuous CVE matching against the OSV.dev vulnerability database (15 minute refresh)
- A multi-organization dashboard with MTTR and SLA tracking, vulnerability trends and NIST framework alignment
- A per-instance ArangoDB password, JWT signing key, token-encryption key and administrator password, generated on first boot and documented in
/root/ortelius-credentials.txt(mode 0600) - GitHub App integration for connecting your own repositories, plus favorite-by-name for public repositories
- A Welcome page that shows real tracked-component data from your first sign-in, because first boot adds the
ortelius/orteliusrepository as a system Favorite - Ubuntu 24.04 LTS base, patched at build time
- 24/7 SecureAnyCloud support, with a 1 hour average response for critical issues
Open both ports. Both 3000 and 8080 must be reachable from wherever you use the dashboard. The browser calls the API directly, and the frontend server does not proxy it.
Security by design: the image has no administrator account. Instead of shipping a default login to rotate later, this image ships no usable credential, no database schema and no signing keys at all. On the first boot of every VM, a one-shot service does the following:
- Rotates ArangoDB's root password from empty to a unique per-VM value and enables database authentication.
- Generates a unique JWT signing key and token-encryption key.
- Creates the schema and the administrator account.
- Proves through the real login API that the new
adminaccount signs in with its uniquepassword, and that the common defaults admin, password,changeme,admin123,orteliusand a blank password are all rejected. - Writes
/root/ortelius-credentials.txt(mode 0600, root only).
Upstream ships a hardcoded JWT signing key, and this image does not. The Ortelius backend source hardcodes a JWT signing key ("your-secret-key-change-this-in-production"). It also exposes a SetJWTSecret() function to override that key, but upstream's own main.go never calls it. This image's backend is built from a small patch that wires the function up to a required JWT_SECRET environment variable. The backend refuses to start without a per-VM signing key, so no SecureAnyCloud Ortelius instance can sign a session with the publicly known default.
First boot also proves that this system Favorite renders in the authenticated catalog before it declares itself done. When you sign in, you can see how favoriting a repository works before you do it yourself.
Prerequisites
- An active Azure subscription, an SSH public key, and a VNet and subnet in the target region
- A subscription to the Ortelius listing on the Azure Marketplace
- Network Security Group rules that allow TCP 22 (administration), TCP 8080 (the web dashboard) and TCP 3000 (the API) from the networks that need them. The dashboard's browser-side calls reach port 3000 directly.
- Outbound internet access from the VM. The backend verifies favorited repositories against the GitHub and GitLab public APIs, and matches components against OSV.dev.
Deploy from the Azure Portal
Search the Azure Marketplace for Ortelius, select the SecureAnyCloud publisher, and select Create.
Choose Standard_B2ms or larger. ArangoDB and a persistent Next.js server benefit from the extra headroom over Standard_B2s.
Configure the Network Security Group to allow TCP 8080 (dashboard) and TCP 3000 (API) from your administrative networks, and TCP 22 for administration. Port 3000 is required because the browser talks to the API directly. ArangoDB stays on loopback and is never exposed.
Deploy from the Azure CLI
Run the following to create the network resources, accept the Marketplace terms and create the VM:
RG="ortelius-prod"; LOCATION="eastus"; VM_NAME="ortelius-01" IMAGE_URN="sac1647283583153:ortelius:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name ortelius-vnet --address-prefix 10.93.0.0/16 --subnet-name ortelius-subnet --subnet-prefix 10.93.1.0/24 az network nsg create -g "$RG" --name ortelius-nsg az network nsg rule create -g "$RG" --nsg-name ortelius-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name ortelius-nsg --name allow-dashboard --priority 110 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 8080 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name ortelius-nsg --name allow-api --priority 120 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 3000 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:ortelius:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2ms --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name ortelius-vnet --subnet ortelius-subnet --nsg ortelius-nsg --public-ip-sku StandardFirst boot and your credentials
On first boot the image rotates ArangoDB's root password and enables database authentication. It generates this VM's JWT signing key, token-encryption key and administrator password, and starts the API and dashboard. It also adds the ortelius/ortelius repository as a proof-of-life Favorite, and verifies that the new administrator password works and that common defaults are rejected. This completes in seconds.
SSH in as azureuser and read the details:
sudo cat /root/ortelius-credentials.txtThe file is mode 0600 and owned by root, so only a privileged user can read it. It contains the dashboard URL, the API URL, the administrator username and password, and the ArangoDB root password.
Confirm the appliance is running
All three services should report active. The ss command confirms that the API and dashboard are listening while ArangoDB is bound to loopback only. The Apache-2.0 licence text ships in the image.
systemctl is-active arangodb3.service ortelius-backend.service ortelius-frontend.service ss -tln 2>/dev/null | grep -E ':(3000|8080|8529) ' head -3 /usr/share/doc/ortelius/LICENSEYou can prove the same login from the command line. The script below logs in through the API with the per-VM password and confirms that every common default credential is rejected. It then proves the core catalog function end to end by creating and listing a tracked repository:
sudo /usr/local/sbin/ortelius-roundtrip.shSign in to the web dashboard
Browse to http://<your-vm-public-ip>:8080/. The Ortelius sign-in form appears. Unauthenticated visitors can still browse public repository vulnerability data, under the banner "You are viewing public open source repositories. Sign In or Sign Up to see your organization data."
Sign in with the username admin and the password from the credentials file. You land on the Organizations view. It shows the ortelius organization that the first-boot proof-of-life repository created automatically, with its release count, vulnerability status and dependency count.
Explore the Welcome page and your first tracked repository
Open Welcome, either from the onboarding banner or at /welcome. First boot already added ortelius/ortelius as a proof-of-life Favorite, so you land on real data instead of an empty screen.
This is the core of what Ortelius does: it turns a tracked repository into a populated entry in the vulnerability catalog.
Track your own repositories
There are two ways to add repositories to the catalog:
- Connect GitHub (recommended for your own repositories): select Connect GitHub Account, authorize the Ortelius GitHub App, and choose which repositories, public or private, to grant it access to.
- Favorite a public repository by name: search by
owner/repofor something you run in production (the form suggestsnginx,curlandredis), select Search, then Favorite the result. This is useful for public repositories you do not have GitHub access to yourself.
curl -s -b <(sudo bash -c 'echo "auth_token=<your session token>"') \
-H 'Content-Type: application/json' \
-d '{"provider":"github","owner":"<owner>","name":"<repo>"}' \
http://<vm-ip>:3000/api/v1/tracked-reposCVE matching depends on SBOM data reaching a release. Connecting or favoriting a repository creates a release record, but it does not attach an SBOM immediately.
For fully automated SBOM and Scorecard collection, you can deploy the companion relscanner-job CronJob separately. It is not part of this image. It scans every tracked repository on a 15 minute schedule and attaches SBOMs through OCI attestations, Cosign, GitHub Release assets, or Syft and cdxgen generation.
Review the dashboard
Once your organization has release and SBOM data, these views are available:
- Dashboard ("The Posture") shows Mean Time To Remediate, SLA compliance by severity (Critical 15 days, High 30 days, Medium 90 days, Low 180 days), 180-day vulnerability trend analysis, and NIST SP 800-53/800-137/800-190/800-218 alignment.
- Synced Endpoints ("Where It's Running") shows where deployed software is running: Kubernetes, Docker, VM or serverless.
- Project Releases ("Where to Fix It") tracks vulnerabilities by release version.
User management and RBAC
Sign in as admin and open User Management to review accounts, or System Settings for application configuration.
The Ortelius role hierarchy is owner, admin, editor, viewer, scoped per organization. You can apply RBAC configuration as GitOps-style YAML through the API.
Back up your data
The entire catalog lives in ArangoDB's vulnmgt database: releases, SBOMs, CVEs, endpoints and the dependency graph. Take a logical backup with arangodump on a schedule that suits your rate of change:
sudo arangodump --server.username root --server.password "<arangodb-root-password-from-credentials-file>" \
--server.database vulnmgt --output-directory "/root/ortelius-backup-$(date +%Y%m%d)"Store the dump off the VM, for example in Azure Blob Storage, on another host or in your existing backup pipeline. To restore, run arangorestore against an empty vulnmgt database.
Add a TLS certificate for your own domain
The image serves HTTP only, on both the API (3000) and dashboard (8080) ports. If you point a domain at this VM, put a reverse proxy (nginx, Caddy or an Azure Application Gateway) in front of both ports with your own TLS certificate.
Then set RUNTIME_REST_ENDPOINT / RUNTIME_GRAPHQL_ENDPOINT in /etc/ortelius/frontend.env and CORS_ALLOWED_ORIGINS in /etc/ortelius/backend.env to your HTTPS domain, and restart both services. The browser calls the API origin directly, so both files must agree on the externally visible address.
Change the administrator password
In the Ortelius UI, open Profile to change your password. To rotate it through the API instead, run:
curl -s -b <(echo "auth_token=<your session token>") -H 'Content-Type: application/json' \
-d '{"old_password":"<current>","new_password":"<new-strong-password>"}' \
http://<vm-ip>:3000/api/v1/auth/change-passwordTroubleshooting
Cannot reach the dashboard right after first boot. First boot completes in seconds. If you connect immediately after VM creation, wait a few seconds and retry. Both ortelius-backend.service and ortelius-frontend.service start only once the bootstrap marker exists. Check progress with:
systemctl status ortelius-firstboot.service journalctl -u ortelius-firstboot.service --no-pagerSign-in fails with "Invalid credentials" even though the password is right. Confirm that you reach the dashboard on the same origin that the API's CORS_ALLOWED_ORIGINS allows. By default this is the VM's own public IP.
A different hostname, a different IP, or a reverse SSH tunnel on a different local port changes the browser's Origin header. The API's CORS policy then rejects the request, and the frontend shows an "Invalid credentials" message instead of a network error.
Forgot the administrator password. SSH in and read /root/ortelius-credentials.txt again, or rotate the password through the API as described in Step 12.
Favoriting a repository returns "not found". Before tracking a repository, the backend verifies that it exists with a real GitHub or GitLab API call. Confirm the owner/repo spelling and that nothing blocks outbound internet access from the VM.
Need to recover a secret. The ArangoDB root password is also stored in /root/ortelius-credentials.txt. Ortelius itself never displays it again after first boot.
Support
SecureAnyCloud provides 24/7 technical support for this Ortelius image by email (sales@secureanycloud.com) and live chat. Support covers:
- Deployment and first-boot configuration
- Signing in and rotating the administrator password
- GitHub integration and repository connection
- Organization and RBAC setup
- ArangoDB backup and restore
- Ortelius version upgrades
- Troubleshooting
Critical issues receive a 1 hour average response time.
Ortelius is free software licensed under the Apache License, Version 2.0, and is a Continuous Delivery Foundation project. All product and company names are trademarks or registered trademarks of their respective holders. Their use does not imply any affiliation with or endorsement by them.
Deploy on Azure
Launch Ortelius on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com