# LifeTrack — copy to .env next to docker-compose.yml, then edit. # cp .env.example .env # .env is git-ignored (C7): it is the only place secrets live. # --- PostgreSQL --------------------------------------------------------- POSTGRES_USER=lifetrack # Ends up inside LIFETRACK_DATABASE_URL: keep it URL-safe (letters/digits/-/_), # a '@', ':' or '/' would break the connection string. # openssl rand -hex 16 POSTGRES_PASSWORD=change-me POSTGRES_DB=lifetrack # --- API (every name is LIFETRACK_ + a field of app/core/config.py) ------ # MUST be overridden: it signs the JWTs. openssl rand -hex 32 LIFETRACK_JWT_SECRET=generate-a-long-random-string # Default timezone of the daily aggregations (?tz= overrides it per request). LIFETRACK_TIMEZONE=Europe/Paris # Max size of an uploaded import file, in bytes (20 MiB). Keep it <= the # client_max_body_size of docker/nginx.conf (25m). # LIFETRACK_MAX_UPLOAD_BYTES=20971520 # Dev only (Vite dev server without the nginx proxy). JSON array, not a bare # list: pydantic-settings parses complex fields as JSON. # LIFETRACK_CORS_ORIGINS=["http://localhost:5173"] # Dev/tests only: comma-separated whitelist of backend modules (empty = all). # Read straight from the environment by app/core/module_loader.py. # LIFETRACK_MODULES=auth,imports,health # --- Published ports ---------------------------------------------------- # The SPA (nginx). This is the URL you open in a browser. WEB_PORT=80 # The API, exposed for /api/docs and the device ingestion endpoints. API_PORT=8000 # --- Build --------------------------------------------------------------- # Empty by default. On a host with less than ~2 GB of RAM, cap the V8 heap so # `vite build` cannot be OOM-killed: # NODE_OPTIONS=--max-old-space-size=1024