Skip to content

Self-hosted IP geolocation API and Python package with no external API dependencies. Lookup IP data using local databases with Docker support.

License

Notifications You must be signed in to change notification settings

Malith-Rukshan/geoip-api

Repository files navigation

GeoIP API

GeoIP API

PyPI Package FastAPI Docker

✨ A self-hosted IP geolocation API and Python package that works completely offline! πŸš€

- Deploy your own private GeoIP service with complete control over your data and infrastructure -
Powered by MaxMind's GeoLite2 databases ツ

✨ Features

  • 🌍 Fast and reliable IP geolocation lookups
  • πŸ”’ Self-hosted solution with no external API dependencies
  • πŸ› οΈ Dual functionality: Python package and REST API
  • 🐳 Easy deployment with Docker and cloud platforms
  • πŸ“Š Get country, city, coordinates, timezone, ISP, and ASN data
  • 🎨 Beautiful, interactive demo UI for testing
  • πŸš€ Built with FastAPI for high performance
  • πŸ“¦ Automatic GeoLite2 database downloads and updates

πŸ› οΈ Usage

Python Package

Installation

pip install geoip-py

Basic Usage

from geoip_api import GeoIPLookup

# Initialize the lookup service (downloads DB files if needed)
lookup = GeoIPLookup(download_if_missing=True)

# Look up an IP address
result = lookup.lookup('8.8.8.8')
print(result)

# Output:
# {
#   "ip": "8.8.8.8",
#   "code": "US",
#   "country": "United States",
#   "continent": "North America",
#   "continent_code": "NA",
#   "city": "Mountain View",
#   "lat": 37.4056,
#   "lon": -122.0775,
#   "tz": "America/Los_Angeles",
#   "currency": "USD",
#   "isp": "Google LLC",
#   "asn": 15169
# }

REST API

βœ… Demo : https://geoip-api.malith.dev/

Simple Endpoints

# Simple path parameter
https://your-domain.com/8.8.8.8

# Query parameter
https://your-domain.com/?ip=8.8.8.8

Standard API Endpoint

https://your-domain.com/api/v1/geoip/lookup/8.8.8.8

Response Format

{
  "ip": "8.8.8.8",
  "code": "US",
  "country": "United States",
  "continent": "North America",
  "continent_code": "NA",
  "city": "Mountain View",
  "lat": 37.4056,
  "lon": -122.0775,
  "tz": "America/Los_Angeles",
  "currency": "USD",
  "isp": "Google LLC",
  "asn": 15169
}

πŸ“¦ Deployment Options

πŸš€ Cloud Deployment

One-click deployment to popular platforms:

Deploy with heroku Deploy to Netlify

Deploy to Railway Deploy to Render

🐳 Docker

The fastest way to deploy your own GeoIP API:

docker pull malithrukshan/geoip-api
docker run -p 8000:8000 malithrukshan/geoip-api

Your API will be available at http://localhost:8000

Docker Compose

Create a docker-compose.yml file:

version: '3.8'

services:
  geoip-api:
    image: malithrukshan/geoip-api
    ports:
      - "8000:8000"
    # volumes:
    #   - ./data:/app/api/db
    environment:
      - ENVIRONMENT=production

Then run:

docker-compose up -d

πŸ”¨ Building Docker Image Locally

If you want to build and run the Docker image from source:

  1. Clone the repository
    git clone https://github.com/Malith-Rukshan/geoip-api.git
    cd geoip-api
  2. Build the Docker image
    docker build -t geoip-api .
  3. Run the container
    docker run -p 8000:8000 geoip-api
  4. Access the API at http://localhost:8000

πŸ’» Local Development

Prerequisites

  • Python 3.9+
  • pip

Setup

  1. Clone the repository

    git clone https://github.com/Malith-Rukshan/geoip-api.git
    cd geoip-api
  2. Install dependencies

    pip install -r requirements/dev.txt
    pip install -e .
  3. Download GeoIP databases (optional, will be downloaded automatically if needed)

    mkdir -p ~/.geoip_api
    curl -L -o ~/.geoip_api/GeoLite2-City.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb
    curl -L -o ~/.geoip_api/GeoLite2-ASN.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-ASN.mmdb
  4. Run the FastAPI application

    uvicorn api.main:app --reload
  5. Visit http://localhost:8000 to see the API in action

Running Tests

pytest
black --check src tests api
mypy src tests api

🌐 Use Cases

  • Security & Compliance: Enhance security systems with IP-based threat detection while maintaining data sovereignty
  • Content Localization: Deliver region-specific content based on visitor location without sharing user data
  • Analytics: Analyze traffic patterns and user demographics with geographic data that remains within your infrastructure
  • Fraud Prevention: Identify suspicious login attempts based on geographic anomalies
  • Development Environment: Use a local GeoIP service in your development environment without external API dependencies

πŸ“œ License

This project is licensed under the MIT License - see the LICENSE file for details.

⚠️ Database License Notice

This project uses GeoLite2 data created by MaxMind, available from https://www.maxmind.com. The GeoLite2 databases are licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.

πŸ”§ Acknowledgements

πŸ‡ΊπŸ‡³ Flags By : Animated Country Flags

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

🌟 Support and Community

If you found this project helpful, please give it a ⭐ on GitHub. This helps more developers discover the project! 🫢

πŸ“¬ Contact

If you have any questions, feedback, or just want to say hi, you can reach out to me:

πŸ§‘β€πŸ’» Built with πŸ’– by Malith Rukshan

About

Self-hosted IP geolocation API and Python package with no external API dependencies. Lookup IP data using local databases with Docker support.

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •