From e1a22d5f4c0d5a09a819e719515a768454e34d56 Mon Sep 17 00:00:00 2001 From: Moritz Marquardt Date: Tue, 26 Mar 2024 07:47:39 +0100 Subject: [PATCH] Make it possible to actually use redis for caching through the config flags --- cli/flags.go | 7 +++++++ config/config.go | 1 + config/setup.go | 3 +++ server/cache/redis.go | 8 ++------ server/startup.go | 30 ++++++++++++++++++++++++------ 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/cli/flags.go b/cli/flags.go index 52e1c1c..bfae93e 100644 --- a/cli/flags.go +++ b/cli/flags.go @@ -126,6 +126,13 @@ var ( EnvVars: []string{"BLACKLISTED_PATHS"}, }, + &cli.StringFlag{ + Name: "redis-url", + Value: "", + Usage: "use redis instead of the built-in memory cache (recommended)", + EnvVars: []string{"REDIS_URL"}, + }, + &cli.StringFlag{ Name: "log-level", Value: "warn", diff --git a/config/config.go b/config/config.go index 0146e0f..51a54cb 100644 --- a/config/config.go +++ b/config/config.go @@ -6,6 +6,7 @@ type Config struct { Gitea GiteaConfig Database DatabaseConfig ACME ACMEConfig + RedisURL string `default:""` } type ServerConfig struct { diff --git a/config/setup.go b/config/setup.go index 6a2aa62..9ebb9bc 100644 --- a/config/setup.go +++ b/config/setup.go @@ -54,6 +54,9 @@ func MergeConfig(ctx *cli.Context, config *Config) { mergeGiteaConfig(ctx, &config.Gitea) mergeDatabaseConfig(ctx, &config.Database) mergeACMEConfig(ctx, &config.ACME) + if ctx.IsSet("redis-url") { + config.RedisURL = ctx.String("redis-url") + } } func mergeServerConfig(ctx *cli.Context, config *ServerConfig) { diff --git a/server/cache/redis.go b/server/cache/redis.go index 3263d8d..1e5c7c9 100644 --- a/server/cache/redis.go +++ b/server/cache/redis.go @@ -36,13 +36,9 @@ func (r *RedisCache) Remove(key string) { } } -func NewRedisCache() ICache { +func NewRedisCache(opts *redis.Options) ICache { return &RedisCache{ context.Background(), - redis.NewClient(&redis.Options{ - Addr: "localhost:6379", - Password: "", // no password set - DB: 0, // use default DB - }), + redis.NewClient(opts), } } diff --git a/server/startup.go b/server/startup.go index a639e37..98c8c62 100644 --- a/server/startup.go +++ b/server/startup.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "github.com/OrlovEvgeny/go-mcache" + "github.com/redis/go-redis/v9" "net" "net/http" "os" @@ -71,16 +72,33 @@ func Serve(ctx *cli.Context) error { } defer closeFn() + // keyCache stores the parsed certificate objects (Redis is no advantage here) keyCache := mcache.New() - challengeCache := cache.NewInMemoryCache() - // canonicalDomainCache stores canonical domains - canonicalDomainCache := cache.NewInMemoryCache() - // dnsLookupCache stores DNS lookups for custom domains + // dnsLookupCache stores DNS lookups for custom domains (Redis is no advantage here) dnsLookupCache := mcache.New() + + var redisErr error = nil + createCache := func() cache.ICache { + if cfg.RedisURL != "" { + opts, err := redis.ParseURL(cfg.RedisURL) + if err != nil { + redisErr = err + } + return cache.NewRedisCache(opts) + } + return cache.NewInMemoryCache() + } + // challengeCache stores the certificate challenges + challengeCache := createCache() + // canonicalDomainCache stores canonical domains + canonicalDomainCache := createCache() // redirectsCache stores redirects in _redirects files - redirectsCache := cache.NewInMemoryCache() + redirectsCache := createCache() // clientResponseCache stores responses from the Gitea server - clientResponseCache := cache.NewInMemoryCache() + clientResponseCache := createCache() + if redisErr != nil { + return redisErr + } giteaClient, err := gitea.NewClient(cfg.Gitea, clientResponseCache) if err != nil {