config.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package server
  2. import (
  3. "io/fs"
  4. "net/netip"
  5. "text/template"
  6. "time"
  7. "heckel.io/ntfy/v2/user"
  8. )
  9. // Defines default config settings (excluding limits, see below)
  10. const (
  11. DefaultListenHTTP = ":80"
  12. DefaultConfigFile = "/etc/ntfy/server.yml"
  13. DefaultTemplateDir = "/etc/ntfy/templates"
  14. DefaultCacheDuration = 12 * time.Hour
  15. DefaultCacheBatchTimeout = time.Duration(0)
  16. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  17. DefaultManagerInterval = time.Minute
  18. DefaultDelayedSenderInterval = 10 * time.Second
  19. DefaultMessageDelayMin = 10 * time.Second
  20. DefaultMessageDelayMax = 3 * 24 * time.Hour
  21. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  22. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  23. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  24. DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
  25. )
  26. // Defines default Web Push settings
  27. const (
  28. DefaultWebPushExpiryWarningDuration = 55 * 24 * time.Hour
  29. DefaultWebPushExpiryDuration = 60 * 24 * time.Hour
  30. )
  31. // Defines all global and per-visitor limits
  32. // - message size limit: the max number of bytes for a message
  33. // - total topic limit: max number of topics overall
  34. // - various attachment limits
  35. const (
  36. DefaultMessageSizeLimit = 4096 // Bytes; note that FCM/APNS have a limit of ~4 KB for the entire message
  37. DefaultTotalTopicLimit = 15000
  38. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  39. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  40. DefaultAttachmentExpiryDuration = 3 * time.Hour
  41. )
  42. // Defines all per-visitor limits
  43. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  44. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  45. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  46. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  47. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  48. const (
  49. DefaultVisitorSubscriptionLimit = 30
  50. DefaultVisitorRequestLimitBurst = 60
  51. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  52. DefaultVisitorMessageDailyLimit = 0
  53. DefaultVisitorEmailLimitBurst = 16
  54. DefaultVisitorEmailLimitReplenish = time.Hour
  55. DefaultVisitorAccountCreationLimitBurst = 3
  56. DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
  57. DefaultVisitorAuthFailureLimitBurst = 30
  58. DefaultVisitorAuthFailureLimitReplenish = time.Minute
  59. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  60. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  61. DefaultVisitorPrefixBitsIPv4 = 32 // Use the entire IPv4 address for rate limiting
  62. DefaultVisitorPrefixBitsIPv6 = 64 // Use /64 for IPv6 rate limiting
  63. )
  64. var (
  65. // DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
  66. DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
  67. // DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
  68. // extended using the server.yml config. If updated, also update in Android and web app.
  69. DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
  70. )
  71. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  72. type Config struct {
  73. File string // Config file, only used for testing
  74. BaseURL string
  75. ListenHTTP string
  76. ListenHTTPS string
  77. ListenUnix string
  78. ListenUnixMode fs.FileMode
  79. KeyFile string
  80. CertFile string
  81. FirebaseKeyFile string
  82. CacheFile string
  83. CacheDuration time.Duration
  84. CacheStartupQueries string
  85. CacheBatchSize int
  86. CacheBatchTimeout time.Duration
  87. AuthFile string
  88. AuthStartupQueries string
  89. AuthDefault user.Permission
  90. AuthUsers []*user.User
  91. AuthAccess map[string][]*user.Grant
  92. AuthTokens map[string][]*user.Token
  93. AuthBcryptCost int
  94. AuthStatsQueueWriterInterval time.Duration
  95. AttachmentCacheDir string
  96. AttachmentTotalSizeLimit int64
  97. AttachmentFileSizeLimit int64
  98. AttachmentExpiryDuration time.Duration
  99. TemplateDir string // Directory to load named templates from
  100. KeepaliveInterval time.Duration
  101. ManagerInterval time.Duration
  102. DisallowedTopics []string
  103. WebRoot string // empty to disable
  104. DelayedSenderInterval time.Duration
  105. FirebaseKeepaliveInterval time.Duration
  106. FirebasePollInterval time.Duration
  107. FirebaseQuotaExceededPenaltyDuration time.Duration
  108. UpstreamBaseURL string
  109. UpstreamAccessToken string
  110. SMTPSenderAddr string
  111. SMTPSenderUser string
  112. SMTPSenderPass string
  113. SMTPSenderFrom string
  114. SMTPServerListen string
  115. SMTPServerDomain string
  116. SMTPServerAddrPrefix string
  117. TwilioAccount string
  118. TwilioAuthToken string
  119. TwilioPhoneNumber string
  120. TwilioCallsBaseURL string
  121. TwilioVerifyBaseURL string
  122. TwilioVerifyService string
  123. TwilioCallFormat *template.Template
  124. MetricsEnable bool
  125. MetricsListenHTTP string
  126. ProfileListenHTTP string
  127. MessageDelayMin time.Duration
  128. MessageDelayMax time.Duration
  129. MessageSizeLimit int
  130. TotalTopicLimit int
  131. TotalAttachmentSizeLimit int64
  132. VisitorSubscriptionLimit int
  133. VisitorAttachmentTotalSizeLimit int64
  134. VisitorAttachmentDailyBandwidthLimit int64
  135. VisitorRequestLimitBurst int
  136. VisitorRequestLimitReplenish time.Duration
  137. VisitorRequestExemptPrefixes []netip.Prefix
  138. VisitorMessageDailyLimit int
  139. VisitorEmailLimitBurst int
  140. VisitorEmailLimitReplenish time.Duration
  141. VisitorAccountCreationLimitBurst int
  142. VisitorAccountCreationLimitReplenish time.Duration
  143. VisitorAuthFailureLimitBurst int
  144. VisitorAuthFailureLimitReplenish time.Duration
  145. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  146. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  147. VisitorPrefixBitsIPv4 int // Number of bits for IPv4 rate limiting (default: 32)
  148. VisitorPrefixBitsIPv6 int // Number of bits for IPv6 rate limiting (default: 64)
  149. BehindProxy bool // If true, the server will trust the proxy client IP header to determine the client IP address (IPv4 and IPv6 supported)
  150. ProxyForwardedHeader string // The header field to read the real/client IP address from, if BehindProxy is true, defaults to "X-Forwarded-For" (IPv4 and IPv6 supported)
  151. ProxyTrustedPrefixes []netip.Prefix // List of trusted proxy networks (IPv4 or IPv6) that will be stripped from the Forwarded header if BehindProxy is true
  152. StripeSecretKey string
  153. StripeWebhookKey string
  154. StripePriceCacheDuration time.Duration
  155. BillingContact string
  156. EnableSignup bool // Enable creation of accounts via API and UI
  157. EnableLogin bool
  158. RequireLogin bool
  159. EnableReservations bool // Allow users with role "user" to own/reserve topics
  160. EnableMetrics bool
  161. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  162. WebPushPrivateKey string
  163. WebPushPublicKey string
  164. WebPushFile string
  165. WebPushEmailAddress string
  166. WebPushStartupQueries string
  167. WebPushExpiryDuration time.Duration
  168. WebPushExpiryWarningDuration time.Duration
  169. Version string // injected by App
  170. }
  171. // NewConfig instantiates a default new server config
  172. func NewConfig() *Config {
  173. return &Config{
  174. File: DefaultConfigFile, // Only used for testing
  175. BaseURL: "",
  176. ListenHTTP: DefaultListenHTTP,
  177. ListenHTTPS: "",
  178. ListenUnix: "",
  179. ListenUnixMode: 0,
  180. KeyFile: "",
  181. CertFile: "",
  182. FirebaseKeyFile: "",
  183. CacheFile: "",
  184. CacheDuration: DefaultCacheDuration,
  185. CacheStartupQueries: "",
  186. CacheBatchSize: 0,
  187. CacheBatchTimeout: 0,
  188. AuthFile: "",
  189. AuthStartupQueries: "",
  190. AuthDefault: user.PermissionReadWrite,
  191. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  192. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  193. AttachmentCacheDir: "",
  194. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  195. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  196. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  197. TemplateDir: DefaultTemplateDir,
  198. KeepaliveInterval: DefaultKeepaliveInterval,
  199. ManagerInterval: DefaultManagerInterval,
  200. DisallowedTopics: DefaultDisallowedTopics,
  201. WebRoot: "/",
  202. DelayedSenderInterval: DefaultDelayedSenderInterval,
  203. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  204. FirebasePollInterval: DefaultFirebasePollInterval,
  205. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  206. UpstreamBaseURL: "",
  207. UpstreamAccessToken: "",
  208. SMTPSenderAddr: "",
  209. SMTPSenderUser: "",
  210. SMTPSenderPass: "",
  211. SMTPSenderFrom: "",
  212. SMTPServerListen: "",
  213. SMTPServerDomain: "",
  214. SMTPServerAddrPrefix: "",
  215. TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
  216. TwilioAccount: "",
  217. TwilioAuthToken: "",
  218. TwilioPhoneNumber: "",
  219. TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
  220. TwilioVerifyService: "",
  221. TwilioCallFormat: nil,
  222. MessageSizeLimit: DefaultMessageSizeLimit,
  223. MessageDelayMin: DefaultMessageDelayMin,
  224. MessageDelayMax: DefaultMessageDelayMax,
  225. TotalTopicLimit: DefaultTotalTopicLimit,
  226. TotalAttachmentSizeLimit: 0,
  227. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  228. VisitorSubscriberRateLimiting: false,
  229. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  230. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  231. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  232. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  233. VisitorRequestExemptPrefixes: make([]netip.Prefix, 0),
  234. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  235. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  236. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  237. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  238. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  239. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  240. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  241. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  242. VisitorPrefixBitsIPv4: DefaultVisitorPrefixBitsIPv4, // Default: use full IPv4 address
  243. VisitorPrefixBitsIPv6: DefaultVisitorPrefixBitsIPv6, // Default: use /64 for IPv6
  244. BehindProxy: false, // If true, the server will trust the proxy client IP header to determine the client IP address
  245. ProxyForwardedHeader: "X-Forwarded-For", // Default header for reverse proxy client IPs
  246. StripeSecretKey: "",
  247. StripeWebhookKey: "",
  248. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  249. BillingContact: "",
  250. EnableSignup: false,
  251. EnableLogin: false,
  252. EnableReservations: false,
  253. RequireLogin: false,
  254. AccessControlAllowOrigin: "*",
  255. Version: "",
  256. WebPushPrivateKey: "",
  257. WebPushPublicKey: "",
  258. WebPushFile: "",
  259. WebPushEmailAddress: "",
  260. WebPushExpiryDuration: DefaultWebPushExpiryDuration,
  261. WebPushExpiryWarningDuration: DefaultWebPushExpiryWarningDuration,
  262. }
  263. }