Favicon of Rybbit

Rybbit

Get lightweight web analytics without cookies. Understand user behavior with session replays, funnels, and real-time data. Fully GDPR & CCPA compliant.

Gain deep insights into your website traffic with a powerful, lightweight, and privacy-first analytics solution. Designed as a modern alternative to complex tools, it provides everything you need to understand your audience without compromising their privacy. No cookies means no annoying banners and automatic compliance with GDPR and CCPA regulations.

Installation is incredibly simple, requiring just a single line of code to start seeing data instantly. From there, you can access a suite of advanced features to analyze user behavior in detail.

Key features include:

  • Session Replay: Watch recordings of real user sessions to identify usability issues and pain points.
  • Conversion Funnels: Visualize the paths users take and pinpoint exactly where they drop off.
  • Real-time Data: Monitor visitor activity as it happens.
  • User Journeys: Track how individual users navigate through your site from start to finish.
  • Custom Events: Track specific interactions like button clicks, form submissions, or sign-ups.

As a 100% open-source tool, you have the freedom to self-host or use the managed cloud service. Full API access and data export capabilities ensure you always have control over your data.

Directory Structure

rybbit
caddy_config
caddy_data
event-data
event-logs
postgres-data
.env
Caddyfile
docker-compose.yml

docker-compose.yml

services:
  caddy:
    profiles: ["with-webserver"]
    image: caddy:2.10.0
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp" # Needed for HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile # Mount Caddy config file
      - ./caddy_data:/data               # Local directory for SSL certs and state
      - ./caddy_config:/config           # Local directory for config cache
    environment:
      - DOMAIN_NAME=${DOMAIN_NAME}       # Domain for Caddyfile usage
    depends_on:
      - backend
      - client

  clickhouse:
    container_name: clickhouse
    image: clickhouse/clickhouse-server:25.4.2
    volumes:
      - ./event-data:/var/lib/clickhouse # Persistent data in local directory
      - ./event-logs:/var/log/clickhouse # Persistent logs in local directory
    configs:
      - source: clickhouse_network
        target: /etc/clickhouse-server/config.d/network.xml
      - source: clickhouse_json
        target: /etc/clickhouse-server/config.d/enable_json.xml
      - source: clickhouse_logging
        target: /etc/clickhouse-server/config.d/logging_rules.xml
      - source: clickhouse_user_logging
        target: /etc/clickhouse-server/config.d/user_logging.xml
    environment:
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-analytics}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-frog}
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"]
      interval: 3s
      timeout: 5s
      retries: 5
      start_period: 10s
    restart: unless-stopped
    ports:
      - "8123:8123"

  postgres:
    image: postgres:17.4
    container_name: postgres
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-frog}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-frog}
      - POSTGRES_DB=${POSTGRES_DB:-analytics}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data # Persistent DB data in local directory
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 3s
      timeout: 5s
      retries: 5
      start_period: 10s
    restart: unless-stopped
    ports:
      - "5432:5432"

  backend:
    image: ghcr.io/rybbit-io/rybbit-backend:${IMAGE_TAG:-latest}
    container_name: backend
    build:
      context: .
      dockerfile: server/Dockerfile
    ports:
      - "${HOST_BACKEND_PORT:-127.0.0.1:3001:3001}"
    environment:
      - NODE_ENV=production
      - CLICKHOUSE_HOST=http://clickhouse:8123
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-analytics}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-frog}
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
      - POSTGRES_DB=${POSTGRES_DB:-analytics}
      - POSTGRES_USER=${POSTGRES_USER:-frog}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-frog}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - BASE_URL=${BASE_URL}
      - DISABLE_SIGNUP=${DISABLE_SIGNUP}
      - DISABLE_TELEMETRY=${DISABLE_TELEMETRY}
      - MAPBOX_TOKEN=${MAPBOX_TOKEN}
    depends_on:
      clickhouse:
        condition: service_healthy
      postgres:
        condition: service_started
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3001/api/health"]
      interval: 3s
      timeout: 5s
      retries: 5
      start_period: 10s
    restart: unless-stopped

  client:
    image: ghcr.io/rybbit-io/rybbit-client:${IMAGE_TAG:-latest}
    container_name: client
    build:
      context: .
      dockerfile: client/Dockerfile
      args:
        NEXT_PUBLIC_BACKEND_URL: ${BASE_URL}
        NEXT_PUBLIC_DISABLE_SIGNUP: ${DISABLE_SIGNUP}
    ports:
      - "${HOST_CLIENT_PORT:-127.0.0.1:3002:3002}"
    environment:
      - NODE_ENV=production
      - NEXT_PUBLIC_BACKEND_URL=${BASE_URL}
      - NEXT_PUBLIC_DISABLE_SIGNUP=${DISABLE_SIGNUP}
    depends_on:
      - backend
    restart: unless-stopped

configs:
  clickhouse_network:
    content: |
      <clickhouse>
          <listen_host>0.0.0.0</listen_host>
      </clickhouse>

  clickhouse_json:
    content: |
      <clickhouse>
          <settings>
              <enable_json_type>1</enable_json_type>
          </settings>
      </clickhouse>

  clickhouse_logging:
    content: |
      <clickhouse>
        <logger>
            <level>warning</level>
            <console>true</console>
        </logger>
        <query_thread_log remove="remove"/>
        <query_log remove="remove"/>
        <text_log remove="remove"/>
        <trace_log remove="remove"/>
        <metric_log remove="remove"/>
        <asynchronous_metric_log remove="remove"/>
        <session_log remove="remove"/>
        <part_log remove="remove"/>
        <latency_log remove="remove"/>
        <processors_profile_log remove="remove"/>
      </clickhouse>

  clickhouse_user_logging:
    content: |
      <clickhouse>
        <profiles>
          <default>
            <log_queries>0</log_queries>
            <log_query_threads>0</log_query_threads>
            <log_processors_profiles>0</log_processors_profiles>
          </default>
        </profiles>
      </clickhouse>

.env

# General Configuration
APP_PORT=8000
BASE_URL=https://analytics.yourdomain.com

# Secrets (Generate these using `openssl rand -base64 64` and `openssl rand -base64 32`)
SECRET_KEY_BASE=replace_with_a_long_random_base64_string_minimum_64_chars
TOTP_VAULT_KEY=replace_with_a_long_random_base64_string_minimum_32_chars

# Database Configuration (PostgreSQL)
POSTGRES_USER=rybbit_user
POSTGRES_PASSWORD=secure_postgres_password
POSTGRES_DB=rybbit_db

# Registration Settings
# Set to 'true' to disable new user registration after you have created your admin account
DISABLE_REGISTRATION=false

# SMTP / Email Configuration (Optional but recommended for password resets)
MAILER_EMAIL=noreply@yourdomain.com
SMTP_HOST_ADDR=smtp.example.com
SMTP_HOST_PORT=587
SMTP_USER_NAME=your_smtp_user
SMTP_USER_PWD=your_smtp_password
SMTP_HOST_SSL_ENABLED=true
Categories:

Share:

Ad
Favicon

 

  
 

Similar to Rybbit

Favicon

 

  
  
Favicon

 

  
  
Favicon