diff --git a/.woodpecker/deploy.yml b/.woodpecker/deploy.yml index 896639b..9172713 100644 --- a/.woodpecker/deploy.yml +++ b/.woodpecker/deploy.yml @@ -16,6 +16,14 @@ labels: depends_on: - build +# deploy doesn't need the repo — it runs docker compose against a host-mounted +# dir. Skip the default clone to keep the UI clean. +clone: + - name: skip-clone + image: alpine + commands: + - ":" + steps: - name: deploy image: docker:24-cli diff --git a/README.md b/README.md new file mode 100644 index 0000000..05911e2 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# stellar-ops / NOVA + +Airline operations platform built with MCP (Model Context Protocol). Connects AI agents to real-time flight data, crew duty status, weather, and airport conditions to assist with irregular ops — flight disruptions, crew rebooking, and passenger notifications. + +Two agent clients share a common set of MCP servers: + +- **EFH agent** — internal ops-facing, monitors disruptions and drives crew/rebooking decisions +- **Handover agent** — passenger-facing, generates notifications and status updates + +## Docs + +Browse the architecture docs locally: + +```bash +python -m http.server 8000 --directory docs +``` + +Then open `http://localhost:8000`. diff --git a/ctrl/deploy.sh b/ctrl/deploy.sh deleted file mode 100755 index 4bbf2ba..0000000 --- a/ctrl/deploy.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash -# Deploy UNT (NOVA) to server -# Usage: ./ctrl/deploy.sh [push|rsync|sync|restart|edge] -# -# push — (default) build images locally, push to registry, deploy (avoids OOM on server) -# rsync — sync source, rebuild images on server, restart (bypass CI) -# sync — sync source only (no rebuild, no restart) -# restart — restart containers (no sync, no rebuild) -# edge — pull latest images from registry and restart -# -# Note: code is baked into the image (no volume mounts), so code changes -# need a rebuild (rsync | edge). Config-only changes (docker-compose, .env -# already on server) can use `restart`. - -set -e -cd "$(dirname "$0")/.." - -SERVER="mcrn.ar" -REMOTE_DIR="~/unt" - -do_sync() { - echo "=== Syncing source to $SERVER ===" - rsync -avz --exclude='.git' --exclude='node_modules' --exclude='.venv' \ - --exclude='ui/app/dist' --exclude='__pycache__' \ - --exclude='ctrl/edge/.env' \ - --filter=':- .gitignore' \ - . "$SERVER:$REMOTE_DIR/" -} - -do_rebuild_and_restart() { - echo "=== Building and restarting on server ===" - ssh "$SERVER" << 'EOF' - cd ~/unt - docker build -t registry.mcrn.ar/unt/api:latest -f ctrl/Dockerfile.api . - docker build -t registry.mcrn.ar/unt/ui:latest -f ctrl/Dockerfile.ui . - cd ctrl/edge - [ -f .env ] || cp .env.example .env - docker compose up -d --remove-orphans --force-recreate - docker image prune -f - docker compose ps -EOF -} - -do_restart() { - echo "=== Restarting containers on $SERVER ===" - ssh "$SERVER" << 'EOF' - cd ~/unt/ctrl/edge - docker compose up -d --remove-orphans --force-recreate - docker compose ps -EOF -} - -case "${1:-push}" in - rsync) - do_sync - do_rebuild_and_restart - ;; - - sync) - do_sync - ;; - - restart) - do_restart - ;; - - push) - echo "=== Building images locally ===" - docker build -t unt/api:latest -f ctrl/Dockerfile.api . - docker build -t unt/ui:latest -f ctrl/Dockerfile.ui . - - echo "=== Pushing to registry ===" - /home/mariano/wdir/ppl/ctrl/push-image.sh unt/api latest - /home/mariano/wdir/ppl/ctrl/push-image.sh unt/ui latest - - echo "=== Pulling and restarting on $SERVER ===" - ssh "$SERVER" << 'EOF' - cd ~/unt/ctrl/edge - docker compose pull - docker compose up -d --remove-orphans --force-recreate - docker image prune -f - docker compose ps -EOF - ;; - - edge) - echo "=== Pulling latest images on $SERVER ===" - ssh "$SERVER" << 'EOF' - cd ~/unt/ctrl/edge - docker compose pull - docker compose up -d --remove-orphans --force-recreate - docker image prune -f - docker compose ps -EOF - ;; - - *) - echo "Usage: $0 [rsync|sync|restart|push|edge]" - exit 1 - ;; -esac - -echo "=== Done ==="