config.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package server
  2. import (
  3. "io/fs"
  4. "net/netip"
  5. "time"
  6. )
  7. // Defines default config settings (excluding limits, see below)
  8. const (
  9. DefaultListenHTTP = ":80"
  10. DefaultCacheDuration = 12 * time.Hour
  11. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  12. DefaultManagerInterval = time.Minute
  13. DefaultDelayedSenderInterval = 10 * time.Second
  14. DefaultMinDelay = 10 * time.Second
  15. DefaultMaxDelay = 3 * 24 * time.Hour
  16. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  17. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  18. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  19. )
  20. // Defines all global and per-visitor limits
  21. // - message size limit: the max number of bytes for a message
  22. // - total topic limit: max number of topics overall
  23. // - various attachment limits
  24. const (
  25. DefaultMessageLengthLimit = 4096 // Bytes
  26. DefaultTotalTopicLimit = 15000
  27. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  28. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  29. DefaultAttachmentExpiryDuration = 3 * time.Hour
  30. )
  31. // Defines all per-visitor limits
  32. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  33. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  34. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  35. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  36. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  37. const (
  38. DefaultVisitorSubscriptionLimit = 30
  39. DefaultVisitorRequestLimitBurst = 60
  40. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  41. DefaultVisitorEmailLimitBurst = 16
  42. DefaultVisitorEmailLimitReplenish = time.Hour
  43. DefaultVisitorAccountCreateLimitBurst = 3
  44. DefaultVisitorAccountCreateLimitReplenish = 24 * time.Hour
  45. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  46. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  47. )
  48. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  49. type Config struct {
  50. BaseURL string
  51. ListenHTTP string
  52. ListenHTTPS string
  53. ListenUnix string
  54. ListenUnixMode fs.FileMode
  55. KeyFile string
  56. CertFile string
  57. FirebaseKeyFile string
  58. CacheFile string
  59. CacheDuration time.Duration
  60. CacheStartupQueries string
  61. CacheBatchSize int
  62. CacheBatchTimeout time.Duration
  63. AuthFile string
  64. AuthDefaultRead bool
  65. AuthDefaultWrite bool
  66. AttachmentCacheDir string
  67. AttachmentTotalSizeLimit int64
  68. AttachmentFileSizeLimit int64
  69. AttachmentExpiryDuration time.Duration
  70. KeepaliveInterval time.Duration
  71. ManagerInterval time.Duration
  72. WebRootIsApp bool
  73. DelayedSenderInterval time.Duration
  74. FirebaseKeepaliveInterval time.Duration
  75. FirebasePollInterval time.Duration
  76. FirebaseQuotaExceededPenaltyDuration time.Duration
  77. UpstreamBaseURL string
  78. SMTPSenderAddr string
  79. SMTPSenderUser string
  80. SMTPSenderPass string
  81. SMTPSenderFrom string
  82. SMTPServerListen string
  83. SMTPServerDomain string
  84. SMTPServerAddrPrefix string
  85. MessageLimit int
  86. MinDelay time.Duration
  87. MaxDelay time.Duration
  88. TotalTopicLimit int
  89. TotalAttachmentSizeLimit int64
  90. VisitorSubscriptionLimit int
  91. VisitorAttachmentTotalSizeLimit int64
  92. VisitorAttachmentDailyBandwidthLimit int
  93. VisitorRequestLimitBurst int
  94. VisitorRequestLimitReplenish time.Duration
  95. VisitorRequestExemptIPAddrs []netip.Prefix
  96. VisitorEmailLimitBurst int
  97. VisitorEmailLimitReplenish time.Duration
  98. VisitorAccountCreateLimitBurst int
  99. VisitorAccountCreateLimitReplenish time.Duration
  100. BehindProxy bool
  101. EnableWeb bool
  102. EnableSignup bool
  103. EnableLogin bool
  104. EnableEmailConfirm bool
  105. EnableResetPassword bool
  106. Version string // injected by App
  107. }
  108. // NewConfig instantiates a default new server config
  109. func NewConfig() *Config {
  110. return &Config{
  111. BaseURL: "",
  112. ListenHTTP: DefaultListenHTTP,
  113. ListenHTTPS: "",
  114. ListenUnix: "",
  115. ListenUnixMode: 0,
  116. KeyFile: "",
  117. CertFile: "",
  118. FirebaseKeyFile: "",
  119. CacheFile: "",
  120. CacheDuration: DefaultCacheDuration,
  121. CacheBatchSize: 0,
  122. CacheBatchTimeout: 0,
  123. AuthFile: "",
  124. AuthDefaultRead: true,
  125. AuthDefaultWrite: true,
  126. AttachmentCacheDir: "",
  127. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  128. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  129. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  130. KeepaliveInterval: DefaultKeepaliveInterval,
  131. ManagerInterval: DefaultManagerInterval,
  132. MessageLimit: DefaultMessageLengthLimit,
  133. MinDelay: DefaultMinDelay,
  134. MaxDelay: DefaultMaxDelay,
  135. DelayedSenderInterval: DefaultDelayedSenderInterval,
  136. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  137. FirebasePollInterval: DefaultFirebasePollInterval,
  138. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  139. TotalTopicLimit: DefaultTotalTopicLimit,
  140. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  141. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  142. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  143. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  144. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  145. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  146. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  147. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  148. VisitorAccountCreateLimitBurst: DefaultVisitorAccountCreateLimitBurst,
  149. VisitorAccountCreateLimitReplenish: DefaultVisitorAccountCreateLimitReplenish,
  150. BehindProxy: false,
  151. EnableWeb: true,
  152. Version: "",
  153. }
  154. }