| 1 | # .env.example - DropHawk |
| 2 | # |
| 3 | # Copy to `.env` and fill in real values. NEVER commit `.env`. |
| 4 | # Pre-commit hook (gitleaks) will reject secrets. |
| 5 | # |
| 6 | # Reference: CONTRACTS.md §Y for the canonical list of every key. |
| 7 | |
| 8 | # ════════════════════════════════════════════════════════════════════ |
| 9 | # Postgres 16 + TimescaleDB |
| 10 | # ════════════════════════════════════════════════════════════════════ |
| 11 | POSTGRES_USER=drophawk |
| 12 | POSTGRES_PASSWORD=__CHANGE_ME__ |
| 13 | POSTGRES_DB=drophawk |
| 14 | DATABASE_URL=postgres://drophawk:__CHANGE_ME__@postgres:5432/drophawk |
| 15 | |
| 16 | # ════════════════════════════════════════════════════════════════════ |
| 17 | # Redis 7 |
| 18 | # ════════════════════════════════════════════════════════════════════ |
| 19 | REDIS_PASSWORD=__CHANGE_ME__ |
| 20 | REDIS_URL=redis://:__CHANGE_ME__@redis:6379/0 |
| 21 | |
| 22 | # ════════════════════════════════════════════════════════════════════ |
| 23 | # NATS 2.14 (JetStream) |
| 24 | # ════════════════════════════════════════════════════════════════════ |
| 25 | NATS_USER=drophawk |
| 26 | NATS_PASSWORD=__CHANGE_ME__ |
| 27 | NATS_URL=nats://drophawk:__CHANGE_ME__@nats:4222 |
| 28 | |
| 29 | # ════════════════════════════════════════════════════════════════════ |
| 30 | # Meilisearch 1.47 |
| 31 | # ════════════════════════════════════════════════════════════════════ |
| 32 | MEILI_URL=http://meilisearch:7700 |
| 33 | MEILI_MASTER_KEY=__CHANGE_ME__ |
| 34 | |
| 35 | # ════════════════════════════════════════════════════════════════════ |
| 36 | # ntfy 2.14 (self-hosted push) |
| 37 | # ════════════════════════════════════════════════════════════════════ |
| 38 | NTFY_BASE_URL=http://ntfy:80 |
| 39 | NTFY_TOPIC=drophawk-drops |
| 40 | NTFY_TOPIC_INFO=drophawk-info |
| 41 | # Generate: docker compose exec ntfy token create --user admin |
| 42 | NTFY_TOKEN=tk___CHANGE_ME__ |
| 43 | |
| 44 | # ════════════════════════════════════════════════════════════════════ |
| 45 | # MinIO (debug screenshots) |
| 46 | # ════════════════════════════════════════════════════════════════════ |
| 47 | MINIO_ROOT_USER=drophawk |
| 48 | MINIO_ROOT_PASSWORD=__CHANGE_ME__ |
| 49 | MINIO_ENDPOINT=http://minio:9000 |
| 50 | |
| 51 | # ════════════════════════════════════════════════════════════════════ |
| 52 | # Observability |
| 53 | # ════════════════════════════════════════════════════════════════════ |
| 54 | LOG_LEVEL=info # trace|debug|info|warn|error |
| 55 | OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 |
| 56 | GRAFANA_ADMIN_PASSWORD=__CHANGE_ME__ |
| 57 | |
| 58 | # ════════════════════════════════════════════════════════════════════ |
| 59 | # Public URL (homelab) |
| 60 | # ════════════════════════════════════════════════════════════════════ |
| 61 | PUBLIC_BASE_URL=https://drophawk.lan |
| 62 | |
| 63 | # ════════════════════════════════════════════════════════════════════ |
| 64 | # Source credentials |
| 65 | # ════════════════════════════════════════════════════════════════════ |
| 66 | # Ticketmaster Discovery API (https://developer.ticketmaster.com) |
| 67 | # Free; up to 5 keys per account. Comma-separated for rotation. |
| 68 | TICKETMASTER_API_KEYS= |
| 69 | # SeatGeek (https://seatgeek.com/developers) |
| 70 | SEATGEEK_CLIENT_ID= |
| 71 | # Optional affiliate IDs (honest disclosure in UA) |
| 72 | TICKETMASTER_AFFILIATE_ID= |
| 73 | SEATGEEK_AFFILIATE_ID= |
| 74 | |
| 75 | # ════════════════════════════════════════════════════════════════════ |
| 76 | # Python scrapers (Phase 3+) |
| 77 | # ════════════════════════════════════════════════════════════════════ |
| 78 | SCRAPER_CONCURRENCY=4 |
| 79 | SCRAPER_LOG_LEVEL=INFO |
| 80 | PLAYWRIGHT_BROWSERS_PATH=/ms-playwright |
| 81 | FIFA_BASE_URL=https://tickets.fifa.com |
| 82 | AXS_BASE_URL=https://www.axs.com |
| 83 | SEETICKETS_BASE_URL=https://www.seetickets.com |
| 84 | STUBHUB_API_KEY= |
| 85 | VIVIDSEATS_PROXY= |
| 86 | TWITTER_ACCOUNTS= # comma list of @handles |
| 87 | TWITTER_BEARER_TOKEN= |
| 88 | |
| 89 | # Proxy pool (Phase 6+, optional) |
| 90 | PROXY_POOL_URL= |
| 91 | |
| 92 | # Telegram fallback (optional) |
| 93 | TELEGRAM_BOT_TOKEN= |
| 94 | |
| 95 | # ════════════════════════════════════════════════════════════════════ |
| 96 | # Operational knobs (defaults are sensible) |
| 97 | # ════════════════════════════════════════════════════════════════════ |
| 98 | API_RATE_LIMIT_PER_MIN=100 |
| 99 | SSE_MAX_CLIENTS=200 |
| 100 | SCRAPER_RPC_TIMEOUT_S=30 |
| 101 | WATCHLIST_MAX_RULES=500 |
| 102 | POLL_DEFAULT_INTERVAL_S=300 |
| 103 | POLL_TIGHT_INTERVAL_S=10 |
| 104 | POLL_TIGHT_WINDOW_S=900 # ±15 min around known drop |
| 105 | |
| 106 | # ════════════════════════════════════════════════════════════════════ |
| 107 | # Frontend (build-time, expose to browser via NEXT_PUBLIC_) |
| 108 | # ════════════════════════════════════════════════════════════════════ |
| 109 | NEXT_PUBLIC_API_BASE_URL=https://drophawk.lan/api |
| 110 | NEXT_PUBLIC_NTFY_PUBLIC_URL=https://drophawk.lan/ntfy |
| 111 | NEXT_PUBLIC_NTFY_PUBLIC_TOPIC=drophawk-drops |
| 112 | NEXT_PUBLIC_SENTRY_DSN= # optional |