Compare commits

...

16 Commits

7 changed files with 39 additions and 19 deletions

4
.gitignore vendored
View File

@@ -25,4 +25,6 @@ dist/
.DS_Store .DS_Store
Thumbs.db Thumbs.db
.MAIN-APP-REFERENCE/ .MAIN-APP-REFERENCE/
.project-vesper-plan.md

View File

@@ -1,5 +1,17 @@
FROM python:3.11-slim FROM python:3.11-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
curl \
&& curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz \
| tar -xz --strip-components=1 -C /usr/local/bin docker/docker \
&& curl -fsSL "https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64" \
-o /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose \
&& mkdir -p /usr/local/lib/docker/cli-plugins \
&& ln -s /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app WORKDIR /app
COPY requirements.txt . COPY requirements.txt .

View File

@@ -43,22 +43,22 @@ async def deploy(request: Request):
logger.info("Auto-deploy triggered via Gitea webhook") logger.info("Auto-deploy triggered via Gitea webhook")
project_path = settings.deploy_project_path project_path = settings.deploy_project_path
cmd = f"cd {project_path} && git pull origin main && docker compose up -d --build" cmd = (
try: f"git config --global --add safe.directory {project_path} && "
proc = await asyncio.create_subprocess_shell( f"cd {project_path} && "
cmd, f"git fetch origin main && "
stdout=asyncio.subprocess.PIPE, f"git reset --hard origin/main && "
stderr=asyncio.subprocess.STDOUT, f"docker-compose up -d --build"
) )
stdout, _ = await asyncio.wait_for(proc.communicate(), timeout=300)
output = stdout.decode(errors="replace") if stdout else ""
if proc.returncode != 0: # Fire and forget — run deploy in background so we can respond before
logger.error(f"Deploy failed (exit {proc.returncode}):\n{output}") # the container restarts (which would kill this very process).
raise HTTPException(status_code=500, detail=f"Deploy script failed:\n{output[-500:]}") await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.DEVNULL,
stderr=asyncio.subprocess.DEVNULL,
start_new_session=True,
)
logger.info(f"Deploy succeeded:\n{output[-300:]}") logger.info("Auto-deploy started in background")
return {"ok": True, "output": output[-1000:]} return {"ok": True, "message": "Deploy started"}
except asyncio.TimeoutError:
raise HTTPException(status_code=504, detail="Deploy timed out after 300 seconds")

View File

@@ -10,6 +10,9 @@ services:
- ./data/built_melodies:/app/storage/built_melodies - ./data/built_melodies:/app/storage/built_melodies
- ./data/firmware:/app/storage/firmware - ./data/firmware:/app/storage/firmware
- ./data/firebase-service-account.json:/app/firebase-service-account.json:ro - ./data/firebase-service-account.json:/app/firebase-service-account.json:ro
# Auto-deploy: project root and Docker socket
- /home/bellsystems/bellsystems-cp:/home/bellsystems/bellsystems-cp
- /var/run/docker.sock:/var/run/docker.sock
ports: ports:
- "8000:8000" - "8000:8000"
depends_on: [] depends_on: []

View File

@@ -12,7 +12,7 @@ export default function Header() {
}} }}
> >
<h2 className="text-lg font-semibold" style={{ color: "var(--text-heading)" }}> <h2 className="text-lg font-semibold" style={{ color: "var(--text-heading)" }}>
BellSystems - Control Panel BellCloud - Console 3
</h2> </h2>
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">

View File

@@ -7,6 +7,7 @@ export default defineConfig({
server: { server: {
host: '0.0.0.0', host: '0.0.0.0',
port: 5173, port: 5173,
allowedHosts: ['console.bellsystems.net'],
hmr: { hmr: {
clientPort: 80, clientPort: 80,
}, },

View File

@@ -3,6 +3,8 @@ events {
} }
http { http {
client_max_body_size 10m;
upstream backend { upstream backend {
server backend:8000; server backend:8000;
} }