Advertisement
coderboy

Untitled

Oct 26th, 2019
870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.73 KB | None | 0 0
  1. # Postfix automatic configuration tool
  2.  
  3. REPOURL="https://raw.githubusercontent.com/coderboy14/digitalocean-email-docker/master/"
  4. LETSENCRYPT_ROOT="/etc/letsencrypt/archive/${FDQN}/"
  5. CERTIFICATE='/etc/ssl/certs/dovecot.pem'
  6. CERTIFICATE_KEY='/etc/ssl/private/dovecot.pem'
  7.  
  8. runSQL() {
  9. mysql --host "${DB_HOST}" --user "${DB_USER}" --password "${DB_PASSWORD}" \
  10. -e "${1}"
  11. }
  12.  
  13. fetchFile() {
  14. # ARG1: File Name
  15. # ARG2: File Output
  16. curl -s "${REPOURL}/${1}.gz" > $2
  17. }
  18.  
  19. main() {
  20. echo "Launching!"
  21. echo "Connecting to MySQL Server ${DB_USER}@${DB_HOST} with password '${DB_PASSWORD}'!"
  22.  
  23. if [ -f "${CERTIFICATE_KEY}" ]; then
  24. if ["${USE_SELF_SIGNED}"=="yes"]; then
  25. echo "[SSL] Generating self signed key..."
  26. openssl req -x509 -newkey rsa:4096 -keyout ${CERTIFICATE_KEY} -out ${CERTIFICATE} -days 365 -nodes
  27. echo "[SSL] Self signed key generated!"
  28. fi
  29. if ["${USE_LETSENCRYPT}"=="yes"]; then
  30. echo "[SSL] Starting LETSENCRYPT"
  31. /usr/local/bin/certbot-auto certonly --standalone -d ${FQDN}
  32. cp ${LETSENCRYPT_ROOT}/fullchain.pem ${CERTIFICATE}
  33. echo "[SSL][LETSENCRYPT] Transfering CERTIFICATE"
  34. cp ${LETSENCRYPT_ROOT}/privkey.pem ${CERTIFICATE_KEY}
  35. echo "[SSL][LETSENCRYPT] Transfering KEY"
  36. echo "[SSL] Key generated!"
  37. fi
  38. fi
  39.  
  40. # If the main.cf doesn't exist, it must need configuring!
  41. if [ -f "/etc/postfix/main.cf" ]; then
  42. echo "[Postfix] Fetching files..."
  43.  
  44. fetchFile "files/postfix/dynamicmaps.cf" "/etc/postfix/dynamicmaps.cf"
  45. fetchFile "files/postfix/makedefs.out" "/etc/postfix/makedefs.out"
  46. fetchFile "files/postfix/master.cf" "/etc/postfix/master.cf"
  47. fetchFile "files/postfix/post-install" "/etc/postfix/post-install"
  48. fetchFile "files/postfix/postfix-files" "/etc/postfix/postfix-files"
  49. fetchFile "files/postfix/postfix-script" "/etc/postfix/postfix-script"
  50. mkdir -pv /etc/postfix/{dynamicmaps.cf.d,postfix-files.d,sasl}
  51. echo "[Postfix] Fetched files!"
  52.  
  53. echo "[Postfix] Configuring postfix files..."
  54. echo "[Postfix] Configuring '/etc/postfix/main.cf'..."
  55. echo "" > /etc/postfix/main.cf # clear the file (just in case)
  56. echo 'smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)' >> /etc/postfix/main.cf
  57. echo 'biff = no' >> /etc/postfix/main.cf
  58. echo 'append_dot_mydomain = no' >> /etc/postfix/main.cf
  59. echo 'readme_directory = no' >> /etc/postfix/main.cf
  60. echo 'compatibility_level = 2' >> /etc/postfix/main.cf
  61. echo 'smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination' >> /etc/postfix/main.cf
  62. echo "myhostname = ${HOSTNAME}" >> /etc/postfix/main.cf
  63. echo 'alias_maps = hash:/etc/aliases' >> /etc/postfix/main.cf
  64. echo 'alias_database = hash:/etc/aliases' >> /etc/postfix/main.cf
  65. echo 'myorigin = /etc/mailname' >> /etc/postfix/main.cf
  66. echo 'mydestination = localhost ' >> /etc/postfix/main.cf
  67. echo 'relayhost = ' >> /etc/postfix/main.cf
  68. echo 'mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128' >> /etc/postfix/main.cf
  69. echo 'mailbox_size_limit = 0' >> /etc/postfix/main.cf
  70. echo 'recipient_delimiter = +' >> /etc/postfix/main.cf
  71. echo 'inet_interfaces = all' >> /etc/postfix/main.cf
  72. echo 'inet_protocols = all' >> /etc/postfix/main.cf
  73. echo 'smtpd_sasl_type = dovecot' >> /etc/postfix/main.cf
  74. echo 'smtpd_sasl_path = private/auth' >> /etc/postfix/main.cf
  75. echo 'smtpd_sasl_auth_enable = yes' >> /etc/postfix/main.cf
  76. echo 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination' >> /etc/postfix/main.cf
  77. echo 'virtual_transport = lmtp:unix:private/dovecot-lmtp' >> /etc/postfix/main.cf
  78. echo 'virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf' >> /etc/postfix/main.cf
  79. echo 'virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf' >> /etc/postfix/main.cf
  80. echo 'virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf' >> /etc/postfix/main.cf
  81. echo "[Postfix] Configuring SSL..."
  82. if [-f "/etc/ssl"]; then mkdir -pv /etc/ssl; fi
  83. echo "smtpd_tls_cert_file=${CERTIFICATE}" >> /etc/postfix/main.cf
  84. echo "smtpd_tls_key_file=${CERTIFICATE_KEY}" >> /etc/postfix/main.cf
  85. echo 'smtpd_use_tls=yes' >> /etc/postfix/main.cf
  86. echo 'smtpd_tls_auth_only = yes' >> /etc/postfix/main.cf
  87. echo "[Postfix] SSL configured! Place certificate at '${CERTIFICATE}', and place key at '${CERTIFICATE_KEY}'"
  88. touch /etc/postfix/mysql-virtual-mailbox-domains.cf
  89. echo "
  90. user = ${DB_MAIL_USERNAME}
  91. password = ${DB_MAIL_PASSWORD}
  92. hosts = ${DB_HOST}
  93. dbname = ${DB_NAME}
  94. query = SELECT 1 FROM virtual_domains WHERE name='%s'
  95. " > /etc/postfix/mysql-virtual-mailbox-domains.cf
  96. echo "
  97. user = ${DB_MAIL_USERNAME}
  98. password = ${DB_MAIL_PASSWORD}
  99. hosts = ${DB_HOST}
  100. dbname = ${DB_NAME}
  101. query = SELECT 1 FROM virtual_users WHERE email='%s'
  102. " > /etc/postfix/mysql-virtual-mailbox-maps.cf
  103. echo "
  104. user = ${DB_MAIL_USERNAME}
  105. password = ${DB_MAIL_PASSWORD}
  106. hosts = ${DB_HOST}
  107. dbname = ${DB_NAME}
  108. query = SELECT destination FROM virtual_aliases WHERE source='%s'
  109. " > /etc/postfix/mysql-virtual-alias-maps.cf
  110. fi
  111.  
  112. if [ "$(runSQL 'SHOW DATABASES' | grep ${DB_NAME})" == $DB_NAME ]; then
  113. echo "[MySQL] Configuring SQL..."
  114. echo "[MySQL] Creating database..."
  115. sh -c "mysqladmin -p create ${DB_NAME}"
  116. echo "[MySQL] Creating user and granting permissions..."
  117. runSQL "GRANT SELECT ON ${DB_NAME}.* TO '${DB_MAIL_USERNAME}'@'127.0.0.1' IDENTIFIED BY '${DB_MAIL_PASSWORD}';"
  118. runSQL "FLUSH PRIVILEGES;"
  119. echo "[MySQL] Creating table ${DB_NAME}.virtual_domains"
  120. runSQL "CREATE TABLE `${DB_NAME}`.`virtual_domains` (
  121. `id` INT NOT NULL AUTO_INCREMENT,
  122. `name` VARCHAR(50) NOT NULL,
  123. PRIMARY KEY (`id`)
  124. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  125. echo "[MySQL] Creating table ${DB_NAME}.virtual_users"
  126. runSQL "CREATE TABLE `${DB_NAME}`.`virtual_users` (
  127. `id` INT NOT NULL AUTO_INCREMENT,
  128. `domain_id` INT NOT NULL,
  129. `password` VARCHAR(106) NOT NULL,
  130. `email` VARCHAR(120) NOT NULL,
  131. PRIMARY KEY (`id`),
  132. UNIQUE KEY `email` (`email`),
  133. FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  134. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  135. echo "[MySQL] Creating table ${DB_NAME}.virtual_aliases"
  136. runSQL "CREATE TABLE `${DB_NAME}`.`virtual_aliases` (
  137. `id` INT NOT NULL AUTO_INCREMENT,
  138. `domain_id` INT NOT NULL,
  139. `source` varchar(100) NOT NULL,
  140. `destination` varchar(100) NOT NULL,
  141. PRIMARY KEY (`id`),
  142. FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  143. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  144. echo "[MySQL] Adding domain ${DOMAIN} to domain list"
  145. runSQL "INSERT INTO `${DB_NAME}`.`virtual_domains` (`id` ,`name`) VALUES ('1', '${DOMAIN}')"
  146. POSTMASTER_ADDR="postmaster@${DOMAIN}"
  147. POSTMASTER_PASSWORD="$(sh -c 'head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13')"
  148. echo "[MySQL] Generating email '${POSTMASTER_ADDR}'..."
  149. runSQL "INSERT INTO `servermail`.`virtual_users` (`domain_id`, `password` , `email`)
  150. VALUES (
  151. ('1', ENCRYPT('${POSTMASTER_PASSWORD}', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '${POSTMASTER_ADDR}')
  152. );"
  153. echo "[MySQL] The password for '${POSTMASTER_ADDR}' is \"${POSTMASTER_PASSWORD}\" It's recomended you change this soon!"
  154. fi
  155.  
  156. if [ -f "/etc/dovecot/dovecot.conf" ]; then
  157. echo "[Dovecot] Configuring Dovecot..."
  158.  
  159. echo "[Dovecot] Downloading files"
  160.  
  161. fetchFile "files/dovecot/dovecot.conf" "/etc/dovecot/dovecot.conf"
  162.  
  163. mkdir "/etc/dovecot/conf.d"
  164.  
  165. fetchFile "files/dovecot/conf.d/10-auth.conf" "/etc/dovecot/conf.d/10-auth.conf"
  166. fetchFile "files/dovecot/conf.d/10-director.conf" "/etc/dovecot/conf.d/10-director.conf"
  167. fetchFile "files/dovecot/conf.d/10-logging.conf" "/etc/dovecot/conf.d/10-logging.conf"
  168. fetchFile "files/dovecot/conf.d/10-mail.conf" "/etc/dovecot/conf.d/10-mail.conf"
  169. fetchFile "files/dovecot/conf.d/10-master.conf" "/etc/dovecot/conf.d/10-master.conf"
  170. fetchFile "files/dovecot/conf.d/10-ssl.conf" "/etc/dovecot/conf.d/10-ssl.conf"
  171. fetchFile "files/dovecot/conf.d/10-tcpwrapper.conf" "/etc/dovecot/conf.d/10-tcpwrapper.conf"
  172. fetchFile "files/dovecot/conf.d/15-lda.conf" "/etc/dovecot/conf.d/15-lda.conf"
  173. fetchFile "files/dovecot/conf.d/15-mailboxes.conf" "/etc/dovecot/conf.d/15-mailboxes.conf"
  174. fetchFile "files/dovecot/conf.d/20-imap.conf" "/etc/dovecot/conf.d/20-imap.conf"
  175. fetchFile "files/dovecot/conf.d/20-lmtp.conf" "/etc/dovecot/conf.d/20-lmtp.conf"
  176. fetchFile "files/dovecot/conf.d/90-acl.conf" "/etc/dovecot/conf.d/90-acl.conf"
  177. fetchFile "files/dovecot/conf.d/90-plugin.conf" "/etc/dovecot/conf.d/90-plugin.conf"
  178. fetchFile "files/dovecot/conf.d/90-quota.conf" "/etc/dovecot/conf.d/90-quota.conf"
  179. fetchFile "files/dovecot/conf.d/auth-checkpassword.conf.ext" "/etc/dovecot/conf.d/auth-checkpassword.conf.ext"
  180. fetchFile "files/dovecot/conf.d/auth-deny.conf.ext" "/etc/dovecot/conf.d/auth-deny.conf.ext"
  181. fetchFile "files/dovecot/conf.d/auth-dict.conf.ext" "/etc/dovecot/conf.d/auth-dict.conf.ext"
  182. fetchFile "files/dovecot/conf.d/auth-master.conf.ext" "/etc/dovecot/conf.d/auth-master.conf.ext"
  183. fetchFile "files/dovecot/conf.d/auth-passwdfile.conf.ext" "/etc/dovecot/conf.d/auth-passwdfile.conf.ext"
  184. fetchFile "files/dovecot/conf.d/auth-sql.conf.ext" "/etc/dovecot/conf.d/auth-sql.conf.ext"
  185. fetchFile "files/dovecot/conf.d/auth-static.conf.ext" "/etc/dovecot/conf.d/auth-static.conf.ext"
  186. fetchFile "files/dovecot/conf.d/auth-system.conf.ext" "/etc/dovecot/conf.d/auth-system.conf.ext"
  187. fetchFile "files/dovecot/conf.d/auth-vpopmail.conf.ext" "/etc/dovecot/conf.d/auth-vpopmail.conf.ext"
  188.  
  189. mkdir -p /etc/dovecot/private
  190.  
  191. sh -c "mkdir -p /var/mail/vhosts/${DOMAIN}"
  192.  
  193. USERNOTEXISTS=$(id -u vmail > /dev/null 2>&1; echo $?)
  194. if [$USERNOTEXISTS == 1]; then
  195. echo "Creating system user 'vmail' with group 'vmail'..."
  196. groupadd -g 5000 vmail
  197. useradd -g vmail -u 5000 vmail -d /var/mail
  198. fi
  199.  
  200. chown -R vmail:vmail /var/mail
  201.  
  202. if [ -f "/etc/dovecot/dovecot-sql.conf.ext" ]; then
  203. echo "driver = mysql" > /etc/dovecot/dovecot-sql.conf.ext
  204. echo "connect = host=${DB_HOST} dbname=${DB_NAME} user=${DB_MAIL_USERNAME} password=${DB_MAIL_PASSWORD}" >> /etc/dovecot/dovecot-sql.conf.ext
  205. echo "default_pass_scheme = SHA512-CRYPT" >> /etc/dovecot/dovecot-sql.conf.ext
  206. echo "password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';" >> /etc/dovecot/dovecot-sql.conf.ext
  207. fi
  208.  
  209. if [ -f "/etc/dovecot/conf.d/10-ssl.conf" ]; then
  210. echo "ssl = required" > /etc/dovecot/conf.d/10-ssl.conf
  211. echo "ssl_cert = <${CERTIFICATE}" >> /etc/dovecot/conf.d/10-ssl.conf
  212. echo "ssl_key = <${CERTIFICATE_KEY}" >> /etc/dovecot/conf.d/10-ssl.conf
  213. echo "ssl_client_ca_dir = /etc/ssl/certs" >> /etc/dovecot/conf.d/10-ssl.conf
  214. fi
  215.  
  216. chown -R vmail:dovecot /etc/dovecot
  217. chmod -R o-rwx /etc/dovecot
  218. fi
  219.  
  220. #echo "" >> /etc/dovecot/
  221. #echo "" >> /etc/dovecot/
  222. #echo "" >> /etc/dovecot/
  223. #echo "" >> /etc/dovecot/
  224. #echo "" >> /etc/dovecot/
  225.  
  226. echo "[AUTOCONFIG] Configuration finished. Will now restart POSTFIX and DOVECOT. This may cause your Docker Container to stop.
  227. If you have volumes enabled properly, the system will not reconfigure upon next startup."
  228.  
  229. service postfix restart
  230. service dovecot restart
  231. }
  232.  
  233. echo "Launching..."
  234. echo "[PRE] Server Connection to MySQL Server ${DB_USER}@${DB_HOST} with password '${DB_PASSWORD}'!"
  235. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement