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 version3. Clone Repository
bash
# Create apps directory
mkdir -p /opt/apps
cd /opt/apps
# Clone repo
git clone https://github.com/AmericanMedia/crm.git
cd crm4. Configure Environment
bash
# Copy example config
cp .env.example .env
# Edit with production values
nano .envProduction URLs
Update ESPOCRM_SITE_URL and GRAFANA_ROOT_URL to your actual domains.
5. Start Services
bash
docker compose up -d6. 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 caddy7. Configure DNS
Point your domains to the droplet IP:
| Domain | Type | Value |
|---|---|---|
| crm.yourdomain.com | A | droplet-ip |
| api.yourdomain.com | A | droplet-ip |
| analytics.yourdomain.com | A | droplet-ip |
| mobile.yourdomain.com | A | droplet-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 addressSERVER_USER— SSH user (usuallyroot)SERVER_PORT— SSH port (usually22)
Secrets:
SERVER_SSH_KEY— Private SSH key
Deployment Options
| Deploy Type | What It Does |
|---|---|
| Quick | Git pull + EspoCRM cache clear |
| Standard | + Rebuild bridge container |
| Full | + Rebuild all containers |
Manual Deployment
- Go to Actions → Deploy to Production
- Click Run workflow
- Select options:
- Deploy type:
quick,standard, orfull - Run entity setup: Check if schema changed
- Deploy type:
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 --entitiesPost-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.js2. Create API User
- Go to
https://crm.yourdomain.com - Admin → API Users → Create
- Copy API key to
.env - Restart bridge:
docker compose restart bridge
3. Configure Webhooks
- Admin → Webhooks
- 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.sh5. 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>&1Monitoring
Health Checks
bash
# All services
curl https://api.yourdomain.com/health
# From server
docker compose psLogs
bash
# All logs
docker compose logs -f
# Specific service
docker compose logs -f bridgeResource Usage
bash
docker statsUpdating
Standard Update
bash
cd /opt/apps/crm
git pull
docker compose up -d --build bridge
docker compose exec espocrm php clear_cache.phpFull Rebuild
bash
cd /opt/apps/crm
git pull
docker compose down
docker compose up -d --buildRollback
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 --buildSecurity 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)