216.73.216.120 TODAY : 2,531
자료실 서브 타이틀 아이콘

기술문서

 > 

HTML/CSS

서버 인프라 모니터링용 서버목록 front-end UI Sample

자료 기본정보

서버 인프라 모니터링용 서버목록 front-end UI Sample

주요 프로그램 스펙

  • 평점: 10.0
  • 라이선스: free

피드백 및 다운로드

  • 사용자 평점: 10.0
  • 조회: 1

제조사 및 등록 정보

  • 제작사: LUZENSOFT
  • 등록일: 2026-01-25 11:23:25
  •  

- 설명

Tailwind CSS를 사용하여 레이아웃을 더 세련되게 다듬고, Chart.js를 이용해 시스템 자원 상태를 도넛 차트와 막대 차트로 추가해 보겠습니다.

900px 너비에 최적화된 최신 버전의 코드입니다.


차트가 포함된 서버 모니터링 페이지

차트가 포함된 서버 모니터링 페이지

HTML

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Server Monitoring - SC-SVR01-1028R</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script src="https://cdn.tailwindcss.com"></script>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
        body { font-family: 'Inter', 'Malgun Gothic', sans-serif; }
    </style>
</head>
<body class="bg-slate-50 flex justify-center py-10">

<div id="wrapper" class="w-[900px] bg-white shadow-xl rounded-xl p-8">
    <div class="flex justify-between items-center border-b-2 border-blue-500 pb-6 mb-8">
        <div>
            <h1 class="text-2xl font-bold text-slate-800" id="server_name">서버 실시간 모니터링</h1>
            <p class="text-sm text-slate-500 mt-1">Host: <span id="hn" class="font-semibold text-blue-600">-</span></p>
        </div>
        <input type="date" id="search_date" class="border border-slate-300 rounded-lg px-4 py-2 text-slate-700 focus:outline-none focus:ring-2 focus:ring-blue-500">
    </div>

    <div class="grid grid-cols-3 gap-6 mb-10">
        <div class="bg-slate-50 p-4 rounded-lg border border-slate-100">
            <h3 class="text-sm font-semibold text-slate-600 mb-4 text-center">CPU 사용률</h3>
            <canvas id="cpuChart" width="150" height="150"></canvas>
        </div>
        <div class="bg-slate-50 p-4 rounded-lg border border-slate-100">
            <h3 class="text-sm font-semibold text-slate-600 mb-4 text-center">RAM 사용률</h3>
            <canvas id="ramChart" width="150" height="150"></canvas>
        </div>
        <div class="bg-slate-50 p-4 rounded-lg border border-slate-100">
            <h3 class="text-sm font-semibold text-slate-600 mb-4 text-center">네트워크 트래픽 (Mbps)</h3>
            <canvas id="trafficChart" width="150" height="150"></canvas>
        </div>
    </div>

    <div class="grid grid-cols-4 gap-4 mb-10">
        <div class="p-4 bg-white border border-slate-200 rounded-lg shadow-sm">
            <p class="text-xs text-slate-400 uppercase">OS</p>
            <p id="os" class="text-lg font-bold text-slate-700">-</p>
        </div>
        <div class="p-4 bg-white border border-slate-200 rounded-lg shadow-sm">
            <p class="text-xs text-slate-400 uppercase">WAN IP</p>
            <p id="wan" class="text-sm font-bold text-slate-700">-</p>
        </div>
        <div class="p-4 bg-white border border-slate-200 rounded-lg shadow-sm">
            <p class="text-xs text-slate-400 uppercase">Internal IP</p>
            <p id="ip" class="text-sm font-bold text-slate-700">-</p>
        </div>
        <div class="p-4 bg-white border border-slate-200 rounded-lg shadow-sm">
            <p class="text-xs text-slate-400 uppercase">마지막 업데이트</p>
            <p id="mutime" class="text-[11px] font-bold text-blue-500">-</p>
        </div>
    </div>

    <div class="mb-4 flex items-center justify-between">
        <h2 class="text-lg font-bold text-slate-800 italic">Storage Drives</h2>
    </div>
    <div class="overflow-hidden border border-slate-200 rounded-lg">
        <table class="w-full text-left border-collapse">
            <thead class="bg-slate-800 text-white">
                <tr>
                    <th class="p-3 text-xs uppercase font-semibold">드라이브</th>
                    <th class="p-3 text-xs uppercase font-semibold">모델명</th>
                    <th class="p-3 text-xs uppercase font-semibold text-center">전체 (GB)</th>
                    <th class="p-3 text-xs uppercase font-semibold text-center">남음 (GB)</th>
                    <th class="p-3 text-xs uppercase font-semibold text-center">사용률</th>
                </tr>
            </thead>
            <tbody id="disk_table_body" class="divide-y divide-slate-200">
                </tbody>
        </table>
    </div>
