diff --git a/README.md b/README.md index 83e455c..420c115 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ After installation, make sure to commit the `.ddev` directory to version control | Command | Description | | ------- | ----------- | +| `ddev redis-backend` | Use a different key-value store for Redis | | `ddev redis-cli` | Run `redis-cli` inside the Redis container | | `ddev redis` | Alias for `ddev redis-cli` | | `ddev redis-flush` | Flush all cache inside the Redis container | @@ -35,6 +36,26 @@ After installation, make sure to commit the `.ddev` directory to version control Redis is available inside Docker containers with `redis:6379`. +### Swappable Redis backends + +Use the `ddev redis-backend` command to swap between Redis backends: + +| Command | Docker Image | +|--------------------------------------|-----------------------------------------------| +| `ddev redis-backend redis` | `redis:7` | +| `ddev redis-backend redis-alpine` | `redis:7-alpine` | +| `ddev redis-backend valkey` | `valkey/valkey:8` | +| `ddev redis-backend valkey-alpine` | `valkey/valkey:8-alpine` | +| `ddev redis-backend dragonfly` | `docker.dragonflydb.io/dragonflydb/dragonfly` | +| `ddev redis-backend garnet` | `ghcr.io/microsoft/garnet` | +| `ddev redis-backend kvrocks` | `apache/kvrocks` | +| `ddev redis-backend ` | `` (specify your custom Redis image) | + +> [!TIP] +> Add `optimize` or `optimized` after the command to enable optimized Redis configuration. +> +> Example: `ddev redis-backend redis optimize` + ## Redis Credentials By default, no authentication is required. diff --git a/commands/host/redis-backend b/commands/host/redis-backend new file mode 100755 index 0000000..8cbd1b1 --- /dev/null +++ b/commands/host/redis-backend @@ -0,0 +1,125 @@ +#!/usr/bin/env bash +# ddev-generated + +## Description: Use a different key-value store for Redis +## Usage: redis-backend [optimize] +## Example: ddev redis-backend redis-alpine optimize + +REDIS_DOCKER_IMAGE=${1:-} +REDIS_CONFIG=${2:-} +NAME=$REDIS_DOCKER_IMAGE + +function show_help() { + cat < [optimize] + +Choose from predefined aliases, or provide any Redis-compatible Docker image. + +Available aliases: + redis redis:7 + redis-alpine redis:7-alpine + valkey valkey/valkey:8 + valkey-alpine valkey/valkey:8-alpine + dragonfly docker.dragonflydb.io/dragonflydb/dragonfly + garnet ghcr.io/microsoft/garnet + kvrocks apache/kvrocks + +Custom backend: + You can specify any Docker image, e.g.: + ddev redis-backend redis:6 + +Optional: + optimize Apply additional Redis configuration with resource limits + optimized Same as optimize + +Examples: + ddev redis-backend redis-alpine optimize + ddev redis-backend valkey + ddev redis-backend redis:7.2-alpine +EOF + exit 0 +} + +function optimize_config() { + [[ "$REDIS_CONFIG" != "optimized" && "$REDIS_CONFIG" != "optimize" ]] && return + ddev dotenv set .ddev/.env.redis --redis-optimized=true +} + +function cleanup() { + rm -f "$DDEV_APPROOT/.ddev/.env.redis" + rm -rf "$DDEV_APPROOT/.ddev/redis/" + rm -f "$DDEV_APPROOT/.ddev/docker-compose.redis.yaml" "$DDEV_APPROOT/.ddev/docker-compose.redis_extra.yaml" + + redis_volume="ddev-$(ddev status -j | docker run -i --rm ddev/ddev-utilities jq -r '.raw.name')_redis" + if docker volume ls -q | grep -qw "$redis_volume"; then + ddev stop + docker volume rm "$redis_volume" + fi +} + +function check_docker_image() { + echo "Pulling ${REDIS_DOCKER_IMAGE}..." + if ! docker pull "$REDIS_DOCKER_IMAGE"; then + echo >&2 "❌ Unable to pull ${REDIS_DOCKER_IMAGE}" + exit 2 + fi +} + +function use_docker_image() { + [[ "$REDIS_DOCKER_IMAGE" != "redis:7" ]] && ddev dotenv set .ddev/.env.redis --redis-docker-image="$REDIS_DOCKER_IMAGE" + ddev add-on get ddev/ddev-redis +} + +case "$REDIS_DOCKER_IMAGE" in + redis) + NAME="Redis 7" + REDIS_DOCKER_IMAGE="redis:7" + ;; + redis-alpine) + NAME="Redis 7 Alpine" + REDIS_DOCKER_IMAGE="redis:7-alpine" + ;; + valkey) + NAME="Valkey 8" + REDIS_DOCKER_IMAGE="valkey/valkey:8" + ;; + valkey-alpine) + NAME="Valkey 8 Alpine" + REDIS_DOCKER_IMAGE="valkey/valkey:8-alpine" + ;; + dragonfly) + NAME="Dragonfly" + REDIS_DOCKER_IMAGE="docker.dragonflydb.io/dragonflydb/dragonfly" + ;; + garnet) + NAME="Garnet" + REDIS_DOCKER_IMAGE="ghcr.io/microsoft/garnet" + ;; + kvrocks) + NAME="Kvrocks" + REDIS_DOCKER_IMAGE="apache/kvrocks" + ;; + ""|--help|-h) + show_help + ;; + *) + NAME="$REDIS_DOCKER_IMAGE" + # Allow unknown image, nothing to override + ;; +esac + +check_docker_image +cleanup +optimize_config +use_docker_image + +echo +echo "✅ Redis backend: $REDIS_DOCKER_IMAGE" +if [[ "$REDIS_CONFIG" == "optimized" || "$REDIS_CONFIG" == "optimize" ]]; then + echo "👍 Redis config: optimized" +else + echo "👍 Redis config: default" +fi + +echo +echo "📝 Make sure to commit the '.ddev' directory to version control" diff --git a/install.yaml b/install.yaml index 2cc0d8a..e4361c3 100644 --- a/install.yaml +++ b/install.yaml @@ -14,6 +14,7 @@ project_files: - redis/network.conf - redis/security.conf - redis/snapshots.conf + - commands/host/redis-backend - commands/redis/redis-cli - commands/redis/redis-flush