# EspoCRM

Customer relationship management web app for contacts, accounts, leads and sales.

- Replaces: [Salesforce](https://openlogs.fyi/alternatives/salesforce)
- Summary: Paid CRM services, such as Salesforce.
- Stack: PHP (language), MariaDB (database)
- Deployment: docker_compose
- License: AGPL-3.0 (osi) [source](https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/LICENSE.txt)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/README.md), read 2026-10-22)
- Difficulty: medium. 4 services (1 database or broker: mariadb), 4 volume mounts, no env values to set, no elevated host access. Heuristic score 5 of 11: medium.
- Requirements: not stated
- Repository: [espocrm/espocrm](https://github.com/espocrm/espocrm)

## Install

1. Docker with the Compose plugin ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md#L178-L272))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the code block as docker-compose.yml ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md))

   ```yaml
   services:
   
     espocrm-db:
       image: mariadb:latest
       container_name: espocrm-db
       environment:
         MARIADB_ROOT_PASSWORD: database_root_password
         MARIADB_DATABASE: espocrm
         MARIADB_USER: espocrm
         MARIADB_PASSWORD: database_password
       volumes:
         - espocrm-db:/var/lib/mysql
       restart: unless-stopped
       healthcheck:
         test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
         interval: 20s
         start_period: 10s
         timeout: 10s
         retries: 3
   
     espocrm:
       image: espocrm/espocrm:latest
       container_name: espocrm
       environment:
         ESPOCRM_DATABASE_HOST: espocrm-db
         ESPOCRM_DATABASE_USER: espocrm
         ESPOCRM_DATABASE_PASSWORD: database_password
         ESPOCRM_ADMIN_USERNAME: admin
         ESPOCRM_ADMIN_PASSWORD: admin_password
         ESPOCRM_SITE_URL: "http://localhost:8080"
       volumes:
         - espocrm-data:/var/www/html/data
         - espocrm-custom:/var/www/html/custom
         - espocrm-custom-client:/var/www/html/client/custom
       restart: unless-stopped
       depends_on:
         espocrm-db:
           condition: service_healthy
       healthcheck:
         test: ["CMD", "bin/command", "app-check"]
         start_period: 20s
         interval: 60s
         timeout: 20s
         retries: 3
       ports:
         - 8080:80
   
     espocrm-daemon:
       image: espocrm/espocrm:latest
       container_name: espocrm-daemon
       volumes_from:
         - espocrm
       restart: unless-stopped
       entrypoint: docker-daemon.sh
       depends_on:
         espocrm:
           condition: service_healthy
       healthcheck:
         test: ["CMD", "bin/command", "app-check"]
         start_period: 20s
         interval: 180s
         timeout: 20s
         retries: 3
   
     espocrm-websocket:
       image: espocrm/espocrm:latest
       container_name: espocrm-websocket
       environment:
         ESPOCRM_CONFIG_USE_WEB_SOCKET: "true"
         ESPOCRM_CONFIG_WEB_SOCKET_URL: "ws://localhost:8081"
         ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBSCRIBER_DSN: "tcp://*:7777"
         ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBMISSION_DSN: "tcp://espocrm-websocket:7777"
       volumes_from:
         - espocrm
       restart: unless-stopped
       entrypoint: docker-websocket.sh
       depends_on:
         espocrm:
           condition: service_healthy
       healthcheck:
         test: ["CMD", "bin/command", "app-check"]
         start_period: 20s
         interval: 180s
         timeout: 20s
         retries: 3
       ports:
         - 8081:8080
   
   volumes:
     espocrm-db:
     espocrm-data:
     espocrm-custom:
     espocrm-custom-client:
   ```

3. What the compose file check ran with ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md#L178-L272))

   ```text
   This compose file is copied unchanged from the code block in https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md#L178-L272. The check ran on that block alone. The Docker installation guide shows this docker-compose.yml and tells the reader to run docker compose up -d.
   ```

4. Start it ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md))

   ```text
   Open http://localhost:8080. The compose file publishes host port 8080 for the espocrm service.
   ```

Compose file check: config_ok on 2026-10-22.

## Gotchas and maintenance

### Gotchas

- Some images use the latest tag or no tag: Images without a pinned version: espocrm-db: mariadb:latest, espocrm: espocrm/espocrm:latest, espocrm-daemon: espocrm/espocrm:latest, espocrm-websocket: espocrm/espocrm:latest. A later pull can get a different version. ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md), checked 2026-10-22)
- The compose file publishes host ports: Host ports: 8080 (espocrm), 8081 (espocrm-websocket). A port without a host address listens on all host network interfaces. ([source](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 66
- Stars: 3508, forks: 1014
- Last push: 2026-10-22 (0 days ago)
- Latest release: 10.0.10 on 2026-10-14 (8 days ago)

## Sources

- [Repository: https://github.com/espocrm/espocrm](https://github.com/espocrm/espocrm)
- [License: https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/LICENSE.txt](https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/LICENSE.txt)
- [Business model: https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/README.md](https://github.com/espocrm/espocrm/blob/ddd727b31a4289cf5c4a295d0cf1618af865a93c/README.md)
- [Compose file: https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md)
- [Install step: https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md#L178-L272](https://github.com/espocrm/documentation/blob/83c4d13db362eea1c6f220cdab14304344c3e718/docs/administration/docker/installation.md#L178-L272)

---
Canonical: https://openlogs.fyi/tools/espocrm  
Last updated: 2026-10-22
