Skip to Content

Deploy Plausible

Simple, open source, lightweight and privacy-friendly web analytics alternative to Google Analytics.

⭐ 24.2k stars📜 GNU Affero General Public License v3.0🔴 Advanced⏱ ~20 minutes

A production-ready Plausible Analytics instance. Note that Plausible uses a two-database architecture:

  • PostgreSQL: Stores your users, sites, and metadata.
  • ClickHouse: A high-performance columnar database that stores the millions of raw events (pageviews) you’ll be collecting.

🌍 Geolocation Tip: To see where your visitors are coming from, you’ll need to download the free MaxMind GeoLite2 database after deployment and place it in the ./geoip folder.

Prerequisites

  • A server with Docker and Docker Compose installed (setup guide)
  • A domain name pointed to your server (optional but recommended)
  • Basic terminal access (SSH)

The Config

Create a directory for Plausible and add this docker-compose.yml:

# ------------------------------------------------------------------------- # 🚀 Created and distributed by The AltStack # 🌍 https://thealtstack.com # ------------------------------------------------------------------------- version: '3.8' services: plausible: image: plausible/analytics:latest container_name: plausible restart: unless-stopped command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" depends_on: - plausible_db - plausible_events_db - mail ports: - "8000:8000" environment: - BASE_URL=http://localhost:8000 - SECRET_KEY_BASE=ChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMe - DATABASE_URL=postgres://postgres:postgres@plausible_db:5432/plausible_db - CLICKHOUSE_DATABASE_URL=http://plausible_events_db:8123/plausible_events_db - MAILER_EMAIL=admin@example.com - SMTP_HOST_ADDR=mail - SMTP_HOST_PORT=25 - SMTP_USER_NAME= - SMTP_USER_PWD= - SMTP_SSL_Enabled=false volumes: - ./geoip:/geoip:ro plausible_db: image: postgres:14-alpine container_name: plausible_db restart: unless-stopped volumes: - plausible_db_data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=postgres - POSTGRES_DB=plausible_db plausible_events_db: image: clickhouse/clickhouse-server:24.3.3.102-alpine container_name: plausible_events_db restart: unless-stopped volumes: - plausible_events_data:/var/lib/clickhouse - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro ulimits: nofile: soft: 262144 hard: 262144 mail: image: bytemark/smtp container_name: plausible_mail restart: unless-stopped volumes: plausible_db_data: plausible_events_data:

Let’s Ship It

# Create a directory mkdir -p /opt/plausible && cd /opt/plausible # Create the docker-compose.yml (paste the config above) nano docker-compose.yml # Pull images and start docker compose up -d # Watch the logs docker compose logs -f

Environment Variables

VariableDefaultRequired
BASE_URLhttp://localhost:8000No
SECRET_KEY_BASEChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeNo
DATABASE_URLpostgres://postgres:postgres@plausible_db:5432/plausible_dbNo
CLICKHOUSE_DATABASE_URLhttp://plausible_events_db:8123/plausible_events_dbNo
MAILER_EMAILadmin@example.comNo
SMTP_HOST_ADDRmailNo
SMTP_HOST_PORT25No
SMTP_SSL_EnabledfalseNo
POSTGRES_PASSWORDpostgresNo
POSTGRES_DBplausible_dbNo

Post-Deployment Checklist

  • Service is accessible on the configured port
  • Admin account created (if applicable)
  • Reverse proxy configured (Caddy guide)
  • SSL/HTTPS working
  • Backup script set up (backup guide)
  • Uptime monitor added (Uptime Kuma)

The “I Broke It” Section

Container won’t start?

docker compose logs plausible | tail -50

Port already in use?

# Find what's using the port lsof -i :PORT_NUMBER

Need to start fresh?

docker compose down -v # ⚠️ This deletes volumes/data! docker compose up -d

Going Further