From 721f0d3122055f77886b9f13f7c2e3e9878aa3b7 Mon Sep 17 00:00:00 2001 From: ReLoia Date: Mon, 13 Apr 2026 00:44:36 +0200 Subject: [PATCH] feat(setup): add setup.sh script for automated environment provisioning and app launch --- .env.example | 3 ++- app/main.py | 7 ++++++ setup.sh | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 setup.sh diff --git a/.env.example b/.env.example index 85d0759..d29e9d5 100644 --- a/.env.example +++ b/.env.example @@ -7,4 +7,5 @@ JWT_SECRET_KEY=change-this-secret JWT_ALGORITHM=HS256 JWT_EXPIRE_MINUTES=30 AUTH_USERNAME=admin -AUTH_PASSWORD=change-this-password \ No newline at end of file +AUTH_PASSWORD=change-this-password +DEBUG=true \ No newline at end of file diff --git a/app/main.py b/app/main.py index 0494a77..fe1ef19 100644 --- a/app/main.py +++ b/app/main.py @@ -1,3 +1,4 @@ +import os import sys from contextlib import asynccontextmanager from pathlib import Path @@ -43,9 +44,15 @@ async def lifespan(_: FastAPI): await close_redis() await close_mongodb() + +DEBUG = os.getenv("DEBUG", "false").lower() == "true" + app = FastAPI( title="thePlugAPI", lifespan=lifespan, + docs_url="/docs" if DEBUG else None, + redoc_url="/redoc" if DEBUG else None, + openapi_url="/openapi.json" if DEBUG else None, ) app.include_router(auth_router) diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..d034eb6 --- /dev/null +++ b/setup.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +# nota di Renato +# fatto da Claude Sonnet 4.6 (preferisco tagliarmi le palle che scrivere un bash a mano) + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +info() { echo -e "${GREEN}[+]${NC} $*"; } +warn() { echo -e "${YELLOW}[!]${NC} $*"; } +die() { echo -e "${RED}[✗] FATAL:${NC} $*" >&2; exit 1; } + +# ── 1. ensure we're in thePlug ──────────────────────────────────────────────── +if [[ "$(basename "$PWD")" != "thePlug" ]]; then + warn "Not in thePlug — cloning..." + git clone https://git.reloia.uk/reloia/thePlug || die "git clone failed" + cd thePlug +fi + +# ── 2. spin up dependencies ─────────────────────────────────────────────────── +info "Starting Redis and MongoDB..." +docker compose up -d redis mongodb || die "docker compose failed — are Redis/MongoDB defined in compose.yml?" + +# ── 3. ensure uv is available ───────────────────────────────────────────────── +if ! command -v uv &>/dev/null; then + warn "uv not found — installing..." + curl -LsSf https://astral.sh/uv/install.sh | sh || die "uv installation failed" + export PATH="$HOME/.local/bin:$PATH" + command -v uv &>/dev/null || die "uv installed but still not in PATH — open a new shell and retry" + info "uv installed: $(uv --version)" +fi + +# ── 4. ensure tmux is available ─────────────────────────────────────────────── +if ! command -v tmux &>/dev/null; then + warn "tmux not found — installing..." + sudo apt-get install -y tmux || die "tmux installation failed" + info "tmux installed" +fi + +# ── 5. venv + deps ──────────────────────────────────────────────────────────── +info "Creating/updating venv..." +uv venv +source .venv/bin/activate + +info "Syncing dependencies..." +uv sync + +# ── 6. run in tmux ──────────────────────────────────────────────────────────── +SESSION="theplug" + +if tmux has-session -t "$SESSION" 2>/dev/null; then + warn "tmux session '$SESSION' already exists — killing it..." + tmux kill-session -t "$SESSION" +fi + +info "Launching FastAPI in tmux session '$SESSION'..." +tmux new-session -d -s "$SESSION" \ + "cd $(pwd) && source .venv/bin/activate && uv run uvicorn app.main:app --host 0.0.0.0 --port 8000" + +info "Done — attach with: tmux attach -t $SESSION" \ No newline at end of file