Mirror of goatcounter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Martin Tournoij c814f16cb3
Limit hchart with on small screens
12 hours ago
.github Collect all the migrations in the schema files (#205) 3 months ago
acme Remove some unused stuff 1 month ago
bgrun Add linter to check copyright headers 1 month ago
cfg Add linter to check copyright headers 1 month ago
cmd Fixes for SQLite concurrency issues 19 hours ago
cron Improve styling, fix tests, some cleanups/fixes 1 day ago
db Track billing amount, add form to set GitHub sponsors 1 day ago
docs Implement API auth, export API 4 days ago
gctest Fix race in blackmail, move some stuff to zdb 1 day ago
handlers Use absolute totals for bottom charts when filterings 1 day ago
pack Limit hchart with on small screens 12 hours ago
public Limit hchart with on small screens 12 hours ago
tpl Restyle hchart bars 1 day ago
.editorconfig Initial events implementation (#215) 2 months ago
.gitattributes Implement API auth, export API 4 days ago
.gitignore Update gogo-release config 2 months ago
.gogo-release Update gogo-release config 2 months ago
.ignore Fix/cleanup minor TODO comments 8 months ago
.travis.yml Run Travis on macOS and Windows 4 weeks ago
CHANGELOG.markdown Restyle hchart bars 1 day ago
LICENSE Include 3rdparty licenses in /LICENSE 2 days ago
README.markdown Offer some data files for download 1 week ago
admin.go Track billing amount, add form to set GitHub sponsors 1 day ago
api_token.go Add test 4 days ago
export.go Fix export for Windows 4 days ago
export_test.go Fix export for Windows 4 days ago
gen.go Implement API auth, export API 4 days ago
go.mod Fixes for SQLite concurrency issues 19 hours ago
go.sum Fixes for SQLite concurrency issues 19 hours ago
helper.go Use new zgo.at/blackmail library (#279) 1 month ago
hit.go Improve styling, fix tests, some cleanups/fixes 1 day ago
hit_list.go Fix race 1 day ago
hit_stats.go Stable sorting order in case count_unique is identical 1 day ago
hit_test.go Use the same count for all the hcharts 1 day ago
kommentaar.conf Implement API auth, export API 4 days ago
memstore.go blacklist → refspam 1 week ago
memstore_test.go Last fixes 3 months ago
netlify.toml Redirect count.min.js to count.js in Netlify 5 months ago
ref.go Improve styling, fix tests, some cleanups/fixes 1 day ago
refspam.go blacklist → refspam 1 week ago
session.go s/fmt.Errorf/errors.Errorf/ 1 week ago
session_test.go Add linter to check copyright headers 1 month ago
site.go Improve styling, fix tests, some cleanups/fixes 1 day ago
site_test.go Remove user.Name and site.Name (#262) 1 month ago
tplfunc.go More styling tweaks for hcharts 1 day ago
update.go Move errors package to zgo.at/errors 1 month ago
user.go Track billing amount, add form to set GitHub sponsors 1 day ago

README.markdown

Build Status

GoatCounter is an open source web analytics platform available as a hosted service (free for non-commercial use) or self-hosted app. It aims to offer easy to use and meaningful privacy-friendly web analytics as an alternative to Google Analytics or Matomo.

There are two ways to run this: as hosted service on goatcounter.com, free for non-commercial use, or run it on your own server (the source code is completely Open Source/Free Software, and it can be self-hosted without restrictions).

See docs/rationale.markdown for some more details on the “why?” of this project.

There’s a live demo at https://stats.arp242.net.

Please consider contributing financially if you’re self-hosting GoatCounter so I can pay my rent :-)

GoatCounter is sponsored by a grant from NLnet’s NGI Zero PET fund.

Features

  • Privacy-aware; doesn’t track users with unique identifiers and doesn’t need a GDPR consent notice. Also see the privacy policy.

  • Lightweight and fast; adds just ~5K (~2.5K compressed) of extra data to your site. Also has JavaScript-free “tracking pixel” option, or you can use it from your application’s middleware.

  • Easy; if you’ve been confused by the myriad of options and flexibility of Google Analytics and Matomo that you don’t need then GoatCounter will be a breath of fresh air.

  • Identify unique visits without cookies using a non-identifiable hash (technical details).

  • Keeps useful statistics such as browser information, location, and screen size. Keep track of referring sites and campaigns.

  • Accessibility is a high-priority feature, and the interface works well with screen readers, no JavaScript, and even text browsers (although not all features work equally well without JS).

  • 100% committed to open source; you can see exactly what the code does and make improvements.

  • Own your data; you can always export all data and cancel at any time.

  • Integrate on your site with just a single script tag:

    <script data-goatcounter=“https://yoursite.goatcounter.com/count

          async src="//gc.zgo.at/count.js"></script>
    
  • The JavaScript integration is a good option for most, but you can also use a no-JavaScript image-based tracker or integrate in your backend middleware.

Technical

  • Fast: can handle about 800 hits/second on a $5/month Linode VPS using the default settings.

  • Self-contained binary: everything – including static assets – is in a single ~7M statically compiled binary. The only other thing you need is a SQLite database file or PostgreSQL connection (no way around that).

Running your own

The release page has binaries for Linux amd64, arm, and arm64. These are statically compiled and should work in pretty much any Linux environment. GoatCounter should run on any platform supported by Go, but there are no binaries for them (yet); you’ll have to build from source for now (it’s not hard, I promise).

Building from source

Compile from source with:

$ git clone -b release-1.3 https://github.com/zgoat/goatcounter.git
$ cd goatcounter
$ go build ./cmd/goatcounter

Or to build a statically linked binary:

$ go build \
    -tags osusergo,netgo,sqlite_omit_load_extension \
    -ldflags='-extldflags=-static' \
    ./cmd/goatcounter

You’ll now have a goatcounter binary in the current directory.

Go 1.13 and newer are supported (it follows the Go release policy). You will need a C compiler (for SQLite), or compile it with CGO_ENABLED=0 go build and use PostgreSQL.

It’s recommended to use the latest release as in the above command. The master branch should be reasonably stable, but no guarantees, and sometimes I don’t write release/upgrade notes until the actual release.

It’s not recommended to use go get in GOPATH mode since that will ignore the dependency versions in go.mod.

Running

You can start a test/development server with:

$ goatcounter serve -dev

The default is to use a SQLite database at ./db/goatcounter.sqlite3 (will be created if it doesn’t exist). See the -db flag to customize this.

You can create new sites with the create command:

$ goatcounter create -email me@example.com -domain stats.example.com

This will ask for a password for your new account; you can also add a password on the commandline with -password. If you use a custom DB, you must also pass the -db flag here.

The -dev flag makes some small things a bit more convenient for development. For a production environment run something like:

$ goatcounter serve

By default it will use ACME to create https certificates; use -tls none if you want to disable it (e.g. if you’re running goatcounter behind a proxy which already handles https for you).

Updating

You may need to run run database migrations when updating. Use goatcounter -automigrate to always run all pending migrations on startup. This is the easiest way, although arguably not the “best” way.

Use goatcounter migrate <file> or goatcounter migrate all to manually run migrations; generally you want to upload the new version, run migrations while the old one is still running, and then restart so the new version takes effect.

Use goatcounter migrate show to get a list of pending migrations.

PostgreSQL

Both SQLite and PostgreSQL are supported. SQLite should work well for the vast majority of people and is the recommended database engine. PostgreSQL will not be faster in most cases, and the chief reason for adding support in the first place is to support load balancing web requests over multiple servers. To use it:

  1. Create the database, unlike SQLite it’s not done automatically (you may need to modify the -db flag):

    $ createdb goatcounter $ psql goatcounter -c ‘\i db/schema.pgsql’ $ goatcounter -db ‘postgresql://dbname=goatcounter’ migrate all

  2. Run with custom -db flag:

    $ goatcounter serve

       -db 'postgresql://user=goatcounter dbname=goatcounter sslmode=disable'
    

See the pq docs for more details on the connection string.

  1. You can compile goatcounter without cgo if you don’t use SQLite:

    $ CGO_ENABLED=0 go build

Functionally it doesn’t matter too much, but builds will be a bit easier and faster as it won’t require a C compiler.

Development

See .github/CONTRIBUTING.markdown for details on how to run a development server, write patches, etc.

Various aggregate data files are available at https://www.goatcounter.com/data