From b5e5f8f9348c76c213cfc0583183601a90a24ee4 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Sun, 1 Jan 2017 19:49:02 +0100 Subject: [PATCH 01/14] Add volume --- data/Dockerfiles/sogo/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile index 2d043fdd..932dc751 100644 --- a/data/Dockerfiles/sogo/Dockerfile +++ b/data/Dockerfiles/sogo/Dockerfile @@ -38,6 +38,8 @@ COPY supervisord.conf /etc/supervisor/supervisord.conf EXPOSE 20000 EXPOSE 9191 +VOLUME /usr/lib/GNUstep/SOGo/WebServerResources/ + CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* From bb3ef747219f78f4b10c8a7aa94e61109af1db61 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Sun, 1 Jan 2017 21:23:10 +0100 Subject: [PATCH 02/14] Change service names to skip alias --- docker-compose.yml | 77 ++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 50 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b91c5516..2c74fc5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '2' services: - pdns-mailcow: + pdns: image: andryyy/mailcow-dockerized:pdns volumes: - ./data/conf/pdns/:/etc/powerdns/ @@ -9,13 +9,11 @@ services: networks: mailcow-network: ipv4_address: 172.22.1.254 - aliases: - - pdns - mysql-mailcow: + mysql: image: mariadb:10.1 depends_on: - - pdns-mailcow + - pdns command: mysqld volumes: - mysql-vol-1:/var/lib/mysql/ @@ -31,13 +29,11 @@ services: restart: always networks: mailcow-network: - aliases: - - mysql - redis-mailcow: + redis: image: redis depends_on: - - pdns-mailcow + - pdns volumes: - redis-vol-1:/data/ restart: always @@ -46,13 +42,11 @@ services: dns_search: mailcow-network networks: mailcow-network: - aliases: - - redis - rspamd-mailcow: + rspamd: image: andryyy/mailcow-dockerized:rspamd depends_on: - - pdns-mailcow + - pdns volumes: - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro @@ -64,13 +58,11 @@ services: dns_search: mailcow-network networks: mailcow-network: - aliases: - - rspamd - php-fpm-mailcow: + phpfpm: image: andryyy/mailcow-dockerized:phpfpm depends_on: - - pdns-mailcow + - pdns volumes: - ./data/web:/web:ro - ./data/conf/rspamd/dynmaps:/dynmaps:ro @@ -87,14 +79,12 @@ services: restart: always networks: mailcow-network: - aliases: - - phpfpm - sogo-mailcow: + sogo: image: andryyy/mailcow-dockerized:sogo depends_on: - - pdns-mailcow - - mysql-mailcow + - pdns + - mysql environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} @@ -105,17 +95,14 @@ services: dns_search: mailcow-network volumes: - ./data/conf/sogo/:/etc/sogo/ - - /usr/lib/GNUstep/SOGo/WebServerResources/ restart: always networks: mailcow-network: - aliases: - - sogo - rmilter-mailcow: + rmilter: image: andryyy/mailcow-dockerized:rmilter depends_on: - - pdns-mailcow + - pdns volumes: - ./data/conf/rmilter/:/etc/rmilter.conf.d/:ro restart: always @@ -124,19 +111,17 @@ services: dns_search: mailcow-network networks: mailcow-network: - aliases: - - rmilter - dovecot-mailcow: + dovecot: image: andryyy/mailcow-dockerized:dovecot depends_on: - - pdns-mailcow + - pdns volumes: - ./data/conf/dovecot:/etc/dovecot - ./data/assets/ssl:/etc/ssl/mail/:ro - vmail-vol-1:/var/vmail volumes_from: - - sogo-mailcow + - sogo environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} @@ -154,13 +139,11 @@ services: hostname: ${MAILCOW_HOSTNAME} networks: mailcow-network: - aliases: - - dovecot - postfix-mailcow: + postfix: image: andryyy/mailcow-dockerized:postfix depends_on: - - pdns-mailcow + - pdns volumes: - ./data/conf/postfix:/opt/postfix/conf - ./data/assets/ssl:/etc/ssl/mail/:ro @@ -179,31 +162,27 @@ services: dns_search: mailcow-network networks: mailcow-network: - aliases: - - postfix - memcached-mailcow: + memcached: image: memcached depends_on: - - pdns-mailcow + - pdns restart: always dns: - 172.22.1.254 dns_search: mailcow-network networks: mailcow-network: - aliases: - - memcached - nginx-mailcow: + nginx: depends_on: - - mysql-mailcow - - sogo-mailcow - - php-fpm-mailcow - - rspamd-mailcow + - mysql + - sogo + - phpfpm + - rspamd image: nginx:mainline volumes_from: - - sogo-mailcow + - sogo volumes: - ./data/web:/web:ro - ./data/conf/rspamd/dynmaps:/dynmaps:ro @@ -217,8 +196,6 @@ services: restart: always networks: mailcow-network: - aliases: - - nginx networks: mailcow-network: From c0b31ff2d4ef51a97e9c9d0c7d6419ad64a3064a Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Sun, 1 Jan 2017 21:23:35 +0100 Subject: [PATCH 03/14] Change ports in docker-compose file if needed --- generate_config.sh | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/generate_config.sh b/generate_config.sh index cb1a516e..92deccb5 100755 --- a/generate_config.sh +++ b/generate_config.sh @@ -29,7 +29,6 @@ MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} # ------------------------------ DBNAME=mailcow DBUSER=mailcow - # Please use long, random alphanumeric strings (A-Za-z0-9) DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) @@ -37,17 +36,5 @@ DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) # ------------------------------ # Misc configuration # ------------------------------ -# You should leave that alone -# Can also be 11.22.33.44:25 or 0.0.0.0:465 etc. for specific bindings -SMTP_PORT=25 -SMTPS_PORT=465 -SUBMISSION_PORT=587 -IMAP_PORT=143 -IMAPS_PORT=993 -POP_PORT=110 -POPS_PORT=995 -SIEVE_PORT=4190 - -# Your timezone TZ=${TZ} EOF From b53df6e08851a580a6f94edd1653382d5f1c6c1b Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Sun, 1 Jan 2017 21:26:51 +0100 Subject: [PATCH 04/14] Change ports in docker-compose file if needed --- docker-compose.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2c74fc5c..f54d9f4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -127,11 +127,11 @@ services: - DBUSER=${DBUSER} - DBPASS=${DBPASS} ports: - - "${IMAP_PORT}:143" - - "${IMAPS_PORT}:993" - - "${POP_PORT}:110" - - "${POPS_PORT}:995" - - "${SIEVE_PORT}:4190" + - "143:143" + - "993:993" + - "110:110" + - "995:995" + - "4190:4190" dns: - 172.22.1.254 dns_search: mailcow-network @@ -152,9 +152,9 @@ services: - DBUSER=${DBUSER} - DBPASS=${DBPASS} ports: - - "${SMTP_PORT}:25" - - "${SMTPS_PORT}:465" - - "${SUBMISSION_PORT}:587" + - "25:25" + - "465:465" + - "587:587" restart: always hostname: ${MAILCOW_HOSTNAME} dns: From 2c822accb8f5d602529979fb1f710b56144ab74b Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 10:33:06 +0100 Subject: [PATCH 05/14] Do not change service names --- docker-compose.yml | 93 +++++++++++++++++++++++++++++----------------- generate_config.sh | 13 +++++++ 2 files changed, 71 insertions(+), 35 deletions(-) mode change 100755 => 100644 generate_config.sh diff --git a/docker-compose.yml b/docker-compose.yml index f54d9f4a..b91c5516 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '2' services: - pdns: + pdns-mailcow: image: andryyy/mailcow-dockerized:pdns volumes: - ./data/conf/pdns/:/etc/powerdns/ @@ -9,11 +9,13 @@ services: networks: mailcow-network: ipv4_address: 172.22.1.254 + aliases: + - pdns - mysql: + mysql-mailcow: image: mariadb:10.1 depends_on: - - pdns + - pdns-mailcow command: mysqld volumes: - mysql-vol-1:/var/lib/mysql/ @@ -29,11 +31,13 @@ services: restart: always networks: mailcow-network: + aliases: + - mysql - redis: + redis-mailcow: image: redis depends_on: - - pdns + - pdns-mailcow volumes: - redis-vol-1:/data/ restart: always @@ -42,11 +46,13 @@ services: dns_search: mailcow-network networks: mailcow-network: + aliases: + - redis - rspamd: + rspamd-mailcow: image: andryyy/mailcow-dockerized:rspamd depends_on: - - pdns + - pdns-mailcow volumes: - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro @@ -58,11 +64,13 @@ services: dns_search: mailcow-network networks: mailcow-network: + aliases: + - rspamd - phpfpm: + php-fpm-mailcow: image: andryyy/mailcow-dockerized:phpfpm depends_on: - - pdns + - pdns-mailcow volumes: - ./data/web:/web:ro - ./data/conf/rspamd/dynmaps:/dynmaps:ro @@ -79,12 +87,14 @@ services: restart: always networks: mailcow-network: + aliases: + - phpfpm - sogo: + sogo-mailcow: image: andryyy/mailcow-dockerized:sogo depends_on: - - pdns - - mysql + - pdns-mailcow + - mysql-mailcow environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} @@ -95,14 +105,17 @@ services: dns_search: mailcow-network volumes: - ./data/conf/sogo/:/etc/sogo/ + - /usr/lib/GNUstep/SOGo/WebServerResources/ restart: always networks: mailcow-network: + aliases: + - sogo - rmilter: + rmilter-mailcow: image: andryyy/mailcow-dockerized:rmilter depends_on: - - pdns + - pdns-mailcow volumes: - ./data/conf/rmilter/:/etc/rmilter.conf.d/:ro restart: always @@ -111,27 +124,29 @@ services: dns_search: mailcow-network networks: mailcow-network: + aliases: + - rmilter - dovecot: + dovecot-mailcow: image: andryyy/mailcow-dockerized:dovecot depends_on: - - pdns + - pdns-mailcow volumes: - ./data/conf/dovecot:/etc/dovecot - ./data/assets/ssl:/etc/ssl/mail/:ro - vmail-vol-1:/var/vmail volumes_from: - - sogo + - sogo-mailcow environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} - DBPASS=${DBPASS} ports: - - "143:143" - - "993:993" - - "110:110" - - "995:995" - - "4190:4190" + - "${IMAP_PORT}:143" + - "${IMAPS_PORT}:993" + - "${POP_PORT}:110" + - "${POPS_PORT}:995" + - "${SIEVE_PORT}:4190" dns: - 172.22.1.254 dns_search: mailcow-network @@ -139,11 +154,13 @@ services: hostname: ${MAILCOW_HOSTNAME} networks: mailcow-network: + aliases: + - dovecot - postfix: + postfix-mailcow: image: andryyy/mailcow-dockerized:postfix depends_on: - - pdns + - pdns-mailcow volumes: - ./data/conf/postfix:/opt/postfix/conf - ./data/assets/ssl:/etc/ssl/mail/:ro @@ -152,9 +169,9 @@ services: - DBUSER=${DBUSER} - DBPASS=${DBPASS} ports: - - "25:25" - - "465:465" - - "587:587" + - "${SMTP_PORT}:25" + - "${SMTPS_PORT}:465" + - "${SUBMISSION_PORT}:587" restart: always hostname: ${MAILCOW_HOSTNAME} dns: @@ -162,27 +179,31 @@ services: dns_search: mailcow-network networks: mailcow-network: + aliases: + - postfix - memcached: + memcached-mailcow: image: memcached depends_on: - - pdns + - pdns-mailcow restart: always dns: - 172.22.1.254 dns_search: mailcow-network networks: mailcow-network: + aliases: + - memcached - nginx: + nginx-mailcow: depends_on: - - mysql - - sogo - - phpfpm - - rspamd + - mysql-mailcow + - sogo-mailcow + - php-fpm-mailcow + - rspamd-mailcow image: nginx:mainline volumes_from: - - sogo + - sogo-mailcow volumes: - ./data/web:/web:ro - ./data/conf/rspamd/dynmaps:/dynmaps:ro @@ -196,6 +217,8 @@ services: restart: always networks: mailcow-network: + aliases: + - nginx networks: mailcow-network: diff --git a/generate_config.sh b/generate_config.sh old mode 100755 new mode 100644 index 92deccb5..cb1a516e --- a/generate_config.sh +++ b/generate_config.sh @@ -29,6 +29,7 @@ MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} # ------------------------------ DBNAME=mailcow DBUSER=mailcow + # Please use long, random alphanumeric strings (A-Za-z0-9) DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) @@ -36,5 +37,17 @@ DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28) # ------------------------------ # Misc configuration # ------------------------------ +# You should leave that alone +# Can also be 11.22.33.44:25 or 0.0.0.0:465 etc. for specific bindings +SMTP_PORT=25 +SMTPS_PORT=465 +SUBMISSION_PORT=587 +IMAP_PORT=143 +IMAPS_PORT=993 +POP_PORT=110 +POPS_PORT=995 +SIEVE_PORT=4190 + +# Your timezone TZ=${TZ} EOF From 850398093097c6a94d8ed0e86e557fb4e7bf0a69 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 10:35:41 +0100 Subject: [PATCH 06/14] Revert vol change --- data/Dockerfiles/sogo/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile index 932dc751..2d043fdd 100644 --- a/data/Dockerfiles/sogo/Dockerfile +++ b/data/Dockerfiles/sogo/Dockerfile @@ -38,8 +38,6 @@ COPY supervisord.conf /etc/supervisor/supervisord.conf EXPOSE 20000 EXPOSE 9191 -VOLUME /usr/lib/GNUstep/SOGo/WebServerResources/ - CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* From 2aace3d5cc2a15380c9d182e76fb2195963c9087 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 10:36:12 +0100 Subject: [PATCH 07/14] Fix permission --- generate_config.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 generate_config.sh diff --git a/generate_config.sh b/generate_config.sh old mode 100644 new mode 100755 From 8e07d29f0a43e3c44b7341aa4906f9dd81350c4c Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 10:39:32 +0100 Subject: [PATCH 08/14] Some slight changes in permission checks for future updates --- data/web/inc/functions.inc.php | 35 +++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index ce1b374e..cfa3fdb4 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -8,11 +8,12 @@ function hasDomainAccess($username, $role, $domain) { if (!filter_var($username, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) { return false; } - if (!is_valid_domain_name($domain)) { return false; } - + if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') { + return false; + } try { $stmt = $pdo->prepare("SELECT `domain` FROM `domain_admins` WHERE ( @@ -2192,6 +2193,9 @@ function delete_domain_admin($postarray) { function get_spam_score($username) { global $pdo; $default = "5, 15"; + if ($_SESSION['mailcow_cc_role'] != "user") { + return false; + } if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { return $default; } @@ -2235,6 +2239,13 @@ function get_spam_score($username) { function set_spam_score($postarray) { global $lang; global $pdo; + if ($_SESSION['mailcow_cc_role'] != "user") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } $username = $_SESSION['mailcow_cc_username']; $lowspamlevel = explode(',', $postarray['score'])[0]; $highspamlevel = explode(',', $postarray['score'])[1]; @@ -2288,7 +2299,15 @@ function set_spam_score($postarray) { function set_policy_list($postarray) { global $lang; global $pdo; - + if ($_SESSION['mailcow_cc_role'] != "admin" && + $_SESSION['mailcow_cc_role'] != "domainadmin" && + $_SESSION['mailcow_cc_role'] != "user") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } (isset($postarray['domain'])) ? $object = $postarray['domain'] : $object = $_SESSION['mailcow_cc_username']; ($postarray['object_list'] == "bl") ? $object_list = "blacklist_from" : $object_list = "whitelist_from"; $object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($postarray['object_from']))), '.')); @@ -2389,6 +2408,13 @@ function set_policy_list($postarray) { function set_tls_policy($postarray) { global $lang; global $pdo; + if ($_SESSION['mailcow_cc_role'] != "user") { + $_SESSION['return'] = array( + 'type' => 'danger', + 'msg' => sprintf($lang['danger']['access_denied']) + ); + return false; + } isset($postarray['tls_in']) ? $tls_in = '1' : $tls_in = '0'; isset($postarray['tls_out']) ? $tls_out = '1' : $tls_out = '0'; $username = $_SESSION['mailcow_cc_username']; @@ -2422,6 +2448,9 @@ function set_tls_policy($postarray) { function get_tls_policy($username) { global $lang; global $pdo; + if ($_SESSION['mailcow_cc_role'] != "user") { + return false; + } if (!filter_var($username, FILTER_VALIDATE_EMAIL)) { $_SESSION['return'] = array( 'type' => 'danger', From 887f7db7a8f059924a2d0c6769773e1516ae1e40 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 11:46:11 +0100 Subject: [PATCH 09/14] Add language strings --- data/web/inc/footer.inc.php | 6 +++--- data/web/inc/header.inc.php | 2 +- data/web/lang/lang.de.php | 5 ++++- data/web/lang/lang.en.php | 6 ++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/data/web/inc/footer.inc.php b/data/web/inc/footer.inc.php index 052f03b2..b2976bec 100644 --- a/data/web/inc/footer.inc.php +++ b/data/web/inc/footer.inc.php @@ -6,12 +6,12 @@ if ($_SESSION['mailcow_cc_role'] == "admin"): <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> - <h4 class="modal-title">Restart SOGo</h4> + <h4 class="modal-title"><?=$lang['footer']['restart_sogo'];?></h4> </div> <div class="modal-body"> - <p>Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.</p> + <p><?=$lang['footer']['restart_sogo_info'];?></p> <hr /> - <button class="btn btn-md btn-primary" id="triggerRestartSogo">Restart SOGo</button> + <button class="btn btn-md btn-primary" id="triggerRestartSogo"><?=$lang['footer']['restart_now'];?></button> <br /><br /> <div id="statusTriggerRestartSogo"></div> </div> diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php index 2059f0e6..d72ec73f 100644 --- a/data/web/inc/header.inc.php +++ b/data/web/inc/header.inc.php @@ -226,7 +226,7 @@ endif; <?php if ($_SESSION['mailcow_cc_role'] == "admin"): ?> - <li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Restart SOGo</a></li> + <li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?=$lang['header']['restart_sogo'];?></a></li> <?php endif; ?> diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php index dc96774e..358f87e1 100644 --- a/data/web/lang/lang.de.php +++ b/data/web/lang/lang.de.php @@ -5,7 +5,10 @@ // */ $lang['footer']['loading'] = 'Einen Moment bitte...'; -$lang['getmail']['no_status'] = 'Keinen letzten Vorgang festgestellt.'; +$lang['header']['restart_sogo'] = 'SOGo neustarten'; +$lang['footer']['restart_sogo'] = 'SOGo neustarten'; +$lang['footer']['restart_now'] = 'Restart now'; +$lang['footer']['restart_sogo_info'] = 'Einige Änderungen an Domains benötigen einen Neustart SOGos. Hier können Sie SOGo neustarten.<br /><br /><b>Wichtig:</b> Ein korrekter Neustart SOGos kann eine Weile in Anspruch nehmen, bitte warten Sie, bis der Prozess vollständig beendet wurde.'; $lang['dkim']['confirm'] = 'Sind Sie sicher?'; $lang['danger']['dkim_not_found'] = 'DKIM-Record nicht gefunden'; $lang['danger']['dkim_remove_failed'] = 'Kann DKIM-Record nicht entfernen'; diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 4f227ede..90b8a6c2 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -5,8 +5,10 @@ // */ $lang['footer']['loading'] = "Please wait..."; -$lang['getmail']['no_status'] = "No previous status found."; -$lang['dkim']['confirm'] = "Are you sure?"; +$lang['header']['restart_sogo'] = 'Restart SOGo'; +$lang['footer']['restart_sogo'] = 'Restart SOGo'; +$lang['footer']['restart_now'] = 'Jetzt neustarten'; +$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?"; $lang['danger']['dkim_not_found'] = "DKIM record not found"; $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record"; $lang['danger']['dkim_add_failed'] = "Cannot add given DKIM record"; From ebfc45df9ff7954f58657e6542bf89be6aa156d9 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 11:47:09 +0100 Subject: [PATCH 10/14] Set huge timeout in PHP for SOGo childs to stop --- data/conf/nginx/site.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/conf/nginx/site.conf b/data/conf/nginx/site.conf index 43570d0c..ffc3f607 100644 --- a/data/conf/nginx/site.conf +++ b/data/conf/nginx/site.conf @@ -27,6 +27,10 @@ server { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PHP_VALUE "max_execution_time = 1200 + max_input_time = 1200 + memory_limit = 64M"; + fastcgi_read_timeout 1200; } rewrite ^(/save.+)$ /rspamd$1 last; From caa6890cae014f7e13c9f317a7efb392360bed08 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Tue, 3 Jan 2017 11:50:08 +0100 Subject: [PATCH 11/14] Add lang strings --- data/web/lang/lang.de.php | 2 +- data/web/lang/lang.en.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php index 358f87e1..09b79c9b 100644 --- a/data/web/lang/lang.de.php +++ b/data/web/lang/lang.de.php @@ -7,7 +7,7 @@ $lang['footer']['loading'] = 'Einen Moment bitte...'; $lang['header']['restart_sogo'] = 'SOGo neustarten'; $lang['footer']['restart_sogo'] = 'SOGo neustarten'; -$lang['footer']['restart_now'] = 'Restart now'; +$lang['footer']['restart_now'] = 'Jetzt neustarten'; $lang['footer']['restart_sogo_info'] = 'Einige Änderungen an Domains benötigen einen Neustart SOGos. Hier können Sie SOGo neustarten.<br /><br /><b>Wichtig:</b> Ein korrekter Neustart SOGos kann eine Weile in Anspruch nehmen, bitte warten Sie, bis der Prozess vollständig beendet wurde.'; $lang['dkim']['confirm'] = 'Sind Sie sicher?'; $lang['danger']['dkim_not_found'] = 'DKIM-Record nicht gefunden'; diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 90b8a6c2..0a603393 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -7,7 +7,7 @@ $lang['footer']['loading'] = "Please wait..."; $lang['header']['restart_sogo'] = 'Restart SOGo'; $lang['footer']['restart_sogo'] = 'Restart SOGo'; -$lang['footer']['restart_now'] = 'Jetzt neustarten'; +$lang['footer']['restart_now'] = 'Restart now'; $lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?"; $lang['danger']['dkim_not_found'] = "DKIM record not found"; $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record"; From 7384f83932e763571aa08d76a6dcd9b1b20f8694 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Thu, 5 Jan 2017 20:33:37 +0100 Subject: [PATCH 12/14] Add rspamd volume --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index b91c5516..3888762c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,6 +58,7 @@ services: - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro - ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro - dkim-vol-1:/data/dkim + - rspamd-vol-1:/var/lib/rspamd restart: always dns: - 172.22.1.254 @@ -234,3 +235,4 @@ volumes: mysql-vol-1: dkim-vol-1: redis-vol-1: + rspamd-vol-1: From 75139e51cc0fc19de8ff17bcdc6227742479bed8 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Thu, 5 Jan 2017 20:35:46 +0100 Subject: [PATCH 13/14] Use a single view for all domains - easier but will cause more load with large setups, use procs here instead --- data/Dockerfiles/sogo/reconf-domains.sh | 61 +++++++++++++------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/data/Dockerfiles/sogo/reconf-domains.sh b/data/Dockerfiles/sogo/reconf-domains.sh index 78482859..8cc24052 100755 --- a/data/Dockerfiles/sogo/reconf-domains.sh +++ b/data/Dockerfiles/sogo/reconf-domains.sh @@ -1,17 +1,27 @@ #!/bin/bash -# Go in a 5 minute loop -while true; do +# Recreate view - # Wait for MySQL to warm-up - while ! mysqladmin ping --host mysql --silent; do - sleep 1 - done +mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view" - mkdir -p /var/lib/sogo/GNUstep/Defaults/ +mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF +CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, senderacl, home) AS +SELECT mailbox.username, mailbox.domain, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(ga.aliases, ''), IFNULL(gda.ad_alias, ''), IFNULL(gs.send_as, ''), CONCAT('/var/vmail/', maildir) FROM mailbox +LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username = mailbox.username +LEFT OUTER JOIN grouped_sender_acl gs ON gs.username = mailbox.username +LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username +WHERE mailbox.active = '1'; +EOF - # Generate plist header with timezone data - cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist +# Wait for MySQL to warm-up +while ! mysqladmin ping --host mysql --silent; do + sleep 1 +done + +mkdir -p /var/lib/sogo/GNUstep/Defaults/ + +# Generate plist header with timezone data +cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//GNUstep//DTD plist 0.9//EN" "http://www.gnustep.org/plist-0_9.xml"> <plist version="0.9"> @@ -22,6 +32,8 @@ while true; do <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_cache_folder</string> <key>OCSEMailAlarmsFolderURL</key> <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_alarms_folder</string> + <key>DomainFieldName</key> + <string>domain</string> <key>OCSFolderInfoURL</key> <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_folder_info</string> <key>OCSSessionsFolderURL</key> @@ -36,14 +48,14 @@ while true; do <dict> EOF - # Generate multi-domain setup - while read line +# Generate multi-domain setup +while read line do DOMAIN_SANE=$(echo ${line} | tr '-' 'b' | tr '.' 'p' | tr -cd '[[:alnum:]]') echo " <key>${line}</key> <dict> <key>SOGoMailDomain</key> - <string>$(echo ${line} | tr '-' 'b' | tr '.' 'p')</string> + <string>${DOMAIN_SANE}</string> <key>SOGoUserSources</key> <array> <dict> @@ -72,30 +84,19 @@ EOF <key>userPasswordAlgorithm</key> <string>ssha256</string> <key>viewURL</key> - <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view_${DOMAIN_SANE}</string> + <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view</string> </dict> </array> </dict>" >> /var/lib/sogo/GNUstep/Defaults/sogod.plist - mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view_${DOMAIN_SANE}" - mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF -CREATE VIEW sogo_view_${DOMAIN_SANE} (c_uid, c_name, c_password, c_cn, mail, aliases, ad_aliases, senderacl, home) AS -SELECT mailbox.username, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(ga.aliases, ''), IFNULL(gda.ad_alias, ''), IFNULL(gs.send_as, ''), CONCAT('/var/vmail/', maildir) FROM mailbox -LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username = mailbox.username -LEFT OUTER JOIN grouped_sender_acl gs ON gs.username = mailbox.username -LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username -WHERE mailbox.active = '1' AND domain = '${line}'; -EOF done < <(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain;" -B -N) - # Generate footer - echo ' </dict> +# Generate footer +echo ' </dict> </dict> </plist>' >> /var/lib/sogo/GNUstep/Defaults/sogod.plist - # Fix permissions - chown sogo:sogo -R /var/lib/sogo/ - chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist +# Fix permissions +chown sogo:sogo -R /var/lib/sogo/ +chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist - sleep 300 - -done +sleep infinite From 77c81f95daa777be211ab469afc75bd52cd1bcae Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Thu, 5 Jan 2017 21:12:59 +0100 Subject: [PATCH 14/14] Move line --- data/web/lang/lang.en.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 0a603393..ce9906d5 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -8,7 +8,8 @@ $lang['footer']['loading'] = "Please wait..."; $lang['header']['restart_sogo'] = 'Restart SOGo'; $lang['footer']['restart_sogo'] = 'Restart SOGo'; $lang['footer']['restart_now'] = 'Restart now'; -$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?"; +$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to complete, please wait for it to finish.'; +$lang['dkim']['confirm'] = "Are you sure?"; $lang['danger']['dkim_not_found'] = "DKIM record not found"; $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record"; $lang['danger']['dkim_add_failed'] = "Cannot add given DKIM record";