ntfy/server/config.go

232 lines
12 KiB
Go
Raw Normal View History

2021-12-19 04:02:36 +01:00
package server
2021-10-24 04:49:50 +02:00
import (
"heckel.io/ntfy/user"
"io/fs"
"net/netip"
2021-10-24 04:49:50 +02:00
"time"
)
2022-01-13 00:52:07 +01:00
// Defines default config settings (excluding limits, see below)
const (
2022-06-01 05:27:24 +02:00
DefaultListenHTTP = ":80"
DefaultCacheDuration = 12 * time.Hour
DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
DefaultManagerInterval = time.Minute
DefaultDelayedSenderInterval = 10 * time.Second
DefaultMinDelay = 10 * time.Second
DefaultMaxDelay = 3 * 24 * time.Hour
DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
2023-02-09 04:57:10 +01:00
DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
2021-10-24 04:49:50 +02:00
)
2022-01-13 00:52:07 +01:00
// Defines all global and per-visitor limits
// - message size limit: the max number of bytes for a message
2022-01-04 00:55:08 +01:00
// - total topic limit: max number of topics overall
2022-01-13 00:52:07 +01:00
// - various attachment limits
const (
DefaultMessageLengthLimit = 4096 // Bytes
DefaultTotalTopicLimit = 15000
2022-01-13 03:24:48 +01:00
DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
2022-01-13 00:52:07 +01:00
DefaultAttachmentExpiryDuration = 3 * time.Hour
)
// Defines all per-visitor limits
2022-01-04 00:55:08 +01:00
// - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
2022-02-14 23:07:17 +01:00
// - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
2021-12-24 00:03:04 +01:00
// - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
2022-01-13 00:52:07 +01:00
// - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
2022-01-13 03:24:48 +01:00
// - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
const (
2022-01-13 03:24:48 +01:00
DefaultVisitorSubscriptionLimit = 30
DefaultVisitorRequestLimitBurst = 60
2022-02-14 23:07:17 +01:00
DefaultVisitorRequestLimitReplenish = 5 * time.Second
2023-01-27 04:57:18 +01:00
DefaultVisitorMessageDailyLimit = 0
2022-01-13 03:24:48 +01:00
DefaultVisitorEmailLimitBurst = 16
DefaultVisitorEmailLimitReplenish = time.Hour
DefaultVisitorAccountCreationLimitBurst = 3
DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
DefaultVisitorAuthFailureLimitBurst = 30
2023-02-08 21:20:44 +01:00
DefaultVisitorAuthFailureLimitReplenish = time.Minute
2022-01-13 03:24:48 +01:00
DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
)
2023-01-11 04:51:51 +01:00
var (
// DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
2023-02-09 14:32:51 +01:00
// DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
// extended using the server.yml config. If updated, also update in Android and web app.
DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
2023-01-11 04:51:51 +01:00
)
// Config is the main config struct for the application. Use New to instantiate a default config struct.
type Config struct {
2023-02-08 21:20:44 +01:00
File string // Config file, only used for testing
2022-01-13 03:24:48 +01:00
BaseURL string
ListenHTTP string
ListenHTTPS string
2022-01-15 02:16:12 +01:00
ListenUnix string
ListenUnixMode fs.FileMode
2022-01-13 03:24:48 +01:00
KeyFile string
CertFile string
FirebaseKeyFile string
CacheFile string
CacheDuration time.Duration
2022-06-23 17:02:45 +02:00
CacheStartupQueries string
2022-11-16 16:28:20 +01:00
CacheBatchSize int
CacheBatchTimeout time.Duration
2022-01-23 05:01:20 +01:00
AuthFile string
2023-01-05 21:20:44 +01:00
AuthStartupQueries string
AuthDefault user.Permission
2023-01-28 15:03:14 +01:00
AuthBcryptCost int
2023-01-29 02:29:06 +01:00
AuthStatsQueueWriterInterval time.Duration
2022-01-13 03:24:48 +01:00
AttachmentCacheDir string
AttachmentTotalSizeLimit int64
AttachmentFileSizeLimit int64
AttachmentExpiryDuration time.Duration
KeepaliveInterval time.Duration
ManagerInterval time.Duration
2023-02-09 14:32:51 +01:00
DisallowedTopics []string
2023-05-01 17:58:49 +02:00
WebRoot string // empty to disable
DelayedSenderInterval time.Duration
2022-01-13 03:24:48 +01:00
FirebaseKeepaliveInterval time.Duration
FirebasePollInterval time.Duration
2022-06-01 05:27:24 +02:00
FirebaseQuotaExceededPenaltyDuration time.Duration
2022-05-28 02:30:20 +02:00
UpstreamBaseURL string
2023-05-18 19:08:10 +02:00
UpstreamAccessToken string
2022-01-13 03:24:48 +01:00
SMTPSenderAddr string
SMTPSenderUser string
SMTPSenderPass string
SMTPSenderFrom string
SMTPServerListen string
SMTPServerDomain string
SMTPServerAddrPrefix string
2023-05-05 22:22:54 +02:00
TwilioAccount string
TwilioAuthToken string
TwilioPhoneNumber string
2023-05-16 20:15:58 +02:00
TwilioCallsBaseURL string
2023-05-11 19:50:10 +02:00
TwilioVerifyBaseURL string
TwilioVerifyService string
MetricsEnable bool
MetricsListenHTTP string
2023-03-28 20:41:16 +02:00
ProfileListenHTTP string
2022-01-13 03:24:48 +01:00
MessageLimit int
MinDelay time.Duration
MaxDelay time.Duration
TotalTopicLimit int
TotalAttachmentSizeLimit int64
VisitorSubscriptionLimit int
VisitorAttachmentTotalSizeLimit int64
VisitorAttachmentDailyBandwidthLimit int64
2022-01-13 03:24:48 +01:00
VisitorRequestLimitBurst int
VisitorRequestLimitReplenish time.Duration
VisitorRequestExemptIPAddrs []netip.Prefix
2023-01-27 04:57:18 +01:00
VisitorMessageDailyLimit int
2022-01-13 03:24:48 +01:00
VisitorEmailLimitBurst int
VisitorEmailLimitReplenish time.Duration
VisitorAccountCreationLimitBurst int
VisitorAccountCreationLimitReplenish time.Duration
2023-02-08 21:20:44 +01:00
VisitorAuthFailureLimitBurst int
VisitorAuthFailureLimitReplenish time.Duration
2023-01-11 04:51:51 +01:00
VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
2023-03-04 02:23:18 +01:00
VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
2022-01-13 03:24:48 +01:00
BehindProxy bool
StripeSecretKey string
2023-01-14 12:43:44 +01:00
StripeWebhookKey string
2023-01-18 21:50:06 +01:00
StripePriceCacheDuration time.Duration
2023-02-28 20:38:31 +01:00
BillingContact string
2023-01-05 21:20:44 +01:00
EnableSignup bool // Enable creation of accounts via API and UI
2022-12-15 05:11:22 +01:00
EnableLogin bool
EnableReservations bool // Allow users with role "user" to own/reserve topics
EnableMetrics bool
2023-01-18 21:50:06 +01:00
AccessControlAllowOrigin string // CORS header field to restrict access from web clients
Version string // injected by App
}
// NewConfig instantiates a default new server config
2021-12-22 14:17:50 +01:00
func NewConfig() *Config {
return &Config{
2023-02-08 21:20:44 +01:00
File: "", // Only used for testing
2022-01-13 03:24:48 +01:00
BaseURL: "",
ListenHTTP: DefaultListenHTTP,
ListenHTTPS: "",
2022-01-15 02:16:12 +01:00
ListenUnix: "",
2022-07-04 01:33:01 +02:00
ListenUnixMode: 0,
2022-01-13 03:24:48 +01:00
KeyFile: "",
CertFile: "",
FirebaseKeyFile: "",
CacheFile: "",
CacheDuration: DefaultCacheDuration,
2023-01-18 21:50:06 +01:00
CacheStartupQueries: "",
2022-11-16 16:28:20 +01:00
CacheBatchSize: 0,
CacheBatchTimeout: 0,
2022-01-23 05:01:20 +01:00
AuthFile: "",
2023-01-18 21:50:06 +01:00
AuthStartupQueries: "",
2023-02-09 04:57:10 +01:00
AuthDefault: user.PermissionReadWrite,
2023-01-28 15:03:14 +01:00
AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
2023-01-29 02:29:06 +01:00
AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
2022-01-13 03:24:48 +01:00
AttachmentCacheDir: "",
AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
KeepaliveInterval: DefaultKeepaliveInterval,
ManagerInterval: DefaultManagerInterval,
2023-02-09 21:24:12 +01:00
DisallowedTopics: DefaultDisallowedTopics,
2023-05-01 17:58:49 +02:00
WebRoot: "/",
2022-06-01 05:27:24 +02:00
DelayedSenderInterval: DefaultDelayedSenderInterval,
2022-01-13 03:24:48 +01:00
FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
FirebasePollInterval: DefaultFirebasePollInterval,
2022-06-01 05:27:24 +02:00
FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
2023-01-18 21:50:06 +01:00
UpstreamBaseURL: "",
2023-05-18 19:08:10 +02:00
UpstreamAccessToken: "",
2023-01-18 21:50:06 +01:00
SMTPSenderAddr: "",
SMTPSenderUser: "",
SMTPSenderPass: "",
SMTPSenderFrom: "",
SMTPServerListen: "",
SMTPServerDomain: "",
SMTPServerAddrPrefix: "",
2023-05-16 20:15:58 +02:00
TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
2023-05-05 22:22:54 +02:00
TwilioAccount: "",
TwilioAuthToken: "",
TwilioPhoneNumber: "",
2023-05-11 19:50:10 +02:00
TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
TwilioVerifyService: "",
2023-01-18 21:50:06 +01:00
MessageLimit: DefaultMessageLengthLimit,
MinDelay: DefaultMinDelay,
MaxDelay: DefaultMaxDelay,
2022-01-13 03:24:48 +01:00
TotalTopicLimit: DefaultTotalTopicLimit,
2023-01-18 21:50:06 +01:00
TotalAttachmentSizeLimit: 0,
2022-01-13 03:24:48 +01:00
VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
2023-01-27 04:57:18 +01:00
VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
2022-01-13 03:24:48 +01:00
VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
2023-02-08 21:20:44 +01:00
VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
2023-01-11 04:51:51 +01:00
VisitorStatsResetTime: DefaultVisitorStatsResetTime,
2023-03-04 02:23:18 +01:00
VisitorSubscriberRateLimiting: false,
2022-01-13 03:24:48 +01:00
BehindProxy: false,
2023-01-18 21:50:06 +01:00
StripeSecretKey: "",
StripeWebhookKey: "",
StripePriceCacheDuration: DefaultStripePriceCacheDuration,
2023-03-04 02:23:18 +01:00
BillingContact: "",
2023-01-18 21:50:06 +01:00
EnableSignup: false,
EnableLogin: false,
EnableReservations: false,
AccessControlAllowOrigin: "*",
Version: "",
}
}