A New Collection of Thoughtful Learning Apps — Now Available on iOS & Android

Image
I’m excited to share a set of mobile apps I’ve recently completed and published on both the Google Play Store and the Apple App Store. These apps are designed with a simple goal in mind: to make meaningful, structured content more accessible, whether you’re studying theology or improving your English vocabulary. 📱 Now Available on Both Platforms All apps are live and available for download: Google Play Developer Page: https://play.google.com/store/apps/dev?id=5835943159853189043 Apple App Store Developer Page: https://apps.apple.com/ca/developer/q-z-l-corp/id1888794100 📖 Theology & Confession Study Apps For those interested in Reformed theology and classical Christian teachings, I’ve developed a series of apps that present foundational texts in a clean, focused reading format: The Belgic Confession Canons of Dort Heidelberg Catechism Westminster Shorter Catechism Each app is designed to provide a distraction-free experience, making it easier to read, reflect, and revisit these im...

Deploying a Next.js Standalone App on OpenShift

Deploying a Next.js Standalone App on OpenShift



This is Part 3 of the series: Self-Hosting Next.js in Kubernetes (Without Vercel).

In the previous posts, we:

  • Built a Next.js app in standalone mode
  • Created a minimal, production-ready Docker image

Now we’ll deploy that image into OpenShift using standard Kubernetes resources: Deployment, Service, and Route.


Assumptions

This guide assumes:

  • Your image is already built and pushed to an internal registry
  • The container listens on PORT=3000
  • The app runs using Next.js standalone server.js

1️⃣ Deployment

The Deployment runs the Next.js standalone server as a stateless container.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-nextjs
spec:
  replicas: 2
  selector:
    matchLabels:
      app: example-nextjs
  template:
    metadata:
      labels:
        app: example-nextjs
    spec:
      containers:
        - name: web
          image: image-registry.openshift-image-registry.svc:5000/internal/example-nextjs:latest
          ports:
            - containerPort: 3000
          env:
            - name: NODE_ENV
              value: "production"
            - name: PORT
              value: "3000"
          readinessProbe:
            httpGet:
              path: /
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /
              port: 3000
            initialDelaySeconds: 30
            periodSeconds: 10

Key points:

  • No persistent storage required
  • Stateless and horizontally scalable
  • Probes use /, which Next.js handles naturally

2️⃣ Service

The Service exposes the Deployment internally inside the cluster.

apiVersion: v1
kind: Service
metadata:
  name: example-nextjs
spec:
  selector:
    app: example-nextjs
  ports:
    - name: http
      port: 80
      targetPort: 3000

The Service:

  • Maps port 80 → container port 3000
  • Provides stable networking for the Route

3️⃣ Route (OpenShift)

OpenShift Routes expose the app externally.

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: example-nextjs
spec:
  to:
    kind: Service
    name: example-nextjs
  port:
    targetPort: http
  tls:
    termination: edge

With this Route:

  • TLS is terminated at the router
  • No HTTPS configuration is required in the app
  • The app runs as plain HTTP internally

Common OpenShift Gotchas

  • Ensure the container runs as a non-root user
  • Do not rely on writable root filesystem
  • Do not bind to privileged ports (<1024)

The standalone Next.js setup fits OpenShift security constraints well when built correctly.


Series Progress

Self-Hosting Next.js in Kubernetes (Without Vercel)


Final Thoughts

Once you treat Next.js as a normal Node.js server, deployment becomes straightforward.

In the next post, we’ll deep-dive into one of the most common problems: 404 errors for _next/static in standalone deployments.

❤️ Support This Blog


If this post helped you, you can support my writing with a small donation. Thank you for reading.


Comments

Popular Posts

2026 Begins: Choosing to Stay on the Path as a Blogger

A New Collection of Thoughtful Learning Apps — Now Available on iOS & Android