v3: PostgreSQL backend — 20K rows seeded, server-side SQL filtering

- Added PostgreSQL 16 Alpine service to Docker Swarm stack
- db.py: schema for 17 tables, auto-seed from jv_data.json on first boot
- /api/dashboard/data?start=&end= — server-side SQL filtering
  All Time: 0.43s (was 4MB JSON download stuck loading)
  Filtered (12mo): 0.20s with ~90% less data transferred
- Dashboard HTML patched: calls API instead of static JSON
- Integer casting for IsNewCustomer/HasDiscount/IsFreeShipping
- Advisory lock prevents race condition during parallel worker startup
- Returning Revenue now shows correctly: £14.5M (75% of total)
This commit is contained in:
2026-03-02 20:24:15 +08:00
parent 734142cf8f
commit 3f2b6b6188
5 changed files with 688 additions and 17 deletions

View File

@@ -6,10 +6,14 @@ services:
build: .
environment:
- GEMINI_API_KEY=AIzaSyCHnesXLjPw-UgeZaQotut66bgjFdvy12E
- DATABASE_URL=postgresql://jv:jvpass@tasks.db:5432/justvitamin
volumes:
- jv-generated:/app/generated
networks:
- dokploy-network
- jv-internal
depends_on:
- db
deploy:
labels:
- "traefik.enable=true"
@@ -21,9 +25,30 @@ services:
restart_policy:
condition: on-failure
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=jv
- POSTGRES_PASSWORD=jvpass
- POSTGRES_DB=justvitamin
volumes:
- jv-pgdata:/var/lib/postgresql/data
networks:
- jv-internal
deploy:
replicas: 1
restart_policy:
condition: on-failure
resources:
limits:
memory: 512M
volumes:
jv-generated:
jv-pgdata:
networks:
dokploy-network:
external: true
jv-internal:
driver: overlay