Files
lifetrack/docker-compose.yml
T
MeeJayandClaude Opus 5 93f0689c1e Initial import: LifeTrack v1 (santé, vape, finances)
Tracker de vie auto-hébergé : suivi poids/calories/sport avec planning de
pesées, sevrage tabac (vape) avec modèle de coût DIY et économies, et
finances personnelles avec import de relevés bancaires.

Architecture : FastAPI + SQLAlchemy 2.0 + PostgreSQL 16, React 18 + TS +
Vite + Tailwind + ECharts, déploiement Docker Compose. Modules
auto-découverts des deux côtés (pkgutil / import.meta.glob) et framework
de connecteurs à deux voies (importeurs de fichiers + ingestion JSON)
pour brancher de nouvelles sources sans toucher au noyau.

Validé : 292 tests pytest, tsc + vite build, contrat API/web vérifié
contre le schéma OpenAPI, et déploiement Docker réel sur PostgreSQL 16
(28 tables, SPA servie par nginx, wizard de premier démarrage).

Documentation : README.md, docs/GUIDE.md, CONVENTIONS.md, et les
documents de conception et de recherche dans docs/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 10:48:57 +02:00

58 lines
1.7 KiB
YAML

name: lifetrack
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- pgdata:/var/lib/postgresql/data
# pg_trgm at initdb time (datamodel-finance §2.5). Read-only mount: these
# scripts only run on the very first start, when pgdata is still empty.
- ./docker/postgres-init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
api:
build:
context: .
dockerfile: docker/api.Dockerfile
image: lifetrack-api:1.0.0
restart: unless-stopped
environment:
# Every name below is `LIFETRACK_` + a field of app/core/config.py Settings.
LIFETRACK_DATABASE_URL: postgresql+psycopg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
LIFETRACK_JWT_SECRET: ${LIFETRACK_JWT_SECRET}
LIFETRACK_TIMEZONE: ${LIFETRACK_TIMEZONE:-Europe/Paris}
LIFETRACK_MAX_UPLOAD_BYTES: ${LIFETRACK_MAX_UPLOAD_BYTES:-20971520}
ports:
# Not needed by the SPA (nginx proxies /api/), but exposing it makes
# /api/docs and the ingestion endpoints reachable from other devices.
- "${API_PORT:-8000}:8000"
depends_on:
postgres:
condition: service_healthy
web:
build:
context: .
dockerfile: docker/web.Dockerfile
args:
NODE_OPTIONS: ${NODE_OPTIONS:-}
image: lifetrack-web:1.0.0
restart: unless-stopped
ports:
- "${WEB_PORT:-80}:80"
depends_on:
api:
condition: service_healthy
volumes:
pgdata: