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.