Cloud Computing
Dockerised Coaching-Centre Fee & Attendance App with a Backup/DR Study (Python/Flask + MySQL)
One small app, two containers, a tested restore drill — operations discipline for a real tuition business
- Python
- Flask
- MySQL
- +5
A two-branch pharmacy's billing app, containerised, monitored, backed up and restorable on a free-tier cloud VM — with the running cost tracked to the rupee
Mapped to your syllabusBCU SEP 2024 · 24BCAPJ Project · Semester 5ArogyaOps is a fifth-semester BCA project (BCU SEP 2024, slot 24BCAPJ, team of 3) that puts a small two-branch pharmacy's billing and inventory platform — ArogyaPOS — through everything that happens after the app is written: containerisation, deployment, monitoring, backup, disaster recovery and cost tracking. Most student projects die the day the demo laptop is switched off; this one is built to survive it.
The billing application itself is deliberately modest — PHP and MySQL, written in the Web Programming course's stack — so the project's real weight falls on the operations layer that the Cloud Computing course (24BCA62) is about. The whole stack (Nginx, PHP-FPM, MySQL) runs as a Docker Compose application on a free-tier cloud virtual machine (Oracle Cloud Always-Free, or any free-tier provider), configured entirely from one .env file and a version-controlled docker-compose.yml.
Around it, the team operates real reliability practice on student hardware: Prometheus and Grafana dashboards with alert rules for downtime and disk pressure (industry-standard extras, clearly labelled), nightly mysqldump backups that are compressed, checksummed and synced off-site with rclone, a written DR runbook proven by timed restore drills, and a cost worksheet that accounts for every rupee of running the service — free tier, egress, storage — month by month.
The viva story is concrete: here is the app, here is the graph showing last Tuesday's outage, here is the 14-minute restore that recovered it, and here is the bill: ₹0.
Syllabus alignment
Small Indian businesses — pharmacies among the most demanding, because billing cannot pause — typically run billing software on individual PCs with no central view of stock, no backup that has ever been tested, no monitoring, and no idea of what their setup would cost to run properly in the cloud. When a disk fails or a PC is stolen, sales history and GST records go with it; when two branches work separately, the owner's stock decisions are guesses. Moving to paid SaaS solves availability but costs ₹500–2,000 every month and places data outside the owner's control.
What is missing is a demonstration, at student scale, that a small organisation can run its own service reliably: one application serving both branches from a central database, deployed as code, watched by real monitoring, backed up nightly with restores that are actually rehearsed and timed, and priced honestly — using only free tiers and open-source tools.
ArogyaOps delivers ArogyaPOS, a PHP/MySQL billing and inventory platform for a fictional two-branch pharmacy (Arogya Medicals, Hubballi), not as a laptop demo but as an operated service: three containers behind Docker Compose on a free-tier cloud VM, Prometheus/Grafana monitoring with alert rules, nightly verified backups synced off-site, a disaster-recovery runbook validated by timed drills, and a monthly cost worksheet. Reliability, recoverability and cost are first-class deliverables alongside the application.
A small pharmacy's billing system is invisible until it fails — at 9 p.m., when GST invoices must print and the counter is queued. Student projects answer 'does the app work?', but a real shop must answer 'does it work tomorrow, after a disk fills, an update breaks, or the VM is reclaimed?'. That question belongs to cloud operations — exactly what this slot's project should exercise.
docker-compose.yml with healthchecks, named volumes and environment-file configuration — the same file runs laptop and cloud.mysqldump --single-transaction, gzip, SHA-256 checksum, rclone sync to free object storage with 30-day rotation; a DR runbook with RPO 24 h / RTO 30 min targets, proven by two timed restore drills.In scope
Out of scope (v1)
The project runs an iterative, DevOps-flavoured model with a weekly ops log as a formal deliverable: every week ends with something deployed, measured or rehearsed, and the log (incidents, decisions, times) becomes report evidence.
| Phase | Weeks | Activities | Deliverable |
|---|---|---|---|
| Requirements & app design | 1–2 | Interview-style study of pharmacy billing needs; ER diagram, DFDs, schema; UI wireframes | SRS + design doc |
| Application build | 3–5 | ArogyaPOS modules (invoices, stock, reports, auth); PHPUnit tests for billing rules | Working app (laptop) |
| Containerisation | 6 | Compose file with 3 services, healthchecks, volumes, .env config; parity test laptop ↔ Compose | One-command deployment |
| Cloud deployment | 7 | Free-tier VM, HTTPS, firewall, deploy script, first ops-log entries | Public-ish demo URL |
| Monitoring & alerts | 8 | Prometheus + Grafana + exporters; 4 alert rules; Telegram routing; load test with JMeter-lite | Live dashboards |
| Backup & DR | 9–10 | Backup job, checksums, rclone sync, restore-verification test, two timed drills against RTO | DR runbook + drill log |
| Cost tracking & hardening | 11 | Cost worksheet, resource tuning (VM RAM), security checklist (updates, secrets, least privilege) | Cost report |
| Testing, docs & viva | 12 | Full test-case run, report, PPT, demo rehearsal including a live restore | Final submission |
Testing approach: PHPUnit unit tests for billing and stock rules; black-box test cases for every screen; operations tests as scripts — verify-backup.sh (restore into a scratch DB and row-count/checksum compare), alert-injection tests (stop MySQL, assert the Telegram alert arrives within 5 minutes), and a chaos-lite test (docker kill the app container; healthcheck restarts it, the incident appears on the Grafana graph).
The system has a single deployment unit — one VM, one Compose application — deliberately simple, because the reliability story rests on monitoring and restore, not on clustering.
nginx (TLS termination, static files) → php-fpm (ArogyaPOS) → mysql (data volume). A fourth service, backup, is a cron container that dumps and syncs. Healthchecks let Compose restart unhealthy containers.git pull, docker compose up -d, restore latest verified dump, re-point DNS.flowchart LR
B1([Branch 1 browser]) -->|HTTPS| N[Nginx container]
B2([Branch 2 browser]) -->|HTTPS| N
B3([Owner / dashboard]) -->|HTTPS| N
N --> P[PHP-FPM container: ArogyaPOS]
P -->|PDO| M[(MySQL container + volume)]
BK[Backup cron container] -->|mysqldump| M
BK --> CHK[SHA-256 checksum] --> RC[rclone sync] --> OBJ[(Free object storage)]
NE[node_exporter] -.-> PR[Prometheus]
MX[mysqld-exporter] -.-> PR
CA[cAdvisor] -.-> PR
PR --> G[Grafana dashboards]
PR --> AM[Alertmanager] -->|alerts| TG[Telegram group]flowchart TD
GIT[Git repo: compose + app + runbook] -->|deploy.sh| VM[Free-tier VM]
VM --> UP[docker compose up -d]
UP --> LIVE[Service live behind HTTPS]
BK[(Nightly dump + checksum)] -->|rclone| OBJ[(Object storage)]
DR{Disaster: VM lost} --> RB[Runbook: new VM, install Docker]
RB --> PULL[git pull + compose up]
PULL --> REST[Restore latest verified dump]
REST --> VERIFY[Row-count + checksum verification]
VERIFY --> LIVE2[Service restored — target under 30 min]erDiagram
USER ||--o{ SALE : bills
BRANCH ||--o{ USER : employs
BRANCH ||--o{ STOCK : holds
PRODUCT ||--o{ BATCH : "expires in"
BATCH ||--o{ STOCK : "is stocked as"
SALE ||--o{ SALE_ITEM : contains
PRODUCT ||--o{ SALE_ITEM : "is sold as"
USER {
string id PK
string name
string username UK
string passwordHash
string role
string branchId FK
}
BRANCH {
string id PK
string name
string address
}
PRODUCT {
string id PK
string name
string composition
string hsn
decimal gstRate
}
BATCH {
string id PK
string productId FK
string batchNo
date expiryDate
decimal mrp
}
STOCK {
string id PK
string branchId FK
string batchId FK
int quantity
}
SALE {
string id PK
string branchId FK
string userId FK
datetime at
decimal subtotal
decimal gstTotal
decimal total
}
SALE_ITEM {
string id PK
string saleId FK
string batchId FK
int qty
decimal price
}flowchart TD
PH([Pharmacist]) --> P1[1.0 Authenticate]
P1 <--> D1[(D1 Users)]
PH --> P2[2.0 Bill a sale]
P2 <--> D2[(D2 Stock)]
P2 --> D3[(D3 Sales)]
OW([Owner]) --> P3[3.0 Manage products, batches, branches]
P3 <--> D4[(D4 Products/Batches)]
OW --> P4[4.0 View dashboards and reports]
D3 --> P4
D2 --> P4
SYSB[5.0 Nightly backup job] --> D3
D2 --> SYSB
SYSB --> D5[(D5 Backup archive + off-site copy)]
MON[6.0 Collect metrics and alert] -.-> P2
MON --> D6[(D6 Metrics store)]
MON --> OWModule 01
PHP/MySQL billing and inventory for two branches: product and batch (expiry) masters, per-branch stock with low-stock alerts, GST-style invoicing with number series per branch, day-close and tax reports, and role-based auth (owner, pharmacist, auditor). PHPUnit covers the money and stock rules — invoice totals, negative-stock rejection, expiry filtering.
Module 02
The whole service as three Compose services plus the backup container: healthchecks for all, named volumes for MySQL data and dumps, TLS via the VM's certificate, and every setting from .env so laptop and cloud differ by one file. A deploy.sh rebuilds a fresh VM from nothing — install Docker, clone, up — which the DR drill reuses as its first half.
Module 03
Nightly cron inside the backup container: mysqldump --single-transaction, gzip, SHA-256 checksum file, rclone sync to free object storage, 30-day rotation. verify-backup.sh restores the newest dump into a scratch database and compares row counts and checksums. The DR runbook (RPO 24 h, RTO 30 min) is proven twice with timed drills whose logs go into the report.
Module 04
Prometheus with node_exporter, mysqld-exporter and cAdvisor; Grafana dashboards for host, database and containers; Alertmanager rules — app down, disk above 80%, backup job failed, restore test failed — routed to a Telegram group. The cost worksheet tracks VM hours, object storage GB-months, egress and domain against both the ₹0 free-tier baseline and a priced fallback.
Module 05
A weekly ops log recording incidents, decisions and times (the report's evidence base); a hardening checklist applied and screenshot — unattended security updates, secrets out of git, least-privilege MySQL user, firewall allowing only 80/443/SSH-key; and the documentation set: runbook, README, demo script for viva day.
Module 06
Consolidated test report: PHPUnit results, black-box screen cases, operations tests (backup restore, alert injection, chaos-lite container kill), and the two DR drills. Each team member can be asked to run their half live, so every member rehearses the restore and the alert demo personally.
Slide 1
Containerised Billing & Inventory Platform with Backups and DR for a Pharmacy Chain
Slide 2
The Scenario: Two Branches, One Evening
Slide 3
Problem Statement
Slide 4
Proposed System
Slide 5
Objectives
Slide 6
Technology Stack
Slide 7
Architecture
Slide 8
Application Demo
Slide 9
Operations Demo — the core of the project
Slide 10
Backup & Disaster Recovery
Slide 11
Testing
Slide 12
Limitations and Security Hardening
Slide 13
Conclusion & Future Scope
Bullets, speaker notes and the .pptx · ₹2,000
Read each answer, close it, and say it in your own words. Your viva will ask. Now you'll know.
XAMPP installs state onto one machine — its PHP version, its MySQL data directory — so 'works on my laptop' is fragile and unreproducible. Containers package the exact runtime with the app, keep the database in a named volume, and make the whole service reproducible from one compose file and one .env: the same command that runs my laptop rebuilds the cloud VM, which is precisely the property the DR drill depends on.
RPO, recovery point objective, is how much data you can afford to lose — with nightly backups mine is 24 hours, so a morning crash loses nothing but a late-night crash loses that day's sales. RTO, recovery time objective, is how long the service may stay down — I target 30 minutes, and my two timed restore drills completed in 14 and 19 minutes, so the targets are measured, not aspirational.
node_exporter reports host metrics from inside the VM — CPU, memory, and critically disk usage, since a full disk is the classic way a small VM dies; mysqld-exporter reports database health — connections, slow queries, replication-off-restart counts; cAdvisor reports per-container CPU and memory so I can see whether PHP-FPM or MySQL is the hungry one. Prometheus scrapes all three every 15 seconds and Grafana plots them.
+12 more questions, with answers
Unlocks with the project · ₹2,000
Unlock for ₹2,000What to change before it goes anywhere near a submission. Skipping it is how the demo fails live.
Unlocks with the project · ₹2,000
Unlock for ₹2,000How to study it, adapt it and walk your examiner through it, step by step.
Unlocks with the project · ₹2,000
Unlock for ₹2,000OnlyProjects. (2026). Containerised Billing & Inventory Platform with Backups and DR for a Pharmacy Chain (Docker, PHP/MySQL): BCA Cloud Computing project bundle [Educational resource]. https://onlyprojects.online/projects/bca-cloud-pharmacy-billing-backup-dr
compose up smoke-deploy on every push.Keep browsing
Same degree, same syllabus slot, different idea. Pick the one your guide will actually approve.
Cloud Computing
One small app, two containers, a tested restore drill — operations discipline for a real tuition business
Cloud Computing
A poller, a rule engine and a dashboard that catch outages before customers do
Web Development
Room allocation, complaints and mess billing without the register
AI & Machine Learning
Predict tomorrow's air quality band for every Bengaluru monitoring station, before the morning commute
AI & Machine Learning
Forecast daily OPD crowds department by department, and plan the doctor roster before the Monday rush arrives
AI & Machine Learning
Turn a Soil Health Card into an explained, district-specific crop recommendation a small farmer can act on