| .github | ||
| .husky | ||
| cypress | ||
| db | ||
| docker | ||
| podman | ||
| prisma | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .eslintignore | ||
| .eslintrc.json | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc.json | ||
| .stylelintrc.json | ||
| app.json | ||
| cypress.config.ts | ||
| docker-compose.yml | ||
| Dockerfile | ||
| jest.config.ts | ||
| LICENSE | ||
| netlify.toml | ||
| next-env.d.ts | ||
| next.config.ts | ||
| package.components.json | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| postcss.config.js | ||
| README.md | ||
| rollup.tracker.config.js | ||
| tsconfig.json | ||
| tsconfig.prisma.json | ||
| tsup.config.js | ||
Umami
Umami is a simple, fast, privacy-focused alternative to Google Analytics.
🚀 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-latesttodocker.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"