Umami
אנליטיקה לאתרים ששומרת על פרטיות ולא משתמשת ב-cookies: צפיות בעמודים, מקורות הפניה, אירועים מותאמים, משפכים, יעדים, שימור ולוחות לאתרים רבים, עם הקלטות sessions ו-heatmaps כאפשרות. הפריסה העצמית כוללת קונטיינר Next.js אחד ו-PostgreSQL, ששומר כל אירוע.
משאבים לפי רמת עומס
מה האפליקציה עצמה צריכה בכל רמה, לצד מה שאנחנו ממליצים לשרת שמריץ רק אותה.
| רמה | מה זה אומר | דרישות האפליקציה | מומלץ |
|---|---|---|---|
| קלהערכה | עד 5 אתרים וכ-100,000 אירועים במעקב בחודש (צפיות בעמודים ואירועים מותאמים), כמה אנשים בלוח הבקרה; הקלטות ו-heatmaps כבויים. | 1.5 vCPU · 1.5 GiB RAM · 7.75 GiB דיסק | 1.92 vCPU · 3.3 GiB RAM · 18.343 GiB דיסק |
| בינוניהערכה | עד 20 אתרים וכמיליון אירועים בחודש (כ-4 בשנייה בשעת שיא), צוות שעובד עם דוחות, משפכים ולוחות כל יום. | 3 vCPU · 5 GiB RAM · 52.75 GiB דיסק | 3.72 vCPU · 7.5 GiB RAM · 70.093 GiB דיסק |
| כבדהערכה | עשרות אתרים וכ-3 מיליון אירועים בחודש (כ-12 בשנייה בשעת שיא), עם טווחי תאריכים ארוכים בדוחות וכמה משתמשים בלוח הבקרה בו-זמנית. | 3.5 vCPU · 6 GiB RAM · 52.75 GiB דיסק | 4.32 vCPU · 8.7 GiB RAM · 70.093 GiB דיסק |
מומלץ = דרישות האפליקציה + baseline של המערכת + מרווח ביטחון (headroom), לפי מדיניות ה-sizing 2026.10.0. האפשרויות נשארות בברירת המחדל. ״הערכה״ פירושה שהמקורות לא נותנים מספר למקרה הזה, ולכן הוא מחושב מהם בשיטה שמפורטת תחת רכיבים. איך המספרים נבנים
קבצים מוכנים להפעלה
רמת תמיכה נתמך
תבנית Compose מהמקורות הרשמיים; עוד לא נבדקה בהרצה.
רכיבים
מה כל רכיב צריך בכל רמת עומס, לפני baseline ו-headroom.
| רכיב | קל | בינוני | כבד | מקורות |
|---|---|---|---|---|
| Umami (dashboard, API, tracker and collector) (app) | 0.5 / 0.5 / 1.25 | 1 / 1 / 1.25 | 1.5 / 2 / 1.25 | [3][4][16][29][34] |
| PostgreSQL (database) | 1 / 1 / 6.5 | 2 / 4 / 51.5 | 2 / 4 / 51.5 | [13][23][25][36][39][40][41][42][43][44][45] |
איך ההערכות מחושבות
- Umami (dashboard, API, tracker and collector) · קל: אין sizing רשמי. תהליך Node אחד (start-docker.sh מבצע exec ל-node server.js) מגיש את לוח הבקרה ואת /api/send; 100,000 אירועים בחודש הם כ-0.04 בשנייה בממוצע. RAM: 0.5 GiB ל-Next.js ולמסד GeoLite2 City של 63 MiB שהוא פותח; vCPU: חצי ליבה (הערכה של ANAROQ). Disk: image של 1,105,421,824 B אחרי פריסה (1.03 GiB), מעוגל ל-1.25 GiB; Umami לא שומר קבצים.
- Umami (dashboard, API, tracker and collector) · בינוני: מיליון אירועים בחודש הם כ-0.4 בשנייה בממוצע וכ-4 בשיא של פי 10, כל אחד insert קטן ובדיקת GeoIP, בזמן שהדוחות בלוח הבקרה רצים ב-PostgreSQL. ליבה שלמה ו-1 GiB RAM לתהליך ה-Node היחיד (הערכה של ANAROQ). Disk: רק ה-image, 1.25 GiB.
- Umami (dashboard, API, tracker and collector) · כבד: כ-1.2 אירועים בשנייה בממוצע וכ-12 בשיא של פי 10. 1.5 vCPU: event loop עמוס אחד ועוד threads של GC ו-I/O, בערך מה שתהליך Node יחיד מנצל; 2 GiB RAM לתשובות דוחות במקביל (הערכה של ANAROQ). התיעוד מציע Redis לתעבורה גבוהה; התבנית רצה בלעדיו. Disk: רק ה-image, 1.25 GiB.
- PostgreSQL · קל: לכל אירוע: שורה ב-website_event (כ-250 B: ארבעה UUIDs, timestamp, נתיב, referrer, כותרת, hostname) ועוד 14 אינדקסי B-tree שלה (כ-600 B) וחלק משורת ה-session ו-11 האינדקסים שלה (כ-150 B), כ-1 KB בסך הכול (הערכה של ANAROQ לפי prisma/schema.prisma). בהתקנה עצמית הנתונים נשמרים ללא הגבלת זמן. 100,000 אירועים בחודש מוסיפים כ-0.1 GB, ולכן 5 GB של ה-sidecar מספיקים לכ-4 שנים. @prisma/adapter-pg משתמש ב-pool של node-postgres, 10 חיבורים כברירת מחדל. שיטת ה-light: shared_buffers 25% מה-RAM, 0.5 GiB ל-image + 5 GiB נתונים + 1 GiB ל-WAL.
- PostgreSQL · בינוני: כ-1 KB לאירוע עם האינדקסים שלו (הערכה של ANAROQ לפי prisma/schema.prisma, השיטה ב-preset ה-light), נשמר ללא הגבלת זמן. מיליון אירועים בחודש מוסיפים כ-1 GB ועוברים את 5 GB של ה-sidecar תוך 5 חודשים, ולכן זה ה-preset ה-medium של פרופיל PostgreSQL (עד 50 GB נתונים, כ-4 שנים). @prisma/adapter-pg משתמש ב-pool של node-postgres, 10 חיבורים כברירת מחדל. שיטת ה-medium: shared_buffers של 1 GiB הם 25% מ-4 GiB, 0.5 GiB ל-image + 50 GiB נתונים + 1 GiB ל-WAL.
- PostgreSQL · כבד: כ-1 KB לאירוע עם האינדקסים שלו (הערכה של ANAROQ לפי prisma/schema.prisma, השיטה ב-preset ה-light), נשמר ללא הגבלת זמן. 3 מיליון אירועים בחודש מוסיפים כ-3 GB וממלאים את 50 GB של ה-preset ה-medium בתוך כ-16 חודשים; תכננו דיסק נוסף לפי ops.storageGrowth או מחקו נתונים ישנים. @prisma/adapter-pg משתמש ב-pool של node-postgres, 10 חיבורים כברירת מחדל. שיטת ה-medium: shared_buffers של 1 GiB הם 25% מ-4 GiB, 0.5 GiB ל-image + 50 GiB נתונים + 1 GiB ל-WAL.
פורטים
פורטים ציבוריים נועדו לגישה מחוץ ל-stack, בדרך כלל דרך reverse proxy; פורטים פנימיים נשארים ברשת של ה-stack עצמו.
משתמש והרשאות (UID/GID)
המשתמש שהתהליך של כל קונטיינר רץ תחתיו, והנתיבים שהוא כותב אליהם. bind mount לאחד הנתיבים האלה חייב להיות ניתן לכתיבה על ידי ה-UID:GID הזה.
| רכיב | UID:GID | משתמש | מתחיל כ-root | כותב אל | מקורות |
|---|---|---|---|---|---|
| Umami (dashboard, API, tracker and collector)נגזר | 1001:65533 | nextjs | לא | — | [3][9][10] |
| PostgreSQL | 999:999 | postgres | כן, מכין את התיקיות שלו ואז עובר למשתמש הזה | /var/lib/postgresql/var/run/postgresql | [37][38][44] |
- Umami (dashboard, API, tracker and collector): ה-Dockerfile מסתיים ב-USER nextjs (uid 1001, נוצר עם adduser --system, ולכן הקבוצה הראשית שלו היא nogroup, 65533). שום דבר קבוע לא נכתב: כל המצב נמצא ב-PostgreSQL. רק COLLECT_API_ENDPOINT גורם לסקריפט ההפעלה לשכתב את /app/public/script.js, שנמצא בבעלות nextjs.
צמיחת אחסון
בכמה הנתונים של כל רכיב גדלים בחודש בכל רמת עומס, מעבר לדיסק שבפרופיל. ערך שמסומן ״הנחה״ הוא הנחה מוצהרת של ANAROQ ולא מספר מהמקורות; ההערות מפרטות על מה היא נשענת.
על מה מספרי הצמיחה נשענים
- PostgreSQL: 100,000, מיליון ו-3 מיליון אירועים בחודש × הנחה של כ-1 KB לאירוע עם האינדקסים שלו. Umami בהתקנה עצמית לא מוחק כלום בעצמו, ולכן זה מצטבר כל חודש. הקלטות sessions (כבויות כברירת מחדל) מתווספות לזה ונשמרות 30 יום.
שדרוג וחזרה לאחור
איך עוברים לגרסה חדשה בבטחה, ואיך חוזרים אחורה אם משהו נכשל.
קודם גיבוי
ה-migrations רצים לבד בהפעלה ואי אפשר לבטל אותם: קחו קודם pg_dump של מסד umami ושמרו עותק של ה-.env (APP_SECRET, TWO_FACTOR_ENCRYPTION_KEY, סיסמת מסד הנתונים). [12][22]נגזרבעמוד העדכונים אין שלב גיבוי; הוא נגזר מכך ש-check-db.js מריץ prisma migrate deploy בכל הפעלה, בלי migrations לאחור.
שלבי השדרוג
- קראו את ה-release notes ואת פוסט הבלוג של כל גרסה בין הגרסה שלכם לחדשה; breaking changes, כמו הסרת MySQL ב-v3, מתפרסמים שם. [12][19]
- שנו את ה-tag המוצמד של umami, ואז הריצו docker compose pull ו-docker compose up -d. בהפעלה, check-db.js מריץ prisma migrate deploy לפני שהשרת מאזין; עקבו אחרי docker compose logs -f umami עד שהוא עולה. [4][12][22]
- אחרי שדרוג major הריצו ANALYZE במסד הנתונים (docker compose exec postgres psql -U umami umami), כדי ששאילתות לוח הבקרה יקבלו סטטיסטיקות עדכניות. זה בטוח על מסד נתונים פעיל. [12]
חזרה לאחור
שחזרו את ה-dump של מסד הנתונים מלפני השדרוג והצמידו את ה-image חזרה ל-tag הקודם. צריך את שניהם: גרסה ישנה לא מכירה schema שמיגרציה חדשה יותר שינתה. [22][35]נגזרupstream לא מתעד rollback; זה נגזר מ-migrations של Prisma שרצים רק קדימה ומה-tags המוצמדים לפי semver ב-GHCR.
שינויים שוברים ידועים
- בגרסה 3.3.0: נוסף אימות דו-שלבי, שדורש TWO_FACTOR_ENCRYPTION_KEY (64 תווי hex) לפני שמישהו יכול להפעיל אותו. ה-image מתחיל עכשיו ב-sh scripts/start-docker.sh במקום npm run start-docker, ולכן command מותאם צריך להתעדכן בהתאם. [14][20][32][33]
- בגרסה 3.0.0: MySQL כבר לא נתמך, רק PostgreSQL; משתמשי MySQL עוברים קודם לפי המדריך הרשמי. ה-tags של ה-image השתנו מ-postgresql-v2.x ו-postgresql-latest ל-tags פשוטים של 3.x, ואחרי ה-migrations של ה-schema מומלץ להריץ ANALYZE. [12][19][31][35]
מגבלות
- Umami בהתקנה עצמית שומר כל אירוע ללא הגבלת זמן ואין לו הגדרת retention, ולכן PostgreSQL רק גדל; תכננו דיסק לפי נתוני הגדילה או מחקו נתונים ישנים בעצמכם. PostgreSQL הוא מסד הנתונים היחיד (12.14 ומעלה); התמיכה ב-MySQL הסתיימה ב-v3. [8][13][19]
- גם הקלטות sessions (לכל אתר בנפרד, 15% מה-sessions כברירת מחדל, עד 5 דקות כל אחת, נשמרות 30 יום) נשמרות ב-PostgreSQL; ה-presets מניחים שהן כבויות. Redis אופציונלי ולא נמצא בתבנית: התיעוד מציע אותו לתעבורה גבוהה או לכמה instances של Umami. [15][16]
- המיקום של המבקרים מגיע ממסד GeoLite2 City שמובנה ב-image (כ-66 MB), ולכן הוא עדכני רק כמו ה-image; מאחורי CDN ששולח headers של מיקום, הם קודמים. [10][29]
אבטחה
- ההפעלה הראשונה יוצרת מנהל admin עם הסיסמה umami. התחברו ושנו אותה מיד, לפני שלוח הבקרה נגיש מהאינטרנט, ואז הפעילו אימות דו-שלבי. [8][11][24]
- Umami לוקח את ה-IP של המבקר מ-CLIENT_IP_HEADER אם הוגדר, ואחרת מהראשון ברשימת headers (True-Client-IP, CF-Connecting-IP, X-Real-IP ועוד) לפני X-Forwarded-For, ומבקר יכול לשלוח אותם בעצמו. הגדירו את CLIENT_IP_HEADER ל-header שה-proxy שלכם דורס; זה משפיע על המיקום ועל IGNORE_IP. [7][27]
- לוח הבקרה טוען פיקסל טלמטריה אנונימי מ-i.umami.is ובודק ב-api.umami.is אם יש גרסה חדשה. DISABLE_TELEMETRY=1 ו-DISABLE_UPDATES=1 מכבים אותם; PRIVATE_MODE=1 חוסם כל קריאה חיצונית, כולל אייקונים של אתרים. [7][28]
גיבוי
- הכול נמצא ב-PostgreSQL (משתמשים, אתרים, אירועים, דוחות, הקלטות), ולכן pg_dump של מסד umami ועותק של ה-.env הם כל הגיבוי; הקונטיינר של Umami לא מחזיק נתונים. [2][3][23]
- שמרו את APP_SECRET יחד עם ה-dump: ערך חדש מנתק את כולם וגוזר מזהי מבקרים ו-sessions אחרים, כך שמבקרים חוזרים נראים חדשים. בלי ה-TWO_FACTOR_ENCRYPTION_KEY הישן כל משתמש צריך לרשום מחדש את ה-2FA. [7][14][26]
גרסה אחרונה
- הפרופיל נבדק מול
Umami 3.4.0
הפרופיל נבדק מול הגרסה האחרונה.
- נבדק ב-
- 14 באוק׳ 2026
- מצב
- נבדק ב-90 הימים האחרונים
- איפה הגרסאות מתפרסמות
- GitHub Releases
גרסה
- סטטוס הפרופיל
- פורסם
- נבדק מול גרסה
- Umami 3.4.0
- גרסת הפרופיל
- 1.0.0
- המספרים אומתו
- 14 באוק׳ 2026
- גרסת הקטלוג
- 2026.10.10
- מדיניות sizing
- 2026.10.0
- קובץ Compose
- לא אומת
הפרויקט וחלופות
- האתר הרשמי
- umami.is
- קוד מקור
- github.com/umami-software/umami
מקורות
- Docker Docs: Control startup order in Compose (pg_isready healthcheck, service_healthy) (תיעוד רשמי · נקרא 11 באוק׳ 2026)
- umami repository: docker-compose.yml at v3.4.0 (umami:latest on 3000, init: true, curl /api/heartbeat healthcheck every 5s; postgres:15-alpine with umami/umami and /var/lib/postgresql/data) (Compose רשמי · נקרא 14 באוק׳ 2026)
- umami repository: Dockerfile at v3.4.0 (node:22-alpine, apk add curl, user nextjs uid 1001, USER nextjs, EXPOSE 3000, HOSTNAME 0.0.0.0, CMD sh scripts/start-docker.sh, no HEALTHCHECK) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: scripts/start-docker.sh at v3.4.0 (check-db.js, update-tracker.js, then exec node server.js so it is PID 1) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/app/api/heartbeat/route.ts at v3.4.0 (GET /api/heartbeat returns {ok: true}) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/two-factor/crypto.ts at v3.4.0 (TWO_FACTOR_ENCRYPTION_KEY must match /^[0-9a-fA-F]{64}$/, AES-256-GCM) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Environment variables (DATABASE_URL the only required one; APP_SECRET and TWO_FACTOR_ENCRYPTION_KEY from openssl rand -hex 32; CLIENT_IP_HEADER, DISABLE_TELEMETRY, PRIVATE_MODE) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Installation (PostgreSQL minimum v12.14, UTC recommended; Docker Compose with the app and PostgreSQL on port 3000; default login admin / umami) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- GHCR image config of ghcr.io/umami-software/umami:3.4.0 (linux/amd64): User nextjs, ExposedPorts 3000/tcp, Entrypoint docker-entrypoint.sh, no Healthcheck (מאגר רשמי · נקרא 14 באוק׳ 2026)
- Layers of ghcr.io/umami-software/umami:3.4.0 unpacked: nextjs is 1001:65533 (nogroup), /app/geo/GeoLite2-City.mmdb 65,921,355 B, Next 16.3.4 start-server handles SIGTERM (מדידה · נקרא 14 באוק׳ 2026)
- Umami Docs: Login (default administrator admin / umami; change the password first, then enable 2FA) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Getting updates (docker compose pull, docker compose up --force-recreate -d; run ANALYZE after a major upgrade such as v3) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: FAQ (PostgreSQL minimum v12.14 only; self-hosted data is retained indefinitely unless you delete it; no cookies) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Two-factor authentication (since v3.3.0; needs a 64-hex TWO_FACTOR_ENCRYPTION_KEY; losing it forces re-enrolment) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Replays (since v3.1.0, per-website toggle, sample rate 0.15, up to 5 min per recording, stored for 30 days) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Enable Redis (optional cache and server-side sessions via REDIS_URL, for high traffic or several instances) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami Docs: Cloud overview (Umami Cloud is the hosted version run by the creators of Umami; same analytics features as self-hosted) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami: Pricing (Umami Cloud plans by monthly events, websites and data retention) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Umami blog: Umami v3 (breaking change: MySQL is no longer supported, only PostgreSQL; migration guide) (Release notes · נקרא 14 באוק׳ 2026)
- Umami blog: Umami v3.3 (two-factor authentication for self-hosters; Docker image hardened and slimmed down) (Release notes · נקרא 14 באוק׳ 2026)
- Umami blog: Umami v3.4 (annotations, MCP endpoint off by default on self-hosted via MCP_ENABLED, account API keys) (Release notes · נקרא 14 באוק׳ 2026)
- umami repository: scripts/check-db.js at v3.4.0 (refuses PostgreSQL below 9.4.0, then runs prisma migrate deploy unless SKIP_DB_MIGRATION) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: prisma/schema.prisma at v3.4.0 (website_event with 14 indexes, session with 11; PostgreSQL datasource) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: prisma/migrations/01_init/migration.sql at v3.4.0 (inserts the admin user with role admin and a bcrypt hash) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/prisma.ts at v3.4.0 (one PrismaPg adapter on DATABASE_URL, optional DATABASE_REPLICA_URL) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/crypto.ts at v3.4.0 (secret() hashes APP_SECRET, or DATABASE_URL when unset; uuid() derives ids from it) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/ip.ts at v3.4.0 (CLIENT_IP_HEADER first, else true-client-ip, cf-connecting-ip, ... x-real-ip, then x-forwarded-for) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/constants.ts at v3.4.0 (UPDATES_URL api.umami.is/v1/updates, TELEMETRY_PIXEL i.umami.is/a.png) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: src/lib/detect.ts at v3.4.0 (location from CDN headers, else the local GeoLite2-City.mmdb opened with maxmind) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: LICENSE at v3.4.0 (MIT, Umami Software, Inc.) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: docker-compose.yml at v2.20.2 (image umami:postgresql-latest, DATABASE_TYPE postgresql) (Compose רשמי · נקרא 14 באוק׳ 2026)
- umami repository: Dockerfile at v3.2.0 (CMD ["npm", "run", "start-docker"]) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- umami repository: Dockerfile at v3.3.0 (CMD ["sh", "scripts/start-docker.sh"]) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- GHCR manifest of ghcr.io/umami-software/umami:3.4.0 (linux/amd64): 322,703,350 B compressed in 19 layers; layers decompressed and counted: 1,105,421,824 B (מדידה · נקרא 14 באוק׳ 2026)
- GHCR tags of ghcr.io/umami-software/umami (newest release 3.4.0, same digest as latest; postgresql-* tags end at 3.0.0, plain 3.x tags since) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- node-postgres Docs: pg.Pool (max clients in the pool: 10 by default) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- docker-library/postgres: 18/trixie Dockerfile (postgres uid/gid 999, VOLUME /var/lib/postgresql) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker-library/postgres: 18/trixie docker-entrypoint.sh (chown PGDATA, then gosu postgres) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- PostgreSQL 18 documentation: 19.4 Resource Consumption (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- PostgreSQL 18 documentation: 19.3 Connections and Authentication (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- PostgreSQL 18 documentation: 19.10 Vacuuming (autovacuum settings) (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- PostgreSQL 18 documentation: 19.5 Write Ahead Log (max_wal_size) (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- PostgreSQL 18 documentation: 51.2 How Connections Are Established (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- Docker Official Image postgres: documentation (docker-library/docs) (תיעוד רשמי · נקרא 10 באוק׳ 2026)
- Docker Hub: library/postgres tag 18.6 (compressed image sizes) (מאגר רשמי · נקרא 10 באוק׳ 2026)