Add retry logic for database connection and graceful Redis handling

- Retry database connection 5 times with exponential backoff
- Allow app to start even if Redis is unavailable
- Improves startup reliability in container environments

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-11-26 20:16:47 -06:00
parent 6955aca956
commit 8feb308f94

View File

@@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"gorm.io/gorm"
"github.com/treytartt/mycrib-api/internal/config" "github.com/treytartt/mycrib-api/internal/config"
"github.com/treytartt/mycrib-api/internal/database" "github.com/treytartt/mycrib-api/internal/database"
@@ -34,10 +35,18 @@ func main() {
Int("port", cfg.Server.Port). Int("port", cfg.Server.Port).
Msg("Starting MyCrib API server") Msg("Starting MyCrib API server")
// Connect to database // Connect to database (retry with backoff)
db, err := database.Connect(&cfg.Database, cfg.Server.Debug) var db *gorm.DB
for i := 0; i < 5; i++ {
db, err = database.Connect(&cfg.Database, cfg.Server.Debug)
if err == nil {
break
}
log.Warn().Err(err).Int("attempt", i+1).Msg("Failed to connect to database, retrying...")
time.Sleep(time.Duration(i+1) * 2 * time.Second)
}
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("Failed to connect to database") log.Fatal().Err(err).Msg("Failed to connect to database after retries")
} }
defer database.Close() defer database.Close()
@@ -46,12 +55,15 @@ func main() {
log.Fatal().Err(err).Msg("Failed to run database migrations") log.Fatal().Err(err).Msg("Failed to run database migrations")
} }
// Connect to Redis // Connect to Redis (optional - don't fail if unavailable)
cache, err := services.NewCacheService(&cfg.Redis) var cache *services.CacheService
cache, err = services.NewCacheService(&cfg.Redis)
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("Failed to connect to Redis") log.Warn().Err(err).Msg("Failed to connect to Redis - caching disabled")
cache = nil
} else {
defer cache.Close()
} }
defer cache.Close()
// Initialize email service // Initialize email service
var emailService *services.EmailService var emailService *services.EmailService