generate_config.sh 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  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 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""; exit 1; fi
  16. # This will also cover sort
  17. if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""; exit 1; fi
  18. if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\""; exit 1; fi
  19. for bin in openssl curl docker git awk sha1sum grep cut; do
  20. if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
  21. done
  22. # Check Docker Version (need at least 24.X)
  23. docker_version=$(docker -v | grep -oP '\d+\.\d+\.\d+' | cut -d '.' -f 1)
  24. if [[ $docker_version -lt 24 ]]; then
  25. echo -e "\e[31mCannot find Docker with a Version higher or equals 24.0.0\e[0m"
  26. echo -e "\e[33mmailcow needs a newer Docker version to work properly...\e[0m"
  27. echo -e "\e[31mPlease update your Docker installation... exiting\e[0m"
  28. exit 1
  29. fi
  30. if docker compose > /dev/null 2>&1; then
  31. if docker compose version --short | grep -e "^2." -e "^v2." > /dev/null 2>&1; then
  32. COMPOSE_VERSION=native
  33. echo -e "\e[33mFound Docker Compose Plugin (native).\e[0m"
  34. echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m"
  35. sleep 2
  36. echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m"
  37. else
  38. echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
  39. echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
  40. exit 1
  41. fi
  42. elif docker-compose > /dev/null 2>&1; then
  43. if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then
  44. if docker-compose version --short | grep "^2." > /dev/null 2>&1; then
  45. COMPOSE_VERSION=standalone
  46. echo -e "\e[33mFound Docker Compose Standalone.\e[0m"
  47. echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m"
  48. sleep 2
  49. echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m"
  50. else
  51. echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
  52. echo -e "\e[31mPlease update/install manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
  53. exit 1
  54. fi
  55. fi
  56. else
  57. echo -e "\e[31mCannot find Docker Compose.\e[0m"
  58. echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
  59. exit 1
  60. fi
  61. detect_bad_asn() {
  62. echo -e "\e[33mDetecting if your IP is listed on Spamhaus Bad ASN List...\e[0m"
  63. response=$(curl --connect-timeout 15 --max-time 30 -s -o /dev/null -w "%{http_code}" "https://asn-check.mailcow.email")
  64. if [ "$response" -eq 503 ]; then
  65. if [ -z "$SPAMHAUS_DQS_KEY" ]; then
  66. echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m"
  67. echo -e "\e[33mmailcow did not detected a value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf!\e[0m"
  68. sleep 2
  69. echo ""
  70. echo -e "\e[33mTo use the Spamhaus DNS Blocklists again, you will need to create a FREE account for their Data Query Service (DQS) at: https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account\e[0m"
  71. echo -e "\e[33mOnce done, enter your DQS API key in mailcow.conf and mailcow will do the rest for you!\e[0m"
  72. echo ""
  73. sleep 2
  74. else
  75. echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m"
  76. echo -e "\e[32mmailcow detected a Value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf. Postfix will use DQS with the given API key...\e[0m"
  77. fi
  78. elif [ "$response" -eq 200 ]; then
  79. echo -e "\e[33mCheck completed! Your IP is \e[32mclean\e[0m"
  80. elif [ "$response" -eq 429 ]; then
  81. echo -e "\e[33mCheck completed! \e[31mYour IP seems to be rate limited on the ASN Check service... please try again later!\e[0m"
  82. else
  83. echo -e "\e[31mCheck failed! \e[0mMaybe a DNS or Network problem?\e[0m"
  84. fi
  85. }
  86. ### If generate_config.sh is started with --dev or -d it will not check out nightly or master branch and will keep on the current branch
  87. if [[ ${1} == "--dev" || ${1} == "-d" ]]; then
  88. SKIP_BRANCH=y
  89. else
  90. SKIP_BRANCH=n
  91. fi
  92. if [ -f mailcow.conf ]; then
  93. read -r -p "A config file exists and will be overwritten, are you sure you want to continue? [y/N] " response
  94. case $response in
  95. [yY][eE][sS]|[yY])
  96. mv mailcow.conf mailcow.conf_backup
  97. chmod 600 mailcow.conf_backup
  98. ;;
  99. *)
  100. exit 1
  101. ;;
  102. esac
  103. fi
  104. echo "Press enter to confirm the detected value '[value]' where applicable or enter a custom value."
  105. while [ -z "${MAILCOW_HOSTNAME}" ]; do
  106. read -p "Mail server hostname (FQDN) - this is not your mail domain, but your mail servers hostname: " -e MAILCOW_HOSTNAME
  107. DOTS=${MAILCOW_HOSTNAME//[^.]};
  108. if [ ${#DOTS} -lt 1 ]; then
  109. echo -e "\e[31mMAILCOW_HOSTNAME (${MAILCOW_HOSTNAME}) is not a FQDN!\e[0m"
  110. sleep 1
  111. echo "Please change it to a FQDN and redeploy the stack with docker(-)compose up -d"
  112. exit 1
  113. elif [[ "${MAILCOW_HOSTNAME: -1}" == "." ]]; then
  114. echo "MAILCOW_HOSTNAME (${MAILCOW_HOSTNAME}) is ending with a dot. This is not a valid FQDN!"
  115. exit 1
  116. elif [ ${#DOTS} -eq 1 ]; then
  117. echo -e "\e[33mMAILCOW_HOSTNAME (${MAILCOW_HOSTNAME}) does not contain a Subdomain. This is not fully tested and may cause issues.\e[0m"
  118. echo "Find more information about why this message exists here: https://github.com/mailcow/mailcow-dockerized/issues/1572"
  119. read -r -p "Do you want to proceed anyway? [y/N] " response
  120. if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  121. echo "OK. Procceding."
  122. else
  123. echo "OK. Exiting."
  124. exit 1
  125. fi
  126. fi
  127. done
  128. if [ -a /etc/timezone ]; then
  129. DETECTED_TZ=$(cat /etc/timezone)
  130. elif [ -a /etc/localtime ]; then
  131. DETECTED_TZ=$(readlink /etc/localtime|sed -n 's|^.*zoneinfo/||p')
  132. fi
  133. while [ -z "${MAILCOW_TZ}" ]; do
  134. if [ -z "${DETECTED_TZ}" ]; then
  135. read -p "Timezone: " -e MAILCOW_TZ
  136. else
  137. read -p "Timezone [${DETECTED_TZ}]: " -e MAILCOW_TZ
  138. [ -z "${MAILCOW_TZ}" ] && MAILCOW_TZ=${DETECTED_TZ}
  139. fi
  140. done
  141. MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
  142. if [ -z "${SKIP_CLAMD}" ]; then
  143. if [ "${MEM_TOTAL}" -le "2621440" ]; then
  144. echo "Installed memory is <= 2.5 GiB. It is recommended to disable ClamAV to prevent out-of-memory situations."
  145. echo "ClamAV can be re-enabled by setting SKIP_CLAMD=n in mailcow.conf."
  146. read -r -p "Do you want to disable ClamAV now? [Y/n] " response
  147. case $response in
  148. [nN][oO]|[nN])
  149. SKIP_CLAMD=n
  150. ;;
  151. *)
  152. SKIP_CLAMD=y
  153. ;;
  154. esac
  155. else
  156. SKIP_CLAMD=n
  157. fi
  158. fi
  159. if [ -z "${SKIP_SOLR}" ]; then
  160. if [ "${MEM_TOTAL}" -le "2097152" ]; then
  161. echo "Disabling Solr on low-memory system."
  162. SKIP_SOLR=y
  163. elif [ "${MEM_TOTAL}" -le "3670016" ]; then
  164. echo "Installed memory is <= 3.5 GiB. It is recommended to disable Solr to prevent out-of-memory situations."
  165. 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."
  166. 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."
  167. read -r -p "Do you want to disable Solr now? [Y/n] " response
  168. case $response in
  169. [nN][oO]|[nN])
  170. SKIP_SOLR=n
  171. ;;
  172. *)
  173. SKIP_SOLR=y
  174. ;;
  175. esac
  176. else
  177. SKIP_SOLR=n
  178. fi
  179. fi
  180. if [[ ${SKIP_BRANCH} != y ]]; then
  181. echo "Which branch of mailcow do you want to use?"
  182. echo ""
  183. echo "Available Branches:"
  184. echo "- master branch (stable updates) | default, recommended [1]"
  185. echo "- nightly branch (unstable updates, testing) | not-production ready [2]"
  186. sleep 1
  187. while [ -z "${MAILCOW_BRANCH}" ]; do
  188. read -r -p "Choose the Branch with it's number [1/2] " branch
  189. case $branch in
  190. [2])
  191. MAILCOW_BRANCH="nightly"
  192. ;;
  193. *)
  194. MAILCOW_BRANCH="master"
  195. ;;
  196. esac
  197. done
  198. git fetch --all
  199. git checkout -f "$MAILCOW_BRANCH"
  200. elif [[ ${SKIP_BRANCH} == y ]]; then
  201. echo -e "\033[33mEnabled Dev Mode.\033[0m"
  202. echo -e "\033[33mNot checking out a different branch!\033[0m"
  203. MAILCOW_BRANCH=$(git rev-parse --short $(git rev-parse @{upstream}))
  204. else
  205. echo -e "\033[31mCould not determine branch input..."
  206. echo -e "\033[31mExiting."
  207. exit 1
  208. fi
  209. if [ ! -z "${MAILCOW_BRANCH}" ]; then
  210. git_branch=${MAILCOW_BRANCH}
  211. fi
  212. [ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc
  213. cat << EOF > mailcow.conf
  214. # ------------------------------
  215. # mailcow web ui configuration
  216. # ------------------------------
  217. # example.org is _not_ a valid hostname, use a fqdn here.
  218. # Default admin user is "admin"
  219. # Default password is "moohoo"
  220. MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
  221. # Password hash algorithm
  222. # Only certain password hash algorithm are supported. For a fully list of supported schemes,
  223. # see https://docs.mailcow.email/models/model-passwd/
  224. MAILCOW_PASS_SCHEME=BLF-CRYPT
  225. # ------------------------------
  226. # SQL database configuration
  227. # ------------------------------
  228. DBNAME=mailcow
  229. DBUSER=mailcow
  230. # Please use long, random alphanumeric strings (A-Za-z0-9)
  231. DBPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
  232. DBROOT=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
  233. # ------------------------------
  234. # HTTP/S Bindings
  235. # ------------------------------
  236. # You should use HTTPS, but in case of SSL offloaded reverse proxies:
  237. # Might be important: This will also change the binding within the container.
  238. # If you use a proxy within Docker, point it to the ports you set below.
  239. # Do _not_ use IP:PORT in HTTP(S)_BIND or HTTP(S)_PORT
  240. # IMPORTANT: Do not use port 8081, 9081 or 65510!
  241. # Example: HTTP_BIND=1.2.3.4
  242. # For IPv4 leave it as it is: HTTP_BIND= & HTTPS_PORT=
  243. # For IPv6 see https://docs.mailcow.email/post_installation/firststeps-ip_bindings/
  244. HTTP_PORT=80
  245. HTTP_BIND=
  246. HTTPS_PORT=443
  247. HTTPS_BIND=
  248. # ------------------------------
  249. # Other bindings
  250. # ------------------------------
  251. # You should leave that alone
  252. # Format: 11.22.33.44:25 or 12.34.56.78:465 etc.
  253. SMTP_PORT=25
  254. SMTPS_PORT=465
  255. SUBMISSION_PORT=587
  256. IMAP_PORT=143
  257. IMAPS_PORT=993
  258. POP_PORT=110
  259. POPS_PORT=995
  260. SIEVE_PORT=4190
  261. DOVEADM_PORT=127.0.0.1:19991
  262. SQL_PORT=127.0.0.1:13306
  263. SOLR_PORT=127.0.0.1:18983
  264. REDIS_PORT=127.0.0.1:7654
  265. # Your timezone
  266. # See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of timezones
  267. # Use the column named 'TZ identifier' + pay attention for the column named 'Notes'
  268. TZ=${MAILCOW_TZ}
  269. # Fixed project name
  270. # Please use lowercase letters only
  271. COMPOSE_PROJECT_NAME=mailcowdockerized
  272. # Used Docker Compose version
  273. # Switch here between native (compose plugin) and standalone
  274. # For more informations take a look at the mailcow docs regarding the configuration options.
  275. # Normally this should be untouched but if you decided to use either of those you can switch it manually here.
  276. # Please be aware that at least one of those variants should be installed on your machine or mailcow will fail.
  277. DOCKER_COMPOSE_VERSION=${COMPOSE_VERSION}
  278. # Set this to "allow" to enable the anyone pseudo user. Disabled by default.
  279. # When enabled, ACL can be created, that apply to "All authenticated users"
  280. # This should probably only be activated on mail hosts, that are used exclusivly by one organisation.
  281. # Otherwise a user might share data with too many other users.
  282. ACL_ANYONE=disallow
  283. # Garbage collector cleanup
  284. # Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring
  285. # How long should objects remain in the garbage until they are being deleted? (value in minutes)
  286. # Check interval is hourly
  287. MAILDIR_GC_TIME=7200
  288. # Additional SAN for the certificate
  289. #
  290. # You can use wildcard records to create specific names for every domain you add to mailcow.
  291. # Example: Add domains "example.com" and "example.net" to mailcow, change ADDITIONAL_SAN to a value like:
  292. #ADDITIONAL_SAN=imap.*,smtp.*
  293. # This will expand the certificate to "imap.example.com", "smtp.example.com", "imap.example.net", "smtp.example.net"
  294. # plus every domain you add in the future.
  295. #
  296. # You can also just add static names...
  297. #ADDITIONAL_SAN=srv1.example.net
  298. # ...or combine wildcard and static names:
  299. #ADDITIONAL_SAN=imap.*,srv1.example.com
  300. #
  301. ADDITIONAL_SAN=
  302. # Obtain certificates for autodiscover.* and autoconfig.* domains.
  303. # This can be useful to switch off in case you are in a scenario where a reverse proxy already handles those.
  304. # There are mixed scenarios where ports 80,443 are occupied and you do not want to share certs
  305. # between services. So acme-mailcow obtains for maildomains and all web-things get handled
  306. # in the reverse proxy.
  307. AUTODISCOVER_SAN=y
  308. # Additional server names for mailcow UI
  309. #
  310. # Specify alternative addresses for the mailcow UI to respond to
  311. # 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.
  312. # If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.
  313. # You can understand this as server_name directive in Nginx.
  314. # Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f
  315. ADDITIONAL_SERVER_NAMES=
  316. # Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
  317. SKIP_LETS_ENCRYPT=n
  318. # Create seperate certificates for all domains - y/n
  319. # this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames
  320. # see https://doc.dovecot.org/admin_manual/ssl/sni_support
  321. ENABLE_SSL_SNI=n
  322. # Skip IPv4 check in ACME container - y/n
  323. SKIP_IP_CHECK=n
  324. # Skip HTTP verification in ACME container - y/n
  325. SKIP_HTTP_VERIFICATION=n
  326. # Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n
  327. SKIP_UNBOUND_HEALTHCHECK=n
  328. # Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
  329. SKIP_CLAMD=${SKIP_CLAMD}
  330. # Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n
  331. SKIP_SOGO=n
  332. # Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
  333. SKIP_SOLR=${SKIP_SOLR}
  334. # Solr heap size in MB, there is no recommendation, please see Solr docs.
  335. # Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended.
  336. SOLR_HEAP=1024
  337. # Allow admins to log into SOGo as email user (without any password)
  338. ALLOW_ADMIN_EMAIL_LOGIN=n
  339. # Enable watchdog (watchdog-mailcow) to restart unhealthy containers
  340. USE_WATCHDOG=y
  341. # Send watchdog notifications by mail (sent from watchdog@MAILCOW_HOSTNAME)
  342. # CAUTION:
  343. # 1. You should use external recipients
  344. # 2. Mails are sent unsigned (no DKIM)
  345. # 3. If you use DMARC, create a separate DMARC policy ("v=DMARC1; p=none;" in _dmarc.MAILCOW_HOSTNAME)
  346. # Multiple rcpts allowed, NO quotation marks, NO spaces
  347. #WATCHDOG_NOTIFY_EMAIL=a@example.com,b@example.com,c@example.com
  348. #WATCHDOG_NOTIFY_EMAIL=
  349. # Send notifications to a webhook URL that receives a POST request with the content type "application/json".
  350. # You can use this to send notifications to services like Discord, Slack and others.
  351. #WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  352. # JSON body included in the webhook POST request. Needs to be in single quotes.
  353. # Following variables are available: SUBJECT, BODY
  354. #WATCHDOG_NOTIFY_WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}'
  355. # Notify about banned IP (includes whois lookup)
  356. WATCHDOG_NOTIFY_BAN=n
  357. # Send a notification when the watchdog is started.
  358. WATCHDOG_NOTIFY_START=y
  359. # Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.
  360. #WATCHDOG_SUBJECT=
  361. # Checks if mailcow is an open relay. Requires a SAL. More checks will follow.
  362. # https://www.servercow.de/mailcow?lang=en
  363. # https://www.servercow.de/mailcow?lang=de
  364. # No data is collected. Opt-in and anonymous.
  365. # Will only work with unmodified mailcow setups.
  366. WATCHDOG_EXTERNAL_CHECKS=n
  367. # Enable watchdog verbose logging
  368. WATCHDOG_VERBOSE=n
  369. # Max log lines per service to keep in Redis logs
  370. LOG_LINES=9999
  371. # Internal IPv4 /24 subnet, format n.n.n (expands to n.n.n.0/24)
  372. # Use private IPv4 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses
  373. IPV4_NETWORK=172.22.1
  374. # Internal IPv6 subnet in fc00::/7
  375. # Use private IPv6 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv6_addresses
  376. IPV6_NETWORK=fd4d:6169:6c63:6f77::/64
  377. # Use this IPv4 for outgoing connections (SNAT)
  378. #SNAT_TO_SOURCE=
  379. # Use this IPv6 for outgoing connections (SNAT)
  380. #SNAT6_TO_SOURCE=
  381. # Create or override an API key for the web UI
  382. # You _must_ define API_ALLOW_FROM, which is a comma separated list of IPs
  383. # An API key defined as API_KEY has read-write access
  384. # An API key defined as API_KEY_READ_ONLY has read-only access
  385. # Allowed chars for API_KEY and API_KEY_READ_ONLY: a-z, A-Z, 0-9, -
  386. # You can define API_KEY and/or API_KEY_READ_ONLY
  387. #API_KEY=
  388. #API_KEY_READ_ONLY=
  389. #API_ALLOW_FROM=172.22.1.1,127.0.0.1
  390. # mail_home is ~/Maildir
  391. MAILDIR_SUB=Maildir
  392. # SOGo session timeout in minutes
  393. SOGO_EXPIRE_SESSION=480
  394. # DOVECOT_MASTER_USER and DOVECOT_MASTER_PASS must both be provided. No special chars.
  395. # Empty by default to auto-generate master user and password on start.
  396. # User expands to DOVECOT_MASTER_USER@mailcow.local
  397. # LEAVE EMPTY IF UNSURE
  398. DOVECOT_MASTER_USER=
  399. # LEAVE EMPTY IF UNSURE
  400. DOVECOT_MASTER_PASS=
  401. # Let's Encrypt registration contact information
  402. # Optional: Leave empty for none
  403. # This value is only used on first order!
  404. # Setting it at a later point will require the following steps:
  405. # https://docs.mailcow.email/troubleshooting/debug-reset_tls/
  406. ACME_CONTACT=
  407. # WebAuthn device manufacturer verification
  408. # After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed
  409. # root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates
  410. WEBAUTHN_ONLY_TRUSTED_VENDORS=n
  411. # Spamhaus Data Query Service Key
  412. # Optional: Leave empty for none
  413. # Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.
  414. # If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.
  415. # Otherwise it will work normally.
  416. SPAMHAUS_DQS_KEY=
  417. # Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n
  418. # CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost
  419. DISABLE_NETFILTER_ISOLATION_RULE=n
  420. EOF
  421. mkdir -p data/assets/ssl
  422. chmod 600 mailcow.conf
  423. # copy but don't overwrite existing certificate
  424. echo "Generating snake-oil certificate..."
  425. # Making Willich more popular
  426. 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
  427. echo "Copying snake-oil certificate..."
  428. cp -n -d data/assets/ssl-example/*.pem data/assets/ssl/
  429. # Set app_info.inc.php
  430. case ${git_branch} in
  431. master)
  432. mailcow_git_version=$(git describe --tags `git rev-list --tags --max-count=1`)
  433. ;;
  434. nightly)
  435. mailcow_git_version=$(git rev-parse --short $(git rev-parse @{upstream}))
  436. mailcow_last_git_version=""
  437. ;;
  438. *)
  439. mailcow_git_version=$(git rev-parse --short HEAD)
  440. mailcow_last_git_version=""
  441. ;;
  442. esac
  443. # if [ ${git_branch} == "master" ]; then
  444. # mailcow_git_version=$(git describe --tags `git rev-list --tags --max-count=1`)
  445. # elif [ ${git_branch} == "nightly" ]; then
  446. # mailcow_git_version=$(git rev-parse --short $(git rev-parse @{upstream}))
  447. # mailcow_last_git_version=""
  448. # else
  449. # mailcow_git_version=$(git rev-parse --short HEAD)
  450. # mailcow_last_git_version=""
  451. # fi
  452. if [[ $SKIP_BRANCH != "y" ]]; then
  453. mailcow_git_commit=$(git rev-parse origin/${git_branch})
  454. mailcow_git_commit_date=$(git log -1 --format=%ci @{upstream} )
  455. else
  456. mailcow_git_commit=$(git rev-parse ${git_branch})
  457. mailcow_git_commit_date=$(git log -1 --format=%ci @{upstream} )
  458. git_branch=$(git rev-parse --abbrev-ref HEAD)
  459. fi
  460. if [ $? -eq 0 ]; then
  461. echo '<?php' > data/web/inc/app_info.inc.php
  462. echo ' $MAILCOW_GIT_VERSION="'$mailcow_git_version'";' >> data/web/inc/app_info.inc.php
  463. echo ' $MAILCOW_LAST_GIT_VERSION="";' >> data/web/inc/app_info.inc.php
  464. echo ' $MAILCOW_GIT_OWNER="mailcow";' >> data/web/inc/app_info.inc.php
  465. echo ' $MAILCOW_GIT_REPO="mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  466. echo ' $MAILCOW_GIT_URL="https://github.com/mailcow/mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  467. echo ' $MAILCOW_GIT_COMMIT="'$mailcow_git_commit'";' >> data/web/inc/app_info.inc.php
  468. echo ' $MAILCOW_GIT_COMMIT_DATE="'$mailcow_git_commit_date'";' >> data/web/inc/app_info.inc.php
  469. echo ' $MAILCOW_BRANCH="'$git_branch'";' >> data/web/inc/app_info.inc.php
  470. echo ' $MAILCOW_UPDATEDAT='$(date +%s)';' >> data/web/inc/app_info.inc.php
  471. echo '?>' >> data/web/inc/app_info.inc.php
  472. else
  473. echo '<?php' > data/web/inc/app_info.inc.php
  474. echo ' $MAILCOW_GIT_VERSION="'$mailcow_git_version'";' >> data/web/inc/app_info.inc.php
  475. echo ' $MAILCOW_LAST_GIT_VERSION="";' >> data/web/inc/app_info.inc.php
  476. echo ' $MAILCOW_GIT_OWNER="mailcow";' >> data/web/inc/app_info.inc.php
  477. echo ' $MAILCOW_GIT_REPO="mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  478. echo ' $MAILCOW_GIT_URL="https://github.com/mailcow/mailcow-dockerized";' >> data/web/inc/app_info.inc.php
  479. echo ' $MAILCOW_GIT_COMMIT="";' >> data/web/inc/app_info.inc.php
  480. echo ' $MAILCOW_GIT_COMMIT_DATE="";' >> data/web/inc/app_info.inc.php
  481. echo ' $MAILCOW_BRANCH="'$git_branch'";' >> data/web/inc/app_info.inc.php
  482. echo ' $MAILCOW_UPDATEDAT='$(date +%s)';' >> data/web/inc/app_info.inc.php
  483. echo '?>' >> data/web/inc/app_info.inc.php
  484. echo -e "\e[33mCannot determine current git repository version...\e[0m"
  485. fi
  486. detect_bad_asn