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/usershttps://api.masdika.my.id/productshttps://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! β€οΈ
Panduan ini menjelaskan instalasi Jenkins production menggunakan Docker + Traefik (SSL otomatis via DNS Challenge Cloudflare), dengan fokus utama pada…
Let’s Encrypt adalah layanan gratis untuk membuat sertifikat SSL agar akses web Proxmox menjadi aman (HTTPS). Mulai dari versi 6.3,…