Skip to content
README.md 5.55 KiB
Newer Older
andryyy's avatar
andryyy committed
# mailcow-dockerized
andryyy's avatar
andryyy committed

mailcow dockerized comes with 11 containers linked in a mailcow network:
Dovecot, Memcached, Redis, MariaDB, PowerDNS Recursor, PHP-FPM, Postfix, Nginx, Rmilter, Rspamd and SOGo.

andryyy's avatar
andryyy committed
All configurations were written with security in mind.

Exposed ports:
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
| Service               | External bindings                            | Internal bindings              |
andryyy's avatar
andryyy committed
|:----------------------|:---------------------------------------------|:-------------------------------|
andryyy's avatar
andryyy committed
| Postfix               | 25/tcp, 465/tcp, 587/tcp                     | 588/tcp                        |
| Dovecot               | 110/tcp, 143/tcp, 993/tcp, 995/tcp, 4190/tcp | 24/tcp, 10001/tcp              |
| Nginx                 | 443/tcp                                      | 80/tcp, 8081/tcp               |
andryyy's avatar
andryyy committed
| PowerDNS Recursor     | 53/udp                                       | -                              |
andryyy's avatar
andryyy committed
| Rspamd                | -                                            | 11333/tcp, 11334/tcp           |
| MariaDB               | -                                            | 3306/tcp                       |
| Rmilter               | -                                            | 9000/tcp                       |
| PHP FPM               | -                                            | 9000/tcp                       |
| SOGo                  | -                                            | 9000/tcp                       |
| Redis                 | -                                            | 6379/tcp                       |
| Memcached             | -                                            | 11211/tcp                      |

All containers share a network "mailcow-network" (name can be changed, but remove all containers and rebuild them after changing).
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
1. You need Docker. Most systems can install Docker by running `wget -qO- https://get.docker.com/ | sh`
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
2. Clone this repository and configure `mailcow.conf`, do not use special chars in passwords in this file (will be fixed soon).
It is almost always enough to just change the hostname.
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
3. Run `./build-all.sh` - select `Y` when asked to reset the admin password.
andryyy's avatar
andryyy committed
Done.

You can now access https://${MAILCOW_HOSTNAME} with the default credentials `admin` + password `moohoo`.

## Configuration after installation

### Rspamd UI access
If you want to use Rspamds web UI, you need to set a Rspamd controller password:

```
# Generate hash
docker exec -it rspamd-mailcow rspamadm pw
```

Replace given hash in data/conf/rspamd/override.d/worker-controller.inc:
```
enable_password = "myhash";
```

Restart rspamd:
```
docker restart rspamd-mailcow
```

Open https://${MAILCOW_HOSTNAME}/rspamd in a browser.

### SSL (or: How to use Let's Encrypt)
andryyy's avatar
andryyy committed
mailcow dockerized comes with a self-signed certificate. Certificates and DH parameters are saved as `data/assets/ssl/{dhparams.pem,mail.{crt,key}}`.

First you should renew the DH parameters. 
Soem say you should use 4096, but be prepared for a long waiting period when generating such a file.
andryyy's avatar
andryyy committed
Assuming you are in the mailcow root folder:
```
openssl dhparam -out ./data/assets/ssl/dhparams.pem 2048
```

Get the certbot client:
```
andryyy's avatar
andryyy committed
wget https://dl.eff.org/certbot-auto -O /usr/local/sbin/certbot && chmod +x /usr/local/sbin/certbot
```

Please disable applications blocking port 80 and run certbot:
```
andryyy's avatar
andryyy committed
certbot-auto certonly \
	--standalone \
	--standalone-supported-challenges http-01 \
	-d ${MAILCOW_HOSTNAME} \
	--email you@example.org \
	--agree-tos
```

andryyy's avatar
andryyy committed
Create hard links to the full path of the new certificates. Assuming you are still in the mailcow root folder:
```
mv data/assets/ssl/mail.{crt,crt_old}
mv data/assets/ssl/mail.{key,key_old}
andryyy's avatar
andryyy committed
ln $(readlink -f /etc/letsencrypt/live/${MAILCOW_HOSTNAME}/fullchain.pem) data/assets/ssl/mail.crt
ln $(readlink -f /etc/letsencrypt/live/${MAILCOW_HOSTNAME}/privkey.pem) data/assets/ssl/mail.key
```

Restart containers which use the certificate:
```
docker restart postfix-mailcow
docker restart dovecot-mailcow
docker restart nginx-mailcow
```
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
When renewing certificates, run the last two steps (link + restart) as post-hook in certbot.

## Special usage
andryyy's avatar
andryyy committed
### build-*.files

(Re)build a container:
```
./build-$name.sh 
```
andryyy's avatar
andryyy committed
**:exclamation:** Any previous container with the same name will be stopped and removed.
andryyy's avatar
andryyy committed
No persistent data is deleted at any time.
If an image exists, you will be asked wether or not to repull/rebuild it.

### Logs

You can use docker logs $name for almost all containers. Only rmilter does not log to stdout. You can check rspamd logs for rmilter reponses.

When a process dies, the container dies, too. Except for Postfix' container.

andryyy's avatar
andryyy committed
### MariaDB
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
Connect to MariaDB database:
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
./build-sql.sh --client
andryyy's avatar
andryyy committed
```

andryyy's avatar
andryyy committed
Init schema (will also be installed when running `./build-sql.sh` without parameters):
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
./build-sql.sh --init-schema
andryyy's avatar
andryyy committed
```

Reset mailcow admin to `admin:moohoo`:
```
andryyy's avatar
andryyy committed
./build-sql.sh --reset-admin
```

Dump database to file backup_${DBNAME}_${DATE}.sql:
```
./build-sql.sh --dump
andryyy's avatar
andryyy committed
```

Restore database from a file:
```
./build-sql.sh --restore filename

andryyy's avatar
andryyy committed
### Redis

Connect to redis database:
```
andryyy's avatar
andryyy committed
./build-sql.sh --client
andryyy's avatar
andryyy committed
```

### Rspamd examples
andryyy's avatar
andryyy committed

Use rspamadm:
```
docker exec -it rspamd-mailcow rspamadm --help
andryyy's avatar
andryyy committed
```

Use rspamc:
```
docker exec -it rspamd-mailcow rspamc --help
andryyy's avatar
andryyy committed
```

### Remove persistent data

andryyy's avatar
andryyy committed
MariaDB:
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
docker stop mariadb-mailcow
docker rm mariadb-mailcow
andryyy's avatar
andryyy committed
rm -rf data/db/mysql/*
andryyy's avatar
andryyy committed
./build-sql.sh
andryyy's avatar
andryyy committed
```

Redis:
```
# If you feel hardcore:
docker stop redis-mailcow
docker rm redus-mailcow
rm -rf data/db/redis/*
./build-redis.sh

## It is almost always enough to just flush all keys:
./build-redis client
# FLUSHALL [ENTER]
```