<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title">VPS{{ vpsid }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
</div>
<div class="modal-body">
<h3>Containers ({{ dockervpsValues.containers|length }})</h3>
{% for projet, containers in dockervpsValues.containers %}
{% set projectsize = 0 %}
{% for directory, size in sizeinfo %}
{% if directory in projet %}
{% set projectsize = size*1024 %}
{% elseif directory == "symfokasa" and projet == "kasanature" %}
{% set projectsize = size*1024 %}
{% elseif directory == "devsymfo" and projet == "sf5vps2" %}
{% set projectsize = size*1024 %}
{% endif %}
{% endfor %}
{% set oldprojectsize = 0 %}
{% for directory, size in sizeinfoold %}
{% if directory in projet %}
{% set oldprojectsize = size*1024 %}
{% elseif directory == "symfokasa" and projet == "kasanature" %}
{% set oldprojectsize = size*1024 %}
{% elseif directory == "devsymfo" and projet == "sf5vps2" %}
{% set oldprojectsize = size*1024 %}
{% endif %}
{% endfor %}
{% set oldoldprojectsize = 0 %}
{% for directory, size in sizeinfooldold %}
{% if directory in projet %}
{% set oldoldprojectsize = size*1024 %}
{% elseif directory == "symfokasa" and projet == "kasanature" %}
{% set oldoldprojectsize = size*1024 %}
{% elseif directory == "devsymfo" and projet == "sf5vps2" %}
{% set oldoldprojectsize = size*1024 %}
{% endif %}
{% endfor %}
{% set tendancesize = false %}
{% if projectsize and oldprojectsize %}
{% set diffsize = 0 %}
{% if projectsize > oldprojectsize %}
{% set diffsize = projectsize - oldprojectsize %}
{% set tendancesize = '<i class="ti-arrow-up" title="tendance h-12 | +'~diffsize|realsize(2)~'"></i>' %}
{% elseif projectsize < oldprojectsize %}
{% set diffsize = oldprojectsize - projectsize %}
{% set tendancesize = '<i class="ti-arrow-down" title="tendance h-12 | -'~diffsize|realsize(2)~'"></i>' %}
{% elseif projectsize == oldprojectsize %}
{% set tendancesize = '<i class="ti-line-double" title="tendance h-12"></i>' %}
{% endif %}
{% endif %}
{% set tendancesizeold = false %}
{% if oldoldprojectsize and oldprojectsize %}
{% set diffsize = 0 %}
{% if oldprojectsize > oldoldprojectsize %}
{% set diffsize = oldprojectsize - oldoldprojectsize %}
{% set tendancesizeold = '<i class="ti-arrow-up" title="tendance h-24 | +'~diffsize|realsize(2)~'"></i>' %}
{% elseif oldprojectsize < oldoldprojectsize %}
{% set diffsize = oldoldprojectsize - oldprojectsize %}
{% set tendancesizeold = '<i class="ti-arrow-down" title="tendance h-24 | -'~diffsize|realsize(2)~'"></i>' %}
{% elseif oldprojectsize == oldoldprojectsize %}
{% set tendancesizeold = '<i class="ti-line-double" title="tendance h-24"></i>' %}
{% endif %}
{% endif %}
<div class="vpsa">
<strong>
{% if 'vps' in projet %}
<a href="https://{{ projet|replace({'vps': '.vps'}) }}.kelkii.com" title="https://{{ projet|replace({'vps': '.vps'}) }}.kelkii.com" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
{% elseif 'phpmyadmin' in projet %}
<a href="https://phpm.vps1.kelkii.com" title="https://phpm.vps1.kelkii.com" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
{% elseif 'kasanature' in projet %}
<a href="https://kasanature.kelkii.com/fr/" title="https://kasanature.kelkii.com/fr/" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
{% else %}
{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}
{% endif %}
{% if projectsize %} - {{ projectsize|realsize(2) }}{% endif %}{% if tendancesize %} {{ tendancesize|raw }}{% endif %}{% if tendancesizeold %} {{ tendancesizeold|raw }}{% endif %}
</strong> <em class="detaildocker">({% for container in containers %}{{ container|trim }}{% if not loop.last %}, {% endif %}{% endfor %})</em>
</div>
{% endfor %}
<br>
<h3>Outils</h3>
<a href="https://traefik.vps{{ vpsid }}.kelkii.com/" target="_blank">Traefik</a> - <a href="https://portainer.vps{{ vpsid }}.kelkii.com/" target="_blank">Portainer</a>
<br>
<br>
<h3>Disque</h3>
<canvas id="myChart" width="400" height="200"></canvas>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
var sizehisto = {{ sizehisto|json_encode|raw }};
var dates = sizehisto.map(function(item) {
return item.logDate;
});
var percents = sizehisto.map(function(item) {
return item.percent;
});
var chart = new Chart(ctx, {
type: 'line',
data: {
labels: dates,
datasets: [{
label: 'Size (%)',
data: percents,
backgroundColor: 'rgba(0,194,132,0.25)',
borderColor: '#00c284',
borderWidth: 2
}]
},
options: {
scales: {
yAxes: [{
ticks: {
min: 0,
max: 100
}
}]
}
}
});
</script>
<br>
<span id="show30Button" class="cpointer tgreen btn btn-outline-success btn-sm mb-2"><i class="fa fa-line-chart" aria-hidden="true"></i> Changer niveau de zoom</span>
<h3>Mémoire</h3>
<canvas id="memChart" width="400" height="200"></canvas>
<br>
<h3>Utilisation de la mémoire docker</h3>
<canvas id="memoryChart" width="800" height="400"></canvas>
<br>
<h3>IPs Bannis</h3>
<p>Login sur le serveur : {{ vpsinfolastping.login_date }} / {{ vpsinfolastping.login_ip }}</p>
<canvas id="ipChart" width="400" height="200"></canvas>
<br>
<script>
var vpsinfo = {{ vpsinfo|json_encode|raw }};
var vpsdockerinfo = {{ vpsdockerinfo|json_encode|raw }};
var memCtx = document.getElementById('memChart').getContext('2d');
var ipCtx = document.getElementById('ipChart').getContext('2d');
var dockerCtx = document.getElementById('memoryChart').getContext('2d');
var memChart, ipChart, dockerChart;
var zoomState = 0; // 0: all data, 1: last 40, 2: last 20
function createCharts(data, dockerData, pointRadius = 0, maxy = true) {
// VPS Info Charts
var memDates = data.map(item => item.date);
var memUsage = data.map(item => item.mem_usage);
var bannedIps = data.map(item => item.banned_ips);
var memOptions = {
scales: {
yAxes: [{
ticks: {
callback: value => value + '%'
}
}]
}
};
if (maxy) {
memOptions.scales.yAxes[0].ticks.min = 0;
memOptions.scales.yAxes[0].ticks.max = 100;
}
memChart = new Chart(memCtx, {
type: 'line',
data: {
labels: memDates,
datasets: [{
label: 'Memory Usage (%)',
data: memUsage,
backgroundColor: 'rgba(54, 162, 235, 0.25)',
borderColor: 'rgb(54, 162, 235)',
borderWidth: 2,
pointRadius: pointRadius
}]
},
options: memOptions
});
ipChart = new Chart(ipCtx, {
type: 'line',
data: {
labels: memDates,
datasets: [{
label: 'Banned IPs',
data: bannedIps,
backgroundColor: 'rgba(255, 99, 132, 0.25)',
borderColor: 'rgb(255, 99, 132)',
borderWidth: 2,
pointRadius: pointRadius
}]
},
options: {
scales: {
yAxes: [{
ticks: {
min: 0,
stepSize: 1
}
}]
}
}
});
// Docker Info Chart
var datasets = {};
var dates = [];
var allContainers = {};
function getContainerName(containerName) {
return containerName.replace(/_php_1$/, '').replace(/vps[12]_/, '');
}
// First pass: collect all unique containers and dates
dockerData.forEach(function(entry) {
dates.push(entry.date);
var jsondata = JSON.parse(entry.jsondata);
Object.keys(jsondata.jsondata).forEach(function(containerName) {
if (containerName.includes('_php')) {
var cleanName = getContainerName(containerName);
allContainers[cleanName] = true;
}
});
});
// Initialize datasets for all containers
Object.keys(allContainers).forEach(function(cleanName) {
datasets[cleanName] = [];
});
// Second pass: fill data, using null for missing values
dockerData.forEach(function(entry) {
var jsondata = JSON.parse(entry.jsondata);
var currentData = {};
Object.keys(jsondata.jsondata).forEach(function(containerName) {
if (containerName.includes('_php')) {
var cleanName = getContainerName(containerName);
currentData[cleanName] = jsondata.jsondata[containerName].memory;
}
});
// Add data for all containers (null if not present)
Object.keys(allContainers).forEach(function(cleanName) {
datasets[cleanName].push(currentData[cleanName] !== undefined ? currentData[cleanName] : null);
});
});
var chartDatasets = Object.keys(datasets).map(function(cleanName, index) {
var color = 'hsl(' + (index * 360 / Object.keys(datasets).length) + ', 70%, 50%)';
return {
label: cleanName,
data: datasets[cleanName],
borderColor: color,
backgroundColor: color + '33',
fill: false,
lineTension: 0.4,
pointRadius: pointRadius,
spanGaps: true
};
});
dockerChart = new Chart(dockerCtx, {
type: 'line',
data: {
labels: dates,
datasets: chartDatasets
},
options: {
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
callback: value => value + '%'
},
scaleLabel: {
display: true,
labelString: 'Utilisation de la mémoire (%)'
}
}],
xAxes: [{
scaleLabel: {
display: true,
labelString: 'Date et heure'
}
}]
},
legend: {
display: true,
position: 'top',
labels: {
boxWidth: 12,
padding: 10
}
},
title: {
display: true,
text: 'Évolution de l\'utilisation de la mémoire par conteneur PHP'
}
}
});
}
// Initial chart creation with all data
createCharts(vpsinfo, vpsdockerinfo, 0, true);
// Function to toggle between different zoom levels
function toggleDataDisplay() {
memChart.destroy();
ipChart.destroy();
dockerChart.destroy();
zoomState = (zoomState + 1) % 3; // Cycle through 0, 1, 2
let displayData, displayDockerData, pointRadius, setMaxY;
switch(zoomState) {
case 1: // Last 40 points
displayData = vpsinfo.slice(-40);
displayDockerData = vpsdockerinfo.slice(-40);
pointRadius = 3;
setMaxY = false;
break;
case 2: // Last 20 points
displayData = vpsinfo.slice(-20);
displayDockerData = vpsdockerinfo.slice(-20);
pointRadius = 4;
setMaxY = false;
break;
default: // All data
displayData = vpsinfo;
displayDockerData = vpsdockerinfo;
pointRadius = 0;
setMaxY = true;
}
createCharts(displayData, displayDockerData, pointRadius, setMaxY);
}
// Event listener for the button
document.getElementById('show30Button').addEventListener('click', toggleDataDisplay);
</script>
<h3>Backups</h3>
{% for backup in backups %}
{{ backup.name }} : <em>{{ backup.time|date('d/m/Y H:i') }} ({{ backup.size|realsize(2) }})</em><br>
{% endfor %}
<br>
<em>{{ dockervpsValues.containerstime|date('d/m/Y H:i') }}</em>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>