Skip to content

Docker Configuration

Docker Compose orchestrates all MediaMagic CRM services.

Overview

docker-compose.yml

yaml
version: '3.8'

services:
  # EspoCRM - Main CRM Interface
  espocrm:
    image: espocrm/espocrm
    container_name: mediamagic-espocrm
    ports:
      - "8080:80"
    environment:
      - ESPOCRM_DATABASE_HOST=mysql
      - ESPOCRM_DATABASE_USER=espocrm
      - ESPOCRM_DATABASE_PASSWORD=${MYSQL_PASSWORD}
      - ESPOCRM_ADMIN_USERNAME=${ESPOCRM_ADMIN_USER}
      - ESPOCRM_ADMIN_PASSWORD=${ESPOCRM_ADMIN_PASSWORD}
      - ESPOCRM_SITE_URL=${ESPOCRM_SITE_URL}
    volumes:
      - espocrm-data:/var/www/html
      - ./espocrm/custom/client:/var/www/html/client/custom
    depends_on:
      - mysql
    networks:
      - mediamagic

  # MySQL - CRM Database
  mysql:
    image: mysql:8.0
    container_name: mediamagic-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=espocrm
      - MYSQL_USER=espocrm
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - mediamagic

  # Bridge API - Orchestration Layer
  bridge:
    build: ./bridge
    container_name: mediamagic-bridge
    ports:
      - "3100:3100"
    environment:
      - ESPOCRM_SITE_URL=http://espocrm
      - ESPOCRM_API_KEY=${ESPOCRM_API_KEY}
      - POSTGRES_HOST=postgres
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - AYRSHARE_API_KEY=${AYRSHARE_API_KEY}
      - X_SERVER_URL=${X_SERVER_URL}
      - N8N_WEBHOOK_BASE=${N8N_WEBHOOK_BASE}
    depends_on:
      - espocrm
      - postgres
    networks:
      - mediamagic

  # PostgreSQL - Analytics Database
  postgres:
    image: postgres:16
    container_name: mediamagic-postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=mediamagic
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=mediamagic_analytics
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - mediamagic

  # Grafana - Analytics Dashboards
  grafana:
    image: grafana/grafana:11.0.0
    container_name: mediamagic-grafana
    ports:
      - "3200:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
      - GF_SERVER_ROOT_URL=${GRAFANA_ROOT_URL}
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
      - ./grafana/dashboards:/var/lib/grafana/dashboards
    depends_on:
      - postgres
    networks:
      - mediamagic

  # Mobile PWA
  mobile-pwa:
    build: ./mobile-pwa
    container_name: mediamagic-mobile
    ports:
      - "3300:80"
    networks:
      - mediamagic

networks:
  mediamagic:
    driver: bridge

volumes:
  mysql-data:
  espocrm-data:
  postgres-data:
  grafana-data:

Service Dependencies

Port Mapping

ServiceInternalExternalAccess
EspoCRM808080localhost:8080
MySQL3306Internal only
Bridge31003100localhost:3100
PostgreSQL54325432localhost:5432
Grafana30003200localhost:3200
Mobile PWA803300localhost:3300

Volume Management

List Volumes

bash
docker volume ls | grep crm

Inspect Volume

bash
docker volume inspect crm_mysql-data

Backup Volume

bash
docker run --rm \
  -v crm_mysql-data:/source:ro \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/mysql-data.tar.gz -C /source .

Remove Volumes (⚠️ Data Loss)

bash
docker compose down
docker volume rm crm_mysql-data crm_espocrm-data crm_postgres-data crm_grafana-data

Network Configuration

Inspect Network

bash
docker network inspect crm_mediamagic

Container DNS

Services can reach each other by name:

  • http://espocrm → EspoCRM
  • http://bridge:3100 → Bridge API
  • postgres:5432 → PostgreSQL

Common Commands

Start All Services

bash
docker compose up -d

Stop All Services

bash
docker compose down

Rebuild Service

bash
docker compose build bridge
docker compose up -d bridge

View Logs

bash
# All services
docker compose logs -f

# Specific service
docker compose logs -f bridge

# Last 100 lines
docker compose logs --tail 100 bridge

Execute Command in Container

bash
# Shell access
docker compose exec bridge sh

# Run command
docker compose exec postgres psql -U mediamagic -d mediamagic_analytics

Check Resource Usage

bash
docker stats

Dockerfile Examples

Bridge Dockerfile

dockerfile
# bridge/Dockerfile
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3100

CMD ["node", "server.js"]

Mobile PWA Dockerfile

dockerfile
# mobile-pwa/Dockerfile
FROM nginx:alpine

COPY . /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Production Considerations

Resource Limits

yaml
services:
  espocrm:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 512M

Health Checks

yaml
services:
  bridge:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3100/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Restart Policies

yaml
services:
  espocrm:
    restart: unless-stopped

Logging Configuration

yaml
services:
  bridge:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

MediaMagic CRM Documentation