Docker, Nginx & Linux Stack Visual Composer
Visual composer for production-grade Linux, Nginx, and Docker server stacks aligned with SKKNI and LPIC standards. Assemble ingress, frontend, backend API, private database, and cache in modular blocks with live SVG topology and deployment scripts.
What Is Stack Composer For? (Pick Your Scenario)
When you finish coding an app on your laptop and want to deploy it to a Linux VPS, you need Docker, Nginx SSL Reverse Proxy, an Isolated Database, and a Firewall. Pick your stack below to instantly get a High-Res Architecture Diagram, Monthly Cloud VPS Cost Comparison, and a 1-Command Auto-Deploy Script!
Traffic Flow Simulation (1 ➔ 2 ➔ 3 ➔ 4)
Accesses https://app.kampus.ac.id over public internet via HTTPS (Port 443).
Edge ingress terminates TLS certificates and applies rate limiting.
Routes frontend UI requests to NEXTJS_NODE and API endpoints to LARAVEL_OCTANE.
POSTGRES_16 persists records within isolated private bridge network without WAN exposure.
1-Click Production Architecture Templates (Popular Presets)
⚙️STEP 1 • PROJECT IDENTITY & DOMAIN
● ActiveSpecify the project slug and production domain FQDN used for Let's Encrypt SSL and Nginx server_name.
🛡️STEP 2 • LAYER 1 — EDGE INGRESS & TLS
Pilih mekanisme gerbang trafik masuk dari internet publik ke host server Anda.
💻STEP 3 • LAYER 2 — WEB FRONTEND UI
Pilih kerangka antarmuka pengguna klien (SSR atau Static SPA).
⚡STEP 4 • LAYER 3 — BACKEND API SERVICE
Pilih runtime server logika bisnis backend aplikasi.
🗄️STEP 5 • LAYER 4 — DATABASE & CACHE TIER
Database diisolasi 100% di jaringan internal Docker tanpa port publik ke internet.
LIVE VPS RESOURCE & CAPACITY METER
Monthly Cloud VPS Cost Comparison (USD & IDR)
Estimated monthly server cost to run the siakad-app architecture stably 24/7 based on recommended 4 vCPU / 4 GB RAM:
| VPS Provider | Plan Type | Estimasi USD | Estimasi IDR | Region & Strengths |
|---|---|---|---|---|
| 🇩🇪 Hetzner Cloud | CX32 / CPX31 | ~$5.50 - $10.50 / bln | ~Rp 88.000 - Rp 168.000 / bln | Best value per RAM, EU & US Datacenters |
| 🌐 UpCloud / DigitalOcean / Vultr | Standard 4GB / 8GB | ~$12.00 - $24.00 / bln | ~Rp 192.000 - Rp 384.000 / bln | Singapore/Jakarta DC, ultra-low latency (<15ms) |
| 🇮🇩 VPS Cloud Lokal Indonesia | IIX / OpenIXP / IDC | ~$6.00 - $14.00 / bln | ~Rp 95.000 - Rp 225.000 / bln | Unmetered local IIX peering, QRIS/local payment |
LIVE DOCKER CONTAINER NETWORK & ISOLATION TOPOLOGY
# =====================================================================
# Generated by KalkuNet Visual Stack Composer (https://kalkunet.com)
# Project : siakad-app (app.kampus.ac.id)
# Topology: BOTH_NGINX_AND_CF -> frontend + backend-api -> POSTGRES_16 + redis
# =====================================================================
name: siakad-app
services:
nginx-proxy:
image: nginx:1.27-alpine
container_name: siakad-app-nginx
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./certbot/conf:/etc/letsencrypt:ro
depends_on:
- frontend
- backend-api
networks:
- edge-net
cloudflared:
image: cloudflare/cloudflared:latest
container_name: siakad-app-tunnel
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
networks:
- edge-net
frontend:
image: node:20-alpine
container_name: siakad-app-frontend
restart: unless-stopped
working_dir: /app
environment:
NODE_ENV: production
NEXT_PUBLIC_API_URL: https://app.kampus.ac.id/api
expose:
- "3000"
networks:
- edge-net
backend-api:
image: dunglas/frankenphp:1-php8.3-alpine
container_name: siakad-app-backend
restart: unless-stopped
working_dir: /app
command: php artisan octane:frankenphp --host=0.0.0.0 --port=8000
environment:
APP_ENV: production
PORT: 8000
DB_HOST: database
DB_PORT: 5432
DB_NAME: ${DB_NAME:-app_db}
DB_USER: ${DB_USER:-app_user}
DB_PASSWORD: ${DB_PASSWORD}
REDIS_URL: redis://redis-cache:6379
expose:
- "8000"
depends_on:
database:
condition: service_healthy
networks:
- edge-net
- db-net
database:
image: postgres:16-alpine
container_name: siakad-app-db
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-app_db}
POSTGRES_USER: ${DB_USER:-app_user}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-app_user} -d ${DB_NAME:-app_db}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- db-net
redis-cache:
image: redis:7.4-alpine
container_name: siakad-app-redis
restart: unless-stopped
command: redis-server --save 60 1 --loglevel warning --requirepass ${REDIS_PASSWORD}
volumes:
- redis-data:/data
networks:
- db-net
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: siakad-app-monitoring
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- kuma-data:/app/data
networks:
- edge-net
networks:
edge-net:
driver: bridge
db-net:
driver: bridge
internal: true
volumes:
db-data:
redis-data:
kuma-data: