diff --git a/plausible/.env-example b/plausible/.env-example
new file mode 100644
index 0000000..2c237be
--- /dev/null
+++ b/plausible/.env-example
@@ -0,0 +1,55 @@
+# Postgres version for the Plausible database
+PLAUSIBLE_POSTGRES_VERSION=16
+
+# Password for the PostgreSQL database
+PLAUSIBLE_POSTGRES_PASSWORD=your_postgres_password_here
+
+# Clickhouse version for the Plausible events database
+PLAUSIBLE_CLICKHOUSE_VERSION=24.3.3.102-alpine
+
+# Version of Plausible Community Edition
+PLAUSIBLE_VERSION=v2.1.5
+
+# Domain for Plausible instance
+PLAUSIBLE_DOMAIN=plausible.example.com
+
+# Secret key base for Plausible instance (set to a secure random string)
+# Generate with echo "PLAUSIBLE_SECRET_KEY_BASE=$(openssl rand -base64 48)"
+PLAUSIBLE_SECRET_KEY_BASE=your_secure_secret_key_base_here
+
+# Temporary directory for Plausible
+TMPDIR=/var/lib/plausible/tmp
+
+#################################
+# Following fields are optional #
+#################################
+
+# Configuration for databases
+#DATABASE_URL=postgres://postgres:${PLAUSIBLE_POSTGRES_PASSWORD}@plausible-db:5432/plausible
+#CLICKHOUSE_DATABASE_URL=clickhouse://plausible-events:9000/plausible_events
+
+# Google OAuth credentials
+#GOOGLE_CLIENT_ID=your_google_client_id_here
+#GOOGLE_CLIENT_SECRET=your_google_client_secret_here
+
+# Geolocation configuration (Optional)
+#IP_GEOLOCATION_DB=path_to_geolocation_db
+#GEONAMES_SOURCE_FILE=path_to_geonames_file
+#MAXMIND_LICENSE_KEY=your_maxmind_license_key_here
+#MAXMIND_EDITION=your_maxmind_edition_here
+
+# Email configuration (choose one of the email adapters)
+#MAILER_ADAPTER=smtp # Options: smtp, sendgrid, postmark, mandrill, mailgun
+#MAILER_EMAIL=your_email_here
+#MAILER_NAME="Your Name or Company"
+#SMTP_HOST_ADDR=smtp.yourmailserver.com
+#SMTP_HOST_PORT=587
+#SMTP_USER_NAME=your_smtp_username_here
+#SMTP_USER_PWD=your_smtp_password_here
+#SMTP_HOST_SSL_ENABLED=true
+#POSTMARK_API_KEY=your_postmark_api_key_here
+#MAILGUN_API_KEY=your_mailgun_api_key_here
+#MAILGUN_DOMAIN=your_mailgun_domain_here
+#MAILGUN_BASE_URI=https://api.mailgun.net
+#MANDRILL_API_KEY=your_mandrill_api_key_here
+#SENDGRID_API_KEY=your_sendgrid_api_key_here
diff --git a/plausible/data/clickhouse/ipv4-only.xml b/plausible/data/clickhouse/ipv4-only.xml
new file mode 100644
index 0000000..cdd43c3
--- /dev/null
+++ b/plausible/data/clickhouse/ipv4-only.xml
@@ -0,0 +1,3 @@
+
+ 0.0.0.0
+
diff --git a/plausible/data/clickhouse/logs.xml b/plausible/data/clickhouse/logs.xml
new file mode 100644
index 0000000..3ffd303
--- /dev/null
+++ b/plausible/data/clickhouse/logs.xml
@@ -0,0 +1,28 @@
+
+
+ warning
+ true
+
+
+
+ system
+
+ 7500
+
+ ENGINE = MergeTree
+ PARTITION BY event_date
+ ORDER BY (event_time)
+ TTL event_date + interval 30 day
+ SETTINGS ttl_only_drop_parts=1
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plausible/data/clickhouse/low-resources.xml b/plausible/data/clickhouse/low-resources.xml
new file mode 100644
index 0000000..aab3cd8
--- /dev/null
+++ b/plausible/data/clickhouse/low-resources.xml
@@ -0,0 +1,23 @@
+
+
+
+ 524288000
+
+
+
+
+ 1
+
+ 8192
+
+ 1
+
+ 0
+
+ 0
+
+
+
\ No newline at end of file
diff --git a/plausible/docker-compose.yml b/plausible/docker-compose.yml
new file mode 100644
index 0000000..bba0bd5
--- /dev/null
+++ b/plausible/docker-compose.yml
@@ -0,0 +1,122 @@
+services:
+ plausible_db:
+ image: postgres:${PLAUSIBLE_POSTGRES_VERSION:-16}
+ container_name: plausible-db
+ restart: always
+ networks:
+ - plausible
+ volumes:
+ - db-data:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_PASSWORD=${PLAUSIBLE_POSTGRES_PASSWORD:?error}
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
+ start_period: 1m
+
+ plausible_events_db:
+ image: clickhouse/clickhouse-server:${PLAUSIBLE_CLICKHOUSE_VERSION:-24.3.3.102-alpine}
+ container_name: plausible-events
+ restart: always
+ networks:
+ - plausible
+ volumes:
+ - event-data:/var/lib/clickhouse
+ - event-logs:/var/log/clickhouse-server
+ - ./data/clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro
+ # This makes ClickHouse bind to IPv4 only, since Docker doesn't enable IPv6 in bridge networks by default.
+ # Fixes "Listen [::]:9000 failed: Address family for hostname not supported" warnings.
+ - ./data/clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro
+ # This makes ClickHouse consume less resources, which is useful for small setups.
+ # https://clickhouse.com/docs/en/operations/tips#using-less-than-16gb-of-ram
+ - ./data/clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro
+ ulimits:
+ nofile:
+ soft: 262144
+ hard: 262144
+ healthcheck:
+ test: ["CMD-SHELL", "wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping || exit 1"]
+ start_period: 1m
+
+ plausible:
+ image: ghcr.io/plausible/community-edition:${PLAUSIBLE_VERSION:-v2.1.5}
+ container_name: plausible
+ restart: always
+ command: sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
+ depends_on:
+ plausible_db:
+ condition: service_healthy
+ plausible_events_db:
+ condition: service_healthy
+ networks:
+ - traefik
+ - plausible
+ volumes:
+ - plausible:/var/lib/plausible
+ ulimits:
+ nofile:
+ soft: 65535
+ hard: 65535
+ environment:
+ - TMPDIR
+ # required: https://github.com/plausible/community-edition/wiki/configuration#required
+ - BASE_URL=https://${PLAUSIBLE_DOMAIN}
+ - SECRET_KEY_BASE=${PLAUSIBLE_SECRET_KEY_BASE}
+ # optional: https://github.com/plausible/community-edition/wiki/configuration#optional
+ # registration: https://github.com/plausible/community-edition/wiki/configuration#registration
+ - TOTP_VAULT_KEY
+ - DISABLE_REGISTRATION
+ - ENABLE_EMAIL_VERIFICATION
+ # web: https://github.com/plausible/community-edition/wiki/configuration#web
+ - HTTP_PORT
+ - HTTPS_PORT
+ # databases: https://github.com/plausible/community-edition/wiki/configuration#database
+ - DATABASE_URL
+ - CLICKHOUSE_DATABASE_URL
+ # Google: https://github.com/plausible/community-edition/wiki/configuration#google
+ - GOOGLE_CLIENT_ID
+ - GOOGLE_CLIENT_SECRET
+ # geolocation: https://github.com/plausible/community-edition/wiki/configuration#ip-geolocation
+ - IP_GEOLOCATION_DB
+ - GEONAMES_SOURCE_FILE
+ - MAXMIND_LICENSE_KEY
+ - MAXMIND_EDITION
+ # email: https://github.com/plausible/community-edition/wiki/configuration#email
+ - MAILER_ADAPTER
+ - MAILER_EMAIL
+ - MAILER_NAME
+ - SMTP_HOST_ADDR
+ - SMTP_HOST_PORT
+ - SMTP_USER_NAME
+ - SMTP_USER_PWD
+ - SMTP_HOST_SSL_ENABLED
+ - POSTMARK_API_KEY
+ - MAILGUN_API_KEY
+ - MAILGUN_DOMAIN
+ - MAILGUN_BASE_URI
+ - MANDRILL_API_KEY
+ - SENDGRID_API_KEY
+ labels:
+ - "traefik.enable=true"
+ - "traefik.docker.network=traefik"
+ - "traefik.http.routers.plausible.entrypoints=http"
+ - "traefik.http.routers.plausible.rule=Host(`${PLAUSIBLE_DOMAIN:?error}`)"
+ - "traefik.http.middlewares.plausible-https-redirect.redirectscheme.scheme=https"
+ - "traefik.http.routers.plausible.middlewares=plausible-https-redirect"
+ - "traefik.http.routers.plausible-secure.entrypoints=https"
+ - "traefik.http.routers.plausible-secure.rule=Host(`${PLAUSIBLE_DOMAIN:?error}`)"
+ - "traefik.http.routers.plausible-secure.tls=true"
+ - "traefik.http.routers.plausible-secure.service=plausible"
+ - "traefik.http.services.plausible.loadbalancer.server.port=8080"
+
+networks:
+ traefik:
+ external: true
+ plausible:
+ driver: bridge
+
+volumes:
+ db-data:
+ event-data:
+ event-logs:
+ plausible:
+