services: db: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: vash POSTGRES_USER: vash POSTGRES_PASSWORD: ***REMOVED*** volumes: - pgdata:/var/lib/postgresql/data ports: - "127.0.0.1:5432:5432" # Only accessible from host healthcheck: test: ["CMD-SHELL", "pg_isready -U vash -d vash"] interval: 2s timeout: 3s retries: 10 start_period: 2s app: build: . restart: unless-stopped stop_grace_period: 2s depends_on: db: condition: service_healthy ports: - "127.0.0.1:3000:3000" # Only accessible from host (nginx proxies) environment: DATABASE_URL: postgresql://vash:***REMOVED***@db:5432/vash ORIGIN: ${ORIGIN:-https://esports.vash.software} BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} OSU_CLIENT_ID: ${OSU_CLIENT_ID} OSU_CLIENT_SECRET: ${OSU_CLIENT_SECRET} OSU_IRC_USERNAME: ${OSU_IRC_USERNAME} OSU_IRC_PASSWORD: ${OSU_IRC_PASSWORD} NODE_ENV: production env_file: - .env healthcheck: test: ["CMD", "bun", "-e", "fetch('http://localhost:3000/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"] interval: 5s timeout: 3s retries: 3 start_period: 10s umami-db: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: ${UMAMI_DB_PASSWORD} volumes: - umamidata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U umami -d umami"] interval: 2s timeout: 3s retries: 10 start_period: 2s umami: image: ghcr.io/umami-software/umami:postgresql-latest restart: unless-stopped depends_on: umami-db: condition: service_healthy ports: - "127.0.0.1:3001:3000" # Proxy via nginx at e.g. analytics.vash.software environment: DATABASE_URL: postgresql://umami:${UMAMI_DB_PASSWORD}@umami-db:5432/umami APP_SECRET: ${UMAMI_APP_SECRET} healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://localhost:3000/api/heartbeat || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 30s volumes: pgdata: umamidata: