umami/README.md
2025-12-03 22:22:06 -08:00

7.9 KiB

Umami Logo

Umami

Umami is a simple, fast, privacy-focused alternative to Google Analytics.

GitHub Release MIT License Build Status Umami Demo


🚀 Getting Started

A detailed getting started guide can be found at umami.is/docs.


🛠 Installing from Source

Requirements

  • A server with Node.js version 18.18 or newer
  • A database. Umami supports PostgreSQL (minimum v12.14) databases.

Get the Source Code and Install Packages

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

Configure Umami

Create an .env file with the following:

DATABASE_URL=connection-url

The connection URL format:

postgresql://username:mypassword@localhost:5432/mydb

Build the Application

pnpm run build

The build step will create tables in your database if you are installing for the first time. It will also create a login user with username admin and password umami.

Start the Application

pnpm run start

By default, this will launch the application on http://localhost:3000. You will need to either proxy requests from your web server or change the port to serve the application directly.


🐳 Installing with Docker

To build the Umami container and start up a Postgres database, run:

docker compose up -d

Alternatively, to pull just the Umami Docker image with PostgreSQL support:

docker pull docker.umami.is/umami-software/umami:latest

🔄 Getting Updates

Warning

If you are updating from Umami V2, image "postgresql-latest" is deprecated. You must change it to "latest". e.g., rename docker.umami.is/umami-software/umami:postgresql-latest to docker.umami.is/umami-software/umami:latest.

To get the latest features, simply do a pull, install any new dependencies, and rebuild:

git pull
pnpm install
pnpm run build

To update the Docker image, simply pull the new images and rebuild:

docker compose pull
docker compose up --force-recreate -d

Database ERD

erDiagram

    WEBSITE_EVENT {
        uuid website_id
        uuid session_id
        uuid visit_id
        uuid event_id

        string hostname
        string browser
        string os
        string device
        string screen
        string language
        string country
        string region
        string city

        string url_path
        string url_query
        string utm_source
        string utm_medium
        string utm_campaign
        string utm_content
        string utm_term
        string referrer_path
        string referrer_query
        string referrer_domain
        string page_title

        string gclid
        string fbclid
        string msclkid
        string ttclid
        string li_fat_id
        string twclid

        uint event_type
        string event_name
        string tag
        string distinct_id

        datetime created_at
        uuid job_id
    }

    EVENT_DATA {
        uuid website_id
        uuid session_id
        uuid event_id

        string url_path
        string event_name
        string data_key

        string string_value
        decimal number_value
        datetime date_value

        uint data_type
        datetime created_at
        uuid job_id
    }

    SESSION_DATA {
        uuid website_id
        uuid session_id

        string data_key
        string string_value
        decimal number_value
        datetime date_value

        uint data_type
        string distinct_id
        datetime created_at
        uuid job_id
    }

    WEBSITE_EVENT_STATS_HOURLY {
        uuid website_id
        uuid session_id
        uuid visit_id

        string[] hostname
        string browser
        string os
        string device
        string screen
        string language
        string country
        string region
        string city

        string entry_url
        string exit_url

        string[] url_path
        string[] url_query
        string[] utm_source
        string[] utm_medium
        string[] utm_campaign
        string[] utm_content
        string[] utm_term
        string[] referrer_domain
        string[] page_title
        string[] gclid
        string[] fbclid
        string[] msclkid
        string[] ttclid
        string[] li_fat_id
        string[] twclid

        uint event_type
        string[] event_name
        uint views
        datetime min_time
        datetime max_time
        string[] tag
        string distinct_id

        datetime created_at
    }

    WEBSITE_REVENUE {
        uuid website_id
        uuid session_id
        uuid event_id

        string event_name
        string currency
        decimal revenue

        datetime created_at
    }

    %% RELATIONSHIPS

    %% One website_event can have many event_data rows (KV payload for events)
    WEBSITE_EVENT ||--o{ EVENT_DATA : "has event data"

    %% One session (via website_event) can have many session_data rows (session-level KV)
    WEBSITE_EVENT ||--o{ SESSION_DATA : "has session data"

    %% Hourly stats are aggregated from raw events
    WEBSITE_EVENT ||--o{ WEBSITE_EVENT_STATS_HOURLY : "aggregated into"

    %% Revenue is per event
    WEBSITE_EVENT ||--o{ WEBSITE_REVENUE : "has revenue"

    %% Revenue rows are derived from a subset of event_data rows
    EVENT_DATA ||--o{ WEBSITE_REVENUE : "revenue from"


🛟 Support

GitHub Twitter LinkedIn Discord