Relaticle logo

Relaticle

Open-source CRM with native AI agent support

Alternative to: attio, salesforce, hubspot, pipedrive


Relaticle is a self-hosted, open-source CRM built with Laravel and Filament, offering custom objects for companies, people and opportunities, 22 customizable field types, and multi-team workspace isolation. It ships a production-grade MCP server with 37 tools so AI agents like Claude or GPT can read and manage CRM data directly, alongside a full REST API for integrations.

Relaticle Docker Compose example

Self-host Relaticle on your own server, homelab, or VPS starting from this Docker Compose example. It runs Relaticle in Docker containers using the official ghcr.io/relaticle/relaticle:latest, ghcr.io/relaticle/relaticle:latest, ghcr.io/relaticle/relaticle:latest, postgres:17-alpine, redis:7-alpine images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  app:
    image: ghcr.io/relaticle/relaticle:latest
    restart: unless-stopped
    environment:
      # Display name of the CRM instance.
      APP_NAME: "Relaticle"
      APP_ENV: "production"
      # Laravel application key used to encrypt sessions and data. Generate with `php artisan key:generate --show` (format: base64:...).
      APP_KEY: "changeme"
      APP_DEBUG: "false"
      # Timezone used by the application (e.g. Europe/Berlin).
      APP_TIMEZONE: "UTC"
      # Public URL where the CRM is reached, including scheme.
      APP_URL: "changeme"
      # Optional dedicated domain for the admin panel. Leave empty to serve it from APP_URL.
      APP_PANEL_DOMAIN: ""
      # Require users to verify their email address before signing in.
      REQUIRE_EMAIL_VERIFICATION: "true"
      LOG_CHANNEL: "stderr"
      LOG_LEVEL: "warning"
      DB_CONNECTION: "pgsql"
      DB_HOST: "postgres"
      DB_PORT: "5432"
      # Name of the PostgreSQL database.
      DB_DATABASE: "relaticle"
      # PostgreSQL username.
      DB_USERNAME: "relaticle"
      # PostgreSQL password.
      DB_PASSWORD: "changeme"
      REDIS_HOST: "redis"
      REDIS_PASSWORD: "null"
      REDIS_PORT: "6379"
      CACHE_STORE: "redis"
      SESSION_DRIVER: "redis"
      QUEUE_CONNECTION: "redis"
      # Mail transport to use (log, smtp, ...). Use "smtp" to send real email.
      MAIL_MAILER: "log"
      # SMTP server hostname.
      MAIL_HOST: ""
      # SMTP server port.
      MAIL_PORT: "587"
      # SMTP username.
      MAIL_USERNAME: ""
      # SMTP password.
      MAIL_PASSWORD: ""
      # SMTP encryption (tls or ssl).
      MAIL_ENCRYPTION: "tls"
      # Address outgoing email is sent from.
      MAIL_FROM_ADDRESS: "hello@example.com"
      # Display name on outgoing email.
      MAIL_FROM_NAME: "Relaticle"
      # serversideup/php Laravel automations: run database migrations on start.
      AUTORUN_ENABLED: "true"
      AUTORUN_LARAVEL_MIGRATION: "true"
      AUTORUN_LARAVEL_MIGRATION_ISOLATION: "true"
    volumes:
      - storage:/var/www/html/storage/app
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/up"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 60s

  horizon:
    image: ghcr.io/relaticle/relaticle:latest
    restart: unless-stopped
    command: ["php", "/var/www/html/artisan", "horizon"]
    stop_signal: SIGTERM
    environment:
      APP_NAME: "Relaticle"
      APP_ENV: "production"
      # Laravel application key (must match the app service).
      APP_KEY: "changeme"
      APP_DEBUG: "false"
      # Public URL where the CRM is reached, including scheme.
      APP_URL: "changeme"
      # Optional dedicated domain for the admin panel. Leave empty to serve it from APP_URL.
      APP_PANEL_DOMAIN: ""
      # Require users to verify their email address before signing in.
      REQUIRE_EMAIL_VERIFICATION: "true"
      LOG_CHANNEL: "stderr"
      DB_CONNECTION: "pgsql"
      DB_HOST: "postgres"
      DB_PORT: "5432"
      # Name of the PostgreSQL database.
      DB_DATABASE: "relaticle"
      # PostgreSQL username.
      DB_USERNAME: "relaticle"
      # PostgreSQL password.
      DB_PASSWORD: "changeme"
      REDIS_HOST: "redis"
      REDIS_PASSWORD: "null"
      REDIS_PORT: "6379"
      QUEUE_CONNECTION: "redis"
      # Disable automations for the worker container.
      AUTORUN_ENABLED: "false"
    volumes:
      - storage:/var/www/html/storage/app
    depends_on:
      app:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "healthcheck-horizon"]
      start_period: 10s

  scheduler:
    image: ghcr.io/relaticle/relaticle:latest
    restart: unless-stopped
    command: ["php", "/var/www/html/artisan", "schedule:work"]
    stop_signal: SIGTERM
    environment:
      APP_NAME: "Relaticle"
      APP_ENV: "production"
      # Laravel application key (must match the app service).
      APP_KEY: "changeme"
      APP_DEBUG: "false"
      # Public URL where the CRM is reached, including scheme.
      APP_URL: "changeme"
      # Optional dedicated domain for the admin panel. Leave empty to serve it from APP_URL.
      APP_PANEL_DOMAIN: ""
      # Require users to verify their email address before signing in.
      REQUIRE_EMAIL_VERIFICATION: "true"
      LOG_CHANNEL: "stderr"
      DB_CONNECTION: "pgsql"
      DB_HOST: "postgres"
      DB_PORT: "5432"
      # Name of the PostgreSQL database.
      DB_DATABASE: "relaticle"
      # PostgreSQL username.
      DB_USERNAME: "relaticle"
      # PostgreSQL password.
      DB_PASSWORD: "changeme"
      REDIS_HOST: "redis"
      REDIS_PASSWORD: "null"
      REDIS_PORT: "6379"
      QUEUE_CONNECTION: "redis"
      # Disable automations for the scheduler container.
      AUTORUN_ENABLED: "false"
    volumes:
      - storage:/var/www/html/storage/app
    depends_on:
      app:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "healthcheck-schedule"]
      start_period: 10s

  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: "relaticle"
      POSTGRES_USER: "relaticle"
      POSTGRES_PASSWORD: "changeme"
    volumes:
      - postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U relaticle -d relaticle"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  postgres:
  redis:
  storage:

Values set to changeme are required — replace them with your own values before starting Relaticle.

Prefer a managed setup? WinterFlow installs, configures, and updates Relaticle for you using this same Docker Compose configuration.