docker-entrypoint.sh 2.6 KB

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