From 0be8e59ca2201b020a09a570a98b4a27e8d442e5 Mon Sep 17 00:00:00 2001 From: ReLoia Date: Mon, 13 Apr 2026 01:41:35 +0200 Subject: [PATCH] feat(setup): add setup.sh script for automated environment provisioning and app launch --- .env.example | 10 +-- .gitea/workflows/theplug.yml | 32 ---------- README.md | 8 ++- app/main.py | 7 +++ docker-compose.yml | 31 +-------- setup.sh | 118 +++++++++++++++++++++++++++++++++++ 6 files changed, 138 insertions(+), 68 deletions(-) delete mode 100644 .gitea/workflows/theplug.yml create mode 100644 setup.sh diff --git a/.env.example b/.env.example index 85d0759..5520098 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,10 @@ API_PORT=3671 -MONGO_INITDB_ROOT_PASSWORD=pass -MONGODB_URI=mongodb://theplug:pass@mongodb:27017/theplug?authSource=admin +MONGO_INITDB_ROOT_PASSWORD=pass# esegui 'openssl rand -hex 5' in un terminale e copia qui +MONGODB_URI=mongodb://theplug:pass@localhost:27017/theplug?authSource=admin MONGODB_DB_NAME=theplug -REDIS_URL=redis://redis:6379 -JWT_SECRET_KEY=change-this-secret +REDIS_URL=redis://localhost:6379 +JWT_SECRET_KEY= # esegui 'openssl rand -hex 20' in un terminale e copia qui JWT_ALGORITHM=HS256 JWT_EXPIRE_MINUTES=30 AUTH_USERNAME=admin -AUTH_PASSWORD=change-this-password \ No newline at end of file +AUTH_PASSWORD= # esegui 'openssl rand -hex 20' in un terminale e copia qui \ No newline at end of file diff --git a/.gitea/workflows/theplug.yml b/.gitea/workflows/theplug.yml deleted file mode 100644 index 641630d..0000000 --- a/.gitea/workflows/theplug.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Build and Push to Registry - -on: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - container: catthehacker/ubuntu:act-latest - steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Login to Gitea Registry - uses: docker/login-action@v3 - with: - registry: git.reloia.uk - username: reloia - password: ${{ secrets.LOGIN_TOKEN }} - - - name: Build and Push (Shell) - run: | - IMAGE_NAME="git.reloia.uk/reloia/theplug:latest" - - echo "Building $IMAGE_NAME..." - docker build -t "$IMAGE_NAME" . - - echo "Pushing $IMAGE_NAME..." - docker push "$IMAGE_NAME" - diff --git a/README.md b/README.md index 6682ed5..dc60476 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,13 @@ icona di una presa della spina idk FastAPI + MongoDB + Redis ``` -### Setup Dev +## Quick Setup (prod) + +```bash +bash <(curl -s https://git.reloia.uk/reloia/thePlug/raw/branch/master/setup.sh) +``` + +## Setup Dev imposta le variabili d'ambiente 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/docker-compose.yml b/docker-compose.yml index 72e5740..9ba7067 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,40 +1,11 @@ services: - api: - build: - context: . - dockerfile: Dockerfile - container_name: theplug-api - restart: unless-stopped - ports: - - "${API_PORT:-3671}:3671" - environment: - MONGODB_URI: mongodb://${MONGO_USER:-theplug}:${MONGO_PASSWORD:-theplug_dev_password}@mongodb:27017/${MONGO_DB:-theplug}?authSource=admin - MONGODB_DB_NAME: ${MONGO_DB:-theplug} - REDIS_URL: redis://redis:6379/0 - JWT_SECRET_KEY: ${JWT_SECRET_KEY:-change-this-secret} - JWT_ALGORITHM: ${JWT_ALGORITHM:-HS256} - JWT_EXPIRE_MINUTES: ${JWT_EXPIRE_MINUTES:-30} - AUTH_USERNAME: ${AUTH_USERNAME:-admin} - AUTH_PASSWORD: ${AUTH_PASSWORD:-change-this-password} - depends_on: - mongodb: - condition: service_healthy - redis: - condition: service_healthy - healthcheck: - test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://127.0.0.1:3671/').read()\""] - interval: 10s - timeout: 5s - retries: 5 - start_period: 10s - mongodb: image: mongo:8.2 container_name: theplug-mongodb restart: unless-stopped environment: MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-theplug} - MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-pass} + MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD} MONGO_INITDB_DATABASE: ${MONGO_DB:-theplug} ports: - "27017:27017" diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..f3b20c9 --- /dev/null +++ b/setup.sh @@ -0,0 +1,118 @@ +#!/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; } + +if [[ "${1:-}" == "logs" ]]; then + tmux has-session -t "$SESSION" 2>/dev/null || die "nessuna sessione '$SESSION' attiva" + exec tmux attach -t "$SESSION" +fi + +# ── 1. ensure we're in thePlug ──────────────────────────────────────────────── +cd /srv +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 + +chmod +x ./setup.sh + +PLUG_DIR="$(pwd)" +if [[ ! -L /usr/bin/theplug ]]; then + info "Creating symlink /usr/bin/theplug..." + sudo ln -sf "$PLUG_DIR/setup.sh" /usr/bin/theplug + sudo chmod +x /usr/bin/theplug + info "Puoi ora usare 'theplug' e 'theplug logs' da qualsiasi directory" +fi + +# 2 env +if [[ ! -f .env ]]; then + warn ".env not found — copyinh from .env.example with random stuff..." + cp .env.example .env || die ".env.example not found (impossibile)" + + MONGO_PASS=$(openssl rand -hex 8) + JWT_SECRET=$(openssl rand -hex 20) + AUTH_PASS=$(openssl rand -hex 10) + + sed -i "s|^MONGO_INITDB_ROOT_PASSWORD=.*|MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASS|" .env + sed -i "s|^MONGODB_URI=.*|MONGODB_URI=mongodb://theplug:$MONGO_PASS@localhost:27017/theplug?authSource=admin|" .env + sed -i "s|^JWT_SECRET_KEY=.*|JWT_SECRET_KEY=$JWT_SECRET|" .env + sed -i "s|^AUTH_PASSWORD=.*|AUTH_PASSWORD=$AUTH_PASS|" .env +fi + +# ── 3. 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?" + +# ── 4. 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 + +# ── 5. 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 + +# ── 6. venv + deps ──────────────────────────────────────────────────────────── +info "Pinning Python 3.14..." +uv python pin 3.14 + +info "Creating/updating venv..." +uv venv +source .venv/bin/activate + +info "Syncing dependencies..." +uv sync + +# ── 7. run in tmux with autorestart ─────────────────────────────────────────── +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'..." + +API_PORT=$(grep -E '^API_PORT=' .env | cut -d '=' -f2) +API_PORT=${API_PORT:-3671} +tmux new-session -d -s "$SESSION" "bash -c ' + cd $(pwd) + source .venv/bin/activate + while true; do + echo \"[\$(date +%T)] Starting uvicorn...\" + PYTHONPATH=app uv run uvicorn app.main:app --host 0.0.0.0 --port $API_PORT 2>&1 | tee uvicorn.log + echo \"[\$(date +%T)] Process exited — restarting in 3s (Ctrl+C to stop)\" + sleep 3 + done +'" + +info "Done — attach with: tmux attach -t $SESSION" + +echo -e ""; +info "Automatically generated Secrets:" +info " MONGO_PASS: $MONGO_PASS" +info " JWT_SECRET: $JWT_SECRET" +info " AUTH_PASS: $AUTH_PASS - questa è importante" +warn "Save them — these won't be showed again (non è vero basta che leggi $PLUG_DIR/.env)" +echo -e ""; + +info "Installed in $PLUG_DIR, run setup.sh again to restart or similar" \ No newline at end of file