299 lines
7.4 KiB
Markdown
299 lines
7.4 KiB
Markdown
# Docker Setup
|
|
|
|
This guide covers how to deploy DMARQ using Docker, which is the recommended deployment method.
|
|
|
|
## Prerequisites
|
|
|
|
Before deploying DMARQ with Docker, ensure you have:
|
|
|
|
- Docker Engine 20.10.0 or later
|
|
- Docker Compose v2.0.0 or later
|
|
- 2GB RAM minimum (4GB recommended)
|
|
- 20GB storage space
|
|
|
|
## Quick Start
|
|
|
|
The fastest way to get DMARQ running is to use Docker Compose:
|
|
|
|
1. **Clone the repository**
|
|
|
|
```bash
|
|
git clone https://github.com/yourusername/dmarq.git
|
|
cd dmarq
|
|
```
|
|
|
|
2. **Configure environment variables**
|
|
|
|
Create a `.env` file in the project root. For production, prefer a 1Password-mounted `.env` file; see [Secret Handling with 1Password](secrets.md).
|
|
|
|
```
|
|
# Database Configuration
|
|
DB_TYPE=sqlite # or postgres for production
|
|
DB_PATH=./data/dmarq.db # for SQLite
|
|
# For PostgreSQL:
|
|
# DB_HOST=postgres
|
|
# DB_PORT=5432
|
|
# DB_USER=dmarq
|
|
# DB_PASS=secure_password
|
|
# DB_NAME=dmarq
|
|
|
|
# IMAP Configuration (optional)
|
|
IMAP_ENABLED=false
|
|
# IMAP_SERVER=mail.example.com
|
|
# IMAP_PORT=993
|
|
# IMAP_USERNAME=dmarc@example.com
|
|
# IMAP_PASSWORD=your_secure_password
|
|
# IMAP_USE_SSL=true
|
|
# IMAP_POLLING_INTERVAL=60
|
|
# DELETE_IMPORTED_EMAILS=false
|
|
|
|
# Security Settings
|
|
SECRET_KEY=generate_a_secure_random_key
|
|
# WEBHOOK_SECRET=generate_a_separate_webhook_secret
|
|
ALLOWED_HOSTS=localhost,127.0.0.1
|
|
```
|
|
|
|
Generate a secure random key for `SECRET_KEY`:
|
|
|
|
```bash
|
|
openssl rand -hex 32
|
|
```
|
|
|
|
3. **Start the containers**
|
|
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
4. **Access the application**
|
|
|
|
Open your browser and navigate to `http://localhost:8000`
|
|
|
|
## Understanding the Docker Setup
|
|
|
|
The `docker-compose.yml` file defines the following services:
|
|
|
|
- **backend**: The FastAPI application that handles API requests, processes reports, and serves the web interface
|
|
- **db**: A PostgreSQL database container (when using Postgres instead of SQLite)
|
|
|
|
### Docker Compose File Structure
|
|
|
|
The `docker-compose.yml` file looks like this:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
backend:
|
|
build:
|
|
context: ./backend
|
|
ports:
|
|
- "8000:8000"
|
|
volumes:
|
|
- ./data:/app/data
|
|
environment:
|
|
- DB_TYPE=${DB_TYPE:-sqlite}
|
|
- DB_PATH=${DB_PATH:-./data/dmarq.db}
|
|
- DB_HOST=${DB_HOST:-postgres}
|
|
- DB_PORT=${DB_PORT:-5432}
|
|
- DB_USER=${DB_USER:-dmarq}
|
|
- DB_PASS=${DB_PASS:-dmarqpassword}
|
|
- DB_NAME=${DB_NAME:-dmarq}
|
|
- IMAP_ENABLED=${IMAP_ENABLED:-false}
|
|
- IMAP_SERVER=${IMAP_SERVER:-}
|
|
- IMAP_PORT=${IMAP_PORT:-993}
|
|
- IMAP_USERNAME=${IMAP_USERNAME:-}
|
|
- IMAP_PASSWORD=${IMAP_PASSWORD:-}
|
|
- IMAP_USE_SSL=${IMAP_USE_SSL:-true}
|
|
- IMAP_POLLING_INTERVAL=${IMAP_POLLING_INTERVAL:-60}
|
|
- DELETE_IMPORTED_EMAILS=${DELETE_IMPORTED_EMAILS:-false}
|
|
- SECRET_KEY=${SECRET_KEY:-insecure_key_change_me_in_production}
|
|
- WEBHOOK_SECRET=${WEBHOOK_SECRET:-}
|
|
- ALLOWED_HOSTS=${ALLOWED_HOSTS:-localhost,127.0.0.1}
|
|
depends_on:
|
|
- db
|
|
restart: unless-stopped
|
|
|
|
db:
|
|
image: postgres:14-alpine
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
environment:
|
|
- POSTGRES_USER=${DB_USER:-dmarq}
|
|
- POSTGRES_PASSWORD=${DB_PASS:-dmarqpassword}
|
|
- POSTGRES_DB=${DB_NAME:-dmarq}
|
|
restart: unless-stopped
|
|
|
|
volumes:
|
|
postgres_data:
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
### Environment Variables
|
|
|
|
All configuration in the Docker setup is done via environment variables, either directly in the `docker-compose.yml` file or through a separate `.env` file. See the [Configuration](configuration.md) page for detailed information about all available variables.
|
|
|
|
For production, store secret values in 1Password Environments and inject them into Compose with a mounted `.env` file or your deployment runner's secret-injection feature. Do not commit `.env` files that contain `SECRET_KEY`, database credentials, IMAP passwords, OAuth secrets, or API tokens.
|
|
|
|
### Volumes
|
|
|
|
The Docker Compose setup uses these volumes:
|
|
|
|
- **./data**: Local directory mapped to `/app/data` in the container, stores SQLite database (if used) and other persistent data
|
|
- **postgres_data**: Docker volume for PostgreSQL data (when using Postgres)
|
|
|
|
## Production Deployment
|
|
|
|
For production deployments, consider these additional steps:
|
|
|
|
For an operator-focused sequence that covers Docker Compose, Coolify, verification, upgrades, and rollback, use the [Operator Runbook](operations.md). For incident response and ingestion/auth troubleshooting, use [Troubleshooting Playbooks](troubleshooting.md).
|
|
|
|
### Using a Reverse Proxy
|
|
|
|
In production, it's recommended to use a reverse proxy like Nginx or Traefik in front of DMARQ:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
# ...existing services...
|
|
|
|
nginx:
|
|
image: nginx:alpine
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
volumes:
|
|
- ./nginx/conf.d:/etc/nginx/conf.d
|
|
- ./nginx/ssl:/etc/nginx/ssl
|
|
depends_on:
|
|
- backend
|
|
restart: unless-stopped
|
|
```
|
|
|
|
Example Nginx configuration:
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name dmarq.example.com;
|
|
return 301 https://$server_name$request_uri;
|
|
}
|
|
|
|
server {
|
|
listen 443 ssl;
|
|
server_name dmarq.example.com;
|
|
|
|
ssl_certificate /etc/nginx/ssl/cert.pem;
|
|
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
|
|
|
location / {
|
|
proxy_pass http://backend:8000;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
}
|
|
```
|
|
|
|
### Docker Compose Profiles
|
|
|
|
For more complex deployments, you can use Docker Compose profiles:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
backend:
|
|
# ...existing config...
|
|
profiles: [app, all]
|
|
|
|
db:
|
|
# ...existing config...
|
|
profiles: [app, all]
|
|
|
|
nginx:
|
|
# ...nginx config...
|
|
profiles: [production, all]
|
|
```
|
|
|
|
Then start only specific profiles:
|
|
|
|
```bash
|
|
docker-compose --profile production up -d
|
|
```
|
|
|
|
## Updating DMARQ
|
|
|
|
Before updating a production deployment, follow the [Release Checklist](release-checklist.md) and create a database backup.
|
|
The full operator upgrade sequence is documented in [Operator Runbook](operations.md).
|
|
|
|
To update to a newer version:
|
|
|
|
```bash
|
|
# Pull the latest code
|
|
git pull
|
|
|
|
# Stop the containers
|
|
docker-compose down
|
|
|
|
# Rebuild and start
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
## Monitoring and Maintenance
|
|
|
|
### Viewing Logs
|
|
|
|
To view logs from the containers:
|
|
|
|
```bash
|
|
# All logs
|
|
docker-compose logs
|
|
|
|
# Just backend logs
|
|
docker-compose logs backend
|
|
|
|
# Follow logs in real-time
|
|
docker-compose logs -f
|
|
```
|
|
|
|
### Container Health Checks
|
|
|
|
Monitor the health of your containers:
|
|
|
|
```bash
|
|
docker-compose ps
|
|
```
|
|
|
|
### Database Backups
|
|
|
|
Back up the database before upgrades and on a regular schedule. See [Database Backup and Restore](backups.md) for SQLite and PostgreSQL backup, restore, and verification commands.
|
|
|
|
## Troubleshooting
|
|
|
|
### Container Won't Start
|
|
|
|
If containers fail to start:
|
|
|
|
1. Check logs: `docker-compose logs backend`
|
|
2. Verify environment variables: `docker-compose config`
|
|
3. Check disk space: `df -h`
|
|
4. Ensure ports aren't already in use: `netstat -tuln | grep 8000`
|
|
|
|
### Database Connection Issues
|
|
|
|
If the application can't connect to the database:
|
|
|
|
1. Check the DB environment variables in `.env`
|
|
2. For Postgres, ensure the `db` service is running: `docker-compose ps db`
|
|
3. Try connecting manually: `docker-compose exec db psql -U dmarq dmarq`
|
|
|
|
### Mounting Issues
|
|
|
|
If you encounter volume mounting problems:
|
|
|
|
1. Check file permissions on the host
|
|
2. Use absolute paths in your volume mappings
|
|
3. On Windows, ensure you've enabled Docker file sharing for the relevant drives
|