Redis Configuration Consolidation

2026-05-04 update. A second consolidation pass landed alongside the
Solid Cache/Cable revert: production Redis credentials moved into Rails
encrypted credentials (bin/rails credentials:editproduction.redis.*),
and RedisConfig now points every service (sessions, geocoder, ActionCable,
Sidekiq, Rails.cache, api_cache) at a single Vultr Redis instance instead of
splitting cache databases onto local Redis. The redis_sidekiq.yml and
redis_geocoder.yml files are removed. The historical record below
describes the original 2025 consolidation.

Overview

Consolidated three separate Redis configuration files into a single, maintainable configuration with a helper class for URL generation.

Problem Solved

  • Before: 3 separate Redis config files with nearly identical URLs
  • After: 1 consolidated config file with a helper class for clean URL generation

Files Changed

New Files

  • config/redis_consolidated.yml - Single Redis configuration
  • lib/redis_config.rb - Helper class for URL generation
  • config/initializers/action_cable.rb - Programmatic Action Cable configuration
  • config/initializers/redis_cache.rb - Redis-based cache configuration
  • script/test_action_cable.rb - Action Cable configuration test
  • script/test_redis_cache.rb - Redis cache configuration test

Updated Files

  • config/initializers/200_session_store.rb - Uses RedisConfig.sessions_url
  • config/initializers/sidekiq.rb - Uses RedisConfig.sidekiq_url
  • config/initializers/250_geocoder.rb - Uses RedisConfig.connection_options_for(database: 1)
  • app/models/api/image.rb - Uses Redis cache instead of MemCacheStore
  • config/deploy.rb - Updated to use consolidated config
  • script/test_redis_sessions.rb - Uses new helper

Files to Remove (After Migration)

  • config/redis.yml (removed)
  • config/redis_sidekiq.yml (removed 2026-05-04)
  • config/redis_geocoder.yml (removed 2026-05-04)
  • config/cable.yml (removed 2026-05-04, replaced by action_cable.rb)

Database Assignments

Database Service Purpose
0 Sessions Rails session storage
1 Geocoder Location caching
2 Action Cable WebSocket connections
3 Sidekiq Background jobs
4 Rails Cache Fragment caching, view caching
5 API Cache cached_resource, API responses

Configuration Structure

# config/redis_consolidated.yml — production reads from credentials
default: &default
  host: 127.0.0.1
  port: 6379
  username:
  password:
  ssl: false

production:
  host: <%= Heatwave::Configuration.fetch(:redis, :host) %>
  port: <%= Heatwave::Configuration.fetch(:redis, :port) %>
  username: <%= Heatwave::Configuration.fetch(:redis, :username) %>
  password: <%= Heatwave::Configuration.fetch(:redis, :password) %>
  ssl: <%= Heatwave::Configuration.fetch(:redis, :ssl) %>

staging:
  host: 127.0.0.1
  port: 6379
  username: entreat8GRANDAM-ply
  password: 
  ssl: false

development:
  <<: *default
  host: 127.0.0.1
  port: 6379
  username: 
  password: 
  ssl: false

Usage Examples

# Get URL for specific database
RedisConfig.sessions_url     # Database 0
RedisConfig.geocoder_url     # Database 1
RedisConfig.action_cable_url # Database 2
RedisConfig.sidekiq_url      # Database 3

# Get connection options
RedisConfig.connection_options_for(database: 1)

# Custom database
RedisConfig.url_for(database: 5)

Benefits

1. Maintainability

  • Single source of truth for Redis configuration
  • Easy to update credentials or host information
  • No more URL parsing or string manipulation

2. Consistency

  • All Redis connections use the same helper
  • Consistent error handling and fallbacks
  • Standardized configuration loading

3. Flexibility

  • Easy to add new Redis databases
  • Simple to change database assignments
  • Support for both URL and connection options

4. Error Prevention

  • No more manual URL construction
  • Automatic handling of SSL/authentication
  • Centralized fallback configuration

Migration Steps

1. Deploy New Configuration

# Deploy the new files
git add config/redis_consolidated.yml lib/redis_config.rb
git commit -m "Add consolidated Redis configuration"
git push

2. Update Production

# On production server
cap production deploy

3. Verify Configuration

# Test the new configuration
rails runner script/test_redis_sessions.rb

4. Remove Old Files (After Verification)

# Remove old configuration files
rm config/redis.yml
rm config/redis_sidekiq.yml
rm config/redis_geocoder.yml

# Update deploy.rb to remove old linked files
git add config/deploy.rb
git commit -m "Remove old Redis configuration files"
git push

Testing

1. Session Store

rails runner script/test_redis_sessions.rb

2. Sidekiq

# Check Sidekiq can connect
rails runner "puts RedisConfig.sidekiq_url"

3. Geocoder

# Test geocoder Redis connection
rails runner "puts RedisConfig.connection_options_for(database: 1)"

4. Action Cable

# Test Action Cable configuration
rails runner script/test_action_cable.rb

5. Redis Cache

# Test Redis cache configuration
rails runner script/test_redis_cache.rb

Rollback Plan

If issues arise, revert to individual config files:

  1. Restore old configuration files
  2. Revert initializer changes
  3. Update deploy.rb to link old files
  4. Deploy rollback

Monitoring

Redis Database Usage

# Check database usage via Ruby Redis client — keeps creds out of process args
mise exec -- bin/rails runner '
  redis = Redis.new(url: RedisConfig.sessions_url)
  puts redis.info("keyspace")
'

Connection Testing

# Ping each logical database via the consolidated config
mise exec -- bin/rails runner '
  [
    [0, RedisConfig.sessions_url],
    [1, RedisConfig.geocoder_url],
    [2, RedisConfig.action_cable_url],
    [3, RedisConfig.sidekiq_url],
    [4, RedisConfig.rails_cache_url],
    [5, RedisConfig.api_cache_url]
  ].each { |db, url| puts "db=#{db}: #{Redis.new(url: url).ping}" }
'

This consolidation makes Redis configuration much cleaner, more maintainable, and less error-prone while providing a solid foundation for future Redis usage.