Next.js web application with 2 pods sharing cache.
[!NOTE] You can also check the other branches for Next.js 14 (
main-14), Next.js 15 (main-15) or Redis Strings (redis-strings) as there are variants that may also be useful to you.
I created the Docker image following the example in:
https://github.com/vercel/next.js/tree/canary/examples/with-dockerI configured the output: "standalone" property in next-config.ts.
More info at:
https://nextjs.org/docs/app/getting-started/deploying#dockerI use ValKey to cache values and ensure consistency across all pods.
I installed custom handler using
npm install @mrjasonroy/cache-components-cache-handler:
More info at:
https://github.com/mrjasonroy/cache-components-cache-handlerI added cache-handler.mjs and configured the cacheHandlers property in
next.config.ts.
cacheComponents: true,
cacheHandlers: {
default: require.resolve("./cache-handler.mjs"),
remote: require.resolve("./cache-handler.mjs"),
},
cacheMaxMemorySize: 0, // disable default in-memory cachingAdditionally, I enabled cacheComponents: true to cache the rendered components.
I followed this example and the same pages to validate the cache using use cache,
cacheTag, cacheLife, updateTag and revalidatePath.
[!WARNING] Only Next.js 16 + cacheComponents supports these features.
[!WARNING] CacheHandlers (with S) is different than CacheHandler (without S).
More info at:
https://nextjs.org/docs/app/guides/self-hostinghttps://nextjs.org/docs/app/api-reference/config/next-config-js/cacheHandlershttps://nextjs.org/docs/app/api-reference/config/next-config-js/incrementalCacheHandlerPathIn the k8s folder, there are all the Kubernetes manifests to create two pods with
the Next.js web application and one pod with a Redis server.
Run in dev mode with npm run dev.
Run in Docker using Docker Compose with
docker compose -f "compose.yaml" up -d --build.
Run in Kubernetes:
- Execute
docker build -t nextjs-docker .to create the Docker image. - Execute
kubectl apply -f k8s/configmaps/nextjs.yaml. - Execute
kubectl apply -f k8s/deployments/nextjs.yaml. - Execute
kubectl apply -f k8s/deployments/redis.yaml. - Execute
kubectl apply -f k8s/services/nextjs.yaml. - Execute
kubectl apply -f k8s/services/redis.yaml. - Access
http://localhost:3000.
[!NOTE] You can use this option to deploy your Docker image on your VPS.