NEXT_PUBLIC_* env vars must be available at Next.js build time to be inlined into the client bundle. Without this, the Google OAuth button never renders in self-hosted Docker deployments even when the env var is correctly set in .env.
Add a one-command self-hosting setup: `docker compose -f docker-compose.selfhost.yml up -d` starts PostgreSQL, backend (with auto-migration), and frontend. Changes: - docker-compose.selfhost.yml: full stack orchestration (postgres + backend + frontend) - Dockerfile: add entrypoint.sh that auto-runs migrations before server start - Dockerfile.web: multi-stage Next.js build with standalone output - docker/entrypoint.sh: migration + server startup script - .dockerignore: exclude unnecessary files from Docker builds - apps/web/next.config.ts: conditional standalone output for Docker builds - SELF_HOSTING.md: rewrite with Docker Compose as primary approach - README.md: update self-host section Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>