generate_config.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. #!/usr/bin/env bash
  2. set -o pipefail
  3. if [[ "$(uname -r)" =~ ^4\.15\.0-60 ]]; then
  4. echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!";
  5. echo "Please update to 5.x or use another distribution."
  6. exit 1
  7. fi
  8. if [[ "$(uname -r)" =~ ^4\.4\. ]]; then
  9. if grep -q Ubuntu <<< $(uname -a); then
  10. echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!";
  11. echo "Please update to linux-generic-hwe-16.04 by running \"apt-get install --install-recommends linux-generic-hwe-16.04\""
  12. fi
  13. exit 1
  14. fi
  15. if grep --help 2>&1 | grep -q -i "busybox"; then
  16. echo "BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""
  17. exit 1
  18. fi
  19. if cp --help 2>&1 | grep -q -i "busybox"; then
  20. echo "BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""
  21. exit 1
  22. fi
  23. for bin in openssl curl docker-compose docker git awk sha1sum; do
  24. if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
  25. done
  26. if [ -f mailcow.conf ]; then
  27. read -r -p "A config file exists and will be overwritten, are you sure you want to contine? [y/N] " response
  28. case $response in
  29. [yY][eE][sS]|[yY])
  30. mv mailcow.conf mailcow.conf_backup
  31. chmod 600 mailcow.conf_backup
  32. ;;
  33. *)
  34. exit 1
  35. ;;
  36. esac
  37. fi
  38. echo "Press enter to confirm the detected value '[value]' where applicable or enter a custom value."
  39. while [ -z "${MAILCOW_HOSTNAME}" ]; do
  40. read -p "Mail server hostname (FQDN) - this is not your mail domain, but your mail servers hostname: " -e MAILCOW_HOSTNAME
  41. DOTS=${MAILCOW_HOSTNAME//[^.]};
  42. if [ ${#DOTS} -lt 2 ] && [ ! -z ${MAILCOW_HOSTNAME} ]; then
  43. echo "${MAILCOW_HOSTNAME} is not a FQDN"
  44. MAILCOW_HOSTNAME=
  45. fi
  46. done
  47. if [ -a /etc/timezone ]; then
  48. DETECTED_TZ=$(cat /etc/timezone)
  49. elif [ -a /etc/localtime ]; then
  50. DETECTED_TZ=$(readlink /etc/localtime|sed -n 's|^.*zoneinfo/||p')
  51. fi
  52. while [ -z "${MAILCOW_TZ}" ]; do
  53. if [ -z "${DETECTED_TZ}" ]; then
  54. read -p "Timezone: " -e MAILCOW_TZ
  55. else
  56. read -p "Timezone [${DETECTED_TZ}]: " -e MAILCOW_TZ
  57. [ -z "${MAILCOW_TZ}" ] && MAILCOW_TZ=${DETECTED_TZ}
  58. fi
  59. done
  60. MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
  61. if [ ${MEM_TOTAL} -le "2621440" ]; then
  62. echo "Installed memory is <= 2.5 GiB. It is recommended to disable ClamAV to prevent out-of-memory situations."
  63. echo "ClamAV can be re-enabled by setting SKIP_CLAMD=n in mailcow.conf."
  64. read -r -p "Do you want to disable ClamAV now? [Y/n] " response
  65. case $response in
  66. [nN][oO]|[nN])
  67. SKIP_CLAMD=n
  68. ;;
  69. *)
  70. SKIP_CLAMD=y
  71. ;;
  72. esac
  73. else
  74. SKIP_CLAMD=n
  75. fi
  76. if [ ${MEM_TOTAL} -le "2097152" ]; then
  77. echo "Disabling Solr on low-memory system."
  78. SKIP_SOLR=y
  79. elif [ ${MEM_TOTAL} -le "3670016" ]; then
  80. echo "Installed memory is <= 3.5 GiB. It is recommended to disable Solr to prevent out-of-memory situations."
  81. echo "Solr is a prone to run OOM and should be monitored. The default Solr heap size is 1024 MiB and should be set in mailcow.conf according to your expected load."
  82. echo "Solr can be re-enabled by setting SKIP_SOLR=n in mailcow.conf but will refuse to start with less than 2 GB total memory."
  83. read -r -p "Do you want to disable Solr now? [Y/n] " response
  84. case $response in
  85. [nN][oO]|[nN])
  86. SKIP_SOLR=n
  87. ;;
  88. *)
  89. SKIP_SOLR=y
  90. ;;
  91. esac
  92. else
  93. SKIP_SOLR=n
  94. fi
  95. [ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc
  96. cat << EOF > mailcow.conf
  97. # ------------------------------
  98. # mailcow web ui configuration
  99. # ------------------------------
  100. # example.org is _not_ a valid hostname, use a fqdn here.
  101. # Default admin user is "admin"
  102. # Default password is "moohoo"
  103. MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
  104. # Password hash algorithm
  105. # Only certain password hash algorithm are supported. For a fully list of supported schemes,
  106. # see https://mailcow.github.io/mailcow-dockerized-docs/model-passwd/
  107. MAILCOW_PASS_SCHEME=BLF-CRYPT
  108. # ------------------------------
  109. # SQL database configuration
  110. # ------------------------------
  111. DBNAME=mailcow
  112. DBUSER=mailcow
  113. # Please use long, random alphanumeric strings (A-Za-z0-9)
  114. DBPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  115. DBROOT=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  116. # ------------------------------
  117. # HTTP/S Bindings
  118. # ------------------------------
  119. # You should use HTTPS, but in case of SSL offloaded reverse proxies:
  120. # Might be important: This will also change the binding within the container.
  121. # If you use a proxy within Docker, point it to the ports you set below.
  122. # Do _not_ use IP:PORT in HTTP(S)_BIND or HTTP(S)_PORT
  123. # IMPORTANT: Do not use port 8081, 9081 or 65510!
  124. HTTP_PORT=80
  125. HTTP_BIND=0.0.0.0
  126. HTTPS_PORT=443
  127. HTTPS_BIND=0.0.0.0
  128. # ------------------------------
  129. # Other bindings
  130. # ------------------------------
  131. # You should leave that alone
  132. # Format: 11.22.33.44:25 or 0.0.0.0:465 etc.
  133. SMTP_PORT=25
  134. SMTPS_PORT=465
  135. SUBMISSION_PORT=587
  136. IMAP_PORT=143
  137. IMAPS_PORT=993
  138. POP_PORT=110
  139. POPS_PORT=995
  140. SIEVE_PORT=4190
  141. DOVEADM_PORT=127.0.0.1:19991
  142. SQL_PORT=127.0.0.1:13306
  143. SOLR_PORT=127.0.0.1:18983
  144. REDIS_PORT=127.0.0.1:7654
  145. # Your timezone
  146. TZ=${MAILCOW_TZ}
  147. # Fixed project name
  148. # Please use lowercase letters only
  149. COMPOSE_PROJECT_NAME=mailcowdockerized
  150. # Set this to "allow" to enable the anyone pseudo user. Disabled by default.
  151. # When enabled, ACL can be created, that apply to "All authenticated users"
  152. # This should probably only be activated on mail hosts, that are used exclusivly by one organisation.
  153. # Otherwise a user might share data with too many other users.
  154. ACL_ANYONE=disallow
  155. # Garbage collector cleanup
  156. # Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring
  157. # How long should objects remain in the garbage until they are being deleted? (value in minutes)
  158. # Check interval is hourly
  159. MAILDIR_GC_TIME=7200
  160. # Additional SAN for the certificate
  161. #
  162. # You can use wildcard records to create specific names for every domain you add to mailcow.
  163. # Example: Add domains "example.com" and "example.net" to mailcow, change ADDITIONAL_SAN to a value like:
  164. #ADDITIONAL_SAN=imap.*,smtp.*
  165. # This will expand the certificate to "imap.example.com", "smtp.example.com", "imap.example.net", "imap.example.net"
  166. # plus every domain you add in the future.
  167. #
  168. # You can also just add static names...
  169. #ADDITIONAL_SAN=srv1.example.net
  170. # ...or combine wildcard and static names:
  171. #ADDITIONAL_SAN=imap.*,srv1.example.com
  172. #
  173. ADDITIONAL_SAN=
  174. # Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
  175. SKIP_LETS_ENCRYPT=n
  176. # Create seperate certificates for all domains - y/n
  177. # this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames
  178. # see https://wiki.dovecot.org/SSL/SNIClientSupport
  179. ENABLE_SSL_SNI=n
  180. # Skip IPv4 check in ACME container - y/n
  181. SKIP_IP_CHECK=n
  182. # Skip HTTP verification in ACME container - y/n
  183. SKIP_HTTP_VERIFICATION=n
  184. # Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
  185. SKIP_CLAMD=${SKIP_CLAMD}
  186. # Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n
  187. SKIP_SOGO=n
  188. # Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
  189. SKIP_SOLR=${SKIP_SOLR}
  190. # Solr heap size in MB, there is no recommendation, please see Solr docs.
  191. # Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended.
  192. SOLR_HEAP=1024
  193. # Allow admins to log into SOGo as email user (without any password)
  194. ALLOW_ADMIN_EMAIL_LOGIN=n
  195. # Enable watchdog (watchdog-mailcow) to restart unhealthy containers
  196. USE_WATCHDOG=y
  197. # Send watchdog notifications by mail (sent from watchdog@MAILCOW_HOSTNAME)
  198. # CAUTION:
  199. # 1. You should use external recipients
  200. # 2. Mails are sent unsigned (no DKIM)
  201. # 3. If you use DMARC, create a separate DMARC policy ("v=DMARC1; p=none;" in _dmarc.MAILCOW_HOSTNAME)
  202. # Multiple rcpts allowed, NO quotation marks, NO spaces
  203. #WATCHDOG_NOTIFY_EMAIL=a@example.com,b@example.com,c@example.com
  204. #WATCHDOG_NOTIFY_EMAIL=
  205. # Notify about banned IP (includes whois lookup)
  206. WATCHDOG_NOTIFY_BAN=n
  207. # Checks if mailcow is an open relay. Requires a SAL. More checks will follow.
  208. # https://www.servercow.de/mailcow?lang=en
  209. # https://www.servercow.de/mailcow?lang=de
  210. # No data is collected. Opt-in and anonymous.
  211. # Will only work with unmodified mailcow setups.
  212. WATCHDOG_EXTERNAL_CHECKS=n
  213. # Max log lines per service to keep in Redis logs
  214. LOG_LINES=9999
  215. # Internal IPv4 /24 subnet, format n.n.n (expands to n.n.n.0/24)
  216. # Use private IPv4 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses
  217. IPV4_NETWORK=172.22.1
  218. # Internal IPv6 subnet in fc00::/7
  219. # Use private IPv6 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv6_addresses
  220. IPV6_NETWORK=fd4d:6169:6c63:6f77::/64
  221. # Use this IPv4 for outgoing connections (SNAT)
  222. #SNAT_TO_SOURCE=
  223. # Use this IPv6 for outgoing connections (SNAT)
  224. #SNAT6_TO_SOURCE=
  225. # Create or override an API key for the web UI
  226. # You _must_ define API_ALLOW_FROM, which is a comma separated list of IPs
  227. # An API key defined as API_KEY has read-write access
  228. # An API key defined as API_KEY_READ_ONLY has read-only access
  229. # Allowed chars for API_KEY and API_KEY_READ_ONLY: a-z, A-Z, 0-9, -
  230. # You can define API_KEY and/or API_KEY_READ_ONLY
  231. #API_KEY=
  232. #API_KEY_READ_ONLY=
  233. #API_ALLOW_FROM=172.22.1.1,127.0.0.1
  234. # mail_home is ~/Maildir
  235. MAILDIR_SUB=Maildir
  236. # SOGo session timeout in minutes
  237. SOGO_EXPIRE_SESSION=480
  238. # DOVECOT_MASTER_USER and DOVECOT_MASTER_PASS must both be provided. No special chars.
  239. # Empty by default to auto-generate master user and password on start.
  240. # User expands to DOVECOT_MASTER_USER@mailcow.local
  241. # LEAVE EMPTY IF UNSURE
  242. DOVECOT_MASTER_USER=
  243. # LEAVE EMPTY IF UNSURE
  244. DOVECOT_MASTER_PASS=
  245. EOF
  246. mkdir -p data/assets/ssl
  247. chmod 600 mailcow.conf
  248. # copy but don't overwrite existing certificate
  249. echo "Generating snake-oil certificate..."
  250. # Making Willich more popular
  251. openssl req -x509 -newkey rsa:4096 -keyout data/assets/ssl-example/key.pem -out data/assets/ssl-example/cert.pem -days 365 -subj "/C=DE/ST=NRW/L=Willich/O=mailcow/OU=mailcow/CN=${MAILCOW_HOSTNAME}" -sha256 -nodes
  252. echo "Copying snake-oil certificate..."
  253. cp -n -d data/assets/ssl-example/*.pem data/assets/ssl/