Docker template generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/go-acme/lego/v3/certcrypto"
  5. "github.com/go-acme/lego/v3/lego"
  6. "os"
  7. "strings"
  8. )
  9. const (
  10. envCertDestinationKey = "DOTEGE_CERT_DESTINATION"
  11. envCertDestinationDefault = "/data/certs/"
  12. envDnsProviderKey = "DOTEGE_DNS_PROVIDER"
  13. envAcmeEmailKey = "DOTEGE_ACME_EMAIL"
  14. envAcmeEndpointKey = "DOTEGE_ACME_ENDPOINT"
  15. envAcmeKeyTypeKey = "DOTEGE_ACME_KEY_TYPE"
  16. envAcmeKeyTypeDefault = "P384"
  17. envAcmeCacheLocationKey = "DOTEGE_ACME_CACHE_FILE"
  18. envAcmeCacheLocationDefault = "/data/config/certs.json"
  19. envSignalContainerKey = "DOTEGE_SIGNAL_CONTAINER"
  20. envSignalContainerDefault = ""
  21. envSignalTypeKey = "DOTEGE_SIGNAL_TYPE"
  22. envSignalTypeDefault = "HUP"
  23. envTemplateDestinationKey = "DOTEGE_TEMPLATE_DESTINATION"
  24. envTemplateDestinationDefault = "/data/output/haproxy.cfg"
  25. envTemplateSourceKey = "DOTEGE_TEMPLATE_SOURCE"
  26. envTemplateSourceDefault = "./templates/haproxy.cfg.tpl"
  27. envWildcardDomainsKey = "DOTEGE_WILDCARD_DOMAINS"
  28. envWildcardDomainsDefault = ""
  29. )
  30. // Config is the user-definable configuration for Dotege.
  31. type Config struct {
  32. Templates []TemplateConfig
  33. Signals []ContainerSignal
  34. Labels LabelConfig
  35. DefaultCertDestination string
  36. Acme AcmeConfig
  37. WildCardDomains []string
  38. }
  39. // TemplateConfig configures a single template for the generator.
  40. type TemplateConfig struct {
  41. Source string
  42. Destination string
  43. }
  44. // ContainerSignal describes a container that should be sent a signal when the config/certs change.
  45. type ContainerSignal struct {
  46. Name string
  47. Signal string
  48. }
  49. // LabelConfig describes the labels used for various properties.
  50. type LabelConfig struct {
  51. Hostnames string
  52. RequireAuth string
  53. }
  54. // AcmeConfig describes the configuration to use for getting certs using ACME.
  55. type AcmeConfig struct {
  56. Email string
  57. DnsProvider string
  58. Endpoint string
  59. KeyType certcrypto.KeyType
  60. CacheLocation string
  61. }
  62. func requiredVar(key string) (value string) {
  63. value, ok := os.LookupEnv(key)
  64. if !ok {
  65. panic(fmt.Errorf("required environmental variable not defined: %s", key))
  66. }
  67. return
  68. }
  69. func optionalVar(key string, fallback string) (value string) {
  70. value, ok := os.LookupEnv(key)
  71. if !ok {
  72. value = fallback
  73. }
  74. return
  75. }
  76. func createSignalConfig() []ContainerSignal {
  77. name := optionalVar(envSignalContainerKey, envSignalContainerDefault)
  78. if name == envSignalContainerDefault {
  79. return []ContainerSignal{}
  80. } else {
  81. return []ContainerSignal{
  82. {
  83. Name: name,
  84. Signal: optionalVar(envSignalTypeKey, envSignalTypeDefault),
  85. },
  86. }
  87. }
  88. }
  89. func createConfig() *Config {
  90. return &Config{
  91. Templates: []TemplateConfig{
  92. {
  93. Source: optionalVar(envTemplateSourceKey, envTemplateSourceDefault),
  94. Destination: optionalVar(envTemplateDestinationKey, envTemplateDestinationDefault),
  95. },
  96. },
  97. Labels: LabelConfig{
  98. Hostnames: "com.chameth.vhost",
  99. RequireAuth: "com.chameth.auth",
  100. },
  101. Acme: AcmeConfig{
  102. DnsProvider: requiredVar(envDnsProviderKey),
  103. Email: requiredVar(envAcmeEmailKey),
  104. Endpoint: optionalVar(envAcmeEndpointKey, lego.LEDirectoryProduction),
  105. KeyType: certcrypto.KeyType(optionalVar(envAcmeKeyTypeKey, envAcmeKeyTypeDefault)),
  106. CacheLocation: optionalVar(envAcmeCacheLocationKey, envAcmeCacheLocationDefault),
  107. },
  108. Signals: createSignalConfig(),
  109. DefaultCertDestination: optionalVar(envCertDestinationKey, envCertDestinationDefault),
  110. WildCardDomains: splitList(optionalVar(envWildcardDomainsKey, envWildcardDomainsDefault)),
  111. }
  112. }
  113. func splitList(input string) (result []string) {
  114. result = []string{}
  115. for _, part := range strings.Split(strings.ReplaceAll(input, " ", ","), ",") {
  116. if len(part) > 0 {
  117. result = append(result, part)
  118. }
  119. }
  120. return
  121. }