
🌐 También en: English · Deutsch · Français
Todo el que tiene un blog acaba haciéndose la misma pregunta: ¿de verdad alguien lee esto? En la web moderna, la respuesta honesta es incómoda: la mayor parte de tu «tráfico» son robots. Así que hice lo que haría cualquier sysadmin sensato en lugar de instalar otro tracker de JavaScript más: escribí un pequeño script en Python, lo apunté a mis propios logs de nginx-ingress y conté a los humanos a mano. Bueno, a base de regex. 🐍
Así es como se ve de verdad una semana en www.apt-upgrade.me cuando quitas las máquinas de en medio.
📉 El embudo de la decepción (y del alivio)
| Peticiones HTTP en total | 22.666 |
| IP que se comportaron como un navegador | 119 |
| …de ellas: cloud / centro de datos / scrapers 🤖 | 45 |
| Visitantes habituales reales 🧑💻 | 74 |
≈ 16 humanos al día, o sea, unos ~110 a la semana. De veintidós mil peticiones. Deja que eso cale. Internet es, estadísticamente, una sala de servidores hablando sola. 🕳️
🕵️ Por qué las «IP únicas» en bruto son una mentira
Si simplemente pasas tu log de accesos por sort | uniq -c, obtendrás un número precioso, gordo y completamente ficticio. La inmensa mayoría de las visitas son crawlers y escáneres, y una buena parte de ellos envía un User-Agent de lo más normal, Mozilla/5.0 … Chrome/…. El enfoque ingenuo de «contar los UA que parecen de navegador» daba con estos datos 959 visitantes. La cifra real es un orden de magnitud menor.
Por eso el script aplica tres filtros, cada uno más estrecho que el anterior:
| # | Filtro | Qué atrapa |
|---|---|---|
| 1️⃣ | Lista negra de User-Agents | Los bots que admiten educadamente que son bots (bot, crawl, spider, python, curl, zgrab, masscan…). |
| 2️⃣ | Correlación de recursos 💪 | Un navegador de verdad descarga el CSS, el JS y las imágenes que referencia la página. Un scraper se lleva el HTML y se larga. «¿Has cargado también ≥3 recursos?» es, con diferencia, la señal individual más potente. |
| 3️⃣ | Rangos de red cloud + rDNS | Lo que sobrevive al paso 2 es sobre todo Chrome headless en Tencent Cloud, OVH, Alibaba y compañía: un «navegador» que se geolocaliza allí donde dé la casualidad de que esté la VM. |
🌍 De dónde venían los humanos
Una vez filtradas las máquinas, este es el reparto geográfico de los 74 supervivientes (país obtenido de una base de datos GeoLite2 local; ningún dato sale del servidor, más sobre esto abajo):
| País | Visitantes | Cuota | |
|---|---|---|---|
| 🇺🇸 Estados Unidos | 13 | 17,6 % | █████████ |
| 🇩🇪 Alemania | 10 | 13,5 % | ███████ |
| 🇨🇳 China | 8 | 10,8 % | ██████ |
| 🇬🇧 Reino Unido | 6 | 8,1 % | ████ |
| 🇨🇦 Canadá | 5 | 6,8 % | ████ |
| 🇳🇱 Países Bajos | 4 | 5,4 % | ███ |
| 🇮🇹 Italia | 3 | 4,1 % | ██ |
| 🇧🇷 Brasil | 2 | 2,7 % | █ |
| 🇨🇿 Chequia | 2 | 2,7 % | █ |
| 🇫🇷 Francia | 2 | 2,7 % | █ |
| 🇩🇰 Dinamarca | 2 | 2,7 % | █ |
| 🌐 17 países más (1 cada uno) | 17 | 23,0 % | 🇲🇽🇰🇿🇱🇧🇦🇺🇺🇦🇱🇹🇯🇵🇰🇼🇶🇦🇷🇴🇮🇱🇸🇪🇳🇿🇮🇳🇦🇷🇭🇺 |
| Total | 74 | 100 % |
Un público pequeño pero de lo más internacional para un blog alemán y friki sobre Linux y seguridad. Hola, seas quien seas, en Kazajistán y en Kuwait: solo veo a uno de cada sitio, y te lo agradezco. 👋
🔧 Cómo funciona el script (y dónde robarlo)
Son unas 330 líneas de Python con muy pocas dependencias. El pipeline, en pocas palabras:
parse nginx-ingress logs (CRI-wrapped combined format) → drop private IPs, non-GET, self-declared bots → split each IP's hits into "HTML pages" vs "assets" → keep only IPs with a real page + ≥3 assets # the human test → subtract cloud netblocks & datacenter rDNS → geolocate locally, mask to /24, aggregate, print
Todo es open source (sin secretos, solo la lógica de análisis) y está en mi repositorio de infraestructura:
👉 github.com/aptupgrademe/www_k3s (scripts/analytics/visitor-stats.py). Clónalo, apúntalo a tus propios logs de ingress y descubre lo solitario que es en realidad tu rincón de la web. 😄
🛡️ Sin tracker, sin banner de cookies, sin datos que salgan de la máquina
Esta es la parte de la que estoy discretamente orgulloso: en este blog no hay ningún tipo de seguimiento. Ni Google Analytics, ni balizas, ni píxeles de terceros, ni ventanas emergentes de «valoramos tu privacidad». Esto es puro análisis de logs del servidor: las mismas líneas que nginx escribe de todos modos. Y como las IP de los visitantes son datos personales según el RGPD, el script está diseñado a propósito para que:
- 🔒 Nada salga nunca del servidor: la geolocalización usa una base de datos GeoLite2 local, no una API de terceros.
- 🎭 La salida se enmascare a /24 (o /48 en IPv6): suficiente para ver «un visitante de Italia», nunca suficiente para identificar a una persona.
- 🧹 Solo se ejecute bajo demanda y no guarde ningún perfil: sin cookies, literalmente no puede distinguir a un lector que vuelve de uno nuevo. Y así está bien.
⚠️ Sección de honestidad (porque los números mienten)
- Una IP no es una persona. Los usuarios de móvil cambian de dirección, los hogares comparten una, y el CGNAT esconde a cientos detrás de una sola. Estas cifras son un orden de magnitud, no un censo.
- Lo de «por semana» es una extrapolación. k3s rota los logs de los contenedores a los 10 MB y guarda muy pocos, así que en la práctica solo quedan en disco ~4,7 días. La cifra semanal es esos días escalados: tómala con pinzas. 🧂
- Mi propio tráfico está excluido. Editando un artículo visito en una tarde más páginas que los lectores reales en un mes, así que el prefijo de mi casa queda filtrado. Si no, el mayor fan del blog sería yo.
💡 ¿Para qué molestarse? (la pregunta del dinero)
Voy a ser totalmente transparente: gano exactamente 0 € con este blog. Sin anuncios, sin enlaces de afiliado, sin «invítame a un café», sin embudo de venta de cursos. Nada. Me cuesta tiempo y una factura de servidor, y no me reporta nada más que algún visitante ocasional desde Catar. 🪙❌
Y aun así, incluso con muchísimas horas invertidas y muchísima ayuda de la IA por el camino, es de verdad divertido. Cada uno de estos pequeños proyectos (bastionar el stack, perseguir bots escáneres, construir este contador de visitas) es una excusa para mancharme las manos con Linux y seguridad, y cada vez aprendo algo concreto. Esa es toda la recompensa, y sinceramente es más que suficiente. Si un puñado de esos 74 humanos también ha aprendido algo, eso es un extra. 🐧❤️
Hay otra forma más en la que he llegado a ver todo esto. En alemán existe una palabra maravillosa, Ehrenamt, para el trabajo cívico no remunerado que uno asume por sentido del deber y por auténtico placer: el cargo honorífico, ejercido por la comunidad y no por un sueldo. Tiene una tradición larga y orgullosa. Y con mis propias habilidades e intereses, siento que he encontrado justo aquí mi Ehrenamt para el tercer milenio: una forma de voluntariado que encaja de verdad conmigo, en la era de la digitalización y la informática, expresada en el medio que de verdad conozco y me encanta: Linux, servidores y seguridad. 🐧
En concreto, esto es lo que me importa:
- 📢 Sin publicidad, siempre. Sin banners, sin trackers, sin artículos patrocinados, nada que vender. Lo que lees es simplemente lo que quería escribir.
- 🎁 Sin buscar ventaja. Comercialmente no saco nada: se da libremente, y de eso se trata precisamente.
- 🎓 Transferencia de conocimiento. Todo lo que descubro (bastionar un stack, cazar bots escáneres, medir el TTFB) queda por escrito para que el siguiente pueda saltarse la parte dolorosa.
- 🌍 Sin fronteras. Un blog llega a cualquiera con un navegador, desde Alemania hasta Kazajistán o Kuwait (hola otra vez 👋). Un alcance que antes terminaba a la salida del pueblo ahora es mundial, y gratis.
- 🧑💻 Open source, de principio a fin. Todo (playbooks de Ansible, manifiestos de Kubernetes, este mismo script de visitas) está a la vista. Cógelo, aprende de él, ejecútalo tú mismo.
Y aquí puedo ser más preciso que «open source». El repositorio se publica bajo la licencia MIT, que la Free Software Foundation reconoce como una auténtica licencia de software libre (permisiva y compatible con la GPL). Así que no es solo código fuente que se te permite mirar: es software que eres realmente libre de ejecutar, estudiar, compartir y modificar, para cualquier propósito y sin letra pequeña. En el sentido más pleno de la palabra, me parece exactamente la manera correcta de devolver algo en 2026. 🌐❤️
📦 Código fuente completo, infraestructura como código y el script de visitas: github.com/aptupgrademe/www_k3s. Ningún tracker sufrió daños durante la elaboración de este artículo.




