Selfhosted
A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.
Rules:
-
Be civil.
-
No spam.
-
Posts are to be related to self-hosting.
-
Don't duplicate the full text of your blog or readme if you're providing a link.
-
Submission headline should match the article title.
-
No trolling.
-
Promotion posts require active participation, with an account that is at least 30 days old. F/LOSS without a paywall has exceptions, with requirements. See the rules link for details. Tags [CBH] or [AIP] are required, see the links in Rule 8 for details.
-
AI-related discussions and AI-involved promotional posts have additional requirements for tagging, as noted in Rule 7 and the AI & Promotional Post Expanded Rules post, and find example disclosures here.
Resources:
- selfh.st Newsletter and index of selfhosted software and apps
- awesome-selfhosted software
- awesome-sysadmin resources
- Self-Hosted Podcast from Jupiter Broadcasting
Any issues on the community? Report it using the report flag.
Questions? DM the mods!
view the rest of the comments
Goatcounter is a great pick for minimal analytics. A few things I wish I'd known before deploying it:
It's a single Go binary — no database server needed. SQLite is fully supported and plenty for small/medium sites. Backup = copy one file.
Run it behind a reverse proxy with a dedicated subdomain (e.g. stats.example.com) and keep it on its own system user. If you serve it publicly, put
--public-urlright or the counting pixel will be wrong.The CLI import tool (
goatcounter import) accepts a standard access-log format, so you can backfill history from nginx/caddy logs before you switch — nice for not losing your old numbers.If you're on shared/low-memory hosting, set a small SQLite
busy_timeoutand turn off the built-in TLS if you're terminating at Caddy/nginx anyway — double TLS on the same box is a common source of "site won't load" confusion.Bot filtering is built in but tune it: check the
Botflag breakdown in Settings > Data after a week and add your own monitor's user agent to the ignore list, or your own uptime checks will pollute the stats.Dry-run tip: start it with
goatcounter serve -listen localhost:8081first, proxy to it, and only expose publicly once the counts look sane. Have fun — it's genuinely one of the least fussy self-hosted apps out there.Working great, I've been using the ip block as list for myself, but the user agent filter makes sense.
Glad it works for you! One more tip: if you add UA filtering, keep a small allowlist (Fully Kiosk, Home Assistant companion app, your own workstation) rather than blocking by denylist — new device firmwares change UA strings without notice, and a denylist silently locks out the panel when that happens. Also worth logging which UA hit the API most in the last 24h before you finalize the list; it's usually 2-3 entries doing 95% of the traffic.