Seal Report on Ubuntu 24.04 on Azure User Guide
Overview
Seal Report is a free, open source framework for producing database reports and dashboards. It connects to your SQL and NoSQL data sources, lets you design reports and dynamic dashboards from a metadata model with LINQ and Razor templating, and publishes them through a Web Report Server with a browser interface. Reports can pivot, chart, drill down and render as HTML, PDF, Excel or CSV, and a task scheduler can run them on a schedule and distribute the results by email or to a folder. A repository of shared connections and elements lets report authors reuse data definitions across many reports.
This cloudimg image builds the Seal Report 10.0 Web Report Server from the official open source (MIT licensed) release and runs it under systemd as the unprivileged seal system user on Ubuntu's native .NET 10 runtime. Seal listens on the loopback address 127.0.0.1:5000 only, and an nginx reverse proxy fronts it on port 80, which is the only public entry point. A unique administrator password is generated on the first boot of every VM, hashed into Seal's own configuration exactly the way Seal stores passwords, and written to a root only file, so no shared credential ships in the image. Backed by 24/7 cloudimg support.
Secure by default. A stock Seal Report demo repository ships a security script that lets a blank user name sign in anonymously, a hardcoded backdoor account, and a set of demo logins. This image does not ship in that state. The security script is replaced with one that does nothing but authenticate a real login, every demo account is removed, and a single administrator is defined in a full rights group. Seal is bound to loopback behind nginx, and that public entry point is only brought up after a unique administrator password is generated on each virtual machine's first boot. The password is stored as a salted hash, so the plain value never remains in the configuration; the plain credentials are placed in a root only file for the administrator to read.
What is included:
- Seal Report 10.0 Web Report Server, built from the official MIT licensed source and recorded in
/opt/seal/VERSION - Run under systemd as the unprivileged
sealsystem user with a hardened service sandbox (NoNewPrivileges,PrivateTmp,ProtectSystem=full,ProtectHome) - Seal bound to the loopback address
127.0.0.1:5000, with nginx on port 80 as the only public listener - A unique administrator password generated on first boot and recorded in a root only file, hashed into the configuration
- The shipped anonymous login, backdoor account and demo logins all removed
- An unauthenticated
/healthzendpoint for Azure Load Balancer health probes - A built in self test at
/usr/local/bin/seal-report-selftestthat proves the credential path end to end - Ubuntu 24.04 LTS base with the latest security patches applied at build time and the Ubuntu native ASP.NET Core 10 runtime, both patched by unattended security upgrades
- Azure Linux Agent for seamless cloud integration and SSH key injection
- 24/7 cloudimg support with a guaranteed 24 hour response SLA
Prerequisites
An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting point. NSG inbound rules: allow 22/tcp from your management network for SSH and 80/tcp for the Web Report Server. Seal reaches your databases over their own outbound ports, so no other inbound port is required. The Web UI is served over plain HTTP on port 80; for production, terminate TLS in front of it with your own domain (see Maintenance).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Seal Report by cloudimg, and select Create. On Basics pick your subscription, resource group, region and size; under Administrator account choose SSH public key and paste your key; under Inbound port rules allow SSH (22) and HTTP (80). Then Review + create -> Create.
Step 2 - Deploy from the Azure CLI
az vm create \
--resource-group <your-rg> \
--name seal-report \
--image <marketplace-image-urn> \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name seal-report --port 80 --priority 1010
Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>
Step 4 - Confirm the services are running
systemctl is-active seal-report.service nginx.service
Both report active. Seal Report serves its Web Report Server on the loopback address 127.0.0.1:5000, and nginx fronts it on port 80. Because Seal is bound to loopback, it is never reachable directly from the network; the only public path is nginx.
active
active

Step 5 - Retrieve your admin login
The Seal Report administrator password is generated uniquely on the first boot of your VM and written to a root only file:
sudo cat /root/seal-report-credentials.txt
This file contains SEAL_REPORT_URL, SEAL_REPORT_ADMIN_USER (which is admin) and SEAL_REPORT_ADMIN_PASSWORD. The administrator password signs you in to the Web Report Server. Store it somewhere safe.

Step 6 - Confirm the login round trip from the command line
Before opening a browser you can prove the appliance end to end. The unauthenticated health endpoint answers without a credential, a blank (anonymous) login is refused, and the shipped self test signs in with the real per VM password:
curl -s http://127.0.0.1/healthz
ok
curl -s -X POST --data-urlencode "user=" --data-urlencode "password=" http://127.0.0.1/SWILogin
The anonymous login is rejected - authentication is enforced:
{"error":"Invalid user name or password","authenticated":false}
sudo /usr/local/bin/seal-report-selftest
OK

Step 7 - Sign in to the Web Report Server
Open http://<vm-public-ip>/ in a browser. Seal Report presents a login prompt - there is no anonymous access. Enter admin and the password from your credentials file.

After signing in you land on the report explorer, with the folder tree on the left and the reports of the selected folder on the right.

Step 8 - Explore the sample reports
Expand Reports -> Samples to see the bundled example reports - charts, cross tabs, gauges, cards, data tables and more. Select any report to open it, then use Execute to render it. These samples are a quick way to confirm the server renders reports and to learn the report model before you point Seal at your own databases.

Step 9 - Review the data sources
Select the Sources node to see the data sources the repository ships with, including the bundled offline Northwind sample and connection templates for SQL Server, PostgreSQL, MySQL, Oracle, SQLite and MongoDB. From here you connect Seal to your own databases and build your metadata model. To add a new source and design new reports, use the Seal Report Server Manager and Report Designer (the Windows design tools) against this repository, or edit the repository files directly.

Step 10 - Review the security posture
You can confirm the hardening at any time. Only the admin login exists (the shipped demo logins are gone), the server runs as the unprivileged seal user, and the runtime is the Ubuntu native ASP.NET Core 10 shared framework:
grep -oE "<Id>[a-z]+</Id>" /var/lib/seal/Repository/Security/Security.xml | sort -u
<Id>admin</Id>
ps -o user= -C dotnet | sort -u
seal

Maintenance
Change the administrator password. The password is stored as a salted hash in /var/lib/seal/Repository/Security/Security.xml. To rotate it, generate a new hash with the shipped helper and restart the service:
sudo /usr/local/sbin/seal-report-set-admin-password.py \
/var/lib/seal/Repository/Security/Security.xml '<your-new-password>'
sudo chown seal:seal /var/lib/seal/Repository/Security/Security.xml
sudo systemctl restart seal-report.service
Update /root/seal-report-credentials.txt to match, then keep it safe.
Terminate TLS for production. The Web Report Server is served over plain HTTP on port 80. For production, place your own TLS certificate in front of it - for example with a certificate for <your-domain> from your CA or Let's Encrypt via certbot - and proxy HTTPS to http://127.0.0.1:5000, or add a server block for <your-domain> to the nginx site at /etc/nginx/sites-available/cloudimg-seal-report.
Operating system and runtime updates. The base image ships fully patched with unattended security upgrades enabled, and the ASP.NET Core 10 runtime is the Ubuntu native package, so it receives security updates from the OS. Reports, data sources and security settings live under /var/lib/seal/Repository; back that directory up.
Service management.
systemctl status seal-report.service --no-pager
sudo journalctl -u seal-report.service -n 50 --no-pager
Support
Every cloudimg image is backed by 24/7 support with a guaranteed 24 hour response SLA. Contact support@cloudimg.co.uk with the offer name and your VM details. Seal Report is open source software distributed under the MIT License; the cloudimg charge covers packaging, hardening, security patching, image maintenance and support.