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
ackeeuser, started on boot and restarted on failure - The Ackee dashboard and tracking API on
:80(nginx reverse proxy to127.0.0.1:3000) - A per-VM
adminaccount (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.serviceandnginx.serviceas enabled, active systemd units- An unauthenticated
/healthzendpoint 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 1010Step 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.txtAckee 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/ackeeMaintenance
- Back up your analytics data. Everything Ackee stores lives in MongoDB's data files under
/var/lib/ackee. Snapshot the data disk, or usemongodumpandmongorestorefor 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 runsudo systemctl restart ackeeto 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