From 85b243a15be2cff6fb30f95cfd6fcd842ca38024 Mon Sep 17 00:00:00 2001 From: andryyy Date: Tue, 20 Dec 2016 15:24:33 +0100 Subject: [PATCH] SOGo multi-domain setup --- data/Dockerfiles/sogo/Dockerfile | 2 +- data/Dockerfiles/sogo/docker-entrypoint.sh | 97 +++++++++++++++++++--- data/Dockerfiles/sogo/supervisord.conf | 4 + data/conf/sogo/sogo.conf | 9 ++ data/web/inc/functions.inc.php | 6 ++ data/web/inc/init.sql | 9 -- 6 files changed, 107 insertions(+), 20 deletions(-) diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile index d81447f0..f9f55552 100644 --- a/data/Dockerfiles/sogo/Dockerfile +++ b/data/Dockerfiles/sogo/Dockerfile @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND noninteractive ENV GOSU_VERSION 1.9 RUN set -x \ - && apt-get update && apt-get install -y --no-install-recommends apt-transport-https ca-certificates wget rsyslog supervisor && rm -rf /var/lib/apt/lists/* \ + && apt-get update && apt-get install -y --no-install-recommends apt-transport-https ca-certificates wget rsyslog supervisor mysql-client && rm -rf /var/lib/apt/lists/* \ && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \ diff --git a/data/Dockerfiles/sogo/docker-entrypoint.sh b/data/Dockerfiles/sogo/docker-entrypoint.sh index 2992b999..e639c4f5 100755 --- a/data/Dockerfiles/sogo/docker-entrypoint.sh +++ b/data/Dockerfiles/sogo/docker-entrypoint.sh @@ -1,16 +1,93 @@ #!/bin/bash set -e -AS_SOGO="gosu sogo" +mkdir -p /var/lib/sogo/GNUstep/Defaults/ -${AS_SOGO} defaults write sogod SOGoUserSources "({type = sql;id = directory;viewURL = mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view;canAuthenticate = YES;isAddressBook = YES;displayName = \"GAL\";MailFieldNames = (aliases, ad_aliases, senderacl);userPasswordAlgorithm = ssha256;})" -${AS_SOGO} defaults write sogod SOGoProfileURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_user_profile" -${AS_SOGO} defaults write sogod OCSFolderInfoURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_folder_info" -${AS_SOGO} defaults write sogod OCSEMailAlarmsFolderURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_alarms_folder" -${AS_SOGO} defaults write sogod OCSSessionsFolderURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_sessions_folder" -${AS_SOGO} defaults write sogod OCSCacheFolderURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_cache_folder" -${AS_SOGO} defaults write sogod OCSStoreURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_store" -${AS_SOGO} defaults write sogod OCSAclURL "mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_acl" -${AS_SOGO} defaults write sogod SOGoTimeZone "${TZ}" +# Generate plist header with timezone data +cat < /var/lib/sogo/GNUstep/Defaults/sogod.plist + + + + + OCSAclURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_acl + OCSCacheFolderURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_cache_folder + OCSEMailAlarmsFolderURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_alarms_folder + OCSFolderInfoURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_folder_info + OCSSessionsFolderURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_sessions_folder + OCSStoreURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_store + SOGoProfileURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_user_profile + SOGoTimeZone + ${TZ} + domains + +EOF + +# Generate multi-domain setup +while read line +do +DOMAIN_SANE=$(echo ${line} | tr '-' 'b' | tr '.' 'p' | tr -cd '[[:alnum:]]') +echo " ${line} + + SOGoMailDomain + $(echo ${line} | tr '-' 'b' | tr '.' 'p') + SOGoUserSources + + + MailFieldNames + + aliases + ad_aliases + senderacl + + KindFieldName + kind + MultipleBookingsFieldName + multiple_bookings + IMAPLoginFieldName + c_uid + canAuthenticate + YES + displayName + GAL + id + ${line} + isAddressBook + YES + type + sql + userPasswordAlgorithm + ssha256 + viewURL + mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view_${DOMAIN_SANE} + + + " >> /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 ' + +' >> /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 exec "$@" diff --git a/data/Dockerfiles/sogo/supervisord.conf b/data/Dockerfiles/sogo/supervisord.conf index 16a8115b..fcb30328 100644 --- a/data/Dockerfiles/sogo/supervisord.conf +++ b/data/Dockerfiles/sogo/supervisord.conf @@ -21,3 +21,7 @@ stdout_logfile_maxbytes=0 command=/sogo-cron.sh user=sogo autorestart=true + +#[unix_http_server] +#file=/var/run/controller/supervisord.sock +#chown=www-data:nogroup diff --git a/data/conf/sogo/sogo.conf b/data/conf/sogo/sogo.conf index f6cd1506..9a5bd29a 100644 --- a/data/conf/sogo/sogo.conf +++ b/data/conf/sogo/sogo.conf @@ -15,6 +15,15 @@ SOGoFoldersSendEMailNotifications = YES; SOGoForwardEnabled = YES; + // Multi-domain setup + // Domains are isolated, you can define visibility options here. + // Example: + + // SOGoDomainsVisibility = ( + // (domain1.tld, domain5.tld), + // (domain3.tld, domain2.tld) + // ); + SOGoIMAPServer = "imap://dovecot:143/?tls=YES"; SOGoSieveServer = "sieve://dovecot:4190/?tls=YES"; SOGoSMTPServer = "postfix:588"; diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index fd14f550..e300eb44 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -328,6 +328,12 @@ function mailbox_add_domain($postarray) { ':modified' => date('Y-m-d H:i:s'), ':relay_all_recipients' => $relay_all_recipients )); + /* + PoC for a restart with supervisord unix socket + * $sock = stream_socket_client("unix:///var/run/controller/supervisord.sock", $errno, $errstr, 30); + * fwrite($sock, "GET ?processname=sogo&action=restart HTTP/1.0\r\nAccept: */*\r\n\r\n"); + * fclose($sock); + */ $_SESSION['return'] = array( 'type' => 'success', 'msg' => sprintf($lang['success']['domain_added'], htmlspecialchars($domain)) diff --git a/data/web/inc/init.sql b/data/web/inc/init.sql index 2332c13d..4335ff20 100644 --- a/data/web/inc/init.sql +++ b/data/web/inc/init.sql @@ -102,7 +102,6 @@ CREATE TABLE IF NOT EXISTS `filterconf` ( DROP VIEW IF EXISTS grouped_mail_aliases; DROP VIEW IF EXISTS grouped_sender_acl; DROP VIEW IF EXISTS grouped_domain_alias_address; -DROP VIEW IF EXISTS sogo_view; CREATE VIEW grouped_mail_aliases (username, aliases) AS SELECT goto, IFNULL(GROUP_CONCAT(address SEPARATOR ' '), '') AS address FROM alias @@ -120,14 +119,6 @@ CREATE VIEW grouped_domain_alias_address (username, ad_alias) AS SELECT username, IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ' '), '') AS ad_alias FROM mailbox LEFT OUTER JOIN alias_domain on target_domain=domain GROUP BY username; -CREATE VIEW sogo_view (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'; - CREATE TABLE IF NOT EXISTS sogo_acl ( c_folder_id integer NOT NULL, c_object character varying(255) NOT NULL,