How to Self-Host Umami: A Step-by-Step Guide to Privacy-Focused Web Analytics (With Docker Setup)

Amit WaniAmit Wani
3 min read

Umami is a simple, privacy-focused, open-source web analytics solution. It’s lightweight, doesn’t rely on cookies, and offers clean, insightful dashboards — making it a great alternative to tools like Google Analytics if you’re serious about privacy and data ownership.

In this guide, we’ll walk through how to self-host Umami on your server, both manually and using Docker. Whether you prefer fine-grained control or a quick containerized deployment, you’ll find everything you need here.

🚀 Why Self-Host Umami?

  • Data Privacy: You control your analytics data.

  • Lightweight: Fast and minimal resource consumption.

  • No Tracking Consent Needed: Since Umami doesn’t use cookies or collect personal data.

  • Open-Source: Free to use and customizable.

Manual Setup Guide for Umami

🛠️ Prerequisites

  • A Linux-based server (Ubuntu recommended)

  • Node.js (v18.18 or newer)

  • MySQL (v8+) or PostgreSQL (v12+)

  • Nginx (for reverse proxy)

  • Domain name (optional but recommended)

1️⃣ Install Dependencies

Node.js & npm

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
npm -v

Database (PostgreSQL Example)

sudo apt update
sudo apt install postgresql postgresql-contrib
sudo -u postgres psql
CREATE DATABASE umami;
CREATE USER umami WITH ENCRYPTED PASSWORD 'strongpassword';
GRANT ALL PRIVILEGES ON DATABASE umami TO umami;

2️⃣ Install Umami

git clone https://github.com/umami-software/umami.git
cd umami
npm install
cp .env.example .env

Edit your .env file to include your database credentials:

DATABASE_URL=postgresql://umami:strongpassword@localhost:5432/umami
HASH_SALT=some-random-salt-value

3️⃣ Build and Start Umami

npm run build
npm start

(Optional) Use PM2 to keep the app running:

npm install pm2 -g
pm2 start npm --name umami -- start
pm2 save
server {
    server_name analytics.yourdomain.com;
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Don’t forget SSL! Use Let’s Encrypt or another certificate provider.

⚓ Docker Setup Guide for Umami

If you want a quicker and easier deployment option, Docker is your friend!

🛠️ Prerequisites

  • Docker

  • Docker Compose (optional, but helpful)

  • A server (local or cloud)

1️⃣ Clone the Repository

git clone https://github.com/umami-software/umami.git
cd umami

2️⃣ Modify Docker Environment Variables

Rename and edit the .env file:

cp .env.example .env

Modify the following variables as needed (Postgres example):

DATABASE_URL=postgresql://umami:strongpassword@db:5432/umami
HASH_SALT=some-random-salt-value

3️⃣ Create the Docker Compose File

Here’s a sample docker-compose.yml for Umami with PostgreSQL:

version: '3'

services:
  db:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: strongpassword
    volumes:
      - umami-db-data:/var/lib/postgresql/data

  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    restart: always
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:strongpassword@db:5432/umami
      HASH_SALT: some-random-salt-value
    depends_on:
      - db

volumes:
  umami-db-data:

4️⃣ Start the Containers

Run the following command to spin up the services:

docker-compose up -d

5️⃣ Access Your Umami Instance

Visit http://your-server-ip:3000 or your configured domain.

Default login credentials:

Username: admin
Password: umami

Make sure to change your password immediately after logging in!

Add an Nginx reverse proxy and set up SSL for your Docker deployment too! Same as the manual setup Nginx block above.

✅ Conclusion

That’s it! You’ve successfully self-hosted Umami either manually or using Docker. You now have a privacy-first analytics solution where you own your data and keep your users’ privacy intact.

For more information or advanced configurations, refer to the official Umami documentation: https://umami.is/docs

💡 What’s Next?

  • Connect your websites by adding the Umami script:
<script async defer data-website-id="YOUR-WEBSITE-ID" src="https://analytics.yourdomain.com/script.js"></script>
  • Create custom reports and share dashboards.

  • Explore advanced tracking options with events and goals.

👉 Have questions or feedback? Drop them in the comments!

👉 Like the post if you found it helpful!

0
Subscribe to my newsletter

Read articles from Amit Wani directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Amit Wani
Amit Wani

𝗪𝗔𝗥𝗥𝗜𝗢𝗥! Full Stack Developer | SDE Reliance Jio 🖥️ Tech Enthusiastic 💻 Man Utd 🔴 Sachin & Dravid fan! ⚾ Photography 📸 Get Hands Dirty on Keyboard!