Masdika Loading..
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

  • Home
  • Portfolio
  • Services
  • Resume
  • Skills
  • Blog
  • Contact
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

Download CV

Recent Posts

  • Dari Laptop Bekas Jadi Server Pribadi: Cara Membangun Home Server Murah Menggunakan ISP MyRepublic dengan Public IP
  • Pembuatan Subnet dan Alokasi IP Address pada Amazon Web Service VPC
  • Instalasi dan Konfigurasi AWS CLI pada EC2 (Lab Guide)
  • Membangun Arsitektur Web + Database Highly Available di AWS (RDS Multi-AZ)
  • Cara Reset Password OpenBSD di Proxmox via VNC

Recent Comments

  1. Alif on Jangan Gunakan latest Tag pada Docker Images! Ini Alasannya
  2. Sahrull on Panduan Lengkap Anti-DDoS: Installasi Iptables, Hardening, dan Cloudflare Proxy
  3. VSTRA on Cara Cerdas Menguasai Kubernetes (K8s): Panduan Lengkap Orkestrasi Kontainer untuk Developer Modern
  4. Rikiy on Cara Mudah Deploy Website Node.js Menggunakan Docker
  5. Masdika.BIZ.ID on Disaster Recovery Cluster (DRC) WordPress dengan MariaDB Galera dan Load Balancer Caddy

Categories

  • Tutorial

Masdika.ID

  • About
  • Terms & Conditions
  • Privacy Policy
BLOG POST

Deploy Next.js di Kubernetes dengan Ingress + SSL Let’s Encrypt

August 27, 2025 Tutorial by Masdika.ID
Deploy Next.js di Kubernetes dengan Ingress + SSL Let’s Encrypt

Buat kamu yang lagi Deploy aplikasi dengan Next.js dan pengen jalan di Kubernetes dengan domain custom + SSL otomatis, artikel ini cocok banget. Kita akan bahas step-by-step mulai dari build Docker image, deploy ke cluster Kubernetes, sampai aktifin HTTPS pakai Ingress NGINX + cert-manager. πŸ”’βœ¨

πŸ”§ 1. Build Docker Image Next.js

Pertama, bikin Dockerfile khusus Kubernetes:

# ---------- Stage 1: Build Next.js ----------
FROM node:20-alpine AS builder

WORKDIR /app

# Install dependencies
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install

# Copy source code
COPY . .

# Build Next.js
RUN pnpm build

# ---------- Stage 2: Runtime ----------
FROM node:20-alpine

WORKDIR /app

# Copy only necessary runtime files
COPY --from=builder /app ./

EXPOSE 3000

CMD ["pnpm", "start"]

Build dan push ke Docker Hub:

docker build -f Dockerfile.kube -t masdika/infradevcomunity:latest .
docker push masdika/infradevcomunity:latest

☸️ 2. Deploy ke Kubernetes

Bikin manifest infradev-final.yaml:

# ---------- Namespace (tempat khusus untuk resource app ini) ----------
apiVersion: v1
kind: Namespace
metadata:
  name: infradev

---
# ---------- Deployment (definisi pod Next.js, berisi container app) ----------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: infradev-deployment
  namespace: infradev
spec:
  replicas: 2                       # jumlah pod (auto scaling manual)
  selector:
    matchLabels:
      app: infradev-app             # selector cocokkan ke label pod
  template:
    metadata:
      labels:
        app: infradev-app           # label pod
    spec:
      containers:
      - name: infradev-container
        image: masdika/infradevcomunity:latest  # image dari Docker Hub
        ports:
        - containerPort: 3000       # port yang dipakai app Next.js

---
# ---------- Service (akses internal cluster ke pod) ----------
apiVersion: v1
kind: Service
metadata:
  name: infradev-service
  namespace: infradev
spec:
  selector:
    app: infradev-app               # target pod berdasarkan label
  ports:
  - port: 80                        # port service (akses internal)
    targetPort: 3000                # port dalam container
  type: ClusterIP                   # hanya bisa diakses internal (untuk Ingress)

---
# ---------- Ingress (akses publik via domain + HTTPS) ----------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: infradev-ingress
  namespace: infradev
  annotations:
    kubernetes.io/ingress.class: "nginx"          # gunakan Ingress NGINX
    cert-manager.io/cluster-issuer: "letsencrypt-prod" # issuer TLS cert-manager
spec:
  tls:
  - hosts:
    - infradev.masdika.biz.id        # domain publik
    secretName: infradev-tls         # nama secret TLS otomatis dibuat cert-manager
  rules:
  - host: infradev.masdika.biz.id    # host/domain yang diarahkan
    http:
      paths:
      - path: /                      # route path
        pathType: Prefix
        backend:
          service:
            name: infradev-service   # service tujuan
            port:
              number: 80             # port service tujuan

Apply ke cluster:

kubectl apply -f infradev-final.yaml

🌐 3. Konfigurasi DNS

Arahkan domain/subdomain ke IP publik dari Ingress Controller (MetalLB):

infradev.masdika.biz.id β†’ 206.237.97.18

Atur di Cloudflare sebagai A Record. Proxy (☁️) bisa ON atau OFF, karena cert-manager pakai DNS-01 challenge.

πŸ”’ 4. SSL Otomatis dengan cert-manager

Cert-manager akan otomatis bikin sertifikat TLS dari Let’s Encrypt. Cek status:

kubectl -n infradev get certificate
kubectl -n infradev describe certificate infradev-tls

Kalau sukses, aplikasi bisa diakses lewat:

https://infradev.masdika.biz.id

⚑ Kesimpulan

Dengan setup ini:

  • βœ… Next.js berjalan di Kubernetes
  • βœ… Routing via Ingress NGINX
  • βœ… SSL otomatis via cert-manager (Let’s Encrypt)
  • βœ… MetalLB kasih IP publik

Hasilnya, aplikasi kamu lebih aman, scalable, dan production-ready πŸš€πŸ”₯

πŸ‘‰ Yuk coba implementasi di projectmu! Kalau ada masalah kayak DNS belum resolve atau sertifikat belum issued, cek log cert-manager dan pastikan DNS di Cloudflare udah benar. πŸ˜‰

Share:
Tags: dockerkubernetes
Related Posts
Troubleshooting K3s: Semua Pod Rusak Setelah Reboot Karena CNI Flannel

Pendahuluan Bayangkan sebuah cluster Kubernetes yang kemarin masih berjalan normal. Semua service aktif, storage Longhorn stabil, dan aplikasi berjalan tanpa…

VM vs Container vs Pod – Perbedaan Lengkap untuk Cloud & DevOps!

Dalam dunia Cloud Computing dan DevOps, tiga istilah yang paling sering kita dengar adalah Virtual Machine (VM), Container, dan Pod….

Post navigation

Prev
Next
Write a comment Cancel Reply


Β© 2025 www.masdika.id β€” Semua hak cipta dilindungi