Skip to content

Commit b95fa8e

Browse files
committed
feat: add ddev redis-backend for swappable backends
1 parent 256f752 commit b95fa8e

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ After installation, make sure to commit the `.ddev` directory to version control
2727

2828
| Command | Description |
2929
| ------- | ----------- |
30+
| `ddev redis-backend` | Use a different key-value store for Redis |
3031
| `ddev redis-cli` | Run `redis-cli` inside the Redis container |
3132
| `ddev redis` | Alias for `ddev redis-cli` |
3233
| `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
3536

3637
Redis is available inside Docker containers with `redis:6379`.
3738

39+
### Swappable Redis backends
40+
41+
Use the `ddev redis-backend` command to swap between Redis backends:
42+
43+
| Command | Docker Image |
44+
|--------------------------------------|-----------------------------------------------|
45+
| `ddev redis-backend redis` | `redis:7` |
46+
| `ddev redis-backend redis-alpine` | `redis:7-alpine` |
47+
| `ddev redis-backend valkey` | `valkey/valkey:8` |
48+
| `ddev redis-backend valkey-alpine` | `valkey/valkey:8-alpine` |
49+
| `ddev redis-backend dragonfly` | `docker.dragonflydb.io/dragonflydb/dragonfly` |
50+
| `ddev redis-backend garnet` | `ghcr.io/microsoft/garnet` |
51+
| `ddev redis-backend kvrocks` | `apache/kvrocks` |
52+
| `ddev redis-backend <image>` | `<image>` (specify your custom Redis image) |
53+
54+
> [!TIP]
55+
> Add `optimize` or `optimized` after the command to enable optimized Redis configuration.
56+
>
57+
> Example: `ddev redis-backend redis optimize`
58+
3859
## Redis Credentials
3960

4061
By default, no authentication is required.

commands/host/redis-backend

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#!/usr/bin/env bash
2+
# ddev-generated
3+
4+
## Description: Use a different key-value store for Redis
5+
## Usage: redis-backend <image> [optimize]
6+
## Example: ddev redis-backend redis-alpine optimize
7+
8+
REDIS_DOCKER_IMAGE=${1:-}
9+
REDIS_CONFIG=${2:-}
10+
NAME=$REDIS_DOCKER_IMAGE
11+
12+
function show_help() {
13+
cat <<EOF
14+
Usage: ddev redis-backend <image|alias> [optimize]
15+
16+
Choose from predefined aliases, or provide any Redis-compatible Docker image.
17+
18+
Available aliases:
19+
redis redis:7
20+
redis-alpine redis:7-alpine
21+
valkey valkey/valkey:8
22+
valkey-alpine valkey/valkey:8-alpine
23+
dragonfly docker.dragonflydb.io/dragonflydb/dragonfly
24+
garnet ghcr.io/microsoft/garnet
25+
kvrocks apache/kvrocks
26+
27+
Custom backend:
28+
You can specify any Docker image, e.g.:
29+
ddev redis-backend redis:6
30+
31+
Optional:
32+
optimize Apply additional Redis configuration with resource limits
33+
optimize Same as optimize
34+
35+
Examples:
36+
ddev redis-backend redis-alpine optimize
37+
ddev redis-backend valkey
38+
ddev redis-backend redis:7.2-alpine
39+
EOF
40+
exit 0
41+
}
42+
43+
function optimize_config() {
44+
[[ "$REDIS_CONFIG" != "optimized" && "$REDIS_CONFIG" != "optimize" ]] && return
45+
ddev dotenv set .ddev/.env.redis --redis-optimized=true
46+
}
47+
48+
function cleanup() {
49+
rm -f "$DDEV_APPROOT/.ddev/.env.redis"
50+
rm -rf "$DDEV_APPROOT/.ddev/redis/"
51+
rm -f "$DDEV_APPROOT/.ddev/docker-compose.redis.yaml" "$DDEV_APPROOT/.ddev/docker-compose.redis_extra.yaml"
52+
53+
redis_volume="ddev-$(ddev status -j | docker run -i --rm ddev/ddev-utilities jq -r '.raw.name')_redis"
54+
if docker volume ls -q | grep -qw "$redis_volume"; then
55+
ddev stop
56+
docker volume rm "$redis_volume"
57+
fi
58+
}
59+
60+
function check_docker_image() {
61+
echo "Pulling ${REDIS_DOCKER_IMAGE}..."
62+
if ! docker pull "$REDIS_DOCKER_IMAGE"; then
63+
echo >&2 "❌ Unable to pull ${REDIS_DOCKER_IMAGE}"
64+
exit 2
65+
fi
66+
}
67+
68+
function use_docker_image() {
69+
[[ "$REDIS_DOCKER_IMAGE" != "redis:7" ]] && ddev dotenv set .ddev/.env.redis --redis-docker-image="$REDIS_DOCKER_IMAGE"
70+
ddev add-on get ddev/ddev-redis
71+
}
72+
73+
case "$REDIS_DOCKER_IMAGE" in
74+
redis)
75+
NAME="Redis 7"
76+
REDIS_DOCKER_IMAGE="redis:7"
77+
;;
78+
redis-alpine)
79+
NAME="Redis 7 Alpine"
80+
REDIS_DOCKER_IMAGE="redis:7-alpine"
81+
;;
82+
valkey)
83+
NAME="Valkey 8"
84+
REDIS_DOCKER_IMAGE="valkey/valkey:8"
85+
;;
86+
valkey-alpine)
87+
NAME="Valkey 8 Alpine"
88+
REDIS_DOCKER_IMAGE="valkey/valkey:8-alpine"
89+
;;
90+
dragonfly)
91+
NAME="Dragonfly"
92+
REDIS_DOCKER_IMAGE="docker.dragonflydb.io/dragonflydb/dragonfly"
93+
;;
94+
garnet)
95+
NAME="Garnet"
96+
REDIS_DOCKER_IMAGE="ghcr.io/microsoft/garnet"
97+
;;
98+
kvrocks)
99+
NAME="Kvrocks"
100+
REDIS_DOCKER_IMAGE="apache/kvrocks"
101+
;;
102+
""|--help|-h)
103+
show_help
104+
;;
105+
*)
106+
NAME="$REDIS_DOCKER_IMAGE"
107+
# Allow unknown image, nothing to override
108+
;;
109+
esac
110+
111+
check_docker_image
112+
cleanup
113+
optimize_config
114+
use_docker_image
115+
116+
echo
117+
echo "✅ Redis backend: $REDIS_DOCKER_IMAGE"
118+
if [[ "$REDIS_CONFIG" == "optimized" || "$REDIS_CONFIG" == "optimize" ]]; then
119+
echo "👍 Redis config: optimized"
120+
else
121+
echo "👍 Redis config: default"
122+
fi
123+
124+
echo
125+
echo "📝 Make sure to commit the '.ddev' directory to version control"

install.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ project_files:
1414
- redis/network.conf
1515
- redis/security.conf
1616
- redis/snapshots.conf
17+
- commands/host/redis-backend
1718
- commands/redis/redis-cli
1819
- commands/redis/redis-flush
1920

0 commit comments

Comments
 (0)