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 + query_log
+ 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: +