andryyy 8 éve
szülő
commit
e3f0058f4f

+ 1 - 0
.gitignore

@@ -7,3 +7,4 @@ data/dkim/keys/*
 !data/dkim/keys/.dkim_priv_keys
 data/dkim/txt/*
 !data/dkim/txt/.dkim_pub_keys
+backup*sql

+ 16 - 11
README.md

@@ -30,28 +30,33 @@ You can use docker logs $name for almost all containers. Only rmilter does not l
 
 When a process dies, the container dies, too. Except for Postfix' container.
 
-### MySQL
+### MariaDB
 
-Connect to MySQL database:
+Connect to MariaDB database:
 ```
-./build-mysql.sh --client
+./build-sql.sh --client
 ```
 
-Init schema (will also be installed when running `./build-mysql.sh` without parameters):
+Init schema (will also be installed when running `./build-sql.sh` without parameters):
 ```
-./build-mysql.sh --init-schema
+./build-sql.sh --init-schema
 ```
 
 Reset mailcow admin to `admin:moohoo`:
 ```
-./build-mysql.sh --reset-admin
+./build-sql.sh --reset-admin
+```
+
+Dump database to file backup_${DBNAME}_${DATE}.sql:
+```
+./build-sql.sh --dump
 ```
 
 ### Redis
 
 Connect to redis database:
 ```
-./build-mysql.sh --client
+./build-sql.sh --client
 ```
 
 ### rspamd
@@ -84,13 +89,13 @@ docker restart rspamd-mailcow
 
 ### Remove persistent data
 
-MySQL:
+MariaDB:
 
 ```
-docker stop mysql-mailcow
-docker rm mysql-mailcow
+docker stop mariadb-mailcow
+docker rm mariadb-mailcow
 rm -rf data/db/mysql/*
-./build-mysql.sh
+./build-sql.sh
 ```
 
 Redis:

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 583 - 0
backup_mailcow_20161211_101317.sql


+ 1 - 0
build-all.sh

@@ -1,6 +1,7 @@
 #!/bin/bash
 
 /bin/bash build-network.sh
+[[ $? != 0 ]] && exit 1
 for buildx in $(ls build-*.sh | grep -vE "all|network"); do
     echo "Starting build file ${buildx} ..."
 	/bin/bash ${buildx}

+ 0 - 1
build-memcached.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="memcached-mailcow"
 

+ 5 - 0
build-network.sh

@@ -4,5 +4,10 @@
 if [[ -z $(docker network ls --filter "name=${DOCKER_NETWORK}" -q) ]]; then
 	docker network create ${DOCKER_NETWORK} --subnet ${DOCKER_SUBNET}
 else
+	if [[ $(docker network inspect mailcow-network --format='{{range .IPAM.Config}}{{.Subnet}}{{end}}' 2> /dev/null) != ${DOCKER_SUBNET} ]]; then
+		echo "ERROR: mailcow network exists, but has wrong subnet!"
+		exit 1
+	fi
+	echo "Correct mailcow network exists, skipped..."
 	exit 0
 fi

+ 0 - 1
build-nginx.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="nginx-mailcow"
 

+ 0 - 1
build-php-fpm.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="php-fpm-mailcow"
 

+ 0 - 1
build-postfix.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="postfix-mailcow"
 

+ 3 - 1
build-redis.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="redis-mailcow"
 
@@ -12,6 +11,9 @@ client() {
 if [[  ${1} == "--client" ]]; then
     client
 	exit 0
+elif [[ ! -z ${1} ]]; then
+    echo "Unknown parameter"
+    exit 1
 fi
 
 echo "Stopping and removing containers with name tag ${NAME}..."

+ 0 - 1
build-rmilter.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="rmilter-mailcow"
 

+ 0 - 1
build-rspamd.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="rspamd-mailcow"
 

+ 0 - 1
build-sogo.sh

@@ -1,7 +1,6 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
 NAME="sogo-mailcow"
 

+ 34 - 11
build-mysql.sh → build-sql.sh

@@ -1,13 +1,12 @@
 #!/bin/bash
 
 . mailcow.conf
-./build-network.sh
 
-NAME="mysql-mailcow"
+NAME="mariadb-mailcow"
 
 reconf() {
 	echo "Installing database schema (this will not overwrite existing data)"
-	echo "It may take a while for MySQL to warm up, please wait..."
+	echo "It may take a while for MariaDB to warm up, please wait..."
 	until docker exec ${NAME} /bin/bash -c "mysql -u'${DBUSER}' -p'${DBPASS}' ${DBNAME} < /assets/init.sql"; do
 		echo "Trying again in 2 seconds..."
 		sleep 2
@@ -15,9 +14,20 @@ reconf() {
 	echo "Done."
 }
 
+dump() {
+	DATE=$(date +"%Y%m%d_%H%M%S")
+    echo "Creating dump file ./backup_${DBNAME}_${DATE}.sql"
+    docker exec -it ${NAME} /bin/bash mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} > backup_${DBNAME}_${DATE}.sql
+}
+
+restore() {
+    echo "Restoring dump file ${2}..."
+    docker exec -i ${NAME} mysql -u${DBUSER} -p${DBPASS} ${DBNAME} < ${1}
+}
+
 insert_admin() {
 	echo 'Setting mailcow UI admin login to "admin:moohoo"...'
-	echo "It may take a while for MySQL to warm up, please wait..."
+	echo "It may take a while for MariaDB to warm up, please wait..."
 	until docker exec ${NAME} /bin/bash -c "mysql -u'${DBUSER}' -p'${DBPASS}' ${DBNAME} < /assets/pw.sql"; do
 		echo "Trying again in 2 seconds..."
 		sleep 2
@@ -29,18 +39,31 @@ client() {
 	echo "==============================="
 	echo "DB: ${DBNAME} - USER: ${DBUSER}"
 	echo "==============================="
-    docker exec -it ${NAME} /bin/bash -c "mysql -u'${DBUSER}' -p'${DBPASS}' ${DBNAME}"
+    docker exec -it ${NAME} mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
 }
 
-if [[  ${1} == "--init-schema" ]]; then
+if [[ ${1} == "--init-schema" ]]; then
 	reconf
     exit 0
-elif [[  ${1} == "--client" ]]; then
+elif [[ ${1} == "--dump" ]]; then
+	dump
+	exit 0
+elif [[ ${1} == "--restore" ]]; then
+	if [[ -z ${2} || ! -f ${2} ]]; then
+		echo "Invalid input file"
+		exit 1
+	fi
+	restore ${2}
+	exit 0
+elif [[ ${1} == "--client" ]]; then
 	client
 	exit 0
-elif [[  ${1} == "--reset-admin" ]]; then
+elif [[ ${1} == "--reset-admin" ]]; then
 	insert_admin
 	exit 0
+elif [[ ! -z ${1} ]]; then
+	echo "Unknown parameter"
+	exit 1
 fi
 
 echo "Stopping and removing containers with name tag ${NAME}..."
@@ -49,11 +72,11 @@ if [[ ! -z $(docker ps -af "name=${NAME}" -q) ]]; then
 	docker rm $(docker ps -af "name=${NAME}" -q)
 fi
 
-if [[ ! -z "$(docker images -q mysql:${DBVERS})" ]]; then
+if [[ ! -z "$(docker images -q mariadb:${DBVERS})" ]]; then
     read -r -p "Found image locally. Delete local image and repull? [y/N] " response
     response=${response,,}
     if [[ $response =~ ^(yes|y)$ ]]; then
-        docker rmi mysql:${DBVERS}
+        docker rmi mariadb:${DBVERS}
     fi
 fi
 
@@ -69,7 +92,7 @@ docker run \
 	-e MYSQL_DATABASE=${DBNAME} \
 	-e MYSQL_USER=${DBUSER} \
 	-e MYSQL_PASSWORD=${DBPASS} \
-	-d mysql:${DBVERS}
+	-d mariadb:${DBVERS}
 
 reconf
 

+ 0 - 5
data/Dockerfiles/dovecot/Dockerfile

@@ -1,14 +1,10 @@
 From ubuntu:xenial
 MAINTAINER Andre Peters <andre.peters@servercow.de>
 
-# Set noninteractive mode for apt-get
 ENV DEBIAN_FRONTEND noninteractive
 
-# Update
 RUN apt-get update
 
-# Start editing
-# Install package here for cache
 RUN apt-get -y install dovecot-common dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve dovecot-mysql dovecot-pop3d
 
 RUN groupadd -g 5000 vmail
@@ -16,5 +12,4 @@ RUN useradd -g vmail -u 5000 vmail -d /var/vmail
 
 EXPOSE 24 10001
 
-# Run
 CMD ["/usr/sbin/dovecot", "-F"]

+ 0 - 5
data/Dockerfiles/postfix/Dockerfile

@@ -1,14 +1,10 @@
 From ubuntu:xenial
 MAINTAINER Andre Peters <andre.peters@servercow.de>
 
-# Set noninteractive mode for apt-get
 ENV DEBIAN_FRONTEND noninteractive
 
-# Update
 RUN apt-get update
 
-# Start editing
-# Install package here for cache
 RUN apt-get -y install supervisor \
 	postfix \
 	sasl2-bin \
@@ -26,5 +22,4 @@ RUN useradd -g vmail -u 5000 vmail -d /var/vmail
 
 EXPOSE 588
 
-# Run
 CMD /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

+ 2 - 0
data/Dockerfiles/rmilter/Dockerfile

@@ -1,6 +1,8 @@
 FROM debian:jessie
 MAINTAINER Andre Peters <andre.peters@servercow.de>
 
+ENV DEBIAN_FRONTEND noninteractive
+
 RUN apt-get update \
 	&& apt-get install -y wget \
 	&& wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add - \

+ 2 - 0
data/Dockerfiles/rspamd/Dockerfile

@@ -1,6 +1,8 @@
 FROM debian:jessie
 MAINTAINER Andre Peters <andre.peters@debinux.de>
 
+ENV DEBIAN_FRONTEND noninteractive
+
 RUN apt-get update \
 	&& apt-get install -y wget \
 	&& wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add - \

+ 2 - 0
data/Dockerfiles/sogo/Dockerfile

@@ -1,6 +1,8 @@
 FROM debian:jessie
 MAINTAINER Andre Peters <andre.peters@debinux.de>
 
+ENV DEBIAN_FRONTEND noninteractive
+
 RUN apt-get update \
 	&& apt-get -y --force-yes install apt-transport-https \
 	&& apt-key adv --keyserver keys.gnupg.net --recv-key 0x810273C4 \

+ 1 - 0
data/conf/mysql/my.cnf

@@ -11,3 +11,4 @@ default-character-set = utf8mb4
 
 [mysql]
 default-character-set = utf8mb4
+#sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

+ 14 - 12
data/conf/rspamd/dynmaps/settings.php

@@ -24,7 +24,7 @@ while ($row = array_shift($rows)) {
 	$username_sane = preg_replace("/[^a-zA-Z0-9]+/", "", $row['object']);
 ?>
 	score_<?=$username_sane;?> {
-	priority = low;
+		priority = low;
 <?php
 	$stmt = $pdo->prepare("SELECT `option`, `value` FROM `filterconf` 
 		WHERE (`option` = 'highspamlevel' OR `option` = 'lowspamlevel')
@@ -39,15 +39,15 @@ while ($row = array_shift($rows)) {
 	$grouped_lists = $stmt->fetchAll(PDO::FETCH_COLUMN);
 	$value_sane = preg_replace("/\.\./", ".", (preg_replace("/\*/", ".*", $grouped_lists[0])));
 ?>
