diff --git a/config/database.php b/config/database.php index dcfe3f033179..31b0515bf351 100644 --- a/config/database.php +++ b/config/database.php @@ -191,4 +191,124 @@ ], + /* + |-------------------------------------------------------------------------- + | Valkey Databases + |-------------------------------------------------------------------------- + | + | Valkey is a BSD-licensed, high performance key-value store that is fully + | wire-compatible with Redis. Each option falls back to its "REDIS_*" + | equivalent, so existing Redis applications may adopt Valkey without any + | additional configuration by setting the "VALKEY_FROM_REDIS" option. + | + | The GLIDE client also exposes a handful of Valkey-native options: + | + | VALKEY_READ_FROM primary, prefer_replica, az_affinity, any + | VALKEY_TLS true to enable TLS/SSL for every connection + | VALKEY_AZ_AFFINITY availability zone used when read_from is "az_affinity" + | + | Further GLIDE capabilities (IAM auth, reconnect strategy, client-side + | caching, compression, clustering, and OpenTelemetry) may be enabled via + | the commented options shown below. + | + */ + + 'valkey' => [ + + 'from_redis' => env('VALKEY_FROM_REDIS', false), + + 'client' => env('VALKEY_CLIENT', 'valkey_glide'), + + 'options' => [ + 'cluster' => env('VALKEY_CLUSTER', env('REDIS_CLUSTER', 'valkey')), + 'prefix' => env('VALKEY_PREFIX', env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-')), + 'persistent' => env('VALKEY_PERSISTENT', env('REDIS_PERSISTENT', false)), + 'use_tls' => env('VALKEY_TLS', false), + 'read_from' => env('VALKEY_READ_FROM', 'primary'), + 'az_affinity' => env('VALKEY_AZ_AFFINITY'), + ], + + 'default' => [ + 'url' => env('VALKEY_URL', env('REDIS_URL')), + 'host' => env('VALKEY_HOST', env('REDIS_HOST', '127.0.0.1')), + 'username' => env('VALKEY_USERNAME', env('REDIS_USERNAME')), + 'password' => env('VALKEY_PASSWORD', env('REDIS_PASSWORD')), + 'port' => env('VALKEY_PORT', env('REDIS_PORT', '6379')), + 'database' => env('VALKEY_DB', env('REDIS_DB', '0')), + 'max_retries' => env('VALKEY_MAX_RETRIES', env('REDIS_MAX_RETRIES', 3)), + 'backoff_algorithm' => env('VALKEY_BACKOFF_ALGORITHM', env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter')), + 'backoff_base' => env('VALKEY_BACKOFF_BASE', env('REDIS_BACKOFF_BASE', 100)), + 'backoff_cap' => env('VALKEY_BACKOFF_CAP', env('REDIS_BACKOFF_CAP', 1000)), + ], + + 'cache' => [ + 'url' => env('VALKEY_URL', env('REDIS_URL')), + 'host' => env('VALKEY_HOST', env('REDIS_HOST', '127.0.0.1')), + 'username' => env('VALKEY_USERNAME', env('REDIS_USERNAME')), + 'password' => env('VALKEY_PASSWORD', env('REDIS_PASSWORD')), + 'port' => env('VALKEY_PORT', env('REDIS_PORT', '6379')), + 'database' => env('VALKEY_CACHE_DB', env('REDIS_CACHE_DB', '1')), + 'max_retries' => env('VALKEY_MAX_RETRIES', env('REDIS_MAX_RETRIES', 3)), + 'backoff_algorithm' => env('VALKEY_BACKOFF_ALGORITHM', env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter')), + 'backoff_base' => env('VALKEY_BACKOFF_BASE', env('REDIS_BACKOFF_BASE', 100)), + 'backoff_cap' => env('VALKEY_BACKOFF_CAP', env('REDIS_BACKOFF_CAP', 1000)), + ], + + // The options below expose additional GLIDE capabilities. They are + // optional and disabled by default — uncomment any you wish to use. + + // 'request_timeout' => env('VALKEY_REQUEST_TIMEOUT', 250), + // 'connection_timeout' => env('VALKEY_CONNECTION_TIMEOUT', 250), + // 'client_name' => env('VALKEY_CLIENT_NAME'), + // 'lazy_connect' => env('VALKEY_LAZY_CONNECT', false), + // 'inflight_requests_limit' => env('VALKEY_INFLIGHT_LIMIT', 1000), + // 'register_phpredis_aliases' => env('VALKEY_REGISTER_ALIASES', true), + + // AWS ElastiCache / MemoryDB IAM authentication. + // 'iam_config' => null, + + // Reconnect / backoff strategy. + // 'reconnect_strategy' => [ + // 'num_of_retries' => env('VALKEY_RECONNECT_RETRIES', 3), + // 'factor' => env('VALKEY_RECONNECT_FACTOR', 2), + // 'exponent_base' => env('VALKEY_RECONNECT_EXP_BASE', 2), + // ], + + // Client-side caching (server-assisted invalidation). + // 'client_side_cache' => [ + // 'enabled' => env('VALKEY_CSC_ENABLED', false), + // 'max_size' => env('VALKEY_CSC_MAX_SIZE', 10000), + // ], + + // Native payload compression (experimental). + // 'compression' => [ + // 'enabled' => env('VALKEY_COMPRESSION', false), + // 'algorithm' => env('VALKEY_COMPRESSION_ALGO', 'lz4'), + // ], + + // Cluster node definitions for multi-node deployments. + // 'clusters' => [ + // 'default' => [ + // ['host' => '10.0.0.1', 'port' => 7000], + // ['host' => '10.0.0.2', 'port' => 7001], + // ['host' => '10.0.0.3', 'port' => 7002], + // ], + // 'options' => [ + // 'read_from' => 'prefer_replica', + // 'use_tls' => true, + // 'az_affinity' => 'us-east-1a', + // ], + // ], + + // OpenTelemetry tracing and metrics export. + // 'otel' => [ + // 'enabled' => env('VALKEY_OTEL_ENABLED', false), + // 'endpoint' => env('VALKEY_OTEL_ENDPOINT'), + // 'traces' => ['enabled' => true, 'sample_percentage' => env('VALKEY_OTEL_SAMPLE_PCT', 1)], + // 'metrics' => ['enabled' => true], + // 'flush_interval_ms' => env('VALKEY_OTEL_FLUSH_MS', 5000), + // ], + + ], + ]; diff --git a/docker-compose.yml b/docker-compose.yml index 06f7fee2455d..5e06c2cc8070 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,24 +10,24 @@ services: ports: - "11211:11211" restart: always - mysql: - image: mysql/mysql-server:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: 1 - MYSQL_ROOT_PASSWORD: "" - MYSQL_DATABASE: "forge" - MYSQL_ROOT_HOST: "%" - ports: - - "3306:3306" - restart: always - # postgres: - # image: postgres:15 + # mysql: + # image: mysql/mysql-server:5.7 # environment: - # POSTGRES_PASSWORD: "secret" - # POSTGRES_DB: "forge" + # MYSQL_ALLOW_EMPTY_PASSWORD: 1 + # MYSQL_ROOT_PASSWORD: "" + # MYSQL_DATABASE: "forge" + # MYSQL_ROOT_HOST: "%" # ports: - # - "5432:5432" + # - "3306:3306" # restart: always + postgres: + image: postgres:18-alpine + environment: + POSTGRES_PASSWORD: "secret" + POSTGRES_DB: "forge" + ports: + - "5432:5432" + restart: always # mariadb: # image: mariadb:11 # environment: @@ -46,11 +46,11 @@ services: # ports: # - "1433:1433" # restart: always - redis: - image: redis:7.0-alpine - ports: - - "6379:6379" - restart: always + # redis: + # image: redis:7.0-alpine + # ports: + # - "6379:6379" + # restart: always # redis-cluster-0: # image: redis:7.0-alpine # ports: @@ -77,3 +77,34 @@ services: # - redis-cluster-2 # command: sh -c 'redis-cli --cluster create redis-cluster-0:7000 redis-cluster-1:7001 redis-cluster-2:7002 --cluster-replicas 0 --cluster-yes || true' # restart: no + valkey: + image: valkey/valkey:9-alpine + ports: + - "6380:6379" + restart: always + # valkey-cluster-0: + # image: valkey/valkey:9-alpine + # ports: + # - "7100:7100" + # restart: always + # command: valkey-server --port 7100 --appendonly yes --cluster-enabled yes + # valkey-cluster-1: + # image: valkey/valkey:9-alpine + # ports: + # - "7101:7101" + # restart: always + # command: valkey-server --port 7101 --appendonly yes --cluster-enabled yes + # valkey-cluster-2: + # image: valkey/valkey:9-alpine + # ports: + # - "7102:7102" + # restart: always + # command: valkey-server --port 7102 --appendonly yes --cluster-enabled yes + # valkey-cluster-creator: + # image: valkey/valkey:9-alpine + # depends_on: + # - valkey-cluster-0 + # - valkey-cluster-1 + # - valkey-cluster-2 + # command: sh -c 'valkey-cli --cluster create valkey-cluster-0:7100 valkey-cluster-1:7101 valkey-cluster-2:7102 --cluster-replicas 0 --cluster-yes || true' + # restart: no