d0e99b5244
- Click events are enqueued and written by a background thread — redirects never block on DB writes or geo lookups. - Uptime heartbeat marks per-minute rows (INSERT OR IGNORE), safe across Gunicorn workers; /api/uptime now measures real availability from each day's first heartbeat instead of a per-process counter that could only report 100%. Legacy uptime_daily rows still honoured. - Hourly maintenance thread: daily SQLite backup via VACUUM INTO (atomic temp-file rename, race-safe across workers, BACKUP_KEEP retention), CLICK_RETENTION_DAYS purge, uptime-mark pruning. - notify_webhook() helper for Slack/Discord-compatible WEBHOOK_URL. - Auth groundwork: _try_api_key_auth() lets the login/admin decorators accept Bearer qrk_ tokens (scope-checked, no Set-Cookie), and log_audit() records admin actions — used by the following feature commits. - New env config: WEBHOOK_URL, GEOIP_DB_PATH, GEO_API_FALLBACK, IP_ANONYMIZE, CLICK_RETENTION_DAYS, BACKUPS, BACKUP_DIR, BACKUP_KEEP. - requirements: add geoip2 for local GeoLite2 lookups. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6 lines
78 B
Plaintext
6 lines
78 B
Plaintext
flask>=2.3.0
|
|
qrcode[pil]>=7.4.2
|
|
Pillow>=10.0.0
|
|
gunicorn>=21.0.0
|
|
geoip2>=4.7.0
|