What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
The simplest production setup for a single VPS is Umami’s Docker Compose deployment: it runs the Umami application and PostgreSQL together, listens on port 3000 locally, and can sit behind Nginx or Apache for a public HTTPS address. A source installation gives you more control over Node.js, PostgreSQL, and the process manager, but also makes upgrades and service management your responsibility.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
Whichever route you choose, set a unique APP_SECRET, protect PostgreSQL, put the public endpoint behind a reverse proxy with TLS, and replace the initial admin/umami password immediately. This guide covers both deployment methods, subdirectory hosting, backups, updates, and the failure modes most likely to stop a new installation.
As an Amazon Associate I earn from qualifying purchases.
What self-hosted Umami looks like on a VPS
Umami is a privacy-first web analytics platform for traffic, campaigns, behavior, conversions, and revenue. A self-hosted instance keeps the application and its analytics database under your control instead of sending site data to a hosted analytics provider.
There are four documented installation routes:
- Docker Compose: the shortest path for one VPS. The supplied Compose stack contains the Umami application and a PostgreSQL database.
- Source installation: install Node.js and PostgreSQL yourself, build Umami with pnpm, and run the resulting service.
- Prebuilt Docker image: run the published image while connecting it to a database you provide separately.
- Kubernetes: use Kubernetes with a third-party Helm chart when your organization already operates a cluster.
For a personal site, a small business, or a game-community network on one server, Compose normally has the fewest moving parts. Source installation is more appropriate when you already standardize on system packages, PM2 or another service supervisor, and an independently managed PostgreSQL service.
#1 Best Overall
- BLUE LIGHT BLOCKING GLASSES: Our blue light glasses for women boast UV400 protection, blocking harmful blue rays from computer screens. With these bluelight glasses women, you can enjoy gaming, reading, or watching TV with no worries of eye strain.
- EYE RELIEF: Our blue light glasses are engineered to reduce blurry vision or strain caused by prolonged screen time. These womens blue light glasses aid in better sleep by preventing blue light from disrupting your natural sleep cycle, helping you fall asleep faster and enjoy a more restful night's sleep, making them the perfect christmas present.
- COMFORTABLE: Crafted from durable material, our trendy blue light glasses for woman or blue light glasses men ensure long-lasting comfort. The high-transmittance lenses accessories, gamer gifts for men, help keep your eyes relaxed. Perfect stocking stuffers, gifts for gamers men, christmas gifts for men, halloween costumes.
- LIGHTWEIGHT: These clear blue light glasses feature a lightweight frame, meaning they’ll stay comfy for long-term wear. Perfect as blue blockers glasses for women or mens blue light glasses, these non-prescription fake glasses for men can be worn throughout the day. The blue light blocking glasses women feature polycarbonate HD lenses, which are anti-reflective and restore true color.
- WORRY-FREE PURCHASE: If you experience any issues, our support team is ready to assist you quickly. These are the perfect costume glasses for cosplay dressing up.
Plan the VPS before installing
Choose the operating layout
You can keep Umami, PostgreSQL, and the reverse proxy on one machine, or put PostgreSQL on another host. One server is easier to deploy and cheaper to operate, but a VPS failure takes out both the dashboard and its database. A separate database host creates isolation and an independent failure domain, at the cost of private networking, firewall rules, credentials management, and additional monitoring.
| Layout | Advantages | Trade-offs |
|---|---|---|
| Application and PostgreSQL on one VPS | Fastest setup, no database network hop, one backup target and one bill | Application and data fail together; upgrades compete for the same CPU, memory and disk |
| Umami on VPS, PostgreSQL elsewhere | Database isolation, independent database backups and scaling, smaller application host | Requires private connectivity, database firewall rules, TLS or a trusted network, and handling an additional service |
Prepare DNS, firewall and backups
- Register a DNS record such as
analytics.example.compointing to the VPS address. Do not expose Umami by its temporary IP if you intend to issue a certificate for a hostname. - Allow SSH only from the administration addresses you need. Allow TCP 80 and 443 for the reverse proxy. Keep PostgreSQL on its private interface or local socket; do not open port 5432 to the whole internet.
- Decide where PostgreSQL backups will live before collecting real analytics. A backup on the same disk does not protect against disk loss or a compromised server.
- Enable automatic security updates for the operating system where they fit your maintenance policy, and monitor disk usage. Analytics tables grow with event volume and retention.
Umami’s official material does not provide a universal CPU, RAM, or visitor-volume sizing table. Capacity therefore depends on event traffic, retention, dashboard query load, and whether the database shares the VPS with other applications. Start with a monitored instance, then increase resources when CPU saturation, memory pressure, slow queries, or disk growth make the bottleneck measurable.
Docker Compose: the recommended single-VPS route
Why Compose is usually the best first deployment
The official Compose file defines the application and PostgreSQL services together. Running docker compose up -d starts the stack, and the application is available locally at http://localhost:3000. You do not have to install a compatible Node.js runtime or initialize PostgreSQL by hand. You do still own the VPS, Docker updates, firewall, reverse proxy, secrets, and database backups.
Install Docker and create the project directory
- Install a current Docker Engine and the Docker Compose plugin using your Linux distribution’s supported instructions.
- Create a directory that will hold the Compose file and environment settings, for example
sudo mkdir -p /opt/umami, then give your administrator account access to it. - Place Umami’s official Compose file in that directory. Keep the file under change control so you can reproduce the exact service definition during a recovery.
- Create a
.envfile beside the Compose file. Store database credentials and anAPP_SECRETthere, and set restrictive permissions such aschmod 600 .env.
The Compose database service supplies PostgreSQL for the stack. If you edit service names, ports, volumes, or credentials, make the same changes in the environment values consumed by the application; a mismatch commonly appears as a database connection failure on first boot.
Set the required secrets
DATABASE_URL is the required environment variable in Umami’s environment reference. In a Compose deployment, the supplied file may already assemble a database URL from its service variables; inspect the file and ensure the application receives a valid URL. Set a random, installation-specific APP_SECRET. The documented generation method is:
Rank #2
- WINDEX GAMING WIPES: effortlessly clean all your gaming gear and gaming electronics in one easy step with our new Windex Gaming Wipes
- AMMONIA FREE: our ammonia-free formula is safe to use on all of your favorite gaming equipment like consoles, headsets, controllers, screens, keyboards, and more
- PRE-MOISTENED WIPES: each wipe instantly removes dust, dirt, and stubborn smudges and fingerprints leaving a streak-free shine
- ANTI-STATIC: great for cleaning and wiping down your gaming gear and electronics leaving behind no visible residue
- COMPACT RESEALABLE PACKAGE: store your pack of Windex Gaming Wipes anywhere in your home for whenever a quick and easy wipedown is needed
openssl rand -hex 32
Do not reuse that value on another Umami instance, commit it to a public repository, or replace it casually after users and sessions exist. A changed secret can invalidate existing sessions and any data encrypted with the previous value.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchStart and inspect the stack
- Change into the project directory:
cd /opt/umami. - Start both services in the background:
docker compose up -d. - Check container state with
docker compose ps. Both the application and PostgreSQL should remain in a running state. - Read startup output with
docker compose logs --tail=100. Look for a message indicating that the web service is listening and for database authentication or migration errors. - From the VPS itself, request
http://localhost:3000. A response confirms that the application is reachable before you add Nginx or HTTPS.
The first database setup creates the initial login account. Its documented credentials are username admin and password umami. Log in as soon as the reverse proxy is working and change this password before exposing the dashboard to the public internet.
Using the prebuilt image instead
The documented image is docker.umami.is/umami-software/umami:latest. Unlike the bundled Compose route, this image expects you to provide a database and set DATABASE_URL. Use this arrangement when PostgreSQL is already operated elsewhere or when you need to pin and promote image versions through your own deployment pipeline. Treat the latest tag as a moving target: record the image digest or chosen version if reproducibility matters.
Source installation: direct control over Node.js and PostgreSQL
Supported runtime requirements
Source installation requires Node.js 18.18 or newer and PostgreSQL 12.14 or newer. Verify both versions before building; an older distribution package can fail during dependency installation or produce runtime errors that look unrelated to the original version mismatch.
Install PostgreSQL and create an application database
- Install PostgreSQL from your operating system’s supported packages and enable the service at boot.
- Create a dedicated database and a dedicated login role for Umami. Grant that role ownership or the minimum permissions needed to create and alter Umami’s tables in its database; do not use the PostgreSQL superuser for the application.
- Keep PostgreSQL bound to localhost for a same-server deployment. If the database is remote, restrict its listener and firewall to the application host or private network.
- Record a URL in the form
postgresql://username:password@host:5432/database. URL-encode reserved characters in the password so the parser cannot mistake them for delimiters.
Build and start Umami
- Install Node.js 18.18 or newer and pnpm on the VPS.
- Obtain the Umami source at the version you intend to run and change into its directory.
- Create a
.envfile containingDATABASE_URLand a uniqueAPP_SECRET. Protect this file from other users. - Install dependencies with
pnpm install. - Compile the application with
pnpm build. The first setup creates the database tables and the initial administrator account. - Start the service with
pnpm start. For a production service, run it under a supervisor such as PM2 or a systemd unit so it restarts after a crash and starts after reboot.
Run the start command from the same release directory whose environment and dependencies you built. If you use a process manager, explicitly define the working directory and environment file instead of relying on an interactive shell.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsRank #3
- Ergonomic & Adjustable Design: Fight "text neck" and improve your posture. Designed for comfort, it offers an adjustable height (7.1in-8.5in) (1.4in adjustable range) and angle (5°-85°) Please note: cell phone stand is only 9 inches tall—the length of a standard pencil
- Without blocking subtitles Perfect for office desk Tiktok Face Time Zoom video—this is the ultimate kitchen desk essential for phones! Perfect viewing experience while reducing neck back strain, A must-have for gamers streamers desk, and anyone who values both style and support!
- Sleek & Stable Design fits Otterbox Case: Say goodbye to bent cables, tangles, and tip-overs! LISEN’s stylish adjustable desk phone holder features a built-in charging hole and smart cable management, keeping your phone secure and your workspace clutter-free cool gadgets for men
- ANTI-SLIP DESIGN free hands: The under 10.00 items easy gadgets back and the bottom of this kitchen essentials for women are fully covered by anti-skid silicone, which LISEN stand up desk decor can provide maximum protection device from any scratches and slides
- Your Perfect Viewing Companion:If your product arrives damaged or breaks within 365 days, reach out to LISEN for a quick and hassle-free solution. Struggling with assembly, like tightening the screw? We’ve got your back! Your experience matters to us. (Product including: phone Holder stand*1, screw*1, hexagon screwdriver*1, specification*1)
Environment variables and secure configuration
| Variable | Purpose | How to use it safely |
|---|---|---|
DATABASE_URL |
Connection string for PostgreSQL; the only required variable in the reference | Use a dedicated role, a strong password, private connectivity, and URL-encode reserved password characters |
APP_SECRET |
Secret used by the application for session and security functions | Generate a unique value with openssl rand -hex 32; keep it private and stable for the life of the installation |
BASE_PATH |
Prefix when Umami is served below the domain root | For a URL such as https://example.com/stats, set BASE_PATH=/stats and configure the proxy to preserve that prefix |
API_URL |
Optional API endpoint configuration | Set it only when your integration requires a non-default API address, and make its public path match the proxy |
TWO_FACTOR_ENCRYPTION_KEY |
Optional encryption key for two-factor data | The repository documents a 64-character hexadecimal value; generate and store it as a secret rather than inventing a short key |
MCP_ENABLED |
Enables the MCP endpoint when set to 1 |
Enable deliberately, assess its exposure, and protect the endpoint with the same access controls as other administration surfaces |
Environment variables are configuration, not a substitute for network controls. A private database, least-privilege database role, restricted SSH, HTTPS, and a protected backup location still matter when every secret is correct.
Put Nginx or Apache in front of Umami
Do not make port 3000 your public interface. Bind Umami to the local machine or a private network and let a reverse proxy terminate TLS, enforce the hostname, and forward requests to the application.
Root-domain Nginx pattern
The following is a minimal pattern for an installation served at its own hostname. Replace the hostname and certificate paths with your values:
server {
listen 80;
server_name analytics.example.com;
location / {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Use the HTTP server block to obtain a certificate with your chosen ACME client, then add a 443 server block that points to the certificate and retains the proxy headers. Redirect port 80 to HTTPS after certificate issuance. Test the configuration before reloading Nginx.
Free tools Windows power users keep installed
One-click scans. No signup required.
Subdirectory deployment
To publish Umami at https://example.com/stats rather than at a dedicated hostname, set BASE_PATH=/stats in the application environment and restart it. The proxy location must preserve the same prefix:
Rank #4
- Easy Installation: Our gaming lights have been designed to enhance your entertainment experience. Simply position the led light bar next to your TV or game console to create a game room environment with ease. They come with USB power and a 60 inch cord for direct mounting and mobility
- Audio Syncing & Extensive Mode: The built-in high-sensitivity music sensor allows you to sync the TV led lights to your favorite music. Lights react and move to the beat of music, film and game audio, creating an incredible immersive sound and light experience – and all without the need for an additional hub. You can choose from 64+ patterns, including strobe, illusion, jump, energy, gradient, running, chasing, fluttering mode etc. Each mode can be applied to different scenes
- 64+ Chasing IC+RGB & W Effect: The independent control design of IC+RGB and white all-in-one multifunctional rgbw led bar lights monitor backlight allows you to easily switch the led lights for desk between IC+RGB and white to enjoy a variety of lighting effects, you can choose white lighting mode with high brightness for better illumination when working, etc. Choose IC+RGB lighting mode when you need to create an entertaining atmosphere for the light show, 16 million colours of Color changing rgb light bar let you dance to the beat and create a dynamic party atmosphere
- Dynamic and Dimmable Lights: 1%-full brightness free brightness adjustment gives you the flexibility to adjust dimmable led light bar for room decorations or a variety of occasions
- USB Powered: USB light bars for room can be powered by powernank, usb charger, TV, Monitor, laptop PC mainframe, making behind TV led lighting bar easy to install in any location.TV led lights are powered by the TV usb interface / PC mainframe, can be turned on/off synchronously with TV / PC
location /stats/ {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-Proto $scheme;
}
Do not configure the proxy for /stats while leaving BASE_PATH empty, or configure BASE_PATH=/stats while stripping the prefix in proxy_pass. That mismatch produces missing JavaScript, redirects to the wrong path, or API calls that return 404. After reloading the proxy, test the login page, static assets, dashboard navigation, and an event request from a tracking site.
Finish the first-run security checklist
- Open the HTTPS hostname, sign in with the initial
admin/umamicredentials, and change the password immediately. - Confirm that the browser shows a valid certificate and that HTTP redirects to HTTPS.
- Verify that port 3000 is not reachable from the public internet. If Docker publishes it on all interfaces, change the binding to localhost or block it at the firewall.
- Review the administrator account and create only the users and permissions you need.
- Create a tracking website in Umami, copy its tracking snippet, and place that snippet on a non-production page first. Confirm that a visit appears in the dashboard before deploying it site-wide.
- Write down the Umami version, Compose file or source commit, environment variable names, proxy configuration, database location, and backup schedule.
Docker Compose versus source installation
| Decision point | Docker Compose | Source installation |
|---|---|---|
| Initial setup | Shortest documented single-server setup; application and PostgreSQL start together | More steps: supported Node.js, PostgreSQL, database role, pnpm dependencies and process supervision |
| Node.js and PostgreSQL control | Versions are encapsulated by the image and database service; less host-level control | Direct control over package versions, extensions, tuning and service layout |
| Upgrade workflow | Pull the new image, then recreate the services | Pull source, install dependencies, rebuild and restart the process |
| Backups | You must back up the PostgreSQL volume or dump the database; Docker does not make backups automatically | You must back up the separately installed PostgreSQL database and retain configuration files |
| Reverse proxy | Proxy to the published local container port, commonly 3000 | Proxy to the port used by the supervised Node.js process |
| Operational complexity | Lower at first, but requires Docker volume, image and Compose knowledge | Higher initially, with familiar system-service controls for teams that already use them |
Choose Compose when a reproducible one-host stack matters more than host-level package control. Choose source when your operations team needs to patch, tune, monitor, or share PostgreSQL and Node.js according to an existing platform standard.
Recommended Free Tools
Backups, updates and routine maintenance
Back up the data that actually matters
The PostgreSQL database contains the analytics history, sites, users, and configuration stored by Umami. Back up it up independently of the application image or source tree. A logical dump is portable and easy to verify:
pg_dump --format=custom --file=umami-$(date +%F).dump DATABASE_NAME
Use the correct database role and host for your deployment, encrypt dumps at rest, copy them to a separate failure domain, and periodically restore one to a test PostgreSQL instance. For Compose, also preserve the Compose file and volume definition; for source installs, preserve the release commit, .env secrets, process-manager unit, and proxy configuration. Never place secrets in an unencrypted public backup.
Update a source installation
From the checked-out Umami directory, the documented sequence is:
Best Value
- Compatible with Wide Screens - To ensure compatibility with the dual monitor mount, your each monitor must meet three conditions at the same time: First, computer screens size range: 13 to 32 inches. Second, screen weight range: 4.4 to 19.8 lbs. Third, the back of the monitor screen must have VESA mounting holes with a pitch of 75x75mm or 100x100mm.
- Regarding the compatibility with desks - Your desk must meet three conditions at the same time: First, desk material: Only wooden desks are recommended, plastic or glass desks cannot be used. Second, desk thickness range: 0.59" - 3.54". Third, the bottom of the desk should not have any cross beams or panels, as this will interfere with installation. We recommend carefully checking that your desk and monitors meets all above conditions before purchasing.
- Dual C-Clamp Hold - Worried your dual monitors might wobble or slip? Our upgraded base uses a larger platform plus a dual C-clamp structure to lock the dual monitor arm firmly to your desk. Each arm safely keeps your screens steady while you type, click and game—no shaking, no sliding, just a clean and secure setup you can trust every day. It also provides Grommet Mounting installation choice, both options ensure stable and secure fixation for your 0.59" - 3.54" desk.
- Full-Motion Adjustment For Comfortable View - Pull the screen closer when you’re deep in a spreadsheet, push it back to watch videos, or rotate to portrait for coding — moving everything smoothly with just one hand. The monitor stand offers +85°/-50° tilt, ±90° swivel and 360° rotation. Raise your monitor up to 15.75″ to support a healthy sitting posture. Whether you’re working from home, gaming through the night, or switching between video calls and documents, getting the screens to your natural line of sight helps relieve neck, shoulder and back strain so you can stay focused longer with less fatigue.
- Keep Your Desk Organized: By lifting both screens off the desktop, this dual monitor stand opens up valuable space for your keyboard, notebook, docking station or a simple, clutter-free work area. Built-in cable management guides wires along the arms, keeping cords out of sight and out of the way. Enjoy a tidy, modern workstation that looks as good as it feels to use.
git pullpnpm installpnpm build- Restart the service with
pnpm start, or restart the PM2 process or systemd unit that runs it.
Take a database backup before a major version change. Keep the previous source revision available until the new build has passed login, dashboard, tracking, and proxy checks.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Update a Compose installation
From the directory containing the Compose file, run:
docker compose pulldocker compose up --force-recreate -ddocker compose psanddocker compose logs --tail=100to verify health and startup output.
Pin a tested image version when you need controlled rollouts instead of silently receiving a changing latest image. Keep the database volume and environment file unchanged unless the release notes require a deliberate migration.
Refresh PostgreSQL statistics after major upgrades
After a major Umami upgrade, run PostgreSQL ANALYZE so the query planner refreshes table statistics. Execute it against the Umami database with a role allowed to analyze its tables, then inspect dashboard response times and database logs. This maintenance does not replace a backup or a schema migration; it refreshes planner information after the upgrade.
Troubleshooting by symptom
The container or process exits immediately
- Read logs first. A malformed
DATABASE_URL, unreachable PostgreSQL host, invalid credentials, or unsupported Node.js version is more useful than repeatedly restarting. - Check that the environment file is in the directory and format expected by Compose or the process manager.
- For source installs, verify Node.js is at least 18.18 and PostgreSQL at least 12.14 before reinstalling dependencies.
The login page works locally but not through Nginx
- Confirm the proxy points to the actual local listening address and port.
- Check the Nginx error log and test the local URL from the VPS.
- Verify DNS resolves to the VPS and that the firewall allows 80 and 443.
- If the installation is under a path, make
BASE_PATH, the Nginx location, and the public URL use the identical prefix.
CSS or JavaScript files return 404 under a subdirectory
This almost always indicates a prefix mismatch. Set BASE_PATH=/stats for a /stats deployment, preserve that prefix in the proxy, restart Umami, clear an old browser cache, and test the generated asset URLs again.
The dashboard is empty after adding the tracking script
- Use the browser developer tools to confirm the script loads over HTTPS and that its requests are not blocked by mixed-content rules or a content-security policy.
- Check that the script uses the correct website identifier and endpoint for this Umami instance.
- Generate a visit on a test page, then inspect Umami and the reverse-proxy logs for the incoming event.
PostgreSQL fills the disk
Measure database growth against event volume and retention rather than deleting files from the PostgreSQL data directory. Expand storage, establish retention practices appropriate to your analytics needs, archive or remove data through supported database procedures, and verify that backups still complete.
When to use a separate database host
Move PostgreSQL away from the Umami VPS when database durability, independent scaling, or organizational separation outweighs the simplicity of a single host. Place both systems on a private network, allow connections only from the Umami address, use a dedicated database role, and require TLS when traffic crosses an untrusted segment. Test what happens when the database is unavailable: the dashboard should fail clearly, and your monitoring should alert before users discover it.
A separate database does not remove backup responsibility. It changes where backups, upgrades, credentials, and failure recovery are managed. Document the database version, connection endpoint, allowed network ranges, backup retention, and restoration procedure alongside the Umami deployment.
Quick Recap
Production readiness checklist
- Supported runtime: Node.js 18.18 or newer for source installs; PostgreSQL 12.14 or newer.
- Unique
APP_SECRETgenerated with a cryptographically strong method. - Dedicated PostgreSQL role and a protected
DATABASE_URL. - Initial administrator password changed from
umami. - Public traffic served through Nginx or Apache with a valid HTTPS certificate.
- Port 3000 restricted to localhost or a private network.
BASE_PATHand proxy rules aligned when using a subdirectory.- Tested PostgreSQL backups stored away from the VPS.
- Written update procedure for either Compose or source deployment.
- Monitoring for disk, memory, CPU, process health, certificate expiry, and database availability.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →




