Rill
Overview
Rill Data is an open-source operational business-intelligence tool. It builds fast, interactive dashboards directly from your data using an embedded DuckDB engine. You define a project as a few YAML and SQL files: a source, a metrics view (the semantic layer) and an Explore dashboard. Rill compiles them into a live, sub-second dashboard that you slice and dice in the browser.
This SecureAnyCloud image installs Rill 0.87.4 as the single rill binary at /usr/local/bin/rill and runs it as a dedicated rill system user. It includes a ready-made sample analytics project, so the UI shows real dashboards on first login.
What you get:
- Rill Data 0.87.4 at
/usr/local/bin/rill - A ready-made sample Rill project (a CSV source, an Orders metrics view and an Orders Explore dashboard) at
/var/lib/rill/sample - The Rill web UI behind an nginx reverse proxy on TCP
:80, with the listener bound to loopback - nginx HTTP Basic auth (Rill's local UI has no built-in authentication) with a unique per-VM web password, generated on first boot and stored in a root-only file
- A dedicated Azure data disk at
/var/lib/rillholding the project and the embedded DuckDB data, separate from the OS disk and re-provisioned with every VM - A loopback firewall guard, so the Rill runtime port
9009is reachable only from localhost rill.serviceandnginx.serviceas systemd units, enabled and active- 24/7 SecureAnyCloud support
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.
Standard_B2ms (2 vCPU / 8 GiB RAM) is a good starting size. Choose a larger size for bigger datasets and more concurrent users.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp for the web UI. For public exposure, front the UI with TLS (see Enabling HTTPS).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Rill Data by SecureAnyCloud, and select Create.
On the Basics tab, 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).
Review the dedicated data disk on the Disks tab, then select Review + create and Create.
Step 2 - Deploy from the Azure CLI
Accept the Marketplace terms once per subscription, create the VM and open port 80:
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:rill-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name rill \
--image sac1647283583153:rill-ubuntu-24-04:default:latest \
--size Standard_B2ms \
--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 rill --port 80 --priority 1010Step 3 - Connect to your VM
Connect over SSH as azureuser.
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
Check that both services are active:
systemctl is-active rill.service nginx.serviceBoth services report active. Rill compiles the sample project at startup and serves it within a few seconds.
Step 5 - Retrieve your web password
Your VM generates a unique admin password on first boot and writes it to a root-only file. Read it with sudo:
sudo cat /root/rill-credentials.txtThe file contains RILL_ADMIN_USER (admin), RILL_ADMIN_PASSWORD and the URL for the web UI. Store the password somewhere safe.
Step 6 - Check the health endpoint
nginx serves an unauthenticated health endpoint for load balancers and probes:
curl -s http://localhost/healthThe endpoint returns ok.
Step 7 - Open the Rill web UI
Browse to http://<vm-public-ip>/ and sign in as admin with the password from Step 5. Rill opens on the project home, which lists the sample dashboards and resources compiled from /var/lib/rill/sample.
Open the Orders Explore dashboard to see the embedded DuckDB engine in action. It shows a time series of revenue, headline metric cards and dimension breakdowns, all interactive and sub-second.
The project's metrics view is the semantic layer. It declares the dimensions and measures that the dashboard exposes. Open it from the file browser to see how Rill maps SQL expressions to dashboard metrics.
Back in the Explore dashboard, click a dimension (Region or Category) to slice every chart and metric by that value. Rill recomputes the whole dashboard against DuckDB instantly.
Step 8 - Inspect the sample project
The sample project is a small set of plain-text files on the data disk. You can read it and copy it as a template for your own project:
ls -R /var/lib/rill/sampleThe listing shows rill.yaml, the data/orders.csv source file, sources/orders.yaml (the CSV ingest), metrics/orders_metrics.yaml (the semantic layer) and dashboards/orders_explore.yaml (the Explore dashboard).
Step 9 - Look at the metrics view
The metrics view declares the time dimension, the dimensions you can slice by, and the measures that Rill aggregates. Print the file:
cat /var/lib/rill/sample/metrics/orders_metrics.yamlEach measure is a SQL expression, for example SUM(revenue) for total revenue. When you add a measure or dimension to this file, Rill hot-reloads the dashboard.
Step 10 - Build your own project
Rill is project-driven. Drop a CSV, Parquet or JSON file into a project's data/ directory, point a source at it, declare a metrics view over it and add an Explore dashboard. The sample project is a working template that you can copy:
sudo cp -r /var/lib/rill/sample /var/lib/rill/myproject
sudo chown -R rill:rill /var/lib/rill/myprojectNext, edit /etc/default/rill to point RILL_ARGS at /var/lib/rill/myproject, then run sudo systemctl restart rill. Rill recompiles the new project and serves it behind the same authentication.
Step 11 - Confirm data lives on the dedicated disk
The project and the embedded DuckDB data are stored on the dedicated Azure data disk, so they survive OS changes and can be resized independently. Confirm the mount:
findmnt /var/lib/rillA separate Azure data disk backs the mount. The disk is captured into the image and re-provisioned on every VM.
Enabling HTTPS
The nginx reverse proxy terminates plain HTTP on port 80. For public exposure, put a certificate in front of it.
The simplest approach is to add a DNS name for the VM and use the companion SecureAnyCloud nginx-ssl-certbot image as a TLS reverse proxy. Alternatively, install certbot and extend the existing nginx site with a listen 443 ssl; server block and your certificate paths.
Keep Rill itself bound to loopback, so the only public surface is the authenticated, TLS-terminated proxy.
Maintenance
- Configuration. The project path and listener flags are set in the
RILL_ARGSline of/etc/default/rill. Edit the file and runsudo systemctl restart rillto apply changes. - Backups. Snapshot the
/var/lib/rilldata disk, or copy your project directory (plain text plus data files) to Azure Blob Storage. - Upgrades. Replace
/usr/local/bin/rillwith a newer release and restart the service. - Security patches. unattended-upgrades stays enabled, so the OS keeps receiving security updates automatically.
Support
SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.
Rill is a trademark of Rill Data, Inc. SecureAnyCloud produces this image, which is not affiliated with or endorsed by the Rill Data project. Rill Data is distributed under the Apache License 2.0.
Deploy on Azure
Launch Rill Data 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
Overview
This image runs Rill, the open-source operational business-intelligence tool for building fast, interactive dashboards directly from your data. Rill pairs a code-first data modelling workflow with an embedded DuckDB engine. You define sources and metrics as simple configuration files and explore the results in a live dashboard with sub-second queries, with no separate data warehouse or BI server to stand up.
What you get:
- Rill 0.87.4 installed as the single
rillbinary at/usr/local/bin/rill, running as a dedicated unprivilegedrillsystem account under a systemd service that starts on boot and restarts on failure - A ready-made sample project, so the web console shows a real dashboard as soon as the instance is ready (the service runs
rill startagainst it) - A dedicated, independently resizable EBS data volume mounted at
/var/lib/rill, holding the sample project, the embedded DuckDB storage and the Rill runtime home, so your dashboards and data survive instance replacement - The Rill listener bound to loopback on
127.0.0.1:9009, behind an nginx reverse proxy on port 80 that enforces HTTP Basic authentication (Rill's local interface ships without authentication) - A defence-in-depth firewall rule that drops any off-box traffic to the application port
- A unique admin password generated on the first boot of every deployed instance, so two instances launched from the same Amazon Machine Image never share a password, written to
/root/rill-credentials.txtwith mode 0600 so only the root user can read it - An unauthenticated
/healthendpoint served by nginx for health checks
Prerequisites
Before you deploy this image, you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network and port 80 for the web console
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line
Launch the instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images, choose AWS Marketplace AMIs and search for Rill. Select the SecureAnyCloud listing, choose Select, then choose Continue on the subscription summary.
Pick an instance type of m5.large or larger. Choose your EC2 key pair under Key pair (login). Under Network settings, select your VPC and subnet, then create or select a security group that opens port 22 from your management network and port 80 for the web console. Leave the root volume at the default size or larger.
Select Launch instance. First-boot initialisation generates the admin password and writes the nginx credential store. The web console is ready shortly after the instance state becomes Running and the status checks pass.
Launch the instance from the AWS CLI
The following command launches an instance from the SecureAnyCloud Rill Marketplace AMI into an existing subnet and security group.
Replace <ami-id> with the AMI ID shown on the Marketplace listing, <key-name> with your EC2 key pair name, <subnet-id> with your subnet ID, and <security-group-id> with a security group that opens ports 22 and 80 as described above.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=rill}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name. You can find it in the EC2 console or with aws ec2 describe-instances.
Connect to your instance
Connect over SSH using your key pair and the login user for your operating system variant. For Ubuntu 24.04, the SSH login user is ubuntu.
ssh -i <key-name>.pem ubuntu@<public-ip>Retrieve the admin password
The web console is protected by HTTP Basic authentication with the user admin. Each instance generates a unique password on first boot and writes it to a root-only file. Read it with sudo:
sudo cat /root/rill-credentials.txtThe file records the sign-in URL, the user admin and the generated RILL_ADMIN_PASSWORD. Store the password in your own secret manager. It is unique to this instance, and no default login ships in the image.
Sign in to the Rill web console
In a browser, go to http://<instance-public-ip>/. When the browser prompts for HTTP Basic authentication, sign in as admin with the password from the previous step. Rill opens on the bundled SecureAnyCloud Sample Analytics project.
The left sidebar is the project workspace. The sources and models folders shape your data, metrics defines the semantic layer of dimensions and measures, and dashboards holds the interactive Explore dashboards. Open the dashboards folder and select orders_explore to open the sample dashboard.
Explore the sample dashboard
The sample project models a month of e-commerce orders. It exposes four measures (Total Revenue, Total Orders, Units Sold and Average Order Value) over three dimensions (Region, Category and Channel).
Use the time range selector at the top to change the window. Click a dimension value in a leaderboard to filter every measure by it, and use the comparison controls to compare periods.
Switch to the Pivot view to build a cross-tabulation of any measures against any dimensions and time grains, and export the result.
Build a dashboard from your own data
Rill is a code-first tool. A project is a directory of YAML and SQL files under /var/lib/rill. To point Rill at your own data, add a source, model it and describe a metrics view. Rill then generates the Explore dashboard.
- In the workspace, use Add to create a new source, or drop a Parquet, CSV or NDJSON file into the project. You can also connect to ClickHouse, S3, GCS or Snowflake from the connectors panel.
- Shape the source with a SQL model if needed.
- Create a metrics view that names your timeseries column, your dimensions and your measures.
- Open the Explore dashboard that Rill generates over the metrics view, and refine it.
The sample project under /var/lib/rill/sample is a complete, working example of this structure. It contains a source (sources/orders.yaml), a metrics view (metrics/orders_metrics.yaml) and an Explore dashboard (dashboards/orders_explore.yaml) that you can copy and adapt.
Security Model
Rill's local runtime has no built-in authentication, so this image layers two controls in front of it:
- HTTP Basic authentication at the edge. nginx on port 80 requires the
adminuser and the per-instance password (stored in/etc/nginx/.htpasswd) before it proxies any request to Rill. The unauthenticated/healthendpoint is the only exception. - Loopback binding and a firewall guard. The Rill runtime is reached only on
127.0.0.1:9009. A systemd-managed nftables rule (rill-loopback-guard.service) drops any packet to port 9009 that does not arrive on the loopback interface. The runtime is therefore unreachable off-box even if the port were bound to all interfaces, independent of your security group.
Keep your EC2 security group tight. Expose port 22 only to your management network, and expose port 80 (and 443 once you add TLS) only to the clients that need the console.
Enable HTTPS
Terminate TLS in front of nginx for any public exposure. The simplest approach is to put the instance behind an Application Load Balancer with an AWS Certificate Manager certificate, forwarding to port 80.
Alternatively, install a certificate directly in nginx and add a listen 443 ssl; server block. In either case, open port 443 in the security group.
The Data Volume
The sample project, the embedded DuckDB storage and the Rill runtime home live on a dedicated EBS volume mounted at /var/lib/rill. The volume is formatted ext4 and referenced in /etc/fstab by its filesystem UUID, so it re-attaches reliably.
Because the volume is separate from the operating system disk, you can grow it independently. Expand the EBS volume in the AWS console, then grow the filesystem on the instance with sudo resize2fs /dev/nvme1n1 (confirm the device with lsblk).
Managing the Service
Rill runs under systemd. Use these commands to manage it:
sudo systemctl status rill.service
# application status
sudo systemctl restart rill.service
# restart Rill
sudo journalctl -u rill.service -f
# follow the logs
sudo systemctl status nginx.service
# the reverse proxySupport
Every SecureAnyCloud image is backed by 24/7 technical support by email and chat. We help with deployment, connecting your own data sources, authoring metrics views and dashboards, authentication, TLS and reverse-proxy configuration, and storage sizing. Contact sales@secureanycloud.com.
Rill is licensed under the Apache License 2.0. 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 AWS
Launch Rill on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com