Panduan Lengkap Deploy Aplikasi Microservices dengan Docker + Caddy SSL

Ingin membangun sistem microservices dengan deployment yang simpel dan aman? Artikel ini akan membimbing kamu langkah demi langkah membuat aplikasi e-commerce berbasis microservices menggunakan Docker dan Caddy untuk otomatisasi HTTPS. π
π§ Apa Itu Microservices
Microservices adalah pendekatan arsitektur di mana sebuah aplikasi besar dibagi menjadi beberapa layanan kecil yang berdiri sendiri, tetapi saling berkomunikasi. Setiap layanan:
- Mengelola satu fungsi spesifik (seperti user, produk, atau order)
- Dapat dikembangkan, diuji, dan di-deploy secara independen
- Skalabel secara individual
Contoh nyata dari pendekatan ini adalah aplikasi e-commerce yang kamu akan buat dalam artikel ini. π‘
Keunggulan Microservices:
- π Mudah scaling per layanan
- π§ͺ Testing lebih fleksibel
- π§ Tim bisa kerja paralel
- π Keamanan dan isolasi lebih baik
π§± Struktur Aplikasi
Aplikasi ini terdiri dari 4 service utama:
- User Service π€ β Menyediakan data user
- Product Service ποΈ β Menyediakan data produk
- Order Service π¦ β Menyediakan data pesanan
- Gateway π β Reverse proxy internal untuk merutekan request ke service lain
Semua service dijalankan menggunakan docker-compose dan diakses dari internet melalui Caddy yang otomatis menangani HTTPS via Letβs Encrypt. π
π Struktur Folder
.
βββ Caddyfile
βββ docker-compose.yml
βββ gateway
β βββ app.js
β βββ Dockerfile
β βββ package.json
βββ order-service
β βββ app.js
β βββ Dockerfile
β βββ package.json
βββ product-service
β βββ app.js
β βββ Dockerfile
β βββ package.json
βββ user-service
βββ app.js
βββ Dockerfile
βββ package.json
βοΈ Konfigurasi File
π 1. Caddyfile
api.masdika.my.id {
reverse_proxy gateway:3000
}
π³ 2. docker-compose.yml
services:
user-service:
build: ./user-service
networks: [internal]
product-service:
build: ./product-service
networks: [internal]
order-service:
build: ./order-service
networks: [internal]
gateway:
build: ./gateway
expose: ["3000"]
networks: [internal]
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks: [internal]
volumes:
caddy_data:
caddy_config:
networks:
internal:
driver: bridge
π 3. Gateway
π gateway/app.js
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
app.use('/users', createProxyMiddleware({ target: 'http://user-service:3001', changeOrigin: true }));
app.use('/products', createProxyMiddleware({ target: 'http://product-service:3002', changeOrigin: true }));
app.use('/orders', createProxyMiddleware({ target: 'http://order-service:3003', changeOrigin: true }));
app.listen(3000, () => {
console.log('Gateway running on port 3000');
});
π gateway/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
π gateway/package.json
{
"name": "gateway",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2",
"http-proxy-middleware": "^2.0.6"
}
}
π€ 4. User Service
π user-service/app.js
const express = require('express');
const app = express();
app.use(express.json());
app.get('/users', (req, res) => {
res.json([{ id: 1, name: 'Andika' }]);
});
app.listen(3001, () => {
console.log('User Service running on port 3001');
});
π user-service/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
π user-service/package.json
{
"name": "user-service",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
}
}
π¦ 5. Product Service
π product-service/app.js
const express = require('express');
const app = express();
app.use(express.json());
app.get('/products', (req, res) => {
res.json([{ id: 1, name: 'Kaos ChatGPT', price: 100000 }]);
});
app.listen(3002, () => {
console.log('Product Service running on port 3002');
});
π product-service/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
π product-service/package.json
{
"name": "product-service",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
}
}
π 6. Order Service
π order-service/app.js
const express = require('express');
const app = express();
app.use(express.json());
app.get('/orders', (req, res) => {
res.json([{ id: 1, userId: 1, productId: 1 }]);
});
app.listen(3003, () => {
console.log('Order Service running on port 3003');
});
π order-service/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
π order-service/package.json
{
"name": "order-service",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
}
}
π Cara Menjalankan
- Pastikan domain kamu sudah mengarah ke IP server.
- Jalankan project:
docker compose up -d --build

- Akses:
https://api.masdika.my.id/users
https://api.masdika.my.id/products
https://api.masdika.my.id/orders



β Kesimpulan
π Kamu sudah berhasil membuat dan menjalankan aplikasi e-commerce berbasis microservices dengan Docker dan Caddy sebagai reverse proxy otomatis SSL!
Keuntungan:
- π Otomatis HTTPS dengan Let’s Encrypt
- π¦ Modular & terisolasi antar service
- π³ Dockerized β mudah dipindah dan diskalakan
Selanjutnya, kamu bisa mengembangkan ini dengan:
- Database (MySQL, MongoDB)
- Redis cache
- Authentication JWT
- CI/CD (GitHub Actions, Drone)
- Monitoring (Grafana, Prometheus)
Semoga bermanfaat! β€οΈ

Buat kamu yang lagi Deploy aplikasi dengan Next.js dan pengen jalan di Kubernetes dengan domain custom + SSL otomatis, artikel…

Mau bikin website WordPress super cepat, aman, dan bisa di-scale di Kubernetes? π‘ Artikel ini akan membahas langkah demi langkah…