diff --git a/.gitignore b/.gitignore index 1c3101d7..2fc3256c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store docker-compose.yml -postfix/ssl/* \ No newline at end of file +postfix/ssl/* +assert.sh* diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..3d271e53 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: bash +sudo: required +services: + - docker +script: + - make all diff --git a/Dockerfile b/Dockerfile index e029caa4..ff1c1cb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Thomas VIAL # Packages RUN apt-get update -q --fix-missing RUN apt-get -y upgrade -RUN DEBIAN_FRONTEND=noninteractive apt-get -y install vim postfix sasl2-bin courier-imap courier-imap-ssl courier-authdaemon supervisor gamin amavisd-new spamassassin clamav clamav-daemon libnet-dns-perl libmail-spf-perl pyzor razor arj bzip2 cabextract cpio file gzip nomarch p7zip pax unzip zip zoo rsyslog +RUN DEBIAN_FRONTEND=noninteractive apt-get -y install vim postfix sasl2-bin courier-imap courier-imap-ssl courier-authdaemon supervisor gamin amavisd-new spamassassin clamav clamav-daemon libnet-dns-perl libmail-spf-perl pyzor razor arj bzip2 cabextract cpio file gzip nomarch p7zip pax unzip zip zoo rsyslog mailutils RUN apt-get autoclean # Configures Saslauthd diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..c7a0a323 --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +NAME = tvial/docker-mailserver +VERSION = $(TRAVIS_BUILD_ID) + +all: build run prepare fixtures tests + +build: + docker build --no-cache -t $(NAME):$(VERSION) . + +run: + # Copy test files + cp test/accounts.cf postfix/ + cp test/virtual postfix/ + # Run container + docker run -d --name mail -v "`pwd`/postfix":/tmp/postfix -v "`pwd`/spamassassin":/tmp/spamassassin -h mail.my-domain.com -t $(NAME):$(VERSION) + sleep 15 + +prepare: + # Reinitialize logs + docker exec mail /bin/sh -c 'echo "" > /var/log/mail.log' + +fixtures: + # Sending test mails + docker exec mail /bin/sh -c 'echo "This is a test mail" | mail -s "TEST-001" user@localhost.localdomain' + docker exec mail /bin/sh -c 'echo "This is a test mail" | mail -s "TEST-002" nouser@localhost.localdomain' + docker exec mail /bin/sh -c 'echo "This is a test mail" | mail -s "TEST-003" alias1@localhost.localdomain' + docker exec mail /bin/sh -c 'echo "This is a test mail" | mail -s "TEST-004" alias2@localhost.localdomain' + +tests: + # Start tests + ./test/test.sh diff --git a/README.md b/README.md index f02720af..82cf57b4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # docker-mailserver +[![Build Status](https://travis-ci.org/tomav/docker-mailserver.svg)](https://travis-ci.org/tomav/docker-mailserver) + A fullstack but simple mail server (smtp, imap, antispam, antivirus...). Only configuration files, no SQL database. Keep it simple and versioned. Easy to deploy and upgrade. diff --git a/postfix/main.cf b/postfix/main.cf index 7bedd2e8..87f23f8c 100644 --- a/postfix/main.cf +++ b/postfix/main.cf @@ -9,7 +9,7 @@ readme_directory = no # myhostname = alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases -mydestination = localhost.localdomain, localhost +mydestination = relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 172.17.0.0/16 mailbox_size_limit = 0 diff --git a/test/accounts.cf b/test/accounts.cf new file mode 100644 index 00000000..8f209cc6 --- /dev/null +++ b/test/accounts.cf @@ -0,0 +1,2 @@ +user1@localhost.localdomain|mypassword +user2@otherdomain.tld|mypassword diff --git a/test/test.sh b/test/test.sh new file mode 100755 index 00000000..6cca8dcd --- /dev/null +++ b/test/test.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Set up test framework +wget -q https://raw.github.com/lehmannro/assert.sh/master/assert.sh +source assert.sh + +# Testing that services are running +assert_raises "docker exec mail ps aux --forest | grep '/usr/lib/postfix/master'" "true" +assert_raises "docker exec mail ps aux --forest | grep '/usr/sbin/saslauthd'" "true" +assert_raises "docker exec mail ps aux --forest | grep '/usr/sbin/clamd'" "true" +assert_raises "docker exec mail ps aux --forest | grep '/usr/sbin/amavisd-new'" "true" + +# Testing user creation +assert "docker exec mail ls -A /var/mail/localhost.localdomain/user1" "cur\nnew\ntmp" +assert "docker exec mail ls /var/mail/otherdomain.tld/user2" "cur\nnew\ntmp" + +# Testing that mail is received for existing user +assert_raises "docker exec mail grep 'status=sent (delivered to maildir)' /var/log/mail.log" "false" +assert "docker exec mail ls -A /var/mail/localhost.localdomain/user1/new | wc -l" "1" + +# Testing presence of freshclam CRON +assert "docker exec mail crontab -l" "0 1 * * * /usr/bin/freshclam --quiet" + +# Ending tests +assert_end diff --git a/test/virtual b/test/virtual new file mode 100644 index 00000000..e93eb8fb --- /dev/null +++ b/test/virtual @@ -0,0 +1,2 @@ +alias1@localhost.localdomain user1@localhost.localdomain +alias2@localhost.localdomain external1@otherdomain.tld