-	from = "/^((?!<?=$value_sane;?>).)*$/";
-	rcpt = "<?=$row['object'];?>";
+		from = "/^((?!<?=$value_sane;?>).)*$/";
+		rcpt = "<?=$row['object'];?>";
 <?php
 	$stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE `goto` = :object_goto AND `address` NOT LIKE '@%' AND `address` != :object_address");
 	$stmt->execute(array(':object_goto' => $row['object'], ':object_address' => $row['object']));
 	$rows_aliases_1 = $stmt->fetchAll(PDO::FETCH_ASSOC);
 	while ($row_aliases_1 = array_shift($rows_aliases_1)) {
 ?>
-	rcpt = "<?=$row_aliases_1['address'];?>";
+		rcpt = "<?=$row_aliases_1['address'];?>";
 <?php
 	}
 	$stmt = $pdo->prepare("SELECT CONCAT(`local_part`, '@', `alias_domain`.`alias_domain`) AS `aliases` FROM `mailbox` 
@@ -57,20 +57,22 @@ while ($row = array_shift($rows)) {
 	$rows_aliases_2 = $stmt->fetchAll(PDO::FETCH_ASSOC);
 	while ($row_aliases_2 = array_shift($rows_aliases_2)) {
 ?>
-	rcpt = "<?=$row_aliases_2['aliases'];?>";
+		rcpt = "<?=$row_aliases_2['aliases'];?>";
 <?php
 	}
 ?>
-	apply "default" {
-		actions {
-			reject = <?=$spamscore['highspamlevel'][0];?>;
-			greylist = <?=$spamscore['lowspamlevel'][0] - 1;?>;
-			"add header" = <?=$spamscore['lowspamlevel'][0];?>;
+		apply "default" {
+			actions {
+				reject = <?=$spamscore['highspamlevel'][0];?>;
+				greylist = <?=$spamscore['lowspamlevel'][0] - 1;?>;
+				"add header" = <?=$spamscore['lowspamlevel'][0];?>;
+			}
 		}
-	}
 <?php
 }
-
+?>
+	}
+<?php
 /*
 // Start whitelist
 */

+ 1 - 1
data/conf/rspamd/local.d/statistic.conf

@@ -6,7 +6,7 @@ classifier "bayes" {
     backend = "redis";
     servers = "redis:6379";
     min_tokens = 11;
-    min_learns = 200;
+    min_learns = 20;
     autolearn = true;
 
     per_user = <<EOD

+ 7 - 0
data/web/user.php

@@ -184,6 +184,13 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user
 						'msg' => 'MySQL: '.$e
 					);
 				}
+				if (count($rows) == 0):
+				?>
+					<div class="row">
+						<div class="col-sm-12"><i><?=$lang['user']['spamfilter_table_empty'];?></i></div>
+					</div>
+				<?php
+				endif;
 				while ($whitelistRow = array_shift($rows)):
 				?>
 				<div class="row striped">

+ 3 - 4
mailcow.conf

@@ -11,9 +11,8 @@ DBUSER=mailcow
 DBPASS=mysafepasswd
 DBROOT=myverysafepasswd
 
-# MySQL
-# Tested with MySQL 5.5
-DBVERS=5.5
+# MariaDB
+DBVERS=latest
 
 # SOGo configuration
 SOGOCHILDS=20
@@ -42,7 +41,7 @@ REDISVERS="latest"
 # You need to rebuild all containers after changing values.
 # Remove old networks manually.
 DOCKER_NETWORK="mailcow-network"
-DOCKER_SUBNET="172.55.0.0/16"
+DOCKER_SUBNET="172.18.0.0/16"
 
 # ======= ADVANCED ======
 # - not yet implemented -

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott