Ανάπτυξη¶
Τέσσερις λειτουργίες ανάπτυξης παρέχονται:
| Λειτουργία | Πού | Backend | Κλήσεις ΤΝ | Πηγή κλειδιού |
|---|---|---|---|---|
| Τοπική ανάπτυξη | make dev |
FastAPI στο :18001 | Πλευρά διακομιστή | env / secrets.yaml / DB |
| GitHub Pages | astrapi69.github.io/adaptive-learner/ |
Κανένα (Dexie) | Απευθείας browser | DB (IndexedDB) |
| Desktop launcher | Binary PyInstaller (βασισμένο σε Docker) | FastAPI σε Docker container | Πλευρά διακομιστή | .env (αυτόματη δημιουργία) / UI Ρυθμίσεων |
| Docker | Docker Compose self-host | FastAPI σε container | Πλευρά διακομιστή | env / UI Ρυθμίσεων |
Τοπική ανάπτυξη¶
Εκκινεί το backend (FastAPI + uvicorn --reload) στη θύρα 18001
και το frontend (Vite dev server) στη θύρα 15174 παράλληλα.
Πάτησε Ctrl-C μία φορά για να σταματήσουν και τα δύο.
Το Vite proxy του frontend προωθεί /api/* στο backend, οπότε
το frontend χρησιμοποιεί πάντα /api ως base URL - δεν χρειάζεται
διαμόρφωση CORS για τοπική ανάπτυξη.
Για λειτουργία παρασκηνίου:
GitHub Pages (μόνο Dexie)¶
Το .github/workflows/deploy-gh-pages.yml χτίζει το frontend με:
VITE_BASE="/adaptive-learner/"- προθεματίζει κάθε URL asset για τη διαδρομή Pages ανά repo.VITE_STORAGE_MODE="dexie"- καρφώνει το DexieStorage ως προεπιλεγμένη λειτουργία.VITE_API_BASE=""- κανένα backend στο οποίο να δείχνει.
Το workflow τρέχει σε κάθε push στο main και σε χειροκίνητη
εντολή. Μετά το build αντιγράφει dist/index.html σε
dist/404.html για τη εναλλακτική SPA-router, στη συνέχεια
χρησιμοποιεί actions/upload-pages-artifact@v5 + actions/deploy-pages@v5
για δημοσίευση.
Το URL του site είναι https://astrapi69.github.io/adaptive-learner/.
Χρήστες με custom domain προσθέτουν αρχείο CNAME στο frontend/public/
με το όνομα domain· η Pages routing του GitHub που γνωρίζει domain
αναλαμβάνει τα υπόλοιπα.
Docker Compose (πλήρης στοίβα)¶
Το docker-compose.prod.yml περιλαμβάνει έναν μόνο service,
app (ένα container από το #2058 - δεν υπάρχει nginx ούτε
ξεχωριστό frontend container):
- FastAPI (image Python 3.12) σερβίρει ΚΑΙ τα χτισμένα
frontend statics ΚΑΙ το
/api/*, στην εσωτερική θύρα${ADAPTIVE_LEARNER_BACKEND_PORT:-8000}. - Δημοσιευμένη θύρα στον host:
${ADAPTIVE_LEARNER_BIND_ADDRESS:-127.0.0.1}:${ADAPTIVE_LEARNER_PUBLIC_PORT:-8501}- loopback από προεπιλογή. - Ένα επώνυμο volume
adaptive-learner-dataστο/app/dataπου επιβιώνει από rebuilds του container.
Τα install.sh και install.ps1 είναι οι curl-pipe installers
για τελικούς χρήστες - κατεβάζουν tagged release tarball,
ρυθμίζουν ADAPTIVE_LEARNER_SECRET_KEY και εκτελούν
docker compose up.
Τα installers αναγεννιούνται κατά τον χρόνο release από
install.sh.template / install.ps1.template συν την έκδοση του
backend/pyproject.toml (δες scripts/sync_versions.py).
Μην επεξεργάζεσαι τα παραγόμενα αρχεία απευθείας.
Διαμόρφωση για παραγωγή¶
Τέσσερα πράγματα έχουν σημασία για την παραγωγή:
ADAPTIVE_LEARNER_SECRET_KEY: πρέπει να είναι σταθερό κλειδί Fernet. Παράγαγέ το μία φορά, αποθήκευσέ το ασφαλώς (HashiCorp Vault, AWS Secrets Manager, σφραγισμένο.env). Η απώλειά του σημαίνει ότι όλα τα κρυπτογραφημένα API keys καθίστανται μη αναγνώσιμα. Η εφαρμογή αποτυγχάνει σκληρά κατά την εκκίνηση αν δεν είναι ορισμένο (χωρίς σιωπηλή προεπιλογή).ADAPTIVE_LEARNER_CORS_ORIGINS: λίστα επιτρεπόμενων origins χωρισμένη με κόμματα. Η προεπιλογή είναι επιτρεπτική· σφίξε την για παραγωγή.ADAPTIVE_LEARNER_DEBUG: άφησε χωρίς ορισμό / false στην παραγωγή. Η λειτουργία debug εκθέτει stack traces στις αποκρίσεις σφαλμάτων.ADAPTIVE_LEARNER_BIND_ADDRESS: προεπιλογή127.0.0.1, ώστε η δημοσιευμένη θύρα να είναι προσβάσιμη μόνο από τον ίδιο τον host. Η εφαρμογή δεν έχει πιστοποίηση - δέσε0.0.0.0μόνο συνειδητά, και μόνο σε αξιόπιστο δίκτυο ή πίσω από δικό σου στρώμα auth (reverse proxy με basic auth, VPN).
Για containers, οι μεταβλητές περιβάλλοντος είναι το ιδιωματικό
κανάλι έγχυσης. Η επικάλυψη ~/.config/adaptive_learner/secrets.yaml
προορίζεται για desktop / launcher· μπορείς να τη bind-mount-αρεις
μέσα σε container αν προτιμάς ένα αρχείο διαμόρφωσης αντί για
πολλές μεταβλητές.
Desktop launcher¶
Το launcher/ είναι ένας desktop launcher ενός binary,
βασισμένος σε PyInstaller. Δεν είναι ενσωματωμένος server -
είναι ένα λεπτό περίβλημα γύρω από τη δημοσιευμένη μηχανή
docker-app-launcher, διαμορφωμένο μέσω launcher/launcher.json.
Η διανεμόμενη διαμόρφωση τρέχει σε λειτουργία image
(deployment_mode: "image"): ο launcher τραβά το έτοιμο,
επαληθευμένο image της έκδοσης
(ghcr.io/astrapi69/adaptive-learner:<έκδοση>, καρφιτσωμένο στην
ενσωματωμένη έκδοση της εφαρμογής) και το εκκινεί ως Docker
container (προεπιλογή http://localhost:8501), με το volume
δεδομένων adaptive-learner-data προσαρτημένο στο /app/data·
μετά ανοίγει τον προεπιλεγμένο browser του χρήστη. Τίποτα δεν
χτίζεται, δεν κατεβαίνει ως πηγαίος κώδικας ούτε εξάγεται τοπικά.
Η πλήρης αλυσίδα διαμόρφωσης τριών επιπέδων (YAML έργου < επικάλυψη
χρήστη < μεταβλητές περιβάλλοντος) τεκμηριώνεται στο
docs/configuration.md.
Launcher (desktop διαπλατφορμικό)¶
Το launcher/ είναι ένα one-binary installer βασισμένο σε
PyInstaller. Το GitHub Actions χτίζει τρία binaries ανά release:
launcher-linux.yml→adaptive-learner-launcher-linuxlauncher-macos.yml→adaptive-learner-launcher-macoslauncher-windows.yml→adaptive-learner-launcher.exe
Κάθε launcher ενσωματώνει την έκδοση (literal __version__ +
_build_info.py γραμμένο από το spec αρχείο κατά το build). Η
μηχανή εκτελεί επίσης έναν έλεγχο ενημερώσεων στο παρασκήνιο
έναντι του GitHub Releases API (ενεργοποιημένο μέσω
update_check_enabled στο launcher.json)· αποτυγχάνει σιωπηλά
σε κάθε σφάλμα ώστε να μην μπλοκάρει ποτέ τον launcher.
Ο launcher δεν είναι εσκεμμένα το πρωταρχικό κανάλι διανομής (αυτό είναι το Docker). Υπάρχει για χρήστες που θέλουν εμπειρία "διπλό κλικ για εγκατάσταση".
Αρχιτεκτονική CI/CD¶
Κάθε workflow τρέχει σε απομόνωση· χωρίς κοινή κατάσταση μεταξύ τους:
| Workflow | Εντολή | Τι κάνει |
|---|---|---|
ci.yml |
push, pull_request | Τεστ + lint + tsc |
coverage.yml |
push στο main | Coverage HTML + xml |
release-gate.yml |
tag push | Έλεγχος απόκλισης pin έκδοσης |
deploy-gh-pages.yml |
push στο main, dispatch | Build + deploy GH Pages |
launcher-{linux,macos,windows}.yml |
release: created | Build + επισύναψη binary launcher |
docs.yml |
push στο main | Build MkDocs (αυτή τη στιγμή ανενεργό - το site έρχεται από workflow GH Pages) |