Skip to content

Deployment

Deploy MediaMagic CRM to production on DigitalOcean or any Docker-compatible server.

Prerequisites

  • Server with Docker & Docker Compose
  • Domain names for services
  • Reverse proxy (Caddy, Nginx, or Traefik)
  • SSL certificates (Let's Encrypt recommended)

Deployment Architecture

DigitalOcean Setup

1. Create Droplet

Recommended specs:

  • Image: Ubuntu 22.04 LTS
  • Size: 4GB RAM / 2 vCPUs minimum
  • Storage: 80GB SSD
  • Region: Closest to your audience

2. Install Docker

bash
# SSH into your droplet
ssh root@your-droplet-ip

# Install Docker
curl -fsSL https://get.docker.com | sh

# Install Docker Compose plugin
apt update
apt install docker-compose-plugin -y

# Verify
docker --version
docker compose version

3. Clone Repository

bash
# Create apps directory
mkdir -p /opt/apps
cd /opt/apps

# Clone repo
git clone https://github.com/AmericanMedia/crm.git
cd crm

4. Configure Environment

bash
# Copy example config
cp .env.example .env

# Edit with production values
nano .env

Production URLs

Update ESPOCRM_SITE_URL and GRAFANA_ROOT_URL to your actual domains.

5. Start Services

bash
docker compose up -d

6. Set Up Reverse Proxy

caddy
crm.yourdomain.com {
    reverse_proxy localhost:8080
}

api.yourdomain.com {
    reverse_proxy localhost:3100
}

analytics.yourdomain.com {
    reverse_proxy localhost:3200
}

mobile.yourdomain.com {
    reverse_proxy localhost:3300
}
bash
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy

# Edit Caddyfile
nano /etc/caddy/Caddyfile

# Reload
systemctl reload caddy

7. Configure DNS

Point your domains to the droplet IP:

DomainTypeValue
crm.yourdomain.comAdroplet-ip
api.yourdomain.comAdroplet-ip
analytics.yourdomain.comAdroplet-ip
mobile.yourdomain.comAdroplet-ip

Automated Deployment

GitHub Actions

The repository includes automated deployment via GitHub Actions.

Setup Repository Secrets

Go to Settings → Secrets and variables → Actions:

Variables:

  • SERVER_HOST — Droplet IP address
  • SERVER_USER — SSH user (usually root)
  • SERVER_PORT — SSH port (usually 22)

Secrets:

  • SERVER_SSH_KEY — Private SSH key

Deployment Options

Deploy TypeWhat It Does
QuickGit pull + EspoCRM cache clear
Standard+ Rebuild bridge container
Full+ Rebuild all containers

Manual Deployment

  1. Go to Actions → Deploy to Production
  2. Click Run workflow
  3. Select options:
    • Deploy type: quick, standard, or full
    • Run entity setup: Check if schema changed

Manual SSH Deployment

Use deploy.sh for manual deployments:

bash
# Standard deploy
./deploy.sh

# Quick deploy (cache clear only)
./deploy.sh --quick

# Full rebuild
./deploy.sh --full

# Include entity setup
./deploy.sh --entities

# Combine options
./deploy.sh --full --entities

Post-Deployment

1. Run Entity Setup

bash
cd /opt/apps/crm/espocrm/custom
npm install
ESPOCRM_URL=https://crm.yourdomain.com \
ESPOCRM_ADMIN_USER=admin \
ESPOCRM_ADMIN_PASSWORD=your_password \
node setup-entities.js

2. Create API User

  1. Go to https://crm.yourdomain.com
  2. Admin → API Users → Create
  3. Copy API key to .env
  4. Restart bridge: docker compose restart bridge

3. Configure Webhooks

  1. Admin → Webhooks
  2. Update URLs to use http://bridge:3100/webhooks/... (Internal Docker network, not public URL)

4. Seed Data (Optional)

bash
# PostgreSQL analytics data
docker compose exec -T postgres psql -U mediamagic -d mediamagic_analytics < postgres/seed-data.sql

# EspoCRM sample data
ESPOCRM_URL=https://crm.yourdomain.com ./espocrm/seed-espocrm.sh

5. Set Up Backups

bash
# Add to crontab
crontab -e

# Daily backup at 3am
0 3 * * * cd /opt/apps/crm && ./backup.sh >> /var/log/crm-backup.log 2>&1

Monitoring

Health Checks

bash
# All services
curl https://api.yourdomain.com/health

# From server
docker compose ps

Logs

bash
# All logs
docker compose logs -f

# Specific service
docker compose logs -f bridge

Resource Usage

bash
docker stats

Updating

Standard Update

bash
cd /opt/apps/crm
git pull
docker compose up -d --build bridge
docker compose exec espocrm php clear_cache.php

Full Rebuild

bash
cd /opt/apps/crm
git pull
docker compose down
docker compose up -d --build

Rollback

bash
# Find previous commit
git log --oneline -10

# Rollback
git checkout <commit-hash>
docker compose up -d --build

# Or reset to previous commit
git reset --hard HEAD~1
docker compose up -d --build

Security Checklist

  • [ ] Strong passwords in .env
  • [ ] SSH key authentication (disable password auth)
  • [ ] Firewall configured (only 80, 443, 22 open)
  • [ ] SSL certificates active
  • [ ] Regular backups enabled
  • [ ] Monitoring/alerts configured
  • [ ] API rate limiting enabled
  • [ ] Bridge not exposed to internet (internal only)

Next Steps

MediaMagic CRM Documentation