Skip to content

feat: add ddev redis-backend for swappable backends, fixes #32, fixes #28 #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand All @@ -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 <image>` | `<image>` (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.
Expand Down
125 changes: 125 additions & 0 deletions commands/host/redis-backend
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#!/usr/bin/env bash
# ddev-generated

## Description: Use a different key-value store for Redis
## Usage: redis-backend <image> [optimize]
## Example: ddev redis-backend redis-alpine optimize

REDIS_DOCKER_IMAGE=${1:-}
REDIS_CONFIG=${2:-}
NAME=$REDIS_DOCKER_IMAGE

function show_help() {
cat <<EOF
Usage: ddev redis-backend <image|alias> [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"
1 change: 1 addition & 0 deletions install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down