Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Failing after 10m14s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Has been skipped
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
Security Vulnerability Scan / Check for Dependency Changes (push) Failing after 11m25s
Security Vulnerability Scan / Composer Security Audit (push) Has been cancelled
- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
7.3 KiB
7.3 KiB
Redis Stack
External Redis Stack for the Custom PHP Framework application.
Overview
This Redis Stack provides:
- Cache Backend: Application-level caching (sessions, query results, objects)
- Queue Backend: Background job queue storage
- Session Storage: User session persistence
- Rate Limiting: Request rate limiting storage
Architecture Pattern: Following the same external stack pattern as PostgreSQL for consistency and separation of concerns.
Quick Start
# 1. Create environment configuration
cp .env.example .env
# 2. Set Redis password
echo "REDIS_PASSWORD=$(openssl rand -base64 32)" >> .env
# 3. Create app-internal network (if not exists)
docker network create app-internal
# 4. Start Redis Stack
docker compose up -d
# 5. Verify health
docker compose ps
docker compose exec redis-stack redis-cli ping
# Expected: PONG
Configuration
Environment Variables
REDIS_PASSWORD=your-secure-password # Required for production
TZ=Europe/Berlin # Timezone for logs
Redis Configuration
Redis configuration is in redis.conf with production-optimized settings:
Persistence:
- RDB Snapshots: 15min/5min/1min intervals
- AOF (Append Only File):
everysecfsync policy - Combined persistence for data durability
Memory Management:
- Max Memory: 512MB (configurable)
- Eviction Policy:
allkeys-lru(Least Recently Used) - Lazy freeing for async deletion
Performance:
- TCP keepalive: 300s
- Active rehashing enabled
- Optimized client output buffers
Security
Password Protection:
# Set via Docker Secrets (recommended)
echo "your-redis-password" | docker secret create redis_password -
# Or via environment variable
REDIS_PASSWORD=your-password docker compose up -d
Network Isolation:
- Only accessible via
app-internalDocker network - Not exposed to public internet
- Protected mode enabled
Health Monitoring
# Check Redis health
docker compose exec redis-stack redis-cli ping
# Get Redis info
docker compose exec redis-stack redis-cli info
# Monitor real-time activity
docker compose exec redis-stack redis-cli monitor
# Check memory usage
docker compose exec redis-stack redis-cli info memory
# View slow queries
docker compose exec redis-stack redis-cli slowlog get 10
Integration with Application Stack
Production Setup
# In application root directory
docker compose \
-f docker-compose.base.yml \
-f docker-compose.production.yml \
-f docker-compose.postgres-override.yml \
-f docker-compose.redis-override.yml \
up -d
Application Environment Variables
REDIS_HOST=redis-stack # Container name from this stack
REDIS_PORT=6379
REDIS_PASSWORD=your-password # Same as Redis Stack password
Maintenance
Backup
Redis persistence is handled automatically via:
- RDB: Snapshot backups in
/data/dump.rdb - AOF: Append-only log in
/data/appendonly.aof
Manual Backup:
# Trigger immediate RDB snapshot
docker compose exec redis-stack redis-cli BGSAVE
# Copy backup files
docker cp redis-stack:/data/dump.rdb ./backups/redis-$(date +%Y%m%d).rdb
Restore
# Stop Redis
docker compose stop redis-stack
# Restore backup
docker cp ./backups/redis-backup.rdb redis-stack:/data/dump.rdb
# Start Redis
docker compose start redis-stack
Cleanup
# Clear specific database
docker compose exec redis-stack redis-cli -n 0 FLUSHDB
# Clear all databases (DANGEROUS!)
docker compose exec redis-stack redis-cli FLUSHALL
# Remove old AOF/RDB files
docker compose exec redis-stack sh -c "rm -f /data/*.aof.old /data/*.rdb.old"
Performance Tuning
Memory Optimization
# Check memory fragmentation
docker compose exec redis-stack redis-cli info memory | grep fragmentation
# Defragment if needed (Redis 4.0+)
docker compose exec redis-stack redis-cli MEMORY PURGE
Connection Limits
Adjust maxclients in redis.conf based on your application needs:
maxclients 10000 # Default, increase if needed
Persistence Trade-offs
For Cache-Only Usage:
# Disable persistence for maximum performance
save ""
appendonly no
For Critical Data:
# More frequent snapshots
save 300 1
save 60 10
appendfsync always # Slower but safest
Troubleshooting
Connection Issues
# Test connection from application container
docker exec php sh -c 'redis-cli -h redis-stack -a $REDIS_PASSWORD ping'
# Check network connectivity
docker network inspect app-internal
Memory Issues
# Check current memory usage
docker compose exec redis-stack redis-cli info memory
# View evicted keys
docker compose exec redis-stack redis-cli info stats | grep evicted
# Increase memory limit (edit docker-compose.yml)
# deploy.resources.limits.memory: 1G
Performance Issues
# Check slow queries
docker compose exec redis-stack redis-cli slowlog get 10
# Monitor commands in real-time
docker compose exec redis-stack redis-cli monitor
# Analyze key patterns
docker compose exec redis-stack redis-cli --bigkeys
Architecture
Network Topology
┌─────────────────────────────────────────┐
│ app-internal Network │
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ PHP │────────▶│ redis-stack │ │
│ │ App │ │ (Cache) │ │
│ └──────────┘ └──────────────┘ │
│ │
│ ┌──────────┐ │
│ │ Queue │────────▶ │
│ │ Worker │ (Shared Redis) │
│ └──────────┘ │
│ │
└─────────────────────────────────────────┘
Data Separation
Database Indexes:
- DB 0: Application cache (default)
- DB 1: Session storage
- DB 2: Queue backend
- DB 3: Rate limiting
- DB 4-15: Available for other uses
Best Practices
- Always use passwords in production
- Monitor memory usage - set appropriate
maxmemorylimit - Enable persistence for critical data (sessions, queue)
- Regular backups if using Redis as primary data store
- Network isolation - never expose Redis port publicly
- Health checks - monitor Redis availability
- Resource limits - set Docker memory limits
- Logging - check Redis logs for issues
Related Documentation
- Application Docker Compose
- Redis Override Configuration
- PostgreSQL Stack (similar pattern)
- Redis Official Documentation
Support
For issues or questions:
- Check Redis logs:
docker compose logs redis-stack - Test connectivity:
docker compose exec redis-stack redis-cli ping - Review configuration:
docker compose exec redis-stack redis-cli config get '*'