Deployment guide

Ackee

Overview

Ackee is an open source, self-hosted web analytics tool that does not use cookies. It is a privacy-friendly alternative to trackers such as Google Analytics, and it shows pageviews, referrers and devices in a clean real-time dashboard without tracking or fingerprinting individual visitors.

This SecureAnyCloud image runs Ackee 3.6.0 on Ubuntu 24.04 LTS. Ackee is built from source and runs from /opt/ackee on the Node.js 24 LTS runtime, under an unprivileged ackee system account. A local MongoDB 8.0 Community database stores the analytics data for every domain. Ackee listens on 127.0.0.1:3000 only, and nginx forwards requests to it from port 80.

What you get:

  • Ackee 3.6.0 built from source and run by systemd as the unprivileged ackee user, started on boot and restarted on failure
  • The Ackee dashboard and tracking API on :80 (nginx reverse proxy to 127.0.0.1:3000)
  • A per-VM admin account (username and password) set on first boot and recorded in a root-only file
  • MongoDB 8.0 Community, bound to loopback, with its data directory on a dedicated Azure data disk at /var/lib/ackee
  • mongod.service, ackee.service and nginx.service as enabled, active systemd units
  • An unauthenticated /healthz endpoint for Azure Load Balancer health probes
  • 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_B2s (2 vCPU / 4 GiB RAM) is a sensible starting size. Choose a larger size for sites with heavy traffic.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp for the dashboard and tracking script. Ackee serves plain HTTP on port 80, so for production terminate TLS in front of it with your own domain. Browsers increasingly require HTTPS for pages that embed third-party scripts.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Ackee 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 (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:ackee-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name ackee \
  --image sac1647283583153:ackee-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 ackee --port 80 --priority 1010

Step 3 - Connect to your VM

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

Ackee is served by nginx on port 80. nginx proxies to the Node.js app on 127.0.0.1:3000, which talks to MongoDB on 127.0.0.1:27017. Confirm that all three services are active and that nginx is listening on port 80:

systemctl is-active mongod ackee nginx ackee-firstboot
sudo ss -tlnp | grep -E ':80 |:3000 |:27017 '

Expected output:

active active active active LISTEN 0 4096 127.0.0.1:27017 0.0.0.0:* users:(("mongod",pid=...)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=...)) LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=...)) LISTEN 0 511 *:3000 *:* users:(("MainThread",pid=...))

Step 5 - Retrieve your admin password

On the first boot of every VM, ackee-firstboot.service generates a unique password for the admin account. It writes the password, the admin username and the dashboard URL to a root-only file. Read the file with:

sudo cat /root/ackee-credentials.txt

Ackee keeps no stored account record. It checks the username and password against its own process environment on every sign-in attempt, so the credentials in this file are always the current ones for this VM.

Step 6 - Confirm the stack and health endpoint

nginx serves an unauthenticated /healthz endpoint for load balancer probes. Check the Node.js and MongoDB versions and confirm that the dashboard responds:

node -v mongod --version | head -1 curl -sI http://127.0.0.1/healthz | head -1 curl -s http://127.0.0.1/ | grep -o '<title>[^<]*</title>'

Expected output:

v24.18.0 db version v8.0.26 HTTP/1.1 200 OK <title>Ackee</title>

Step 7 - Sign in to the dashboard

Browse to http://<vm-public-ip>/. Enter admin and the password from Step 5.

Step 8 - Add your first domain

After you sign in, open Settings from the top navigation and find the Domains section. Click New domain, enter a title (for example example.com), and click Add.

Step 9 - Read the dashboard overview

The Overview page is the default view after you sign in. It aggregates pageviews, durations, pages, referrers, systems, devices, browsers, sizes and languages across every domain you track. All data is anonymous and aggregated, and no per-visitor identifiers are stored.

The page updates as traffic arrives, once you add the tracking script to your site.

Step 10 - View a domain's detail

Open the Domains dropdown in the top navigation and select a domain. The page shows the same cards as the Overview page, scoped to that site alone.

Step 11 - Get the tracking code and manage domain settings

In Settings, click the domain (listed by its id) to reopen it. The page shows the domain's title, its id and its Embed code. Paste the <script> tag from the embed code into your site, right before the closing </body> tag. You can also rename or delete the domain here.

Ackee sets no cookies and stores no personal data, so most sites do not need a cookie banner for it. Check your own compliance requirements to be sure.

<script async src="http://<vm-public-ip>/tracker.js" data-ackee-server="http://<vm-public-ip>" data-ackee-domain-id="<your-domain-id>"></script>

Step 12 - Confirm analytics data lives on the dedicated disk

All MongoDB data, including every domain, pageview, referrer and device record, lives under /var/lib/ackee. This is a dedicated Azure data disk, captured into the image and re-provisioned on every VM. Confirm the mount:

df -h /var/lib/ackee | tail -1 sudo ls /var/lib/ackee/mongodb | head -5 findmnt -no SOURCE,TARGET,FSTYPE /var/lib/ackee

Maintenance

  • Back up your analytics data. Everything Ackee stores lives in MongoDB's data files under /var/lib/ackee. Snapshot the data disk, or use mongodump and mongorestore for logical backups.
  • Add more domains. Sign in as admin and click Create domain for each site you want to track.
  • Rotate credentials. The admin username and password live in the Ackee process environment at /opt/ackee/.env. Edit that file, then run sudo systemctl restart ackee to apply the change.
  • Apply security updates. Unattended security upgrades are enabled, so the OS stays patched. Reboot when a new kernel is installed.
  • Add TLS. For production, put Ackee behind your own domain and a TLS-terminating reverse proxy or Azure Application Gateway. Most browsers restrict third-party scripts on plain HTTP pages.

Support

SecureAnyCloud provides 24/7/365 expert technical support for this image. Contact sales@secureanycloud.com. Ackee is licensed under the MIT License. Additional charges apply for the image build, maintenance and 24/7 support.

Deploy on Azure

Launch Ackee 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