sunucu kaynak kullanimi (cpu/ram/disk/uptime) ekle
Deploy / deploy (push) Successful in 19s

This commit is contained in:
2026-09-23 16:33:44 +03:00
parent 01e3ac1653
commit f6256445ff
+103 -1
View File
@@ -1,7 +1,9 @@
import json import json
import os import os
import re import re
import shutil
import subprocess import subprocess
import time
from datetime import datetime, timezone from datetime import datetime, timezone
import requests import requests
@@ -53,6 +55,64 @@ def human_relative(iso_ts):
return f"{days} gün önce" return f"{days} gün önce"
def _cpu_times():
with open("/proc/stat") as f:
parts = f.readline().split()[1:]
nums = [int(x) for x in parts]
idle = nums[3] + nums[4]
total = sum(nums)
return idle, total
def server_stats():
stats = {}
# CPU: kisa bir ornekleme araligiyla kullanim yuzdesi
idle1, total1 = _cpu_times()
time.sleep(0.3)
idle2, total2 = _cpu_times()
d_idle = idle2 - idle1
d_total = total2 - total1
cpu_percent = round((1 - d_idle / d_total) * 100, 1) if d_total > 0 else 0.0
stats["cpu_percent"] = cpu_percent
stats["cpu_cores"] = os.cpu_count()
with open("/proc/loadavg") as f:
stats["load"] = " / ".join(f.read().split()[:3])
meminfo = {}
with open("/proc/meminfo") as f:
for line in f:
key, _, rest = line.partition(":")
meminfo[key] = int(rest.strip().split()[0]) # kB
mem_total = meminfo.get("MemTotal", 0)
mem_available = meminfo.get("MemAvailable", 0)
mem_used = mem_total - mem_available
stats["mem_used_gb"] = round(mem_used / 1024 / 1024, 1)
stats["mem_total_gb"] = round(mem_total / 1024 / 1024, 1)
stats["mem_percent"] = round(mem_used / mem_total * 100, 1) if mem_total else 0.0
disk = shutil.disk_usage("/")
stats["disk_used_gb"] = round(disk.used / 1024**3, 1)
stats["disk_total_gb"] = round(disk.total / 1024**3, 1)
stats["disk_percent"] = round(disk.used / disk.total * 100, 1) if disk.total else 0.0
with open("/proc/uptime") as f:
up_secs = int(float(f.read().split()[0]))
days, rem = divmod(up_secs, 86400)
hours, _ = divmod(rem, 3600)
stats["uptime"] = f"{days} gün {hours} saat" if days else f"{hours} saat"
all_containers = subprocess.run(
["docker", "ps", "-a", "--format", "{{.State}}"],
capture_output=True, text=True,
).stdout.split()
stats["containers_running"] = sum(1 for s in all_containers if s == "running")
stats["containers_total"] = len(all_containers)
return stats
def inspect_all(cid): def inspect_all(cid):
return json.loads(subprocess.run( return json.loads(subprocess.run(
["docker", "inspect", cid], capture_output=True, text=True, check=True ["docker", "inspect", cid], capture_output=True, text=True, check=True
@@ -161,11 +221,53 @@ TEMPLATE = """
.btn-delete:hover { background: #991b1b; } .btn-delete:hover { background: #991b1b; }
.empty { opacity: 0.6; margin-top: 1.5rem; } .empty { opacity: 0.6; margin-top: 1.5rem; }
form { display: inline; } form { display: inline; }
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 1rem; margin-bottom: 2rem; }
.stat-card { background: #1e293b; border-radius: 10px; padding: 1rem 1.2rem; }
.stat-label { font-size: 0.75rem; opacity: 0.6; text-transform: uppercase; letter-spacing: .03em; }
.stat-value { font-size: 1.5rem; font-weight: 700; margin: 0.15rem 0 0.5rem; }
.stat-sub { font-size: 0.78rem; opacity: 0.55; }
.bar { height: 6px; border-radius: 999px; background: #334155; overflow: hidden; margin-top: 0.5rem; }
.bar-fill { height: 100%; background: #38bdf8; }
.bar-fill.warn { background: #f59e0b; }
.bar-fill.crit { background: #ef4444; }
</style> </style>
</head> </head>
<body> <body>
<h1>Deploy Panel</h1> <h1>Deploy Panel</h1>
<div class="sub">{{ projects|length }} proje · 20 saniyede bir otomatik yenilenir · <a href="/">şimdi yenile</a></div> <div class="sub">{{ projects|length }} proje · 20 saniyede bir otomatik yenilenir · <a href="/">şimdi yenile</a></div>
<div class="stats">
<div class="stat-card">
<div class="stat-label">CPU ({{ s.cpu_cores }} çekirdek)</div>
<div class="stat-value">%{{ s.cpu_percent }}</div>
<div class="bar"><div class="bar-fill {{ 'crit' if s.cpu_percent > 85 else ('warn' if s.cpu_percent > 60 else '') }}" style="width: {{ s.cpu_percent }}%"></div></div>
<div class="stat-sub">yük: {{ s.load }}</div>
</div>
<div class="stat-card">
<div class="stat-label">Bellek</div>
<div class="stat-value">%{{ s.mem_percent }}</div>
<div class="bar"><div class="bar-fill {{ 'crit' if s.mem_percent > 85 else ('warn' if s.mem_percent > 60 else '') }}" style="width: {{ s.mem_percent }}%"></div></div>
<div class="stat-sub">{{ s.mem_used_gb }} / {{ s.mem_total_gb }} GB</div>
</div>
<div class="stat-card">
<div class="stat-label">Disk</div>
<div class="stat-value">%{{ s.disk_percent }}</div>
<div class="bar"><div class="bar-fill {{ 'crit' if s.disk_percent > 85 else ('warn' if s.disk_percent > 60 else '') }}" style="width: {{ s.disk_percent }}%"></div></div>
<div class="stat-sub">{{ s.disk_used_gb }} / {{ s.disk_total_gb }} GB</div>
</div>
<div class="stat-card">
<div class="stat-label">Sunucu</div>
<div class="stat-value" style="font-size:1.1rem;">{{ s.uptime }}</div>
<div class="stat-sub">çalışma süresi</div>
</div>
<div class="stat-card">
<div class="stat-label">Container</div>
<div class="stat-value" style="font-size:1.1rem;">{{ s.containers_running }} / {{ s.containers_total }}</div>
<div class="stat-sub">çalışan / toplam</div>
</div>
</div>
{% if projects %} {% if projects %}
<table> <table>
<tr><th>Proje</th><th>Adres</th><th>Durum</th><th>İmaj</th><th></th></tr> <tr><th>Proje</th><th>Adres</th><th>Durum</th><th>İmaj</th><th></th></tr>
@@ -225,7 +327,7 @@ LOGS_TEMPLATE = """
@app.route("/") @app.route("/")
def index(): def index():
return render_template_string(TEMPLATE, projects=list_projects()) return render_template_string(TEMPLATE, projects=list_projects(), s=server_stats())
@app.route("/logs/<name>") @app.route("/logs/<name>")