docker-entrypoint.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/bin/bash
  2. ACME_BASE=/var/lib/acme
  3. mkdir -p ${ACME_BASE}/acme/private
  4. restart_containers(){
  5. for container in $*; do
  6. curl -X POST \
  7. --unix-socket /var/run/docker.sock \
  8. "http/containers/${container}/restart"
  9. done
  10. }
  11. if [[ $(openssl x509 -in ${ACME_BASE}/cert.pem -noout -issuer) != *"Let's Encrypt"* &&
  12. $(openssl x509 -in ${ACME_BASE}/cert.pem -noout -issuer) != *"mailcow"* ]]; then
  13. echo "Skipping ACME client"
  14. exit 0
  15. fi
  16. while true; do
  17. declare -a SQL_DOMAIN_ARR
  18. declare -a DOMAIN_ARR
  19. declare -a DOMAIN_ARR
  20. declare -a ADDITIONAL_VALIDATED_SAN
  21. IFS=' ' read -r -a ADDITIONAL_SAN_ARR <<< "${ADDITIONAL_SAN}"
  22. IPV4=$(curl -4s https://mailcow.email/ip.php)
  23. while read line; do
  24. SQL_DOMAIN_ARR+=("${line}")
  25. done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain" -Bs)
  26. for SQL_DOMAIN in "${SQL_DOMAIN_ARR[@]}"; do
  27. A_CONFIG=$(dig A autoconfig.${SQL_DOMAIN} +short)
  28. if [[ ! -z ${A_CONFIG} ]]; then
  29. echo "Found A record for autoconfig.${SQL_DOMAIN}: ${A_CONFIG}"
  30. if [[ ${IPV4} == ${A_CONFIG} ]]; then
  31. echo "Confirmed A record autoconfig.${SQL_DOMAIN}"
  32. CONFIG_DOMAINS+=("autoconfig.${SQL_DOMAIN}")
  33. else
  34. echo "Cannot match Your IP against hostname autoconfig.${SQL_DOMAIN}"
  35. fi
  36. else
  37. echo "No A record for autoconfig.${SQL_DOMAIN} found"
  38. fi
  39. A_DISCOVER=$(dig A autodiscover.${SQL_DOMAIN} +short)
  40. if [[ ! -z ${A_DISCOVER} ]]; then
  41. echo "Found A record for autodiscover.${SQL_DOMAIN}: ${A_CONFIG}"
  42. if [[ ${IPV4} == ${A_DISCOVER} ]]; then
  43. echo "Confirmed A record autodiscover.${SQL_DOMAIN}"
  44. CONFIG_DOMAINS+=("autodiscover.${SQL_DOMAIN}")
  45. else
  46. echo "Cannot match Your IP against hostname autodiscover.${SQL_DOMAIN}"
  47. fi
  48. else
  49. echo "No A record for autodiscover.${SQL_DOMAIN} found"
  50. fi
  51. done
  52. for SAN in "${ADDITIONAL_SAN_ARR[@]}"; do
  53. A_SAN=$(dig A ${SAN} +short)
  54. if [[ ! -z ${A_SAN} ]]; then
  55. echo "Found A record for ${SAN}: ${A_SAN}"
  56. if [[ ${IPV4} == ${A_SAN} ]]; then
  57. echo "Confirmed A record ${SAN}"
  58. ADDITIONAL_VALIDATED_SAN+=("${SAN}")
  59. else
  60. echo "Cannot match Your IP against hostname ${SAN}"
  61. fi
  62. else
  63. echo "No A record for ${SAN} found"
  64. fi
  65. done
  66. acme-client \
  67. -v -e -b -N -n \
  68. -f ${ACME_BASE}/acme/private/account.key \
  69. -k ${ACME_BASE}/acme/private/privkey.pem \
  70. -c ${ACME_BASE}/acme \
  71. ${MAILCOW_HOSTNAME} ${CONFIG_DOMAINS[*]} ${ADDITIONAL_VALIDATED_SAN[*]}
  72. case "$?" in
  73. 0) # new certs
  74. # cp the new certificates and keys
  75. cp ${ACME_BASE}/acme/fullchain.pem ${ACME_BASE}/cert.pem
  76. cp ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/key.pem
  77. # restart docker containers
  78. restart_containers ${CONTAINERS_RESTART}
  79. ;;
  80. 1) # failure
  81. exit 1;;
  82. 2) # no change
  83. ;;
  84. *) # unspecified
  85. exit 1;;
  86. esac
  87. echo "ACME certificate validation done. Sleeping for another day."
  88. sleep 86400
  89. done