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. Generates live SVG topology and deployment configs.
About Stack Composer & Your Workflow Guide
Stack Composer is an interactive visual architecture studio for containerized Linux, Nginx, and Docker server infrastructure. You act as Lead Systems & DevOps Architect designing modular infrastructure from public ingress to private data tier. All options are fully interactive and update configs in real time.
⚙️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 & REVERSE PROXY
WAN BoundaryChoose WAN ingress traffic entry into the host server VPS (Let's Encrypt SSL or Zero-Trust Cloudflare Tunnel).
💻STEP 3 • LAYER 2 — WEB & FRONTEND TIER
web-net (isolated)Select whether the architecture uses SSR Node.js, static Nginx SPA, or is an API-only service.
⚡STEP 4 • LAYER 3 — BACKEND API ENGINE
api-net & db-netSelect production-grade backend API runtime connecting reverse proxy to isolated data tier.
🗄️STEP 5 • LAYER 4 — DATABASE & CACHE ADD-ONS
db-net (internal: true)Select isolated RDBMS (zero open WAN port) and enable Redis caching & Uptime Kuma health monitoring.
LIVE DOCKER CONTAINER NETWORK & ISOLATION TOPOLOGY
# =====================================================================
# Generated by InfraCalc Visual Stack Composer (https://infracalc.web.id)
# 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: