Deployment guide

Seal Report

Overview

Seal Report is a free, open source framework for producing database reports and dashboards. It connects to your SQL and NoSQL data sources and lets you design reports and dynamic dashboards from a metadata model, using LINQ and Razor templating. A Web Report Server publishes them through a browser interface.

Reports can pivot, chart, drill down and render as HTML, PDF, Excel or CSV. 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 SecureAnyCloud image builds the Seal Report 10.0 Web Report Server from the official open source (MIT-licensed) release. It runs 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 on port 80 is the only public entry point.

A unique administrator password is generated on the first boot of every VM. It is hashed into Seal's own configuration exactly the way Seal stores passwords, and the plain credentials are written to a root-only file, so no shared credential ships in the image.

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 only authenticates 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 nginx comes up only after the unique administrator password is generated on each virtual machine's first boot.

What you get:

  • Seal Report 10.0 Web Report Server, built from the official MIT licensed source and recorded in /opt/seal/VERSION
  • A systemd service that runs as the unprivileged seal system user with a hardened 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, hashed into the configuration and recorded in a root-only file
  • The shipped anonymous login, backdoor account and demo logins all removed
  • An unauthenticated /healthz endpoint for Azure Load Balancer health probes
  • A built-in self-test at /usr/local/bin/seal-report-selftest that proves the credential path end to end
  • An Ubuntu 24.04 LTS base with the latest security patches applied at build time, and the Ubuntu-native ASP.NET Core 10 runtime. Unattended security upgrades patch both
  • Azure Linux Agent for seamless cloud integration and SSH key injection
  • 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting point.

Configure the network security group (NSG) to allow inbound 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 interface 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 SecureAnyCloud, 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).

Choose Review + create, then Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:seal-report-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name seal-report \
  --image sac1647283583153:seal-report-ubuntu-24-04:default:latest \
  --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

Your VM generates a unique Seal Report administrator password on first boot and writes it to a root-only file. Read the 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 you open a browser, you can verify 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, which shows that 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, and there is no anonymous access. Enter admin and the password from your credentials file.

After you sign in, the report explorer opens. The folder tree is on the left and the reports of the selected folder are on the right.

Step 8 - Explore the sample reports

Expand Reports, then Samples, to see the bundled example reports: charts, cross tabs, gauges, cards, data tables and more. Select a report to open it, then choose Execute to render it.

The samples are a quick way to confirm that 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, then 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, and 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, get a certificate for <your-domain> from your CA or from Let's Encrypt via certbot, and proxy HTTPS to http://127.0.0.1:5000. Alternatively, add a server block for <your-domain> to the nginx site at /etc/nginx/sites-available/sac-seal-report.

Operating system and runtime updates. The base image is patched at build time and ships with unattended security upgrades enabled. 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 up that directory.

Service management. Use these commands:

systemctl status seal-report.service --no-pager
sudo journalctl -u seal-report.service -n 50 --no-pager

Support

SecureAnyCloud backs every image with 24/7 support and a guaranteed 24 hour response SLA. Contact sales@secureanycloud.com with the offer name and your VM details.

Seal Report is open source software distributed under the MIT License. The SecureAnyCloud charge covers packaging, hardening, security patching, image maintenance and support.

Deploy on Azure

Launch Seal Report 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

Deploy on Azure