All checks were successful
continuous-integration/drone/push Build is passing
Bug: https://github.com/happyDomain/happydeliver/issues/3
165 lines
5.2 KiB
Markdown
165 lines
5.2 KiB
Markdown
# happyDeliver Docker Configuration
|
|
|
|
This directory contains all configuration files for the all-in-one Docker container.
|
|
|
|
## Architecture
|
|
|
|
The Docker container integrates multiple components:
|
|
|
|
- **Postfix**: Mail Transfer Agent (MTA) that receives emails on port 25
|
|
- **OpenDKIM**: DKIM signature verification
|
|
- **OpenDMARC**: DMARC policy validation
|
|
- **SpamAssassin**: Spam scoring and content analysis
|
|
- **happyDeliver**: Go application (API server + email analyzer)
|
|
- **Supervisor**: Process manager that runs all services
|
|
|
|
## Directory Structure
|
|
|
|
```
|
|
docker/
|
|
├── postfix/
|
|
│ ├── main.cf # Postfix main configuration
|
|
│ ├── master.cf # Postfix service definitions
|
|
│ └── transport_maps # Email routing rules
|
|
├── opendkim/
|
|
│ └── opendkim.conf # DKIM verification config
|
|
├── opendmarc/
|
|
│ └── opendmarc.conf # DMARC validation config
|
|
├── spamassassin/
|
|
│ └── local.cf # SpamAssassin rules and scoring
|
|
├── supervisor/
|
|
│ └── supervisord.conf # Supervisor service definitions
|
|
├── entrypoint.sh # Container initialization script
|
|
└── config.docker.yaml # happyDeliver default config
|
|
```
|
|
|
|
## Configuration Details
|
|
|
|
### Postfix (postfix/)
|
|
|
|
**main.cf**: Core Postfix settings
|
|
- Configures hostname, domain, and network interfaces
|
|
- Sets up milter integration for OpenDKIM and OpenDMARC
|
|
- Configures SPF policy checking
|
|
- Routes emails through SpamAssassin content filter
|
|
- Uses transport_maps to route test emails to happyDeliver
|
|
|
|
**master.cf**: Service definitions
|
|
- Defines SMTP service with content filtering
|
|
- Sets up SPF policy service (postfix-policyd-spf-perl)
|
|
- Configures SpamAssassin content filter
|
|
- Defines happydeliver pipe for email analysis
|
|
|
|
**transport_maps**: PCRE-based routing
|
|
- Matches test-UUID@domain emails
|
|
- Routes them to the happydeliver pipe
|
|
|
|
### OpenDKIM (opendkim/)
|
|
|
|
**opendkim.conf**: DKIM verification settings
|
|
- Operates in verification-only mode
|
|
- Adds Authentication-Results headers
|
|
- Socket communication with Postfix via milter
|
|
- 5-second DNS timeout
|
|
|
|
### OpenDMARC (opendmarc/)
|
|
|
|
**opendmarc.conf**: DMARC validation settings
|
|
- Validates DMARC policies
|
|
- Adds results to Authentication-Results headers
|
|
- Does not reject emails (analysis mode only)
|
|
- Socket communication with Postfix via milter
|
|
|
|
### SpamAssassin (spamassassin/)
|
|
|
|
**local.cf**: Spam detection rules
|
|
- Enables network tests (RBL checks)
|
|
- SPF and DKIM checking
|
|
- Required score: 5.0 (standard threshold)
|
|
- Adds detailed spam report headers
|
|
- 5-second RBL timeout
|
|
|
|
### Supervisor (supervisor/)
|
|
|
|
**supervisord.conf**: Service orchestration
|
|
- Runs all services as daemons
|
|
- Start order: OpenDKIM → OpenDMARC → SpamAssassin → Postfix → API
|
|
- Automatic restart on failure
|
|
- Centralized logging
|
|
|
|
### Entrypoint Script (entrypoint.sh)
|
|
|
|
Initialization script that:
|
|
1. Creates required directories and sets permissions
|
|
2. Replaces configuration placeholders with environment variables
|
|
3. Initializes Postfix (aliases, transport maps)
|
|
4. Updates SpamAssassin rules
|
|
5. Starts Supervisor to launch all services
|
|
|
|
### happyDeliver Config (config.docker.yaml)
|
|
|
|
Default configuration for the Docker environment:
|
|
- API server on 0.0.0.0:8080
|
|
- SQLite database at /var/lib/happydeliver/happydeliver.db
|
|
- Configurable domain for test emails
|
|
- RBL servers for blacklist checking
|
|
- Timeouts for DNS and HTTP checks
|
|
|
|
## Environment Variables
|
|
|
|
The container accepts these environment variables:
|
|
|
|
- `HAPPYDELIVER_DOMAIN`: Email domain for test addresses (default: happydeliver.local)
|
|
|
|
Note that the hostname of the container is used to filter the authentication tests results.
|
|
|
|
Example:
|
|
```bash
|
|
docker run -e HAPPYDELIVER_DOMAIN=example.com --hostname mail.example.com ...
|
|
```
|
|
|
|
## Volumes
|
|
|
|
**Required volumes:**
|
|
- `/var/lib/happydeliver`: Database and persistent data
|
|
- `/var/log/happydeliver`: Log files from all services
|
|
|
|
**Optional volumes:**
|
|
- `/etc/happydeliver/config.yaml`: Custom configuration file
|
|
|
|
## Ports
|
|
|
|
- **25**: SMTP (Postfix)
|
|
- **8080**: HTTP API (happyDeliver)
|
|
|
|
## Service Startup Order
|
|
|
|
Supervisor ensures services start in the correct order:
|
|
|
|
1. **OpenDKIM** (priority 10): DKIM verification milter
|
|
2. **OpenDMARC** (priority 11): DMARC validation milter
|
|
3. **SpamAssassin** (priority 12): Spam scoring daemon
|
|
4. **Postfix** (priority 20): MTA that uses the above services
|
|
5. **happyDeliver API** (priority 30): REST API server
|
|
|
|
## Email Processing Flow
|
|
|
|
1. Email arrives at Postfix on port 25
|
|
2. Postfix sends to OpenDKIM milter
|
|
- Verifies DKIM signature
|
|
- Adds `Authentication-Results: ... dkim=pass/fail`
|
|
3. Postfix sends to OpenDMARC milter
|
|
- Validates DMARC policy
|
|
- Adds `Authentication-Results: ... dmarc=pass/fail`
|
|
4. Postfix routes through SpamAssassin content filter
|
|
- Checks SPF record
|
|
- Scores email for spam
|
|
- Adds `X-Spam-Status` and `X-Spam-Report` headers
|
|
5. Postfix checks transport_maps
|
|
- If recipient matches test-UUID pattern, route to happydeliver pipe
|
|
6. happyDeliver analyzer receives email
|
|
- Extracts test ID from recipient
|
|
- Parses all headers added by filters
|
|
- Performs additional analysis (DNS, RBL, content)
|
|
- Generates deliverability score
|
|
- Stores report in database
|