Γηροκομείο Ζωσιμάδων Ιωαννίνων: Healthcare Ops Stack
Volunteer Lead Developer & Maintainer
Τρία ολοκληρωμένα συστήματα που έβγαλαν το Γηροκομείο Ζωσιμάδων Ιωαννίνων από το χαρτί: κλινικές λειτουργίες, διαχείριση αποθεμάτων, και handheld scanner για καταγραφή αποθεμάτων ανά βάρδια. Εθελοντική εργασία, σε καθημερινή παραγωγή.
Το σύστημα
Το Γηροκομείο Ζωσιμάδων Ιωαννίνων δούλευε με χαρτί. Ως εθελοντής Lead Developer, έχτισα τρία ολοκληρωμένα συστήματα που πέρασαν το ίδρυμα σε ψηφιακή λειτουργία και το κρατούν εκεί. Το Healthcare Platform είναι ένα Bun + Elysia monorepo με 13 domain modules που καλύπτουν ολόκληρο τον κλινικό κύκλο (εισαγωγή, ιατρικός φάκελος, αυτοματοποίηση φαρμακευτικού σχήματος, pharmacy rotation, χρέωση, εξιτήριο), πάνω σε PostgreSQL 18 + TypeORM + MinIO + Redis, με Better Auth και 7 cron jobs. Το IMS (Inventory Management System) είναι ξεχωριστό Hono + Drizzle stack με 108 backend tests και ένα shared Zod schema package που δίνει στο React frontend type-safe API contract χωρίς code generation. Το collection-app είναι ένα Expo React Native Android scanner για offline-first απογραφές κατά τη διάρκεια βαρδιών: αναζήτηση, λήξεις, καταμετρήσεις, παραλαβές, με SQLite fallback όταν πέφτει το Wi-Fi του χώρου. Και τα τρία τρέχουν σήμερα σε production στο γηροκομείο. Και τα τρία χτίστηκαν χωρίς αμοιβή.
Αρχιτεκτονική
Healthcare Platform
- Backend: Bun + Elysia (strict TypeScript), 13 domain modules, TypeORM, PostgreSQL 18, MinIO S3, Redis 7, Better Auth, Pino logging, 7 cron jobs
- Frontend: React 18 + TanStack Router/Query, Radix UI primitives, strict TypeScript build (
tsc -b) - Production: On-site Windows + Docker Desktop,
admin.localμε mkcert, pre-deploy Postgres snapshots, auto-rollback on failed health checks - Production discipline: Postgres 16→18 migration plan με dry-run + checksums + advisory lock, MinIO volume carry-over, cutover runbook στο
infra/docs/cutover-runbook.md
IMS (Inventory Management)
- Backend: Hono + Better Auth + Drizzle ORM + PostgreSQL 18
- Frontend: Vite + React + TanStack Router/Query + Tailwind
- Shared package: Zod schemas (type-safe API contract)
- Production: On-site Windows Docker Desktop στο
apoth.local, Coolify-managed demo standby - Tests: 108 backend tests περνώντας, Vitest + ESLint CI, GHCR images κάθε push σε main
collection-app (Android QR scanner)
- Framework: Expo + React Native
- Workflows: lookup · expiry · counts · receiving
- Offline-first: 3s network timeout → SQLite fallback, bulk submission semantics
- Auth: Bearer JWT via expo-secure-store
Η συνεισφορά μου
Σχεδίασα και έχτισα κάθε σύστημα εθελοντικά, και συνεχίζω ως maintainer. Η αρχιτεκτονική απόφαση που μέτρησε περισσότερο ήταν η modular αποδόμηση: 13 domain modules (εισαγωγή, ιατρικός φάκελος, φαρμακευτική αγωγή, pharmacy, χρέωση, εξιτήριο κ.λπ.) μέσα σε ένα Bun + Elysia monorepo που μοιράζονται μία data source, αντί να κατακερματιστούν σε microservices που θα έπρεπε να συντηρεί το γηροκομείο. Κάθε module έχει δικά του TypeORM entities, services και routes, αλλά όλα μοιράζονται Better Auth, MinIO storage και Redis. Έγραψα το ICD-10 seeding script, το document versioning με SHA-256 checksums για tamper-evidence, και τα 7 cron jobs που αυτοματοποιούν φαρμακευτικά σχήματα και pharmacy rotation. Για το IMS επέλεξα shared Zod schema package ανάμεσα στο Hono backend και το Vite + React frontend, δίνοντας type-safe API contract χωρίς code generation. Τα δύο stacks μοιράζονται Docker external network, ώστε ένας ενιαίος nginx edge proxy να μπορεί να route-άρει και τα δύο. Το collection-app σχεδιάστηκε offline-first από την πρώτη μέρα: τοπική SQLite με bulk submission, ώστε οι scanners να συνεχίζουν να δουλεύουν ακόμα και με κακό Wi-Fi στην αποθήκη.
Stack λεπτομέρειες
Το 13-module monorepo decomposition δεν ήταν αυθαίρετο. Κάθε module (admission-intake, billing, medication, κ.λπ.) έχει δικά του TypeORM entities, services, και routes, αλλά μοιράζονται single data source και infrastructure (Redis, MinIO, Better Auth). Αυτό εξασφαλίζει low coupling χωρίς microservice overhead. Η πιο απαιτητική απόφαση ήταν η Postgres 16→18 migration strategy: dry-run mode που επαληθεύει checksums χωρίς να γράφει, advisory lock που αποτρέπει concurrent migrations, pre-deploy snapshot που επιτρέπει rollback σε λιγότερο από 2 λεπτά. Το SHA-256 document checksum layer εξασφαλίζει ότι κάθε uploaded αρχείο (medical records, εισιτήρια) είναι tamper-evident. Ο shared external Docker network contract μεταξύ Healthcare και IMS σημαίνει ότι ο nginx edge proxy μπορεί να route requests και στα δύο systems χωρίς να χρειάζεται separate reverse proxy per system.
Αποτελέσματα
- Healthcare Platform v1.0.50 σε production στο γηροκομείο, με 13 modules να καλύπτουν admission → medical record → medication → billing → discharge
- IMS v1.x σε production για inventory management, με Android collection-app για offline-first scanning σε kit-out βάρδιες
- Αμφότερα συστήματα εθελοντική εργασία: δωρεάν προς το γηροκομείο, υπό συντήρηση
- Production cutover (Postgres 16→18) ολοκληρώθηκε με dry-run, snapshots, auto-rollback, και runbook documentation
Πρόκληση
Ο πιο σύνθετος σχεδιαστικός προβληματισμός ήταν πώς να τρέχουν δύο ξεχωριστά production systems (Healthcare Platform + IMS) στο ίδιο on-site Windows server, χωρίς port conflicts και με ενιαίο TLS. Η λύση: shared Docker external network (healthcare_network) στην οποία συνδέονται αμφότερα τα stacks. Ο nginx edge proxy τρέχει ως ξεχωριστό container στο ίδιο network και κάνει route βάσει subdomain: admin.local → Healthcare frontend, apoth.local → IMS frontend. Κάθε backend εκθέτει private port μόνο μέσα στο Docker network, τίποτα δεν είναι exposed στο host χωρίς πρόθεση. Τα mkcert certificates εξασφαλίζουν ότι οι on-site browsers αποδέχονται το HTTPS χωρίς warnings. Αυτό το contract τεκμηριώθηκε ρητά στο cutover runbook ώστε να είναι reproducible σε περίπτωση που χρειαστεί rebuild.
Σύνδεσμοι
- Internal-only deployment (στο γηροκομείο). No public URL.
- Repos:
jimrarras/healthcare(monorepo),jimrarras/ims(monorepo)
Παρόμοια έργα
- Π.Γ.Ν.Ι. StorageManagement: άλλη εθελοντική civic-tech work για ελληνικό νοσοκομείο, αλλά desktop app αντί for ops platform
- Migraine Tracker: άλλο healthcare software, αλλά mobile + FHIR αντί institutional ops
Στιγμιότυπα