Install docker

Docker install

Install Plausible

1mkdir plausible
2git clone plausible/
3cd plausible
4mkdir db-data
5mkdir event-data

Set the docker-compose.yml file to contain the following. Note that the volumes are replaced by local folders for db-data and event-data. Also, the plausible-net network is added to each image and the plausible-npm network is created to make plausible a part of the NPM Docker . Since this setup communicates with NPM via plausible-npm network, there is no need for exposing the ports and so they are #ed out.

 1version: "3.3"
 3  mail:
 4    image: bytemark/smtp
 5    restart: always
 7  plausible_db:
 8    image: postgres:12
 9    restart: always
10    volumes:
11      - ./db-data:/var/lib/postgresql/data
12    environment:
13      - POSTGRES_PASSWORD=postgres
14    networks:
15      - plausible-net
17  plausible_events_db:
18    image: yandex/clickhouse-server:
19    restart: always
20    volumes:
21      - ./event-data:/var/lib/clickhouse
22      - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
23      - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
24    ulimits:
25      nofile:
26        soft: 262144
27        hard: 262144
28    networks:
29      - plausible-net
31  plausible:
32    image: plausible/analytics:latest
33    restart: always
34    command: sh -c "sleep 10 && / db createdb && / db migrate && / db init-admin && / run"
35    depends_on:
36      - plausible_db
37      - plausible_events_db
38      - mail
39#    ports:
40#      - 8000:8000
41    env_file:
42      - plausible-conf.env
43    networks:
44      - plausible-net
45      - plausible-npm
47#  db-data:
48#    driver: local
49#  event-data:
50#    driver: local
51#  geoip:
52#    driver: local
55  plausible-net:
56  plausible-npm:

Edit plausible-env.conf and set the values of all env variables in there. Note that the ADMIN_USER_EMAIL= is needed because that is the username for logging in. The ADMIN_USER_NAME= is not the username for logging in. The secret key can be generated by the command

1openssl rand -base64 64 | tr -d '\n' ; echo


1docker-compose up -d
2docker exec plausible_plausible_db_1 psql -U postgres -d plausible_db -c "UPDATE users SET email_verified = true;"

Configure Nginx Proxy Manager

Main setup is NPM Docker

Open the NPU UI and add a new proxy host

 1Domain Names:
 2Scheme: http
 3Forward Hostname/IP: plausible
 4Forward Port: 8000
 6Block common exploits: Yes
 8Tab SSL/
 9SSL Certificate:
10Force SSL yes
11HTTP/2 Support yes
13Tab Custom locations/
14Location: /
15Scheme: http
16Forward Hostname/IP: plausible
17Forward Port: 8000
18In detailed settings (gear icon) add the line
19proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

NOTE: Adding the proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; may not be needed because NPM by default adds something like that (albeit with $remote_addr instead of $proxy_add_x_forwarded_for) but just to be on the safe side, since this is recommended by the Plausible docs .

Edit npm/docker-compose.yaml and add plausible_plausible-npm to the networks like so

1    networks:
2      - plausible_plausible-npm
4    plausible_plausible-npm:
5      external: true

Would likely need to do a docker-compose down before editing the npm/docker-compose.yaml file above, followed by docker-compose up -d after the editing is done.

NOTE: Plausible will need to be started before NPM is started, else NPM will not find the external plausible_plausible-npm network

Set up Google Console Search integration as described at

Add a page to toggle exclusion from being counted for a particular web browser by downloading the HTML file referenced here and copying it to static/scripts/ so that browsing to will enable toggling of the exclusion.