Add NAS dashboard: FastAPI + Svelte with Docker mgmt, Gitea, files, terminal
This commit is contained in:
@@ -1,38 +0,0 @@
|
|||||||
import httpx
|
|
||||||
from fastapi import APIRouter
|
|
||||||
from config import DOCKER_PROXY_URL
|
|
||||||
|
|
||||||
router = APIRouter()
|
|
||||||
|
|
||||||
@router.get("/containers")
|
|
||||||
async def list_containers():
|
|
||||||
async with httpx.AsyncClient() as c:
|
|
||||||
r = await c.get(f"{DOCKER_PROXY_URL}/containers/json", params={"all": "true"})
|
|
||||||
return [{"id": x["Id"][:12], "name": x["Names"][0].lstrip("/"), "state": x["State"],
|
|
||||||
"status": x["Status"], "image": x["Image"]} for x in r.json()]
|
|
||||||
|
|
||||||
@router.post("/containers/{container_id}/{action}")
|
|
||||||
async def container_action(container_id: str, action: str):
|
|
||||||
if action not in ("start", "stop", "restart"):
|
|
||||||
return {"error": "invalid action"}
|
|
||||||
async with httpx.AsyncClient() as c:
|
|
||||||
r = await c.post(f"{DOCKER_PROXY_URL}/containers/{container_id}/{action}")
|
|
||||||
return {"ok": r.status_code < 400}
|
|
||||||
|
|
||||||
@router.get("/containers/{container_id}/logs")
|
|
||||||
async def container_logs(container_id: str, tail: int = 200):
|
|
||||||
async with httpx.AsyncClient() as c:
|
|
||||||
r = await c.get(f"{DOCKER_PROXY_URL}/containers/{container_id}/logs",
|
|
||||||
params={"stdout": "true", "stderr": "true", "tail": str(tail), "timestamps": "true"})
|
|
||||||
# Strip docker stream header bytes (8 bytes per line)
|
|
||||||
lines = []
|
|
||||||
raw = r.content
|
|
||||||
i = 0
|
|
||||||
while i < len(raw):
|
|
||||||
if i + 8 <= len(raw):
|
|
||||||
size = int.from_bytes(raw[i+4:i+8], "big")
|
|
||||||
lines.append(raw[i+8:i+8+size].decode("utf-8", errors="replace"))
|
|
||||||
i += 8 + size
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
return {"logs": "".join(lines)}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
export default {
|
|
||||||
content: ['./src/**/*.{svelte,js}', './index.html'],
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: { extend: {} },
|
|
||||||
plugins: [],
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user