This Ansible playbook automates the Docker-based deployment of Modoboa mail server using Docker Compose.
For traditional (non-Docker) installation, see Modoboa Ansible.
Create modoboa-docker-deploy.yml:
---
- name: Deploy Modoboa with Docker
hosts: modoboa
become: true
vars:
# Domain configuration
modoboa_domain: example.com
modoboa_hostname: mail.example.com
# Admin credentials
modoboa_admin_email: admin@example.com
modoboa_admin_password: "secure_admin_password"
# Database configuration
postgres_password: "secure_postgres_password"
# Docker configuration
docker_install_compose_plugin: true
modoboa_docker_path: /opt/modoboa-docker
tasks:
# Install Docker
- name: Install Docker prerequisites
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
state: present
update_cache: true
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker repository
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Install Docker Engine
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
state: present
update_cache: true
- name: Enable and start Docker
systemd:
name: docker
state: started
enabled: true
- name: Add user to docker group
user:
name: "{{ ansible_user_id }}"
groups: docker
append: true
# Clone Modoboa Docker repository
- name: Clone Modoboa Docker repository
git:
repo: https://github.com/modoboa/modoboa-docker
dest: "{{ modoboa_docker_path }}"
version: master
# Create .env file
- name: Create .env configuration
copy:
dest: "{{ modoboa_docker_path }}/.env"
mode: '0600'
content: |
# General settings
MODBOA_DOMAIN={{ modoboa_domain }}
MODBOA_HOSTNAME={{ modoboa_hostname }}
# Admin credentials
MODBOA_ADMIN_EMAIL={{ modoboa_admin_email }}
MODBOA_ADMIN_PASSWORD={{ modoboa_admin_password }}
# Database settings
DB_ENGINE=postgresql
POSTGRES_USER=modoboa
POSTGRES_PASSWORD={{ postgres_password }}
POSTGRES_DB=modoboa
# Email settings
DEFAULT_FROM_EMAIL={{ modoboa_admin_email }}
# SSL/TLS
SSL_TYPE=letsencrypt
LETSENCRYPT_EMAIL={{ modoboa_admin_email }}
# Timezone
TZ=UTC
# Start Modoboa containers
- name: Pull Docker images
command: docker compose pull
args:
chdir: "{{ modoboa_docker_path }}"
- name: Start Modoboa services
command: docker compose up -d
args:
chdir: "{{ modoboa_docker_path }}"
# Wait for services
- name: Wait for Modoboa to be ready
wait_for:
timeout: 120
delegate_to: localhost
# Configure firewall
- name: Configure UFW firewall
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "25"
- "587"
- "465"
- "143"
- "993"
- "80"
- "443"
# Verify installation
- name: Check Modoboa containers
command: docker compose ps
args:
chdir: "{{ modoboa_docker_path }}"
register: modoboa_status
- name: Display Modoboa status
debug:
var: modoboa_status.stdout
Create inventory.ini:
[modoboa]
mail.example.com ansible_user=root
[modoboa:vars]
ansible_python_interpreter=/usr/bin/python3
# Run the playbook
ansible-playbook -i inventory.ini modoboa-docker-deploy.yml
# With custom variables
ansible-playbook -i inventory.ini modoboa-docker-deploy.yml \
-e modoboa_domain=example.com \
-e modoboa_hostname=mail.example.com \
-e modoboa_admin_password="super_secure_password"
| Variable | Default | Description |
|---|---|---|
modoboa_domain |
Required | Email domain |
modoboa_hostname |
Required | Mail server FQDN |
modoboa_admin_email |
Required | Admin email |
modoboa_admin_password |
Required | Admin password |
postgres_password |
Required | PostgreSQL password |
modoboa_docker_path |
/opt/modoboa-docker |
Installation directory |
https://mail.example.comadmin@example.com# A Record
mail.example.com. IN A <server-ip>
# MX Record
example.com. IN MX 10 mail.example.com.
# SPF Record
example.com. IN TXT "v=spf1 mx a -all"
# DKIM Record (get from Modoboa UI)
dkim._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=..."
# DMARC Record
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine"
cd /opt/modoboa-docker
# View status
docker compose ps
# View logs
docker compose logs -f
# Restart services
docker compose restart
# Stop services
docker compose down
# Database backup
docker compose exec postgresql pg_dump -U modoboa modoboa > backup.sql
# Mail backup
docker run --rm \
-v modoboa-docker_vmail:/vmail:ro \
-v $(pwd):/backup \
alpine tar czf /backup/vmail-backup.tar.gz -C /vmail .
Any questions?
Feel free to contact us. Find all contact information on our contact page.