</div>

<script>
let cpuChart, ramChart, trafficChart;

// 차트 초기화 함수
function initCharts() {
    const commonOptions = { cutout: '75%', plugins: { legend: { display: false } } };
    
    cpuChart = new Chart(document.getElementById('cpuChart'), {
        type: 'doughnut',
        data: { datasets: [{ data: [0, 100], backgroundColor: ['#ef4444', '#e2e8f0'], borderWidth: 0 }] },
        options: commonOptions
    });

    ramChart = new Chart(document.getElementById('ramChart'), {
        type: 'doughnut',
        data: { datasets: [{ data: [0, 100], backgroundColor: ['#3b82f6', '#e2e8f0'], borderWidth: 0 }] },
        options: commonOptions
    });

    trafficChart = new Chart(document.getElementById('trafficChart'), {
        type: 'bar',
        data: { labels: ['Traffic'], datasets: [{ data: [0], backgroundColor: '#10b981', borderRadius: 5 }] },
        options: { scales: { y: { beginAtZero: true } }, plugins: { legend: { display: false } } }
    });
}

function updateData() {
    const urlParams = new URLSearchParams(window.location.search);
    const server_no = urlParams.get('server_no') || 1;
    let rawDate = $('#search_date').val().replace(/-/g, "");

    $.ajax({
        url: 'fetch_server_data.php',
        type: 'GET',
        data: { server_no: server_no, date: rawDate },
        dataType: 'json',
        success: function(res) {
            const s = res.server_info;
            
            // 텍스트 업데이트
            $('#hn').text(s.hn);
            $('#os').text(s.os === 'W' ? 'Windows' : 'Linux');
            $('#wan').text(s.wan);
            $('#ip').text(s.ip);
            $('#mutime').text(s.mutime);

            // 차트 업데이트
            cpuChart.data.datasets[0].data = [s.cpu, 100 - s.cpu];
            cpuChart.update();

            ramChart.data.datasets[0].data = [s.ram, 100 - s.ram];
            ramChart.update();

            trafficChart.data.datasets[0].data = [s.traffic];
            trafficChart.update();

            // 디스크 테이블 업데이트
            let diskHtml = '';
            res.disk_info.forEach(d => {
                let usage = ((d.total - d.remain) / d.total * 100).toFixed(1);
                diskHtml += `
                    <tr class="hover:bg-slate-50 transition-colors">
                        <td class="p-3 font-bold text-slate-700">${d.device}</td>
                        <td class="p-3 text-sm text-slate-500">${d.name}</td>
                        <td class="p-3 text-center text-slate-600">${d.total}</td>
                        <td class="p-3 text-center text-slate-600">${d.remain}</td>
                        <td class="p-3 w-40">
                            <div class="flex items-center gap-2">
                                <div class="w-full bg-slate-200 h-2 rounded-full overflow-hidden">
                                    <div class="bg-green-500 h-full" style="width: ${usage}%"></div>
                                </div>
                                <span class="text-[11px] font-bold text-slate-500">${usage}%</span>
                            </div>
                        </td>
                    </tr>
                `;
            });
            $('#disk_table_body').html(diskHtml);
        }
    });
}

$(document).ready(function() {
    $('#search_date').val(new Date().toISOString().split('T')[0]);
    initCharts();
    updateData();
    $('#search_date').on('change', updateData);
});
</script>

</body>
</html>


주요 변경 사항

  1. Tailwind CSS 레이아웃: * w-[900px]로 너비를 고정하고 중앙 정렬했습니다.

    • slateblue 컬러 톤을 사용하여 깔끔한 관리자 페이지 느낌을 주었습니다.

  2. Chart.js 통합:

    • CPU/RAM: 도넛(Doughnut) 차트를 사용하여 현재 사용량을 직관적으로 보여줍니다.

    • Traffic: 막대(Bar) 차트를 사용하여 네트워크 사용량을 표시합니다.

  3. 동적 데이터 연동:

    • AJAX 성공 시 chart.update() 메서드를 호출하여 화면 새로고침 없이 차트 바늘이 움직입니다.

  4. 디스크 프로그레스 바:

    • Tailwind의 rounded-fulloverflow-hidden을 활용하여 현대적인 디자인의 게이지 바를 만들었습니다.


이 카테고리 Navigation
전체 카테고리 Navigation