diff --git a/.travis.yml b/.travis.yml index c3a19529..107696aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,12 +6,17 @@ addons: - docker-ce env: - VERSION=$TRAVIS_BRANCH +language: python +python: + - "3.6" +install: + - pip install -r tests/requirements.txt script: # Default to mailu for DOCKER_ORG - if [ -z "$DOCKER_ORG" ]; then export DOCKER_ORG="mailu"; fi - docker-compose -f tests/build.yml build - - tests/compose/test-script.sh + - python tests/compose/test.py deploy: provider: script diff --git a/tests/compose/core/core.yml b/tests/compose/core/core.yml new file mode 100644 index 00000000..d85388a4 --- /dev/null +++ b/tests/compose/core/core.yml @@ -0,0 +1,82 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + + # Optional services + antispam: + image: mailu/rspamd:master + env_file: mailu.env + volumes: + - "/mailu/filter:/var/lib/rspamd" + - "/mailu/dkim:/dkim" + - "/mailu/overrides/rspamd:/etc/rspamd/override.d" + depends_on: + - front + + + + # Webmail + diff --git a/tests/compose/fetchmail/fetchmail.yml b/tests/compose/fetchmail/fetchmail.yml new file mode 100644 index 00000000..8f40ba19 --- /dev/null +++ b/tests/compose/fetchmail/fetchmail.yml @@ -0,0 +1,77 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + + # Optional services + + + + fetchmail: + image: mailu/fetchmail:master + env_file: mailu.env + + # Webmail + diff --git a/tests/compose/filters+dns/filters+dns.yml b/tests/compose/filters+dns/filters+dns.yml new file mode 100644 index 00000000..993ed786 --- /dev/null +++ b/tests/compose/filters+dns/filters+dns.yml @@ -0,0 +1,119 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + resolver: + image: mailu/unbound:master + env_file: mailu.env + restart: always + networks: + default: + ipv4_address: 192.168.0.254 + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + - resolver + dns: + - 192.168.0.254 + + # Optional services + antispam: + image: mailu/rspamd:master + env_file: mailu.env + volumes: + - "/mailu/filter:/var/lib/rspamd" + - "/mailu/dkim:/dkim" + - "/mailu/overrides/rspamd:/etc/rspamd/override.d" + depends_on: + - front + - resolver + dns: + - 192.168.0.254 + + antivirus: + image: mailu/clamav:master + env_file: mailu.env + volumes: + - "/mailu/filter:/data" + depends_on: + - resolver + dns: + - 192.168.0.254 + + + + # Webmail + webmail: + image: mailu/rainloop:master + env_file: mailu.env + volumes: + - "/mailu/webmail:/data" + depends_on: + - imap + +networks: + default: + driver: bridge + ipam: + driver: default + config: + - subnet: 192.168.0.0/24 diff --git a/tests/compose/core.env b/tests/compose/mailu.env similarity index 72% rename from tests/compose/core.env rename to tests/compose/mailu.env index 78c307c0..74c87118 100644 --- a/tests/compose/core.env +++ b/tests/compose/mailu.env @@ -1,31 +1,38 @@ # Mailu main configuration file # -# Most configuration variables can be modified through the Web interface, -# these few settings must however be configured before starting the mail -# server and require a restart upon change. +# Generated for compose flavor +# +# This file is autogenerated by the configuration management wizard. +# For a detailed list of configuration variables, see the documentation at +# https://mailu.io ################################### # Common configuration variables ################################### # Set this to the path where Mailu data and configuration is stored -ROOT=/mailu +# This variable is now set directly in `docker-compose.yml by the setup utility +# ROOT=/mailu # Mailu version to run (1.0, 1.1, etc. or master) #VERSION=master # Set to a randomly generated 16 bytes string -SECRET_KEY=ChangeMeChangeMe +SECRET_KEY=1DS36JPBRGPM5JUC # Address where listening ports should bind -BIND_ADDRESS4=127.0.0.1 -#BIND_ADDRESS6=::1 +# This variables are now set directly in `docker-compose.yml by the setup utility +# PUBLIC_IPV4= 127.0.0.1 (default: 127.0.0.1) +# PUBLIC_IPV6= ::1 (default: ::1) + +# Subnet +SUBNET=192.168.0.0/24 # Main mail domain DOMAIN=mailu.io # Hostnames for this server, separated with comas -HOSTNAMES=mail.mailu.io,alternative.mailu.io,yetanother.mailu.io +HOSTNAMES=mail.mailu.io # Postmaster local part (will append the main mail domain) POSTMASTER=admin @@ -34,7 +41,7 @@ POSTMASTER=admin TLS_FLAVOR=cert # Authentication rate limit (per source IP address) -AUTH_RATELIMIT=10/minute;1000/hour +AUTH_RATELIMIT=10/minute;1000/hour # Opt-out of statistics, replace with "True" to opt out DISABLE_STATISTICS=False @@ -44,7 +51,7 @@ DISABLE_STATISTICS=False ################################### # Expose the admin interface (value: true, false) -ADMIN=false +ADMIN=true # Choose which webmail to run if any (values: roundcube, rainloop, none) WEBMAIL=none @@ -53,7 +60,10 @@ WEBMAIL=none WEBDAV=none # Antivirus solution (value: clamav, none) -ANTIVIRUS=none +#ANTIVIRUS=none + +#Antispam solution +ANTISPAM=none ################################### # Mail settings @@ -65,7 +75,7 @@ MESSAGE_SIZE_LIMIT=50000000 # Networks granted relay permissions, make sure that you include your Docker # internal network (default to 172.17.0.0/16) -RELAYNETS=172.16.0.0/12 +RELAYNETS=172.17.0.0/16 # Will relay all outgoing mails if configured RELAYHOST= @@ -74,18 +84,12 @@ RELAYHOST= FETCHMAIL_DELAY=600 # Recipient delimiter, character used to delimiter localpart from custom address part -# e.g. localpart+custom@domain;tld RECIPIENT_DELIMITER=+ # DMARC rua and ruf email DMARC_RUA=admin DMARC_RUF=admin -# Welcome email, enable and set a topic and body if you wish to send welcome -# emails to all users. -WELCOME=false -WELCOME_SUBJECT=Welcome to your new email account -WELCOME_BODY=Welcome to your new email account, if you can read this, then it is configured properly! # Maildir Compression # choose compression-method, default: none (value: bz2, gz) @@ -109,12 +113,7 @@ SITENAME=Mailu # Linked Website URL WEBSITE=https://mailu.io -# Registration reCaptcha settings (warning, this has some privacy impact) -# RECAPTCHA_PUBLIC_KEY= -# RECAPTCHA_PRIVATE_KEY= -# Domain registration, uncomment to enable -# DOMAIN_REGISTRATION=true ################################### # Advanced settings @@ -127,14 +126,17 @@ WEBSITE=https://mailu.io LOG_DRIVER=json-file # Docker-compose project name, this will prepended to containers names. -#COMPOSE_PROJECT_NAME=mailu +COMPOSE_PROJECT_NAME=mailu # Default password scheme used for newly created accounts and changed passwords -# (value: SHA512-CRYPT, SHA256-CRYPT, MD5-CRYPT, CRYPT) -PASSWORD_SCHEME=SHA512-CRYPT +# (value: BLF-CRYPT, SHA512-CRYPT, SHA256-CRYPT, MD5-CRYPT, CRYPT) +PASSWORD_SCHEME=BLF-CRYPT # Header to take the real ip from REAL_IP_HEADER= # IPs for nginx set_real_ip_from (CIDR list separated by commas) REAL_IP_FROM= + +# choose wether mailu bounces (no) or rejects (yes) mail when recipient is unknown (value: yes, no) +REJECT_UNLISTED_RECIPIENT= \ No newline at end of file diff --git a/tests/compose/rainloop/rainloop.yml b/tests/compose/rainloop/rainloop.yml new file mode 100644 index 00000000..29011eeb --- /dev/null +++ b/tests/compose/rainloop/rainloop.yml @@ -0,0 +1,84 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + + # Optional services + + + + + # Webmail + webmail: + image: mailu/rainloop:master + env_file: mailu.env + volumes: + - "/mailu/webmail:/data" + depends_on: + - imap + - resolver + dns: + - 192.168.0.254 + diff --git a/tests/compose/roundcube/roundcube.yml b/tests/compose/roundcube/roundcube.yml new file mode 100644 index 00000000..c6e46ed9 --- /dev/null +++ b/tests/compose/roundcube/roundcube.yml @@ -0,0 +1,84 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + + # Optional services + + + + + # Webmail + webmail: + image: mailu/roundcube:master + env_file: mailu.env + volumes: + - "/mailu/webmail:/data" + depends_on: + - imap + - resolver + dns: + - 192.168.0.254 + diff --git a/tests/compose/run.yml b/tests/compose/run.yml deleted file mode 100644 index eac35b76..00000000 --- a/tests/compose/run.yml +++ /dev/null @@ -1,101 +0,0 @@ -version: '2' - -services: - - front: - image: $DOCKER_ORG/nginx:$VERSION - restart: 'no' - env_file: $PWD/.env - logging: - driver: $LOG_DRIVER - ports: - - "$BIND_ADDRESS4:80:80" - - "$BIND_ADDRESS4:443:443" - - "$BIND_ADDRESS4:110:110" - - "$BIND_ADDRESS4:143:143" - - "$BIND_ADDRESS4:993:993" - - "$BIND_ADDRESS4:995:995" - - "$BIND_ADDRESS4:25:25" - - "$BIND_ADDRESS4:465:465" - - "$BIND_ADDRESS4:587:587" - volumes: - - "$ROOT/certs:/certs" - - redis: - image: redis:alpine - restart: 'no' - volumes: - - "$ROOT/redis:/data" - - imap: - image: $DOCKER_ORG/dovecot:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/data:/data" - - "$ROOT/mail:/mail" - - "$ROOT/overrides:/overrides" - depends_on: - - front - - smtp: - image: $DOCKER_ORG/postfix:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/data:/data" - - "$ROOT/overrides:/overrides" - depends_on: - - front - - antispam: - image: $DOCKER_ORG/rspamd:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/filter:/var/lib/rspamd" - - "$ROOT/dkim:/dkim" - - "$ROOT/overrides/rspamd:/etc/rspamd/override.d" - depends_on: - - front - - antivirus: - image: $DOCKER_ORG/$ANTIVIRUS:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/filter:/data" - - webdav: - image: $DOCKER_ORG/$WEBDAV:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/dav:/data" - - admin: - image: $DOCKER_ORG/admin:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/data:/data" - - "$ROOT/dkim:/dkim" - - /var/run/docker.sock:/var/run/docker.sock:ro - depends_on: - - redis - - webmail: - image: "$DOCKER_ORG/$WEBMAIL:$VERSION" - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/webmail:/data" - depends_on: - - imap - - fetchmail: - image: $DOCKER_ORG/fetchmail:$VERSION - restart: 'no' - env_file: $PWD/.env - volumes: - - "$ROOT/data:/data" diff --git a/tests/compose/test.py b/tests/compose/test.py new file mode 100755 index 00000000..95670e30 --- /dev/null +++ b/tests/compose/test.py @@ -0,0 +1,92 @@ +import sys +import os +import time +import docker +from colorama import Fore, Style + +# Declare variables for service name and sleep time +test_name=sys.argv[1] +timeout=int(sys.argv[2]) + +client = docker.APIClient(base_url='unix://var/run/docker.sock') + +containers = [] + +# Start up containers +def start(): + os.system("cp mailu.env " + test_name + "/") + os.system("docker-compose -f " + test_name + "/" + test_name + ".yml -p $DOCKER_ORG up -d ") + +# Stop containers +def stop(exit_code): + print_logs() + os.system("docker-compose -f " + test_name + "/" + test_name + ".yml -p $DOCKER_ORG down") + os.system("rm " + test_name +"/mailu.env") + sys.exit(exit_code) + +# Sleep for a defined amount of time +def sleep(): + print(Fore.LIGHTMAGENTA_EX + "Sleeping for " + str(timeout) + "m" + Style.RESET_ALL) + time.sleep(timeout*60) + +def health_checks(): + exit_code = 0 + #Iterating trough all containers dictionary + for container in client.containers(all=True): + #Perform "docker container inspect" on container based on container ID and save output to a dictionary + container_inspect = client.inspect_container(container['Id']) #Dict + + if "Health" in container_inspect['State'].keys(): + if container_inspect['State']['Health']['Status'] == "healthy": + print(Fore.GREEN + "Health status for " + container_inspect['Name'].replace("/", "") + " : " + Fore.CYAN + container_inspect['State']['Health']['Status'] + Style.RESET_ALL) + if container_inspect['State']['Health']['Status'] != "healthy": + print(Fore.RED + "Container " + container_inspect['Name'].replace("/", "") + " is " + Fore.YELLOW + container_inspect['State']['Health']['Status'] + + Fore.RED + ", FailingStreak: " + Fore.YELLOW + str(container_inspect['State']['Health']['FailingStreak']) + + Fore.RED + ", Log: " + Fore.YELLOW + str(container_inspect['State']['Health']['Log']) + Style.RESET_ALL) + exit_code = 1 + else: + if container_inspect['State']['Status'] == "running": + print(Fore.GREEN + "Running status for " + container_inspect['Name'].replace("/", "") + " : " + Fore.BLUE + container_inspect['State']['Status'] + Style.RESET_ALL) + if container_inspect['State']['Status'] != "running": + print(Fore.RED + "Container " + container_inspect['Name'].replace("/", "") + " state is: " + Fore.YELLOW + container_inspect['State']['Status'] + Style.RESET_ALL) + exit_code = 1 + + #Saving Id, Name and state to a new dictionary + containers_dict = {} + containers_dict['Name'] = container_inspect['Name'].replace("/", "") + containers_dict['Id'] = container_inspect['Id'] + containers_dict['State'] = container_inspect['State'] + + #Adding the generated dictionary to a list + containers.append(containers_dict) + + if exit_code != 0: + stop(exit_code) + +def print_logs(): + print("Printing logs ...") + #Iterating through docker container inspect list and print logs + for container in containers: + print(Fore.LIGHTMAGENTA_EX + "Printing logs for: " + Fore.GREEN + container['Name'] + Style.RESET_ALL) + os.system('docker container logs ' + container['Name']) + +#Iterating over hooks in test folder and running them +def hooks(): + print("Running hooks") + for test_file in sorted(os.listdir(test_name + "/")): + if test_file.endswith(".py"): + os.system("python3 " + test_name + "/" + test_file) + elif test_file.endswith(".sh"): + os.system("./" + test_name + "/" + test_file) + +start() +print() +sleep() +print() +os.system("docker ps -a") +print() +health_checks() +print() +hooks() +print() +stop(0) diff --git a/tests/compose/webdav/webdav.yml b/tests/compose/webdav/webdav.yml new file mode 100644 index 00000000..b4d222ef --- /dev/null +++ b/tests/compose/webdav/webdav.yml @@ -0,0 +1,79 @@ +# This file is auto-generated by the Mailu configuration wizard. +# Please read the documentation before attempting any change. +# Generated for compose flavor + +version: '3.6' + +services: + + # External dependencies + redis: + image: redis:alpine + volumes: + - "/mailu/redis:/data" + + # Core services + front: + image: mailu/nginx:master + env_file: mailu.env + ports: + - "127.0.0.1:80:80" + - "::1:80:80" + - "127.0.0.1:443:443" + - "::1:443:443" + - "127.0.0.1:25:25" + - "::1:25:25" + - "127.0.0.1:465:465" + - "::1:465:465" + - "127.0.0.1:587:587" + - "::1:587:587" + - "127.0.0.1:110:110" + - "::1:110:110" + - "127.0.0.1:995:995" + - "::1:995:995" + - "127.0.0.1:143:143" + - "::1:143:143" + - "127.0.0.1:993:993" + - "::1:993:993" + volumes: + - "/mailu/certs:/certs" + + + admin: + image: mailu/admin:master + env_file: mailu.env + volumes: + - "/mailu/data:/data" + - "/mailu/dkim:/dkim" + depends_on: + - redis + + imap: + image: mailu/dovecot:master + env_file: mailu.env + volumes: + - "/mailu/mail:/mail" + - "/mailu/overrides:/overrides" + depends_on: + - front + + smtp: + image: mailu/postfix:master + env_file: mailu.env + volumes: + - "/mailu/overrides:/overrides" + depends_on: + - front + + # Optional services + + + webdav: + image: mailu/radicale:master + env_file: mailu.env + volumes: + - "/mailu/dav:/data" + + + # Webmail + diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 00000000..36006cfc --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,2 @@ +docker +colorama