|
from fastapi import FastAPI, UploadFile, File, HTTPException |
|
from fastapi.responses import FileResponse |
|
from pathlib import Path |
|
import psutil |
|
import shutil |
|
import os |
|
|
|
app = FastAPI() |
|
|
|
|
|
UPLOAD_DIRECTORY = Path("uploads") |
|
UPLOAD_DIRECTORY.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
TOTAL_SPACE_GB = 50 |
|
|
|
|
|
def get_directory_size(directory: Path) -> int: |
|
total_size = 0 |
|
for dirpath, dirnames, filenames in os.walk(directory): |
|
for f in filenames: |
|
fp = os.path.join(dirpath, f) |
|
total_size += os.path.getsize(fp) |
|
return total_size |
|
|
|
|
|
@app.get("/health") |
|
def health_check(): |
|
return { |
|
"status": "healthy" |
|
} |
|
|
|
|
|
@app.get("/metrics") |
|
def get_metrics(): |
|
|
|
cpu_percent = round(psutil.cpu_percent(interval=1)) |
|
|
|
|
|
memory = psutil.virtual_memory() |
|
memory_total_gb = memory.total / (1024 ** 3) |
|
memory_available_gb = memory.available / (1024 ** 3) |
|
|
|
|
|
uploads_size_bytes = get_directory_size(UPLOAD_DIRECTORY) |
|
uploads_size_gb = uploads_size_bytes / (1024 ** 3) |
|
uploads_percent = (uploads_size_gb / TOTAL_SPACE_GB) * 100 |
|
|
|
return { |
|
"cpu_percent": cpu_percent, |
|
"memory": { |
|
"total_gb": round(memory_total_gb, 2), |
|
"available_gb": round(memory_available_gb, 2), |
|
"percent": memory.percent |
|
}, |
|
"disk": { |
|
"uploads_folder_size_gb": round(uploads_size_gb, 2), |
|
"uploads_usage_percent_of_50gb": round(uploads_percent, 2), |
|
"total_space_gb": TOTAL_SPACE_GB |
|
} |
|
} |
|
|
|
|
|
@app.post("/uploadfile/") |
|
async def upload_file(file: UploadFile = File(...)): |
|
file_location = UPLOAD_DIRECTORY / file.filename |
|
|
|
with file_location.open("wb") as buffer: |
|
shutil.copyfileobj(file.file, buffer) |
|
|
|
return {"info": f"file '{file.filename}' saved at '{file_location}'"} |
|
|
|
|
|
@app.get("/downloadfile/{filename}") |
|
def download_file(filename: str): |
|
file_location = UPLOAD_DIRECTORY / filename |
|
|
|
if not file_location.exists(): |
|
raise HTTPException(status_code=404, detail="File not found") |
|
|
|
return FileResponse(path=file_location, filename=filename) |
|
|
|
|
|
@app.get("/files/") |
|
def list_files(): |
|
files = [f for f in os.listdir(UPLOAD_DIRECTORY) if os.path.isfile(UPLOAD_DIRECTORY / f)] |
|
return {"files": files} |
|
|