Skip to content

Commit d5cfc13

Browse files
authored
feat: add Valkey Redis-compatible caching layer for Next.js (#3228)
1 parent d94820c commit d5cfc13

15 files changed

Lines changed: 475 additions & 11 deletions

File tree

.kontinuous/Chart.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
dependencies:
2+
- name: valkey
3+
repository: https://valkey.io/valkey-helm
4+
version: 0.9.4
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: ConfigMap
2+
apiVersion: v1
3+
metadata:
4+
name: valkey
5+
data:
6+
VALKEY_URL: "redis://valkey:6379"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: ConfigMap
2+
apiVersion: v1
3+
metadata:
4+
name: valkey
5+
data:
6+
VALKEY_URL: "redis://valkey:6379"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: ConfigMap
2+
apiVersion: v1
3+
metadata:
4+
name: valkey
5+
data:
6+
VALKEY_URL: "redis://valkey:6379"

.kontinuous/env/prod/values.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,24 @@ app:
1616
limits:
1717
cpu: 1
1818
memory: 2G
19+
20+
valkey:
21+
replica:
22+
enabled: true
23+
# One replica pod per always-on app pod (= app.autoscale.minReplicas below).
24+
# valkey-helm deploys 1 primary + N replicas, so this gives 3 total pods,
25+
# matching the app HA floor. valkey has no HPA, so we pin to minReplicas
26+
# rather than maxReplicas to avoid over-provisioning cache storage.
27+
replicas: 2
28+
persistence:
29+
size: 1Gi
30+
podDisruptionBudget:
31+
enabled: true
32+
maxUnavailable: 1
33+
resources:
34+
requests:
35+
cpu: 100m
36+
memory: 256Mi
37+
limits:
38+
cpu: 1
39+
memory: 1Gi

.kontinuous/values.yaml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ app:
55
~chart: app
66
~needs:
77
- pg
8+
- valkey
89
imagePackage: app
910
probesPath: /api/healthz
1011
containerPort: 3000
@@ -46,6 +47,9 @@ app:
4647
- secretRef:
4748
name: "audit-cleanup"
4849
optional: true
50+
- configMapRef:
51+
name: "valkey"
52+
optional: true
4953
env:
5054
- name: POSTGRES_HOST
5155
valueFrom:
@@ -84,5 +88,32 @@ app:
8488
pg:
8589
~chart: pg
8690

91+
# Valkey cache. Official valkey-io/valkey-helm chart pulled as a Helm dependency
92+
# from .kontinuous/Chart.yaml. Values below flow straight through to that chart.
93+
valkey:
94+
# Pin service name so VALKEY_URL (redis://valkey:6379) resolves in every namespace.
95+
fullnameOverride: valkey
96+
image:
97+
tag: "9.0.2"
98+
service:
99+
type: ClusterIP
100+
port: 6379
101+
# Dev and preprod run a single-pod standalone deployment — cache loss on
102+
# restart is acceptable, and it keeps infra cost minimal. Prod overrides
103+
# this to a master/replica topology sized against app.autoscale.
104+
replica:
105+
enabled: false
106+
dataStorage:
107+
enabled: false
108+
auth:
109+
enabled: false
110+
resources:
111+
requests:
112+
cpu: 50m
113+
memory: 128Mi
114+
limits:
115+
cpu: 500m
116+
memory: 512Mi
117+
87118
clamav:
88119
~chart: clamav

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,12 @@ Implémenté dans `packages/app/src/server/services/suitApiAuth.ts`.
193193

194194
```bash
195195
# Première génération
196-
./scripts/generate-suit-signing-keys.sh generate dev # → ./suit-signing-keys/dev/
197-
./scripts/generate-suit-signing-keys.sh generate prod # → ./suit-signing-keys/prod/
198-
./scripts/generate-suit-signing-keys.sh generate all # → les deux
196+
./packages/app/scripts/generate-suit-signing-keys.sh generate dev # → ./suit-signing-keys/dev/
197+
./packages/app/scripts/generate-suit-signing-keys.sh generate prod # → ./suit-signing-keys/prod/
198+
./packages/app/scripts/generate-suit-signing-keys.sh generate all # → les deux
199199

200200
# Rotation (sauvegarde les anciennes clés, génère de nouvelles)
201-
./scripts/generate-suit-signing-keys.sh renew prod
201+
./packages/app/scripts/generate-suit-signing-keys.sh renew prod
202202
```
203203

204204
`generate` refuse d'écraser des clés existantes. `renew` les sauvegarde dans un dossier `backup-{date}` avant de regénérer.
@@ -237,7 +237,7 @@ Implémenté dans `packages/app/src/server/services/suitApiAuth.ts`.
237237

238238
### Procédure de rotation
239239

240-
1. `./scripts/generate-suit-signing-keys.sh renew <env>` — génère une nouvelle paire, sauvegarde l'ancienne
240+
1. `./packages/app/scripts/generate-suit-signing-keys.sh renew <env>` — génère une nouvelle paire, sauvegarde l'ancienne
241241
2. Mettre à jour le sealed-secret K8s avec la nouvelle clé publique
242242
3. Déployer EgaPro
243243
4. Transmettre la nouvelle clé privée à SUIT — ils doivent basculer juste après le déploiement

docker-compose.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,20 @@ services:
8181
retries: 10
8282
start_period: 300s
8383

84+
valkey:
85+
image: valkey/valkey:8-alpine
86+
ports:
87+
- 6379:6379
88+
volumes:
89+
- valkeydata:/data
90+
healthcheck:
91+
test: ["CMD", "valkey-cli", "ping"]
92+
interval: 5s
93+
timeout: 5s
94+
retries: 5
95+
8496
volumes:
8597
pgdata:
8698
miniodata:
8799
clamdata:
100+
valkeydata:

packages/app/.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ MAIL_ENABLED="true"
2828
SMTP_HOST="localhost"
2929
SMTP_PORT="1025"
3030
MAIL_FROM="no-reply@egapro.local"
31+
# Valkey cache — optional, app works without it (in-memory fallback)
32+
VALKEY_URL="redis://localhost:6379"

0 commit comments

Comments
 (0)