config.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package config
  2. import (
  3. "log"
  4. "time"
  5. "github.com/joeshaw/envdecode"
  6. )
  7. // Conf is the configuration for the Go server
  8. type Conf struct {
  9. Debug bool `env:"DEBUG,default=false"`
  10. Server ServerConf
  11. Db DBConf
  12. K8s K8sConf
  13. Redis RedisConf
  14. Capabilities CapConf
  15. }
  16. // ServerConf is the server configuration
  17. type ServerConf struct {
  18. ServerURL string `env:"SERVER_URL,default=http://localhost:8080"`
  19. Port int `env:"SERVER_PORT,default=8080"`
  20. StaticFilePath string `env:"STATIC_FILE_PATH,default=/porter/static"`
  21. CookieName string `env:"COOKIE_NAME,default=porter"`
  22. CookieSecrets []string `env:"COOKIE_SECRETS,default=random_hash_key_;random_block_key"`
  23. TokenGeneratorSecret string `env:"TOKEN_GENERATOR_SECRET,default=secret"`
  24. TimeoutRead time.Duration `env:"SERVER_TIMEOUT_READ,default=5s"`
  25. TimeoutWrite time.Duration `env:"SERVER_TIMEOUT_WRITE,default=10s"`
  26. TimeoutIdle time.Duration `env:"SERVER_TIMEOUT_IDLE,default=15s"`
  27. IsLocal bool `env:"IS_LOCAL,default=false"`
  28. IsTesting bool `env:"IS_TESTING,default=false"`
  29. AppRootDomain string `env:"APP_ROOT_DOMAIN,default=porter.run"`
  30. DefaultApplicationHelmRepoURL string `env:"HELM_APP_REPO_URL,default=https://charts.dev.getporter.dev"`
  31. DefaultAddonHelmRepoURL string `env:"HELM_ADD_ON_REPO_URL,default=https://chart-addons.dev.getporter.dev"`
  32. BasicLoginEnabled bool `env:"BASIC_LOGIN_ENABLED,default=true"`
  33. GithubClientID string `env:"GITHUB_CLIENT_ID"`
  34. GithubClientSecret string `env:"GITHUB_CLIENT_SECRET"`
  35. GithubLoginEnabled bool `env:"GITHUB_LOGIN_ENABLED,default=true"`
  36. GithubAppClientID string `env:"GITHUB_APP_CLIENT_ID"`
  37. GithubAppClientSecret string `env:"GITHUB_APP_CLIENT_SECRET"`
  38. GithubAppName string `env:"GITHUB_APP_NAME"`
  39. GithubAppWebhookSecret string `env:"GITHUB_APP_WEBHOOK_SECRET"`
  40. GithubAppID string `env:"GITHUB_APP_ID"`
  41. GithubAppSecretPath string `env:"GITHUB_APP_SECRET_PATH"`
  42. GoogleClientID string `env:"GOOGLE_CLIENT_ID"`
  43. GoogleClientSecret string `env:"GOOGLE_CLIENT_SECRET"`
  44. GoogleRestrictedDomain string `env:"GOOGLE_RESTRICTED_DOMAIN"`
  45. SendgridAPIKey string `env:"SENDGRID_API_KEY"`
  46. SendgridPWResetTemplateID string `env:"SENDGRID_PW_RESET_TEMPLATE_ID"`
  47. SendgridPWGHTemplateID string `env:"SENDGRID_PW_GH_TEMPLATE_ID"`
  48. SendgridVerifyEmailTemplateID string `env:"SENDGRID_VERIFY_EMAIL_TEMPLATE_ID"`
  49. SendgridProjectInviteTemplateID string `env:"SENDGRID_INVITE_TEMPLATE_ID"`
  50. SendgridSenderEmail string `env:"SENDGRID_SENDER_EMAIL"`
  51. SlackClientID string `env:"SLACK_CLIENT_ID"`
  52. SlackClientSecret string `env:"SLACK_CLIENT_SECRET"`
  53. DOClientID string `env:"DO_CLIENT_ID"`
  54. DOClientSecret string `env:"DO_CLIENT_SECRET"`
  55. ProvisionerImageTag string `env:"PROV_IMAGE_TAG,default=latest"`
  56. ProvisionerImagePullSecret string `env:"PROV_IMAGE_PULL_SECRET"`
  57. SegmentClientKey string `env:"SEGMENT_CLIENT_KEY"`
  58. ProvisionerCluster string `env:"PROVISIONER_CLUSTER"`
  59. IngressCluster string `env:"INGRESS_CLUSTER"`
  60. SelfKubeconfig string `env:"SELF_KUBECONFIG"`
  61. }
  62. // DBConf is the database configuration: if generated from environment variables,
  63. // it assumes the default docker-compose configuration is used
  64. type DBConf struct {
  65. // EncryptionKey is the key to use for sensitive values that are encrypted at rest
  66. EncryptionKey string `env:"ENCRYPTION_KEY,default=__random_strong_encryption_key__"`
  67. Host string `env:"DB_HOST,default=postgres"`
  68. Port int `env:"DB_PORT,default=5432"`
  69. Username string `env:"DB_USER,default=porter"`
  70. Password string `env:"DB_PASS,default=porter"`
  71. DbName string `env:"DB_NAME,default=porter"`
  72. ForceSSL bool `env:"DB_FORCE_SSL,default=false"`
  73. SQLLite bool `env:"SQL_LITE,default=false"`
  74. SQLLitePath string `env:"SQL_LITE_PATH,default=/porter/porter.db"`
  75. }
  76. // K8sConf is the global configuration for the k8s agents
  77. type K8sConf struct {
  78. IsTesting bool `env:"K8S_IS_TESTING,default=false"`
  79. }
  80. type CapConf struct {
  81. Provisioner bool `env:"PROVISIONER_ENABLED,default=true"`
  82. Github bool `env:"GITHUB_ENABLED,default=true"`
  83. Google bool
  84. }
  85. // FromEnv generates a configuration from environment variables
  86. func FromEnv() *Conf {
  87. var c Conf
  88. if err := envdecode.StrictDecode(&c); err != nil {
  89. log.Fatalf("Failed to decode server conf: %s", err)
  90. }
  91. if c.Server.GoogleClientID != "" && c.Server.GoogleClientSecret != "" {
  92. c.Capabilities.Google = true
  93. }
  94. return &c
  95. }