services: db: image: pgvector/pgvector:pg16 environment: POSTGRES_DB: lifesandbox POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: ["5433:5432"] healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d lifesandbox"] interval: 5s timeout: 3s retries: 10 migrate: build: . env_file: .env environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/lifesandbox command: [".venv/bin/alembic", "upgrade", "head"] depends_on: db: condition: service_healthy uploads-init: image: alpine:3.21 user: "0:0" command: ["sh", "-c", "mkdir -p /uploads && chown 10001:10001 /uploads"] volumes: - uploads:/uploads api: build: . env_file: .env environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/lifesandbox ports: ["8000:8000"] volumes: - uploads:/srv/life-sandbox/data/uploads shm_size: '1gb' depends_on: migrate: condition: service_completed_successfully uploads-init: condition: service_completed_successfully worker: build: . restart: unless-stopped env_file: .env environment: DATABASE_URL: postgresql+asyncpg://postgres:postgres@db:5432/lifesandbox command: [".venv/bin/python", "-m", "app.jobs.worker"] depends_on: migrate: condition: service_completed_successfully volumes: uploads: