Skip to main content
INFRASTACK COMPOSER STUDIOSKKNI J.611000.013.01 • LPIC-1/2PRODUCTION HARDENED

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.

Active Containers7 Active Containers
Estimated Stack RAM~1872 MB
Recommended VPS Spec4 vCPU / 4 GB RAM
Network Security PostureZERO-TRUST TUNNEL (0 Open Public Web Ports + Isolated DB)
🐳

About Stack Composer & Your Workflow Guide

Standards SKKNI J.611000.013.01 & LPIC-1/2

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: IdentityProject slug & production FQDN.
Step 2: IngressNginx SSL / Cloudflare Tunnel.
Step 3: FrontendNext.js Node / Vite / None.
Step 4: BackendExpress / Laravel / Go / FastAPI.
Step 5: DatabasePostgres / MySQL + Redis Cache.
Architecture Workflow (Free Selection)5 Active Component Modules

⚙️STEP 1 • PROJECT IDENTITY & DOMAIN

● Active

Specify 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 Boundary

Choose 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-net

Select 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

Bridge: siakad-app-net
ZONE 1: WAN INGRESS & TLS TERMINATION (Public Entrypoint)🛡️ Hybrid Nginx + CFapp.kampus.ac.id📈 Uptime Kuma Monitorstatus.app.kampus.ac.idZONE 2: APPLICATION BRIDGE NETWORK (web-net & api-net)▲ frontend (Next.js Node 20)Container: siakad-app-frontendInternal Port: 3000 • RAM ~200MB⚙️ backend-api (LARAVEL_OCTANE)Container: siakad-app-backend-apiAPI Port: 8000 • Internal OnlyZONE 3: PRIVATE STORAGE & PERSISTENCE TIER (db-net • internal: true)🗄️ database (POSTGRES_16)Volume: siakad-app-db-dataPort: 5432 (Zero Public Access)Encrypted Credentials via .env⚡ redis (Redis 7.4 In-Memory)Volume: siakad-app-redis-dataPort: 6379 (Isolated to api-net)Fast Session & Cache Store
# =====================================================================
# 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: