services: db: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: vash POSTGRES_USER: vash POSTGRES_PASSWORD: ${DB_PASSWORD} 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:${DB_PASSWORD}@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} PUBLIC_SENTRY_DSN: ${PUBLIC_SENTRY_DSN} 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: