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
| Service | Internal | External | Access |
|---|---|---|---|
| EspoCRM | 80 | 8080 | localhost:8080 |
| MySQL | 3306 | — | Internal only |
| Bridge | 3100 | 3100 | localhost:3100 |
| PostgreSQL | 5432 | 5432 | localhost:5432 |
| Grafana | 3000 | 3200 | localhost:3200 |
| Mobile PWA | 80 | 3300 | localhost:3300 |
Volume Management
List Volumes
bash
docker volume ls | grep crmInspect Volume
bash
docker volume inspect crm_mysql-dataBackup 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-dataNetwork Configuration
Inspect Network
bash
docker network inspect crm_mediamagicContainer DNS
Services can reach each other by name:
http://espocrm→ EspoCRMhttp://bridge:3100→ Bridge APIpostgres:5432→ PostgreSQL
Common Commands
Start All Services
bash
docker compose up -dStop All Services
bash
docker compose downRebuild Service
bash
docker compose build bridge
docker compose up -d bridgeView Logs
bash
# All services
docker compose logs -f
# Specific service
docker compose logs -f bridge
# Last 100 lines
docker compose logs --tail 100 bridgeExecute Command in Container
bash
# Shell access
docker compose exec bridge sh
# Run command
docker compose exec postgres psql -U mediamagic -d mediamagic_analyticsCheck Resource Usage
bash
docker statsDockerfile 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: 512MHealth Checks
yaml
services:
bridge:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3100/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sRestart Policies
yaml
services:
espocrm:
restart: unless-stoppedLogging Configuration
yaml
services:
bridge:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"