[{"data":1,"prerenderedAt":163},["ShallowReactive",2],{"seo-verification":3,"blog-how-to-host-umami-on-a-vps-ma-en":6,"promo-bar-likely":162},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-how-to-host-umami-on-a-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":102,"ctaBody":103,"ctaButton":104,"ctaUrl":105,"relatedPosts":106},152,"how-to-host-umami-on-a-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-umami-vps","كيفية-استضافة-umami-على-خادم-vps","como-alojar-umami-en-un-vps","How to Host Umami on a VPS","Deploy Umami on your VPS: lightweight, privacy-friendly web analytics without cookies, self-hosted with Docker and HTTPS. Full guide with troubleshooting.",7,1,false,"2026-07-15T00:00:00+00:00","2026-10-09T22:36:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[28],{"id":17,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-umami-vps-poster.svg",{"categorySlug":33,"appSlug":34},"analytics","analytics-umami","Umami is an open-source web analytics tool that is lightweight and privacy-friendly: it measures your audience without cookies or collecting personal data. Self-hosted on your VPS, it makes you the owner of your traffic statistics, without handing them to an ad network. Here is how to deploy it with Docker, a PostgreSQL database, a reverse proxy and a TLS certificate — and how to fix the three issues that block most deployments at startup.",[37,41,50,53,72,75,93,97,99],{"type":38,"title":39,"body":40},"h2","Why self-host Umami on a VPS","Umami is a lightweight alternative to Google Analytics: open source, cookieless, no data sent to third parties. On a VPS, you retain full control — no SaaS account, no site limit, no shared data. The Docker stack is minimal: a Node.js container for the app and a PostgreSQL container for the database. The whole setup takes under ten minutes on a standard VM with root access, and your data stays on your server.\n\nCompared to Google Analytics 4, Umami doesn't require consent for anonymised statistics in most European jurisdictions. Compared to Matomo, its memory footprint is significantly lower, and its Docker setup is a single `docker-compose.yml`. For an agency managing ten clients, a single Umami instance with ten sites replaces a per-user or per-domain SaaS subscription. Version 2.14 (July 2026) added native custom events support and a CSV-exportable dashboard — two features long awaited by marketing teams.",{"type":42,"title":43,"items":44},"ul","The concrete benefits of a self-hosted Umami",[45,46,47,48,49],"Privacy-compliant: no cookies, no personal data, often no consent banner required.","Your audience statistics stay on your server, with no sharing to a third party.","A tracking script of a few kilobytes, with no cookie and no personal data collected.","Clear, multi-site dashboard from a single instance.","Fixed cost regardless of the volume of page views.",{"type":38,"title":51,"body":52},"Hardware and software requirements","Umami runs on any VPS with Docker installed. The recommended minimum is 1 vCPU and 512 MB RAM for personal or SMB use; above 200,000 monthly page views, 1 GB RAM avoids PostgreSQL slowdowns. You will need: Docker Engine (≥ 20.10) and Docker Compose V2 (`docker compose`, not `docker-compose`), a domain or subdomain pointing to your VPS, and a reverse proxy (nginx or Caddy) to serve Umami over HTTPS. Debian 12 and Ubuntu 22 are the reference distributions; the commands below assume root or sudo access.\n\nOn the server side, open ports 80 and 443 in your firewall (`ufw allow 80\u002Ftcp && ufw allow 443\u002Ftcp`). Umami only needs HTTPS exposed externally; the application port (3000 by default) stays internal and is never opened directly. If you're using a ServOrbit VPS, the default security group already allows 80 and 443.",{"type":54,"title":55,"steps":56},"steps","Deploy Umami with Docker and HTTPS",[57,60,63,66,69],{"title":58,"body":59},"Prepare the VPS and Docker","Over SSH, update the system and install Docker via `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Create `mkdir -p \u002Fopt\u002Fumami && cd \u002Fopt\u002Fumami`.",{"title":61,"body":62},"Write the docker-compose.yml","Define two services: `ghcr.io\u002Fumami-software\u002Fumami:postgresql-latest` and a `postgres` database. Fill in `DATABASE_URL` and a random `APP_SECRET`.",{"title":64,"body":65},"Start the containers","Run `docker compose up -d`. Umami listens locally on port 3000; the database is initialised automatically on first start.",{"title":67,"body":68},"Configure the reverse proxy","With Caddy: `stats.your-domain.com { reverse_proxy localhost:3000 }`. The Let's Encrypt certificate is obtained and renewed automatically.",{"title":70,"body":71},"Add your site and the script","Log in (admin\u002Fumami by default, change it immediately), add your site and paste the tracking snippet provided into the `\u003Chead>` of your pages.",{"type":38,"title":73,"body":74},"Common startup issues","Three root causes account for the vast majority of failures reported in 2026 community guides. Here they are with their diagnosis and fix.\n\n**1. Restart loop \"Can't reach database server\" — `DATABASE_URL` does not match `POSTGRES_PASSWORD`**\n\nThis is the most common copy-paste trap: `DATABASE_URL` contains the password in plain text inside the connection string, and that password must be **exactly** the same as the value of `POSTGRES_PASSWORD` in the `db` service. If you change one without the other, Umami starts, fails to reach the database, and restarts in a loop — with no clear error message in the Docker logs.\n\nVerify that both variables are consistent:\n\n```\n# in .env or in the compose file\nPOSTGRES_PASSWORD=strong_password\n\n# in DATABASE_URL, the same password in position 3\nDATABASE_URL=postgresql:\u002F\u002Fumami:strong_password@db:5432\u002Fumami\n```\n\nIf you use variable interpolation (`${POSTGRES_PASSWORD}`), make sure Docker Compose is actually loading your `.env` file.\n\n**2. Umami crashes 5 to 10 seconds after startup — `depends_on` without `healthcheck`**\n\nBy default, `depends_on: db` only waits for the PostgreSQL container to be **started**, not for it to be **ready to accept connections**. Umami then tries to connect while PostgreSQL is still initialising its data files, fails, and exits.\n\nAdd a `healthcheck` on the `db` service and a `condition: service_healthy` in Umami's `depends_on`:\n\n```\nservices:\n  db:\n    image: postgres:15-alpine\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U umami\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n  umami:\n    image: ghcr.io\u002Fumami-software\u002Fumami:postgresql-latest\n    depends_on:\n      db:\n        condition: service_healthy\n```\n\nWith this configuration, Umami only starts once PostgreSQL is responding on its socket.\n\n**3. 502 error after `docker compose pull` — published port has changed**\n\nAfter an update (`docker compose pull` + `docker compose up -d`), nginx may return a 502 error if the configuration changed between image versions: the internal port may have been remapped or the host binding changed. First check the actual state of the containers:\n\n```\ndocker compose ps\n```\n\nLook at the **PORTS** column to confirm that the Umami container is publishing on the expected port (3000 by default). If the port has changed, update the `proxy_pass` (or `reverse_proxy`) directive in nginx or Caddy to reflect the new port, then reload the service (`nginx -s reload` or `systemctl reload caddy`).\n\n**4. `docker-compose` (v1) vs `docker compose` (v2) — silent failure**\n\nGuides published before 2025 often use `docker-compose` (hyphen), the unmaintained Python client. On a fresh Docker Engine install, this command doesn't exist: the terminal just returns `command not found`, without saying that v2 is called `docker compose` (space). Verify with `docker compose version` — if it responds, you have v2. All examples in this guide use `docker compose` (v2).",{"type":54,"title":76,"steps":77},"Updating Umami",[78,81,84,87,90],{"title":79,"body":80},"Back up the database","Before any update: `docker compose exec db pg_dump -U umami umami > umami-backup-$(date +%F).sql`. Keep this file outside the Docker volume — it won't survive a volume removal.",{"title":82,"body":83},"Pull the latest image","`docker compose pull`. Umami publishes releases on GitHub (github.com\u002Fumami-software\u002Fumami\u002Freleases) — check release notes for schema migrations or environment variable changes.",{"title":85,"body":86},"Restart the stack","`docker compose up -d`. Umami runs migrations automatically on startup. Check logs with `docker compose logs -f app` and wait for the `Listening on port 3000` message.",{"title":88,"body":89},"Verify the version in the UI","Settings → About. If the version is unchanged, the image may not have been re-pulled: `docker compose images` shows the digest of each running image.",{"title":91,"body":92},"Check tracking works","Open a tracked site in a private tab and wait 30 seconds — the Realtime page should record the visit. A persistent 0 after a restart usually indicates a tracking script issue on the frontend side.",{"type":94,"title":95,"body":96},"tip","Umami Cloud vs self-hosted","Umami offers a managed Cloud plan (umami.is\u002Fpricing) from $9\u002Fmonth for teams who prefer not to manage infrastructure. Self-hosting on a VPS makes sense if you already have a VM, manage multiple sites, or if your organisation's data policy prohibits sending data to an external SaaS — even GDPR-compliant ones. Both options share the same codebase, features, and export format.",{"type":94,"body":98},"Change the default administrator password on your first login, and back up the PostgreSQL database regularly: it is what holds your entire audience history.",{"type":94,"title":100,"body":101},"The official documentation","For advanced configuration and options specific to the tool, refer to the \u003Ca href=\"https:\u002F\u002Fumami.is\u002Fdocs\" target=\"_blank\" rel=\"noopener noreferrer\">official Umami documentation\u003C\u002Fa>. This guide covers going live on a VPS; the vendor's documentation remains the reference for fine-tuning, major updates and specific use cases.","Deploy your instance on a ServOrbit Cloud VPS","A ServOrbit Cloud VPS with Docker preconfigured and scalable resources lets you install this tool without friction, and adjust RAM and vCPU as usage grows.","Launch my Cloud VPS","\u002Fvps-cloud",[107,125,141],{"id":108,"slug":109,"slugs":110,"title":114,"excerpt":115,"readTime":116,"views":18,"isPinned":19,"noindex":19,"publishedAt":117,"updatedAt":118,"category":119,"categories":120,"featuredImage":29,"bgImage":30,"posterImage":122,"relatedSolution":123},153,"how-to-host-plausible-analytics-on-a-vps",{"fr":111,"en":109,"ar":112,"es":113},"heberger-plausible-vps","كيفية-استضافة-plausible-analytics-على-خادم-vps","como-alojar-plausible-analytics-en-un-vps","How to Host Plausible Analytics on a VPS","Deploy Plausible Analytics on your VPS: lightweight, cookie-free and GDPR-compliant analytics, self-hosted with Docker, ClickHouse and HTTPS. Step-by-step guide.",2,"2026-01-24T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[121],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-plausible-vps-poster.svg",{"categorySlug":33,"appSlug":124},"analytics-plausible",{"id":126,"slug":127,"slugs":128,"title":132,"excerpt":133,"readTime":116,"views":18,"isPinned":19,"noindex":19,"publishedAt":134,"updatedAt":118,"category":135,"categories":136,"featuredImage":29,"bgImage":30,"posterImage":138,"relatedSolution":139},154,"how-to-host-matomo-on-a-vps",{"fr":129,"en":127,"ar":130,"es":131},"heberger-matomo-vps","كيفية-استضافة-matomo-على-خادم-vps","como-alojar-matomo-en-un-vps","How to Host Matomo on a VPS","Deploy Matomo on your VPS: a complete alternative to Google Analytics, with 100% ownership of your data, self-hosted with Docker and HTTPS. Step-by-step guide.","2026-01-23T00:00:00+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[137],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-matomo-vps-poster.svg",{"categorySlug":33,"appSlug":140},"analytics-matomo",{"id":142,"slug":143,"slugs":144,"title":148,"excerpt":149,"readTime":150,"views":18,"isPinned":19,"noindex":19,"publishedAt":151,"updatedAt":152,"category":153,"categories":158,"featuredImage":29,"bgImage":30,"posterImage":160,"relatedSolution":161},97,"plausible-vs-umami-which-self-hosted-analytics-to-choose",{"fr":145,"en":143,"ar":146,"es":147},"plausible-vs-umami","plausible-مقابل-umami-أي-أداة-تحليلات-مستضافة-ذاتيا-تختار","plausible-vs-umami-que-analitica-self-hosted-elegir","Plausible vs Umami: which self-hosted analytics to choose?","In-depth comparison of Plausible vs Umami in 2026: setup, GDPR compliance, funnels, custom events API, migration from GA4, and a decision tree to pick the right tool.",9,"2026-03-15T00:00:00+00:00","2026-11-08T01:13:15+00:00",{"id":154,"name":155,"slug":156,"color":157,"icon":156},5,"Comparison","comparatif","bg-info\u002F10 text-info",[159],{"id":154,"name":155,"slug":156,"color":157,"icon":156},"\u002Fblog\u002Fcovers\u002Fplausible-vs-umami-poster.svg",{"categorySlug":33,"appSlug":124},true,1794270429424]