> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trymondo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mautic

## Overview

Mautic is an open-source marketing automation platform deployed as part of the Mondo Open Platform Service (MOPS). This documentation covers the deployment, configuration, and management of Mautic using Docker Compose with Traefik as a reverse proxy.

## Service Details

| Component  | Value                                                          |
| ---------- | -------------------------------------------------------------- |
| URL        | [https://outreach.trymondo.com](https://outreach.trymondo.com) |
| Image      | mautic/mautic:5.2.4-apache                                     |
| Containers | mautic\_web, mautic\_cron, mautic\_worker, mautic\_db          |
| Database   | MySQL 8.0                                                      |
| Networks   | traefik-net, mautic-net                                        |

## Architecture

Mautic is deployed as a multi-container application with the following components:

```
                      ┌─────────────┐
                      │   Traefik   │
                      └──────┬──────┘
                             │ HTTPS
                             ▼
┌─────────────┐      ┌──────────────┐
│ Mautic Cron │◄────▶│  Mautic Web  │
└─────────────┘      └──────┬───────┘
       ▲                    │
       │                    ▼
       │             ┌──────────────┐
       └─────────────┤ MySQL DB     │
                     └──────────────┘
                            ▲
┌─────────────┐             │
│Mautic Worker│◄────────────┘
└─────────────┘
```

* **Mautic Web**: Main application container serving the UI and API
* **Mautic Cron**: Runs scheduled tasks for email campaigns, etc.
* **Mautic Worker**: Processes queue jobs like email sending
* **MySQL Database**: Stores all Mautic data

## Prerequisites

* Docker Engine (24.0+)
* Docker Compose v2
* Traefik reverse proxy configured and running
* External networks: `traefik-net` and `mautic-net`
* DNS configured for `outreach.trymondo.com`

## Deployment Configuration

### Directory Structure

```
/opt/apps/mautic/
├── docker-compose.yml          # Main configuration file
├── docker-compose.override.yml # Resource limits
├── .mautic.env                 # Mautic configuration
├── .env                        # Database credentials
├── mautic/
│   ├── config/                 # Configuration files
│   ├── logs/                   # Log files
│   └── media/                  # Uploads
└── cron/                       # Cron job configuration
```

### Environment Variables

Create a `.env` file with the following variables:

```
MYSQL_ROOT_PASSWORD=secure_root_password
MYSQL_DATABASE=mautic
MYSQL_USER=mautic_user
MYSQL_PASSWORD=secure_user_password
MAUTIC_PORT=8001
DOCKER_MAUTIC_LOAD_TEST_DATA=false
DOCKER_MAUTIC_RUN_MIGRATIONS=true
```

Create a `.mautic.env` file with additional Mautic-specific configurations (not shown in the provided files).

### Docker Compose Configuration

```yaml theme={null}
x-mautic-volumes: &mautic-volumes
  - ./mautic/config:/var/www/html/config:z
  - ./mautic/logs:/var/www/html/var/logs:z
  - ./mautic/media/files:/var/www/html/docroot/media/files:z
  - ./mautic/media/images:/var/www/html/docroot/media/images:z
  - ./cron:/opt/mautic/cron:z
  - mautic-docroot:/var/www/html/docroot:z

services:
  db:
    image: mysql:8.0
    container_name: mautic_db
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: mysqladmin --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD ping
      start_period: 5s
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - mautic-net
    restart: unless-stopped

  mautic_web:
    image: mautic/mautic:5.2.4-apache
    links:
      - db:mysql
    ports:
      - ${MAUTIC_PORT:-8001}:80
    volumes: *mautic-volumes
    container_name: mautic_web
    environment:
      - DOCKER_MAUTIC_LOAD_TEST_DATA=${DOCKER_MAUTIC_LOAD_TEST_DATA}
      - DOCKER_MAUTIC_RUN_MIGRATIONS=${DOCKER_MAUTIC_RUN_MIGRATIONS}
    env_file:
      - .mautic.env
    healthcheck:
      test: curl http://localhost
      start_period: 5s
      interval: 5s
      timeout: 5s
      retries: 100
    depends_on:
      db:
        condition: service_healthy
    networks:
      - traefik-net
      - mautic-net
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.mautic.rule=Host(`outreach.trymondo.com`)'
      - 'traefik.http.routers.mautic.entrypoints=websecure'
      - 'traefik.http.routers.mautic.tls=true'
      - 'traefik.http.routers.mautic.tls.certresolver=production'
      - 'traefik.http.services.mautic.loadbalancer.server.scheme=http'
      - 'traefik.http.services.mautic.loadbalancer.server.port=80'
      - 'traefik.http.routers.mautic.middlewares=cors@file,secureHeaders@file'
    restart: unless-stopped

  mautic_cron:
    image: mautic/mautic:5.2.4-apache
    links:
      - db:mysql
    volumes: *mautic-volumes
    container_name: mautic_cron
    environment:
      - DOCKER_MAUTIC_ROLE=mautic_cron
    env_file:
      - .mautic.env
    depends_on:
      mautic_web:
        condition: service_healthy
    networks:
      - mautic-net
    restart: unless-stopped

  mautic_worker:
    image: mautic/mautic:5.2.4-apache
    links:
      - db:mysql
    volumes: *mautic-volumes
    container_name: mautic_worker
    environment:
      - DOCKER_MAUTIC_ROLE=mautic_worker
    env_file:
      - .mautic.env
    depends_on:
      mautic_web:
        condition: service_healthy
    networks:
      - mautic-net
    restart: unless-stopped

volumes:
  mysql-data:
  mautic-docroot:

networks:
  traefik-net:
    external: true
  mautic-net:
    external: true
```

### Resource Limits (Optional)

For improved stability, add resource constraints using a `docker-compose.override.yml` file:

```yaml theme={null}
services:
  db:
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.2'

  mautic_web:
    deploy:
      resources:
        limits:
          memory: 384M
          cpus: '0.5'

  mautic_cron:
    deploy:
      resources:
        limits:
          memory: 320M
          cpus: '0.2'

  mautic_worker:
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.3'
```

## Network Configuration

Before deployment, ensure the required networks exist:

```bash theme={null}
# Create external networks if they don't exist
docker network create mautic-net
docker network create traefik-net
```

## Deployment Instructions

1. Create the deployment directory structure:

   ```bash theme={null}
   mkdir -p /opt/apps/mautic/{mautic/{config,logs,media/{files,images}},cron}
   ```

2. Create the configuration files:

   ```bash theme={null}
   touch /opt/apps/mautic/.env
   touch /opt/apps/mautic/.mautic.env
   nano /opt/apps/mautic/docker-compose.yml
   nano /opt/apps/mautic/docker-compose.override.yml
   ```

3. Add appropriate content to the `.env` and `.mautic.env` files

4. Deploy the service:

   ```bash theme={null}
   cd /opt/apps/mautic
   docker compose up -d
   ```

5. Verify the services are running:
   ```bash theme={null}
   docker compose ps
   ```

## Traefik Integration

Mautic is configured with the following Traefik settings:

* **Host Rule**: `outreach.trymondo.com`
* **Entrypoint**: websecure (HTTPS)
* **TLS**: Enabled with production certificate resolver
* **Backend Port**: 80
* **Middlewares**: CORS and secure headers

## Webflow Integration

Mautic can be integrated with Webflow forms using JavaScript tracking. Add the following code to your Webflow site:

```javascript theme={null}
document.addEventListener('DOMContentLoaded', function () {
  const form = document.getElementById('leadForm');
  const emailField = document.getElementById('Email-7');
  const firstNameField = document.getElementById('First-Name');
  const lastNameField = document.getElementById('Last-Name');

  form.addEventListener('submit', function (event) {
    const email = emailField.value;
    const firstName = firstNameField.value;
    const lastName = lastNameField.value;

    // Identify contact in Mautic
    mt('send', 'pageview', {
      email: email,
      firstname: firstName,
      lastname: lastName,
    });

    // Let the form submit normally
    setTimeout(function () {
      form.submit();
    }, 300); // short delay to ensure tracking call completes
  });
});
```

## Maintenance

### Backup Strategy

Back up Mautic regularly:

```bash theme={null}
# Stop the services
docker compose stop

# Backup the database
docker compose exec db mysqldump -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DATABASE} > mautic_backup_$(date +%Y%m%d).sql

# Backup volumes
tar -czf mautic_data_backup_$(date +%Y%m%d).tar.gz -C /opt/apps/mautic mautic

# Restart the services
docker compose start
```

### Updates

To update Mautic:

1. Update the image tag in `docker-compose.yml`

2. Apply the update:

   ```bash theme={null}
   cd /opt/apps/mautic
   docker compose pull
   docker compose up -d
   ```

3. Check logs for any issues:
   ```bash theme={null}
   docker compose logs
   ```

<Warning>
  Always back up your data before updating Mautic to a new version.
</Warning>

## Troubleshooting

### Database Connection Issues

If Mautic can't connect to the database:

1. Verify MySQL container is running:

   ```bash theme={null}
   docker compose ps db
   ```

2. Check database logs:

   ```bash theme={null}
   docker compose logs db
   ```

3. Verify credentials in `.env` file match what Mautic is using

### Email Configuration Problems

If emails are not being sent:

1. Check worker logs:

   ```bash theme={null}
   docker compose logs mautic_worker
   ```

2. Verify SMTP settings in Mautic's configuration

3. Ensure the worker container has proper network access to the SMTP server

### Web Interface Not Accessible

If you can't access the Mautic interface:

1. Check container health:

   ```bash theme={null}
   docker compose ps
   ```

2. Verify Traefik routing:

   ```bash theme={null}
   docker compose logs mautic_web | grep -i "traefik"
   ```

3. Check for any error logs:
   ```bash theme={null}
   docker compose logs mautic_web
   ```

## Performance Optimization

For improved performance:

1. **Increase Memory Limits**: Adjust values in `docker-compose.override.yml` if needed
2. **Database Tuning**: Consider adding MySQL configuration for better performance
3. **Caching**: Enable Redis if needed for larger installations

## Additional Resources

* [Official Mautic Documentation](https://docs.mautic.org/)
* [Mautic Docker Image Documentation](https://github.com/mautic/docker-mautic)
* [Traefik Documentation](https://doc.traefik.io/traefik/)
* [MySQL Documentation](https://dev.mysql.com/doc/)

## Integration Examples

### Mautic Forms

Example of embedding a Mautic form on a website:

```html theme={null}
<script type="text/javascript">
  (function (w, d, t, u, n, a, m) {
    w['MauticTrackingObject'] = n;
    (w[n] =
      w[n] ||
      function () {
        (w[n].q = w[n].q || []).push(arguments);
      }),
      (a = d.createElement(t)),
      (m = d.getElementsByTagName(t)[0]);
    a.async = 1;
    a.src = u;
    m.parentNode.insertBefore(a, m);
  })(window, document, 'script', 'https://outreach.trymondo.com/mtc.js', 'mt');

  mt('send', 'pageview');
</script>

<form
  id="mauticform_webformlead"
  data-mautic-form="webformlead"
  method="post"
  action="https://outreach.trymondo.com/form/submit?formId=1"
>
  <div class="mauticform-page-wrapper">
    <div class="mauticform-row">
      <label for="mauticform_input_webformlead_email">Email</label>
      <input
        id="mauticform_input_webformlead_email"
        name="mauticform[email]"
        type="email"
        required="required"
      />
    </div>
    <div class="mauticform-row">
      <button type="submit" name="mauticform[submit]">Submit</button>
    </div>
  </div>
</form>
```
