Compare commits

..

3 Commits

Author SHA1 Message Date
487ea57579 add readme
Some checks failed
ci/woodpecker/manual/build Pipeline failed
ci/woodpecker/manual/deploy unknown status
2026-05-06 11:52:38 -03:00
8bc82f170f move pipeline definition to ctrl/project.json (translator-driven)
All checks were successful
ci/woodpecker/manual/build Pipeline was successful
ci/woodpecker/manual/deploy Pipeline was successful
2026-04-17 02:26:05 -03:00
74ce349e04 split pipeline into build (local) and deploy (server) workflows
All checks were successful
ci/woodpecker/manual/build Pipeline was successful
ci/woodpecker/manual/deploy Pipeline was successful
2026-04-16 23:10:44 -03:00
5 changed files with 79 additions and 134 deletions

View File

@@ -1,23 +1,21 @@
# UNT (NOVA) Pipeline # UNT (NOVA) — Build Workflow
# #
# Two stages: # Runs on the dev-side agent (label: location=local) to avoid server OOM.
# build-* → runs on dev-side agent (label: location=local) to avoid server OOM # Pushes images to the registry over WireGuard (10.8.0.1:5000, plain HTTP,
# pushes to the registry over WireGuard (10.8.0.1:5000 — plain HTTP, # trusted because of the WG perimeter).
# trusted because of the WG perimeter)
# deploy → runs on server-side agent (label: location=server)
# pulls via the public HTTPS path (same registry, different edge)
# and runs docker compose on the host daemon
# #
# Trigger: manual only. See ppl/def/ci-cd/local-agent-rollout.md. # Triggered together with deploy.yml; deploy depends on this one.
# See ppl/def/ci-cd/local-agent-rollout.md for the full flow.
when: when:
- event: manual - event: manual
labels:
location: local
steps: steps:
- name: build-api - name: build-api
image: plugins/docker image: plugins/docker
labels:
location: local
settings: settings:
repo: 10.8.0.1:5000/unt/api repo: 10.8.0.1:5000/unt/api
registry: 10.8.0.1:5000 registry: 10.8.0.1:5000
@@ -30,8 +28,6 @@ steps:
- name: build-ui - name: build-ui
image: plugins/docker image: plugins/docker
labels:
location: local
settings: settings:
repo: 10.8.0.1:5000/unt/ui repo: 10.8.0.1:5000/unt/ui
registry: 10.8.0.1:5000 registry: 10.8.0.1:5000
@@ -41,21 +37,3 @@ steps:
- ${CI_COMMIT_SHA:0:7} - ${CI_COMMIT_SHA:0:7}
dockerfile: ctrl/Dockerfile.ui dockerfile: ctrl/Dockerfile.ui
context: . context: .
- name: deploy
image: docker:24-cli
labels:
location: server
depends_on:
- build-api
- build-ui
commands:
- cd /edge
- docker compose pull
- docker compose up -d --remove-orphans
- docker image prune -f
- docker compose ps
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# read-only so the deploy step structurally cannot stomp on .env
- /home/mariano/unt/ctrl/edge:/edge:ro

38
.woodpecker/deploy.yml Normal file
View File

@@ -0,0 +1,38 @@
# UNT (NOVA) — Deploy Workflow
#
# Runs on the server-side agent (label: location=server).
# Depends on build.yml completing — pulls the just-pushed images via the
# public HTTPS path and runs docker compose on the host daemon.
#
# The edge compose dir is mounted read-only so we structurally cannot stomp
# the server's .env (see ppl/def/ci-cd/auth-tiers.md context).
when:
- event: manual
labels:
location: server
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
commands:
- cd /edge
- docker compose pull
- docker compose up -d --remove-orphans
- docker image prune -f
- docker compose ps
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/mariano/unt/ctrl/edge:/edge:ro

18
README.md Normal file
View File

@@ -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`.

View File

@@ -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 ==="

14
ctrl/project.json Normal file
View File

@@ -0,0 +1,14 @@
{
"images": [
{
"name": "unt/api",
"dockerfile": "ctrl/Dockerfile.api",
"context": "."
},
{
"name": "unt/ui",
"dockerfile": "ctrl/Dockerfile.ui",
"context": "."
}
]
}