Skip to content
README.md 7.3 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.

andryyy's avatar
andryyy committed
### Exposed ports:
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
| Name              | Service      | Hostname, Alias                | External bindings                            | Internal bindings              |
|:------------------|:-------------|:-------------------------------|:---------------------------------------------|:-------------------------------|
| postfix-mailcow   | Postfix      | ${MAILCOW_HOSTNAME}, postfix   | 25/tcp, 465/tcp, 587/tcp                     | 588/tcp                        |
| dovecot-mailcow   | Dovecot      | ${MAILCOW_HOSTNAME}, dovecot   | 110/tcp, 143/tcp, 993/tcp, 995/tcp, 4190/tcp | 24/tcp, 10001/tcp              |
| nginx-mailcow     | Nginx        | nginx                          | 443/tcp                                      | 80/tcp, 8081/tcp               |
| pdns-mailcow      | PowerDNS     | pdns                           | -                                            | 53/udp                         |
| rspamd-mailcow    | Rspamd       | rspamd                         | -                                            | 11333/tcp, 11334/tcp           |
| mariadb-mailcow   | MariaDB      | mysql                          | -                                            | 3306/tcp                       |
| rmilter-mailcow   | Rmilter      | rmilter                        | -                                            | 9000/tcp                       |
| phpfpm-mailcow    | PHP FPM      | phpfpm                         | -                                            | 9000/tcp                       |
| sogo-mailcow      | SOGo         | sogo                           | -                                            | 9000/tcp                       |
| redis-mailcow     | Redis        | redis                          | -                                            | 6379/tcp                       |
| memcached-mailcow | Memcached    | memcached                      | -                                            | 11211/tcp                      |
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
All containers share a network "mailcow-network" with the subnet 172.22.1.0/24 - if you want to change it, set it in the composer file.
IPs are dynamic except for PowerDNS resolver which has a static ip address 172.22.1.2.
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
### **FAQ**
andryyy's avatar
andryyy committed

- rspamd learns mail as spam or ham when you move a message in or out of the junk folder to any mailbox besides trash.
- rspamd auto-learns mail when a high or low score is detected (see https://rspamd.com/doc/configuration/statistic.html#autolearning)
andryyy's avatar
andryyy committed
- You can upgrade SOGo by running `docker pull andryyy/mailcow-dockerized:sogo && docker pull andryyy/mailcow-dockerized:nginx` and rebuilding of the SOGo and Nginx container.
andryyy's avatar
andryyy committed
- Only Postfix and Rspamd use the PowerDNS resolver for DNSSEC. 
- Linking to existing redis and memcached containers will be possible soon

andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
1. You need Docker and Docker Compose. Most systems can install Docker by running `wget -qO- https://get.docker.com/ | sh` - see [this link](https://docs.docker.com/compose/install/) for installing Docker Compose.
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).
andryyy's avatar
andryyy committed

andryyy's avatar
andryyy committed
3. `docker-compose up -d` - leave the `-d` out for a wall of logs in case of debugging.
andryyy's avatar
andryyy committed
Done.

andryyy's avatar
andryyy committed
You can now access https://${MAILCOW_HOSTNAME} with the default credentials `admin` + password `moohoo`. The database will be initialized when you first visit the UI.

## 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-compose exec rspamd-mailcow rspamadm pw
```

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

Restart rspamd:
```
andryyy's avatar
andryyy committed
docker-compose restart rspamd-mailcow
```

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

andryyy's avatar
andryyy committed
### SSL (and: How to use Let's Encrypt)
mailcow dockerized comes with a snakeoil CA "mailcow" and a server certificate in `data/assets/ssl`. Please use your own trusted certificates.

**Use Let's Encrypt?**

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:
andryyy's avatar
andryyy committed
mv data/assets/ssl/cert.{pem,pem.backup}
mv data/assets/ssl/key.{pem,pem.backup}
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:
```
andryyy's avatar
andryyy committed
docker-compose restart postfix-mailcow
docker-compose restart dovecot-mailcow
docker-compose 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.
andryyy's avatar
andryyy committed
## More useful commands and examples (todo: move to wiki soon)

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

(Re)build a container:
```
andryyy's avatar
andryyy committed
./n-build-$name.sh 
andryyy's avatar
andryyy committed
```
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.

andryyy's avatar
andryyy committed
Build files are numbered "nnn" for dependencies.
andryyy's avatar
andryyy committed
### Logs
andryyy's avatar
andryyy committed
You can use `docker-compose logs $service-name` for almost all containers. Only rmilter does not log to stdout. You can check rspamd logs for rmilter responses.
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
source mailcow.conf
docker-compose exec mariadb-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
andryyy's avatar
andryyy committed
```

andryyy's avatar
andryyy committed
Init schema (will be auto-installed by mailcow UI, but just in case...):
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
source mailcow.conf
docker-compose exec mariadb-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME} < data/web/inc/init.sql
andryyy's avatar
andryyy committed
```

Reset mailcow admin to `admin:moohoo`:
```
andryyy's avatar
andryyy committed
source mailcow.conf
docker-compose exec mariadb-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP TABLE admin; DROP TABLE domain_admins"
andryyy's avatar
andryyy committed
# Open mailcow UI to auto-init the db
andryyy's avatar
andryyy committed
```

andryyy's avatar
andryyy committed
Backup and restore database:
andryyy's avatar
andryyy committed
source mailcow.conf
# Create
DATE=$(date +"%Y%m%d_%H%M%S")
docker-compose exec mariadb-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} > backup_${DBNAME}_${DATE}.sql
andryyy's avatar
andryyy committed
# Restore
docker exec -i mariadb-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME} < ${1}
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
### Redis

andryyy's avatar
andryyy committed
Connect to redis key store:
andryyy's avatar
andryyy committed
```
docker-compose exec redis-mailcow redis-cli
andryyy's avatar
andryyy committed
```

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

andryyy's avatar
andryyy committed
### Use rspamc:
andryyy's avatar
andryyy committed
```
docker-compose exec rspamd-mailcow rspamc --help
andryyy's avatar
andryyy committed
```
andryyy's avatar
andryyy committed
### Use doveadm:
docker-compose exec dovecot-mailcow doveadm
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
./n-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/*
andryyy's avatar
andryyy committed
./n-build-redis.sh
andryyy's avatar
andryyy committed

## It is almost always enough to just flush all keys:
andryyy's avatar
andryyy committed
./n-build-redis client
andryyy's avatar
andryyy committed
# FLUSHALL [ENTER]
```