#!/usr/bin/env python3 # /// script # dependencies = ["matplotlib>=3.9", "pandas>=2.2"] # /// """ Bincio usage statistics — parses nginx access logs and produces a multi-panel matplotlib figure saved as a PNG. Run locally: uv run scripts/usage_stats.py On VPS cron: 0 3 * * 1 cd /opt/bincio && uv run scripts/usage_stats.py Output: /var/bincio/stats/latest.png (served at /api/admin/stats) """ from __future__ import annotations import argparse import gzip import re import sys from datetime import datetime from pathlib import Path from urllib.parse import urlparse import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import matplotlib.ticker as ticker import numpy as np import pandas as pd # ── Config ──────────────────────────────────────────────────────────────────── LOG_DIR = Path("/var/log/nginx") OUTPUT_DIR = Path("/var/bincio/stats") OUTPUT = OUTPUT_DIR / "latest.png" # ── Log parsing ─────────────────────────────────────────────────────────────── _LOG_RE = re.compile( r'(?P\S+) \S+ \S+ \[(?P