Upload 25 files
Browse files- app.py +4 -4
- docker_client.py +12 -0
- routers/controls.py +11 -8
- routers/deploy.py +9 -3
app.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
from fastapi import FastAPI
|
| 2 |
-
import docker
|
| 3 |
import dotenv
|
| 4 |
from routers.deploy import router as deploy_router
|
| 5 |
from routers.controls import router as controls_router
|
| 6 |
from routers.logs import router as logs_router
|
|
|
|
| 7 |
|
| 8 |
# Load environment variables
|
| 9 |
dotenv.load_dotenv()
|
|
@@ -13,11 +13,11 @@ app.include_router(controls_router, prefix="/controls")
|
|
| 13 |
app.include_router(logs_router, prefix="/logs")
|
| 14 |
app.include_router(deploy_router, prefix="/deploy")
|
| 15 |
|
| 16 |
-
client = docker.from_env()
|
| 17 |
-
|
| 18 |
@app.get("/")
|
| 19 |
def dashboard():
|
| 20 |
-
|
|
|
|
|
|
|
| 21 |
container_list = [
|
| 22 |
{
|
| 23 |
"id": container.id,
|
|
|
|
| 1 |
from fastapi import FastAPI
|
|
|
|
| 2 |
import dotenv
|
| 3 |
from routers.deploy import router as deploy_router
|
| 4 |
from routers.controls import router as controls_router
|
| 5 |
from routers.logs import router as logs_router
|
| 6 |
+
from docker_client import docker_client
|
| 7 |
|
| 8 |
# Load environment variables
|
| 9 |
dotenv.load_dotenv()
|
|
|
|
| 13 |
app.include_router(logs_router, prefix="/logs")
|
| 14 |
app.include_router(deploy_router, prefix="/deploy")
|
| 15 |
|
|
|
|
|
|
|
| 16 |
@app.get("/")
|
| 17 |
def dashboard():
|
| 18 |
+
if not docker_client:
|
| 19 |
+
return {"message": "Docker is not available"}
|
| 20 |
+
containers = docker_client.containers.list(all=True)
|
| 21 |
container_list = [
|
| 22 |
{
|
| 23 |
"id": container.id,
|
docker_client.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import docker
|
| 2 |
+
|
| 3 |
+
def get_docker_client():
|
| 4 |
+
try:
|
| 5 |
+
# Check if Docker is available
|
| 6 |
+
client = docker.from_env()
|
| 7 |
+
client.ping()
|
| 8 |
+
return client
|
| 9 |
+
except Exception:
|
| 10 |
+
return None
|
| 11 |
+
|
| 12 |
+
docker_client = get_docker_client()
|
routers/controls.py
CHANGED
|
@@ -1,16 +1,15 @@
|
|
| 1 |
from fastapi import APIRouter, HTTPException
|
| 2 |
-
from fastapi.responses import JSONResponse
|
| 3 |
-
import
|
| 4 |
-
from docker import client
|
| 5 |
|
| 6 |
router = APIRouter()
|
| 7 |
|
| 8 |
-
docker_client = docker.from_env()
|
| 9 |
-
|
| 10 |
@router.get("/start/{container_name}")
|
| 11 |
def start_container(container_name: str):
|
|
|
|
|
|
|
| 12 |
try:
|
| 13 |
-
container =
|
| 14 |
container.unpause()
|
| 15 |
return JSONResponse({"status": "started"})
|
| 16 |
except Exception as e:
|
|
@@ -18,8 +17,10 @@ def start_container(container_name: str):
|
|
| 18 |
|
| 19 |
@router.get("/pause/{container_name}")
|
| 20 |
def pause_container(container_name: str):
|
|
|
|
|
|
|
| 21 |
try:
|
| 22 |
-
container =
|
| 23 |
container.pause()
|
| 24 |
return JSONResponse({"status": "paused"})
|
| 25 |
except Exception as e:
|
|
@@ -27,8 +28,10 @@ def pause_container(container_name: str):
|
|
| 27 |
|
| 28 |
@router.get("/stop/{container_name}")
|
| 29 |
def stop_container(container_name: str):
|
|
|
|
|
|
|
| 30 |
try:
|
| 31 |
-
container =
|
| 32 |
container.stop()
|
| 33 |
container.remove(force=True)
|
| 34 |
return JSONResponse({"status": "stopped and removed"})
|
|
|
|
| 1 |
from fastapi import APIRouter, HTTPException
|
| 2 |
+
from fastapi.responses import JSONResponse
|
| 3 |
+
from docker_client import docker_client
|
|
|
|
| 4 |
|
| 5 |
router = APIRouter()
|
| 6 |
|
|
|
|
|
|
|
| 7 |
@router.get("/start/{container_name}")
|
| 8 |
def start_container(container_name: str):
|
| 9 |
+
if not docker_client:
|
| 10 |
+
raise HTTPException(status_code=503, detail="Docker is not available")
|
| 11 |
try:
|
| 12 |
+
container = docker_client.containers.get(container_name)
|
| 13 |
container.unpause()
|
| 14 |
return JSONResponse({"status": "started"})
|
| 15 |
except Exception as e:
|
|
|
|
| 17 |
|
| 18 |
@router.get("/pause/{container_name}")
|
| 19 |
def pause_container(container_name: str):
|
| 20 |
+
if not docker_client:
|
| 21 |
+
raise HTTPException(status_code=503, detail="Docker is not available")
|
| 22 |
try:
|
| 23 |
+
container = docker_client.containers.get(container_name)
|
| 24 |
container.pause()
|
| 25 |
return JSONResponse({"status": "paused"})
|
| 26 |
except Exception as e:
|
|
|
|
| 28 |
|
| 29 |
@router.get("/stop/{container_name}")
|
| 30 |
def stop_container(container_name: str):
|
| 31 |
+
if not docker_client:
|
| 32 |
+
raise HTTPException(status_code=503, detail="Docker is not available")
|
| 33 |
try:
|
| 34 |
+
container = docker_client.containers.get(container_name)
|
| 35 |
container.stop()
|
| 36 |
container.remove(force=True)
|
| 37 |
return JSONResponse({"status": "stopped and removed"})
|
routers/deploy.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
from fastapi import APIRouter, HTTPException, UploadFile, Form
|
| 2 |
from fastapi.responses import JSONResponse
|
| 3 |
-
import
|
| 4 |
import uuid
|
| 5 |
import zipfile
|
| 6 |
import os
|
|
@@ -11,6 +11,8 @@ router = APIRouter()
|
|
| 11 |
|
| 12 |
@router.post("/project")
|
| 13 |
async def deploy_code(file: UploadFile, app_name: str = Form(...)):
|
|
|
|
|
|
|
| 14 |
if not file.filename.endswith(".zip"):
|
| 15 |
raise HTTPException(status_code=400, detail="Only .zip files are supported")
|
| 16 |
|
|
@@ -81,7 +83,6 @@ async def deploy_code(file: UploadFile, app_name: str = Form(...)):
|
|
| 81 |
container_name = image_name
|
| 82 |
|
| 83 |
try:
|
| 84 |
-
docker_client = docker.from_env()
|
| 85 |
for c in docker_client.containers.list(all=True):
|
| 86 |
if c.status in ["created", "exited"]:
|
| 87 |
print(f"Removing leftover container {c.name} ({c.id})")
|
|
@@ -118,4 +119,9 @@ async def deploy_code(file: UploadFile, app_name: str = Form(...)):
|
|
| 118 |
})
|
| 119 |
|
| 120 |
except Exception as e:
|
| 121 |
-
return JSONResponse({"error": str(e)}, status_code=500)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
from fastapi import APIRouter, HTTPException, UploadFile, Form
|
| 2 |
from fastapi.responses import JSONResponse
|
| 3 |
+
from docker_client import docker_client
|
| 4 |
import uuid
|
| 5 |
import zipfile
|
| 6 |
import os
|
|
|
|
| 11 |
|
| 12 |
@router.post("/project")
|
| 13 |
async def deploy_code(file: UploadFile, app_name: str = Form(...)):
|
| 14 |
+
if not docker_client:
|
| 15 |
+
raise HTTPException(status_code=503, detail="Docker is not available")
|
| 16 |
if not file.filename.endswith(".zip"):
|
| 17 |
raise HTTPException(status_code=400, detail="Only .zip files are supported")
|
| 18 |
|
|
|
|
| 83 |
container_name = image_name
|
| 84 |
|
| 85 |
try:
|
|
|
|
| 86 |
for c in docker_client.containers.list(all=True):
|
| 87 |
if c.status in ["created", "exited"]:
|
| 88 |
print(f"Removing leftover container {c.name} ({c.id})")
|
|
|
|
| 119 |
})
|
| 120 |
|
| 121 |
except Exception as e:
|
| 122 |
+
return JSONResponse({"error": str(e)}, status_code=500)
|
| 123 |
+
|
| 124 |
+
@router.get("/project/{project_id}")
|
| 125 |
+
def get_project_status(project_id: str):
|
| 126 |
+
# Placeholder for project status logic
|
| 127 |
+
return JSONResponse({"project_id": project_id, "status": "running"})
|