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:edit→production.redis.*),
andRedisConfignow 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. Theredis_sidekiq.ymland
redis_geocoder.ymlfiles 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 configurationlib/redis_config.rb- Helper class for URL generationconfig/initializers/action_cable.rb- Programmatic Action Cable configurationconfig/initializers/redis_cache.rb- Redis-based cache configurationscript/test_action_cable.rb- Action Cable configuration testscript/test_redis_cache.rb- Redis cache configuration test
Updated Files
config/initializers/200_session_store.rb- UsesRedisConfig.sessions_urlconfig/initializers/sidekiq.rb- UsesRedisConfig.sidekiq_urlconfig/initializers/250_geocoder.rb- UsesRedisConfig.connection_options_for(database: 1)app/models/api/image.rb- Uses Redis cache instead of MemCacheStoreconfig/deploy.rb- Updated to use consolidated configscript/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 byaction_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.(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:
- Restore old configuration files
- Revert initializer changes
- Update deploy.rb to link old files
- 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.