Skip to content

Commit 5bbbf32

Browse files
authored
feat: add ddev redis-backend for swappable backends, fixes #32, fixes #28 (#42)
1 parent 5eb87b4 commit 5bbbf32

File tree

7 files changed

+319
-24
lines changed

7 files changed

+319
-24
lines changed

.github/workflows/tests.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ jobs:
2727
strategy:
2828
matrix:
2929
ddev_version: [stable, HEAD]
30+
bats_tag: [
31+
"default",
32+
"default-optimized",
33+
"drupal",
34+
"laravel-redis",
35+
"laravel-redis-alpine-optimized",
36+
"laravel-valkey",
37+
"laravel-valkey-alpine-optimized",
38+
"laravel-redis-6",
39+
"drupal-7",
40+
"drupal-no-settings"
41+
]
3042
fail-fast: false
3143

3244
runs-on: ubuntu-latest
@@ -39,3 +51,4 @@ jobs:
3951
debug_enabled: ${{ github.event.inputs.debug_enabled }}
4052
addon_repository: ${{ env.GITHUB_REPOSITORY }}
4153
addon_ref: ${{ env.GITHUB_REF }}
54+
test_command: bats tests --filter-tags ${{ matrix.bats_tag }}

README.md

Lines changed: 18 additions & 0 deletions
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,23 @@ 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 <image>` | `<image>` (specify your custom Redis image) |
50+
51+
> [!TIP]
52+
> Add `optimize` or `optimized` after the command to enable optimized Redis configuration.
53+
>
54+
> Example: `ddev redis-backend redis optimize`
55+
3856
## Redis Credentials
3957

4058
By default, no authentication is required.

commands/host/redis-backend

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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+
Note that not every Docker image can work right away, and you may need to override
18+
the "command:" in the docker-compose.redis_extra.yaml file
19+
20+
Available aliases:
21+
redis redis:7
22+
redis-alpine redis:7-alpine
23+
valkey valkey/valkey:8
24+
valkey-alpine valkey/valkey:8-alpine
25+
26+
Custom backend:
27+
You can specify any Docker image, e.g.:
28+
ddev redis-backend redis:6
29+
30+
Optional:
31+
optimize Apply additional Redis configuration with resource limits
32+
optimized Same as optimize
33+
34+
Examples:
35+
ddev redis-backend redis-alpine optimize
36+
ddev redis-backend valkey
37+
ddev redis-backend redis:7.2-alpine
38+
EOF
39+
exit 0
40+
}
41+
42+
function optimize_config() {
43+
[[ "$REDIS_CONFIG" != "optimized" && "$REDIS_CONFIG" != "optimize" ]] && return
44+
ddev dotenv set .ddev/.env.redis --redis-optimized=true
45+
}
46+
47+
function cleanup() {
48+
rm -f "$DDEV_APPROOT/.ddev/.env.redis"
49+
rm -rf "$DDEV_APPROOT/.ddev/redis/"
50+
rm -f "$DDEV_APPROOT/.ddev/docker-compose.redis.yaml" "$DDEV_APPROOT/.ddev/docker-compose.redis_extra.yaml"
51+
52+
redis_volume="ddev-$(ddev status -j | docker run -i --rm ddev/ddev-utilities jq -r '.raw.name')_redis"
53+
if docker volume ls -q | grep -qw "$redis_volume"; then
54+
ddev stop
55+
docker volume rm "$redis_volume"
56+
fi
57+
}
58+
59+
function check_docker_image() {
60+
echo "Pulling ${REDIS_DOCKER_IMAGE}..."
61+
if ! docker pull "$REDIS_DOCKER_IMAGE"; then
62+
echo >&2 "❌ Unable to pull ${REDIS_DOCKER_IMAGE}"
63+
exit 2
64+
fi
65+
}
66+
67+
function use_docker_image() {
68+
[[ "$REDIS_DOCKER_IMAGE" != "redis:7" ]] && ddev dotenv set .ddev/.env.redis --redis-docker-image="$REDIS_DOCKER_IMAGE"
69+
REPO=$(ddev add-on list --installed -j 2>/dev/null | docker run -i --rm ddev/ddev-utilities jq -r '.raw[] | select(.Name=="redis") | .Repository // empty' 2>/dev/null)
70+
ddev add-on get "${REPO:-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+
""|--help|-h)
91+
show_help
92+
;;
93+
*)
94+
NAME="$REDIS_DOCKER_IMAGE"
95+
# Allow unknown image, nothing to override
96+
;;
97+
esac
98+
99+
check_docker_image
100+
cleanup
101+
optimize_config
102+
use_docker_image
103+
104+
echo
105+
echo "✅ Redis backend: $REDIS_DOCKER_IMAGE"
106+
if [[ "$REDIS_CONFIG" == "optimized" || "$REDIS_CONFIG" == "optimize" ]]; then
107+
echo "⚙️ Redis config: optimized"
108+
else
109+
echo "⚙️ Redis config: default"
110+
fi
111+
112+
echo
113+
echo "📝 Commit the '.ddev' directory to version control"
114+
115+
echo
116+
echo "🔄 Redis config available after 'ddev restart'"

commands/redis/redis-cli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env bash
1+
#!/usr/bin/env sh
22

33
#ddev-generated
44
## Description: Run redis-cli inside the Redis container

commands/redis/redis-flush

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env bash
1+
#!/usr/bin/env sh
22

33
#ddev-generated
44
## Description: Flush all cache inside the Redis container

install.yaml

Lines changed: 1 addition & 0 deletions
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)