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"})
|