generate_config.sh 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  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. exit 1
  13. fi
  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 git awk sha1sum; do
  24. if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
  25. done
  26. echo "checking docker compose version...";
  27. if docker compose >/dev/null 2>&1; then
  28. echo -e "\e[32mFound Compose v2!\e[0m"
  29. elif docker-compose version --short | grep -m1 "^2" > /dev/null 2>&1; then
  30. echo -e "\e[32mFound Compose v2!\e[0m"
  31. COMPOSE_COMMAND="docker-compose"
  32. elif docker-compose version --short | grep -m1 "^1" > /dev/null 2>&1; then
  33. echo -e "\e[33mWARN: Your machine is using Docker-Compose v1!\e[0m"
  34. echo -e "\e[33mmailcow will drop the Docker-Compose v1 Support in December 2022\e[0m"
  35. echo -e "\e[33mPlease consider a upgrade to Docker-Compose v2.\e[0m"
  36. echo
  37. echo
  38. echo -e "\e[33mContinuing...\e[0m"
  39. sleep 3
  40. else
  41. echo -e "\e[31mCannot find Docker-Compose v1 or v2 on your System. Please install Docker-Compose v2 and re-run the Script.\e[0m"
  42. exit 1
  43. fi
  44. if [ -f mailcow.conf ]; then
  45. read -r -p "A config file exists and will be overwritten, are you sure you want to continue? [y/N] " response
  46. case $response in
  47. [yY][eE][sS]|[yY])
  48. mv mailcow.conf mailcow.conf_backup
  49. chmod 600 mailcow.conf_backup
  50. ;;
  51. *)
  52. exit 1
  53. ;;
  54. esac
  55. fi
  56. echo "Press enter to confirm the detected value '[value]' where applicable or enter a custom value."
  57. while [ -z "${MAILCOW_HOSTNAME}" ]; do
  58. read -p "Mail server hostname (FQDN) - this is not your mail domain, but your mail servers hostname: " -e MAILCOW_HOSTNAME
  59. DOTS=${MAILCOW_HOSTNAME//[^.]};
  60. if [ ${#DOTS} -lt 2 ] && [ ! -z ${MAILCOW_HOSTNAME} ]; then
  61. echo "${MAILCOW_HOSTNAME} is not a FQDN"
  62. MAILCOW_HOSTNAME=
  63. fi
  64. done
  65. if [ -a /etc/timezone ]; then
  66. DETECTED_TZ=$(cat /etc/timezone)
  67. elif [ -a /etc/localtime ]; then
  68. DETECTED_TZ=$(readlink /etc/localtime|sed -n 's|^.*zoneinfo/||p')
  69. fi
  70. while [ -z "${MAILCOW_TZ}" ]; do
  71. if [ -z "${DETECTED_TZ}" ]; then
  72. read -p "Timezone: " -e MAILCOW_TZ
  73. else
  74. read -p "Timezone [${DETECTED_TZ}]: " -e MAILCOW_TZ
  75. [ -z "${MAILCOW_TZ}" ] && MAILCOW_TZ=${DETECTED_TZ}
  76. fi
  77. done
  78. MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
  79. if [ ${MEM_TOTAL} -le "2621440" ]; then
  80. echo "Installed memory is <= 2.5 GiB. It is recommended to disable ClamAV to prevent out-of-memory situations."
  81. echo "ClamAV can be re-enabled by setting SKIP_CLAMD=n in mailcow.conf."
  82. read -r -p "Do you want to disable ClamAV now? [Y/n] " response
  83. case $response in
  84. [nN][oO]|[nN])
  85. SKIP_CLAMD=n
  86. ;;
  87. *)
  88. SKIP_CLAMD=y
  89. ;;
  90. esac
  91. else
  92. SKIP_CLAMD=n
  93. fi
  94. if [ ${MEM_TOTAL} -le "2097152" ]; then
  95. echo "Disabling Solr on low-memory system."
  96. SKIP_SOLR=y
  97. elif [ ${MEM_TOTAL} -le "3670016" ]; then
  98. echo "Installed memory is <= 3.5 GiB. It is recommended to disable Solr to prevent out-of-memory situations."
  99. 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."
  100. 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."
  101. read -r -p "Do you want to disable Solr now? [Y/n] " response
  102. case $response in
  103. [nN][oO]|[nN])
  104. SKIP_SOLR=n
  105. ;;
  106. *)
  107. SKIP_SOLR=y
  108. ;;
  109. esac
  110. else
  111. SKIP_SOLR=n
  112. fi
  113. [ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc
  114. cat << EOF > mailcow.conf
  115. # ------------------------------
  116. # mailcow web ui configuration
  117. # ------------------------------
  118. # example.org is _not_ a valid hostname, use a fqdn here.
  119. # Default admin user is "admin"
  120. # Default password is "moohoo"
  121. MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
  122. # Password hash algorithm
  123. # Only certain password hash algorithm are supported. For a fully list of supported schemes,
  124. # see https://mailcow.github.io/mailcow-dockerized-docs/models/model-passwd/
  125. MAILCOW_PASS_SCHEME=BLF-CRYPT
  126. # ------------------------------
  127. # SQL database configuration
  128. # ------------------------------
  129. DBNAME=mailcow
  130. DBUSER=mailcow
  131. # Please use long, random alphanumeric strings (A-Za-z0-9)
  132. DBPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  133. DBROOT=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  134. # ------------------------------
  135. # HTTP/S Bindings
  136. # ------------------------------
  137. # You should use HTTPS, but in case of SSL offloaded reverse proxies:
  138. # Might be important: This will also change the binding within the container.
  139. # If you use a proxy within Docker, point it to the ports you set below.
  140. # Do _not_ use IP:PORT in HTTP(S)_BIND or HTTP(S)_PORT
  141. # IMPORTANT: Do not use port 8081, 9081 or 65510!
  142. # Example: HTTP_BIND=1.2.3.4
  143. # For IPv4 leave it as it is: HTTP_BIND= & HTTPS_PORT=
  144. # For IPv6 see https://mailcow.github.io/mailcow-dockerized-docs/post_installation/firststeps-ip_bindings/
  145. HTTP_PORT=80
  146. HTTP_BIND=
  147. HTTPS_PORT=443
  148. HTTPS_BIND=
  149. # ------------------------------
  150. # Other bindings
  151. # ------------------------------
  152. # You should leave that alone
  153. # Format: 11.22.33.44:25 or 12.34.56.78:465 etc.
  154. SMTP_PORT=25
  155. SMTPS_PORT=465
  156. SUBMISSION_PORT=587
  157. IMAP_PORT=143
  158. IMAPS_PORT=993
  159. POP_PORT=110
  160. POPS_PORT=995
  161. SIEVE_PORT=4190
  162. DOVEADM_PORT=127.0.0.1:19991
  163. SQL_PORT=127.0.0.1:13306
  164. SOLR_PORT=127.0.0.1:18983
  165. REDIS_PORT=127.0.0.1:7654
  166. # Your timezone
  167. # See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of timezones
  168. # Use the row named 'TZ database name' + pay attention for 'Notes' row
  169. TZ=${MAILCOW_TZ}
  170. # Fixed project name
  171. # Please use lowercase letters only
  172. COMPOSE_PROJECT_NAME=mailcowdockerized
  173. # Set this to "allow" to enable the anyone pseudo user. Disabled by default.
  174. # When enabled, ACL can be created, that apply to "All authenticated users"
  175. # This should probably only be activated on mail hosts, that are used exclusivly by one organisation.
  176. # Otherwise a user might share data with too many other users.
  177. ACL_ANYONE=disallow
  178. # Garbage collector cleanup
  179. # Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring
  180. # How long should objects remain in the garbage until they are being deleted? (value in minutes)
  181. # Check interval is hourly
  182. MAILDIR_GC_TIME=7200
  183. # Additional SAN for the certificate
  184. #
  185. # You can use wildcard records to create specific names for every domain you add to mailcow.
  186. # Example: Add domains "example.com" and "example.net" to mailcow, change ADDITIONAL_SAN to a value like:
  187. #ADDITIONAL_SAN=imap.*,smtp.*
  188. # This will expand the certificate to "imap.example.com", "smtp.example.com", "imap.example.net", "smtp.example.net"
  189. # plus every domain you add in the future.
  190. #
  191. # You can also just add static names...
  192. #ADDITIONAL_SAN=srv1.example.net
  193. # ...or combine wildcard and static names:
  194. #ADDITIONAL_SAN=imap.*,srv1.example.com
  195. #
  196. ADDITIONAL_SAN=
  197. # Additional server names for mailcow UI
  198. #
  199. # Specify alternative addresses for the mailcow UI to respond to
  200. # This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.
  201. # If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.
  202. # You can understand this as server_name directive in Nginx.
  203. # Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f
  204. ADDITIONAL_SERVER_NAMES=
  205. # Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
  206. SKIP_LETS_ENCRYPT=n
  207. # Create seperate certificates for all domains - y/n
  208. # this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames
  209. # see https://wiki.dovecot.org/SSL/SNIClientSupport
  210. ENABLE_SSL_SNI=n
  211. # Skip IPv4 check in ACME container - y/n
  212. SKIP_IP_CHECK=n
  213. # Skip HTTP verification in ACME container - y/n
  214. SKIP_HTTP_VERIFICATION=n
  215. # Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
  216. SKIP_CLAMD=${SKIP_CLAMD}
  217. # Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n
  218. SKIP_SOGO=n
  219. # Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
  220. SKIP_SOLR=${SKIP_SOLR}
  221. # Solr heap size in MB, there is no recommendation, please see Solr docs.
  222. # Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended.
  223. SOLR_HEAP=1024
  224. # Allow admins to log into SOGo as email user (without any password)
  225. ALLOW_ADMIN_EMAIL_LOGIN=n
  226. # Enable watchdog (watchdog-mailcow) to restart unhealthy containers
  227. USE_WATCHDOG=y
  228. # Send watchdog notifications by mail (sent from watchdog@MAILCOW_HOSTNAME)
  229. # CAUTION:
  230. # 1. You should use external recipients
  231. # 2. Mails are sent unsigned (no DKIM)
  232. # 3. If you use DMARC, create a separate DMARC policy ("v=DMARC1; p=none;" in _dmarc.MAILCOW_HOSTNAME)
  233. # Multiple rcpts allowed, NO quotation marks, NO spaces
  234. #WATCHDOG_NOTIFY_EMAIL=a@example.com,b@example.com,c@example.com
  235. #WATCHDOG_NOTIFY_EMAIL=
  236. # Notify about banned IP (includes whois lookup)
  237. WATCHDOG_NOTIFY_BAN=n
  238. # Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.
  239. #WATCHDOG_SUBJECT=
  240. # Checks if mailcow is an open relay. Requires a SAL. More checks will follow.
  241. # https://www.servercow.de/mailcow?lang=en
  242. # https://www.servercow.de/mailcow?lang=de
  243. # No data is collected. Opt-in and anonymous.
  244. # Will only work with unmodified mailcow setups.
  245. WATCHDOG_EXTERNAL_CHECKS=n
  246. # Enable watchdog verbose logging
  247. WATCHDOG_VERBOSE=n
  248. # Max log lines per service to keep in Redis logs
  249. LOG_LINES=9999
  250. # Internal IPv4 /24 subnet, format n.n.n (expands to n.n.n.0/24)
  251. # Use private IPv4 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses
  252. IPV4_NETWORK=172.22.1
  253. # Internal IPv6 subnet in fc00::/7
  254. # Use private IPv6 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv6_addresses
  255. IPV6_NETWORK=fd4d:6169:6c63:6f77::/64
  256. # Use this IPv4 for outgoing connections (SNAT)
  257. #SNAT_TO_SOURCE=
  258. # Use this IPv6 for outgoing connections (SNAT)
  259. #SNAT6_TO_SOURCE=
  260. # Create or override an API key for the web UI
  261. # You _must_ define API_ALLOW_FROM, which is a comma separated list of IPs
  262. # An API key defined as API_KEY has read-write access
  263. # An API key defined as API_KEY_READ_ONLY has read-only access
  264. # Allowed chars for API_KEY and API_KEY_READ_ONLY: a-z, A-Z, 0-9, -
  265. # You can define API_KEY and/or API_KEY_READ_ONLY
  266. #API_KEY=
  267. #API_KEY_READ_ONLY=
  268. #API_ALLOW_FROM=172.22.1.1,127.0.0.1
  269. # mail_home is ~/Maildir
  270. MAILDIR_SUB=Maildir
  271. # SOGo session timeout in minutes
  272. SOGO_EXPIRE_SESSION=480
  273. # DOVECOT_MASTER_USER and DOVECOT_MASTER_PASS must both be provided. No special chars.
  274. # Empty by default to auto-generate master user and password on start.
  275. # User expands to DOVECOT_MASTER_USER@mailcow.local
  276. # LEAVE EMPTY IF UNSURE
  277. DOVECOT_MASTER_USER=
  278. # LEAVE EMPTY IF UNSURE
  279. DOVECOT_MASTER_PASS=
  280. # Let's Encrypt registration contact information
  281. # Optional: Leave empty for none
  282. # This value is only used on first order!
  283. # Setting it at a later point will require the following steps:
  284. # https://mailcow.github.io/mailcow-dockerized-docs/troubleshooting/debug-reset_tls/
  285. ACME_CONTACT=
  286. # WebAuthn device manufacturer verification
  287. # After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed
  288. # root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates
  289. WEBAUTHN_ONLY_TRUSTED_VENDORS=n
  290. EOF
  291. mkdir -p data/assets/ssl
  292. chmod 600 mailcow.conf
  293. # copy but don't overwrite existing certificate
  294. echo "Generating snake-oil certificate..."
  295. # Making Willich more popular
  296. 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
  297. echo "Copying snake-oil certificate..."
  298. cp -n -d data/assets/ssl-example/*.pem data/assets/ssl/
  299. # Set app_info.inc.php
  300. mailcow_git_version=$(git describe --tags `git rev-list --tags --max-count=1`)
  301. mailcow_git_commit=$(git rev-parse HEAD)
  302. mailcow_git_commit_date=$(git show -s --format=%cd --date=format:'%Y-%m-%d %H:%M')
  303. if [ $? -eq 0 ]; then
  304. echo '<?php' > data/web/inc/app_info.inc.php
  305. echo ' $MAILCOW_GIT_VERSION="'$mailcow_git_version'";' >> data/web/inc/app_info.inc.php
  306. echo ' $MAILCOW_LAST_GIT_VERSION="";' >> data/web/inc/app_info.inc.php
  307. echo ' $MAILCOW_GIT_OWNER="mailcow";' >> data/web/inc/app_info.inc.php
  308. echo ' $MAILCOW_GIT_REPO="mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  309. echo ' $MAILCOW_GIT_URL="https://github.com/mailcow/mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  310. echo ' $MAILCOW_GIT_COMMIT="'$mailcow_git_commit'";' >> data/web/inc/app_info.inc.php
  311. echo ' $MAILCOW_GIT_COMMIT_DATE="'$mailcow_git_commit_date'";' >> data/web/inc/app_info.inc.php
  312. echo ' $MAILCOW_BUILD="'$BUILD'";' >> data/web/inc/app_info.inc.php
  313. echo ' $MAILCOW_UPDATEDAT='$(date +%s)';' >> data/web/inc/app_info.inc.php
  314. echo '?>' >> data/web/inc/app_info.inc.php
  315. else
  316. echo '<?php' > data/web/inc/app_info.inc.php
  317. echo ' $MAILCOW_GIT_VERSION="";' >> data/web/inc/app_info.inc.php
  318. echo ' $MAILCOW_LAST_GIT_VERSION="";' >> data/web/inc/app_info.inc.php
  319. echo ' $MAILCOW_GIT_OWNER="mailcow";' >> data/web/inc/app_info.inc.php
  320. echo ' $MAILCOW_GIT_REPO="mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  321. echo ' $MAILCOW_GIT_URL="https://github.com/mailcow/mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  322. echo ' $MAILCOW_GIT_COMMIT="";' >> data/web/inc/app_info.inc.php
  323. echo ' $MAILCOW_GIT_COMMIT_DATE="";' >> data/web/inc/app_info.inc.php
  324. echo ' $MAILCOW_BUILD="'$BUILD'";' >> data/web/inc/app_info.inc.php
  325. echo ' $MAILCOW_UPDATEDAT='$(date +%s)';' >> data/web/inc/app_info.inc.php
  326. echo '?>' >> data/web/inc/app_info.inc.php
  327. echo -e "\e[33mCannot determine current git repository version...\e[0m"
  328. fi