Volevo spudoratamente copiare e mettermi in casa il medesimo servizio offerto da Amazon tramite checkip.amazonaws.com.
Non avevo mai provato Flask e ho voluto tirare in piedi la cosa probabilmente più stupida e banale che ci potesse essere. È un po’ per questo motivo che è nato curl-ip, un repository che trovi nel mio account GitHub e che contiene un banale progetto Python che ti permette – appunto – di ottenere il tuo IP pubblico visitando un semplice URL o richiamando l’indirizzo pubblico tramite curl, da riga di comando.
Questa l’idea di base:
from flask import Flask, request
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def get_ip():
"""
Returns the IP address of the client. If the request is forwarded by a proxy server,
the IP address of the proxy server is returned instead.
"""
ip = request.headers.get('X-Forwarded-For', request.remote_addr)
return escape(ip) + "\n"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
Ha funzionato sin da subito. Considera che l’ho fatto girare in un container Docker con immagine di base python:3.13-slim, ho sfruttato un po’ di spazio e “potenza di calcolo” (paroloni) del Raspberry Pi 3B+ che ancora mantengo in vita a casa dei miei suoceri. Poi ho deciso di complicarmi la vita e provare a portare a bordo GPT-5 e Claude, facendomi consigliare possibili miglioramenti, maggiore robustezza e – questo su mia specifica richiesta – un URL di debug attraverso il quale sbirciare i vari header e gli indirizzi IP differenti rilevati, perché spesso mi trovo dietro proxy aziendali e non solo.
Siamo quindi approdati a Gunicorn, autenticazione (basic, non volevo complicarmi la vita all’infinito) per la pagina di debug e un litigio (durato pure troppo) per integrare l’icona da mostrare a chi visitava la pagina web anziché richiamarla da terminale. Entrambi i partecipanti hanno ritoccato il file di Docker Compose e rimesso ordine e rigore pure nel Dockerfile. Diciamo che in ambo i modi si arriva al risultato, semplicemente ci si è creati qualcosa che forse non era del tutto necessario, ma che male – tutto sommato – non fa.
Cosa devi sapere
Tutto il codice è disponibile su GitHub all’indirizzo github.com/gioxx/curl-ip.
Tu puoi usarlo direttamente (ricordati di installare il necessario, quindi pip install -r requirements.txt) avviando app.py (la porta d’ascolto predefinita è la 8080), oppure puoi scegliere di avviare un container Docker (consigliato, perché lo sbattimento si riduce praticamente a zero) partendo dall’immagine disponibile sia su Docker Hub che su GitHub:
Trovi un paio di esempi di docker-compose.yml direttamente su GitHub, entrambi in cartella examples, quello più semplice è certamente questo:
services:
ip:
container_name: ip
image: gfsolone/ip:latest
ports:
- "80:8080"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8080/"]
interval: 30s
timeout: 3s
retries: 3
start_period: 10s
environment:
ENABLE_DEBUG: "false"
DEBUG_TOKEN: "your_super_secret_token_here"
restart: unless-stopped
Ricorda solo di cambiare in “true” la variabile ENABLE_DEBUG se vuoi attivare la pagina di debug, e specificare un token / password complessa al posto di your_super_secret_token_here. Andando così all’indirizzo pubblico del container dovrai semplicemente inserire come nome utente “debug” e come password il token che hai incluso nel Compose. Ti verrà così mostrato l’output JSON completo.
Per ottenere, invece, il tuo indirizzo IP pubblico, ti basterà semplicemente visitare l’indirizzo web che porta al tuo container oppure chiedere udienza via terminale, curl https://ip.gioxx.org, ti risponderà il mio container demo che è ospitato su quel Raspberry Pi di cui ti parlavo qualche riga fa, magari non sempre disponibile e tanto dritto, ma è pur sempre qualcosa.
In caso di dubbi l’area commenti è a tua disposizione come sempre, io cercherò di aiutarti nel limite della mia conoscenza ed esperienza in merito 🙂✌️
#KeepItSimple