Portainer Templates logo

Portainer Templates

MyIP MyIP

Stack

NetworkingTools

IP toolbox for checking your own connection: your IPv4 and IPv6 addresses and where they look like they are, which sites you can reach, WebRTC and DNS leak tests, a speed test, and lookups for MTR, DNS records and whois. Source: https://github.com/jason5ng32/MyIP

Image details

Pulls: 589k
Architecture: amd64, arm64
Image size: 181 MB
Latest: v7.7.0
User: jason5ng32
Created: Dec 10, 2023
Updated: 15 days ago
Status: active

Source details

Stars: 12.2k
Forks: 1k
Language: JavaScript
License: MIT
Updated: 16 hours ago
Website: ipcheck.ing/

Configuration

Type
Compose
Platform
linux
Image
jason5ng32/myip:latest
Ports
${MYIP_PORT:-18966}:18966
Env vars
ALLOWED_DOMAINS=${MYIP_HOSTS:?Set the host name or IP you'll open it on}MYIP_HOSTS=''MYIP_PORT=18966
Restart
unless-stopped
Source

Notes

Fill in the host name or IP you'll open it on before you deploy, since the stack won't start without one. That's just the host part of the address, like 192.168.1.20 or myip.example.com, with no http:// and no port. MyIP's server only answers lookups for pages opened on a host it knows (plus localhost), so if it's missing or wrong the page loads but your IP cards sit there loading forever. To fix it, change it in the stack's environment variables and redeploy. More than one host goes in as a list with commas and no spaces, like 192.168.1.20,myip.example.com, since a space quietly breaks the host after it. Then open http://<your-host>:18966 (or whichever port you picked). There's no login and nothing stored. Checking your connection is the whole point, so the page talks to lots of outside services: its makers' ipcheck.ing probes, IP lookup services (through the server), leak-test servers and the sites in the connectivity test. Docs: github.com/jason5ng32/MyIP

Standalone Install

Select an install method, to see config/commands for deploying MyIP

Installation method

Install on Portainer

Import all app templates into your Portainer instance, for easy 1-click deploys

  1. Ensure both Docker and Portainer are installed, and up-to-date
  2. Log into your Portainer web UI
  3. Under Settings → App Templates, paste the below URL
  4. Head to Home → App Templates, and the list of apps will show up
  5. Select MyIP, fill in any config options, and hit Deploy

Template Import URL

https://raw.githubusercontent.com/Lissy93/portainer-templates/main/templates.json
Show Me demo
Original stackfile

The compose file this template deploys, straight from its repo:

services:
  myip:
    image: jason5ng32/myip:latest
    restart: unless-stopped
    ports:
      - "${MYIP_PORT:-18966}:18966"
    environment:
      ALLOWED_DOMAINS: ${MYIP_HOSTS:?Set the host name or IP you'll open it on}

Or deploy it directly from the source:

git clone https://github.com/NotAFlightRisk/portainer-templates-extras
cd portainer-templates-extras
docker compose -f apps/myip/compose.yml up -d

More install options in our documentation, or see jason5ng32/MyIP for app-specific guidance.

🧰 MyIP - A Better IP Toolbox


IPCheck.ing Banner
jason5ng32%2FMyIP | Trendshift
Mentioned in Awesome Self Hosted
GitHub Repo stars GitHub forks Docker Pulls
Website PWA
CodeQL Docker Build and Push CI
English | 简体中文 | 繁體中文 | Русский | Français | Português (BR)
An open-source, all-in-one IP toolbox: IP lookup from multiple sources, connectivity tests, WebRTC & DNS-leak detection, speed test, MTR, censorship checks, Whois, and more — self-hostable with one Docker command.
👉 Demo: https://ipcheck.ing
Feel free to bookmark the demo or deploy your own.
Deploy with Docker

👀 Features

🪪 Your IP & Identity

  • 🛜 IP Cards: Detects your IPv4 and IPv6 from multiple independent sources side by side — country, region, city, ASN, organization, and the IP's local time zone.
  • 🔍 Query IP: Looks up the same detailed information for any IP address you're curious about.
  • 🧾 IP History: Keeps a local record of the IPs you've been seen with, filterable by type and country — stored in your browser only.
  • 🖥️ Browser Fingerprint: Calculates your browser fingerprint in multiple ways and shows what makes you identifiable.

🕵️ Leaks & Privacy

  • 🚥 WebRTC Detection: Reveals the IP address exposed during WebRTC connections — including whether your browser's privacy hardening is on.
  • 🛑 DNS Leak Test: Shows which DNS endpoints resolve your queries, to evaluate the risk of DNS leaks when using VPNs or proxies.
  • 📋 Security Checklist: A 258-item personal cybersecurity checklist across 12 areas, with progress saved in your browser.

📡 Network Tests

  • 🚦 Connectivity Check: Tests the reachability of up to 60 sites of your choice, with multi-round minimum-latency results — plus curated import lists, from country packs to AI, social, streaming, gaming, developer, and more. Based on the results, it signals whether global internet access is currently feasible for you.
  • 🚀 Speed Test: Measures your download, upload, and latency against edge networks.
  • ⏱️ Global Latency Test: Pings your target from probes all over the world — pick countries from all available Globalping probes, grouped by continent.
  • 🚉 MTR Test: Runs MTR from globally distributed probes to see the route packets actually take.
  • 🚧 Censorship Check: Shows where a website is blocked worldwide — and by what means.
  • 🚏 Proxy Rule Test: Verifies that your proxy software's rule configuration works the way you intended.

🔦 Lookup & Infrastructure

  • 📟 DNS Resolver: Resolves a domain through multiple resolvers at once, grouped by country — an easy way to spot hijacking or contamination.
  • 📓 Whois Search: Performs Whois lookups for domain names, IP addresses, and AS numbers.
  • 🗄️ MAC Lookup: Identifies the vendor and details behind a physical address.
  • 🧮 IP Calculator: Subnet math, notation conversions and IPv6 interface details for any IP, prefix, range or list, computed locally.
  • 🛰️ ASN Info & Upstream Topology: Right on each IP card — AS details, historical announcements for the IP's prefix, and the upstream paths from its ASN to the Tier 1 backbone.
  • 🛂 ASN Profile: The full picture of any AS — registration with the raw Whois record, global rank and size, traffic and connection quality, where its IPv4 space is used, every announced prefix with its RPKI status, its upstreams, peers and customers, and the internet exchanges and data centers where it is present.
  • 📶 Service Status: Live availability of well-known services — Claude, OpenAI, GitHub, Cloudflare, and more — from their official status pages, with recent incidents.

✨ Platform

  • 📤 Shareable Reports: Turn your test results into a diagnostic report — a read-only link with auto-expiry, AI-ready Markdown, or JSON.
  • ⌨️ Curl API: Get your IP from the terminal with a single curl command.
  • 🌍 Earth Online: A panel broadcasting global internet outage events as they happen.
  • 🌗 Dark Mode: Follows your system automatically, with a manual toggle.
  • 📲 PWA: Installable as an app on your phone and as a Chrome app on your desktop.
  • ⚡ Keyboard Shortcuts: Every function has one — press ? to see the list.
  • 🔤 Multiple Languages: The UI ships in 6 languages, and adding yours takes one locale pack.

📕 How to Use

Using Docker

One command and you're up:
docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest

Or click the "Deploy with Docker" button at the top of this page.

Deploying in a Node Environment

Make sure you have Node.js installed, then clone the code:
git clone https://github.com/jason5ng32/MyIP.git

Install and build. This project uses pnpm — if you don't have it, install it first (npm ships with Node, so this command always works):
npm install -g pnpm
pnpm install && pnpm run build

Run:
pnpm start

The program will run on port 18966.

⚙️ Configuration

!IMPORTANT MaxMind GeoLite2 credentials are required. They power IP geolocation and ASN lookups — without them, the MaxMind source returns 503. They're free: → MaxMind Setup

!WARNING ALLOWED_DOMAINS is required on a real domain. It's the hostname allowlist for the backend API — without it, every request from a non-localhost domain gets 403. → Reverse Proxy & Domains

docker run -d -p 18966:18966 \
  -e MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID" \
  -e MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY" \
  -e DATASET_AUTO_UPDATE="true" \
  -e ALLOWED_DOMAINS="your-domain.com" \
  --name myip --restart always \
  jason5ng32/myip:latest

Everything else — optional API keys, security & rate limiting, logging, Sentry, the curl API domains — is documented in the Environment Variables reference.

📖 Documentation

Full guides live in the MyIP Docs Center: docs.ipcheck.ing
  • Developer Guide — deployment, configuration, architecture, and contributing
  • Knowledge Base — how to use every tool, step-by-step network diagnosis, and networking concepts

🤝 Contributing

Contributions are welcome! We keep a curated set of beginner-friendly tasks — each with exact file paths, acceptance criteria, and tests that guide you to a green build:
  • 🏷️ Good first issues — add a DNS resolver from your country, add curated site lists, translate the README into your language, polish translations, and more
  • 🌐 TRANSLATING.md — bring the UI to your language: a locale pack plus one registry line, and a partial translation is a welcome first PR
  • 📄 CONTRIBUTING.md — setup, conventions, and how PRs flow (target the dev branch)

👩🏻‍💻 Advanced Usage

Proxy rules for checking your real IP and your proxy IP at the same time
If you're using a proxy for internet access, consider adding this rule to your proxy configuration (modify it according to your client). This setup lets you check both your real IP and the IP when using the proxy:
# IP Testing
IP-CIDR,1.0.0.2/32,Proxy,no-resolve
IP-CIDR6,2606:4700:4700::1111/128,Proxy,no-resolve
DOMAIN,4.ipcheck.ing,DIRECT
DOMAIN,6.ipcheck.ing,DIRECT
# Rule Testing
DOMAIN,ptest-1.ipcheck.ing,Proxy1
DOMAIN,ptest-2.ipcheck.ing,Proxy2
DOMAIN,ptest-3.ipcheck.ing,Proxy3
DOMAIN,ptest-4.ipcheck.ing,Proxy4
DOMAIN,ptest-5.ipcheck.ing,Proxy5
DOMAIN,ptest-6.ipcheck.ing,Proxy6
DOMAIN,ptest-7.ipcheck.ing,Proxy7
DOMAIN,ptest-8.ipcheck.ing,Proxy8

💖 Sponsors & Supporters

As an open source project, I'm very grateful to the following sponsors for their support:
Sponsors
RapidProxy
↳
RapidProxy — Residential proxies with 90M+ IPs, smart rotation and precise geo-targeting. From $0.55/GB, 10% off with code RAPID10
SwiftProxy
↳ SwiftProxy — High-quality rotating and static residential proxies, with 90M+ residential IPs across 220+ locations worldwide. It supports HTTP(S), SOCKS5, rotating and sticky sessions, with residential proxy plans starting at just $0.7/GB. Use code PROXY90 for an additional 10% off.
Proxy-Seller
↳
Proxy-Seller — offers private residential, mobile (4G/5G/LTE), ISP, and datacenter IPv4/IPv6 proxies with HTTP(S) and SOCKS5 support, 47M+ residential IPs in 220+ locations, precise country/city/ISP targeting, 99.7% uptime, and 24/7 support. MyIP users can use promo code CHECKINGIP15 to get 15% off.
V.PS
↳
V.PS — High-performance KVM VPS with global locations, fast connectivity, and IPv4 & IPv6 included.
Supporters

Cloudflare Project Alexandria

1Password

Greptile

Sentry

GitBook


Interested in sponsoring MyIP? Become a sponsor

📄 License

MIT © Jason Ng

Check the logs first

Nine times out of ten the logs tell you exactly what went wrong.

  • In Portainer, go to Containers, click the container, then Logs. Or run docker logs <container>
  • Exit codes help too: 137 means killed, usually out of memory. 126 or 127 means the command inside the image is broken.

Image won't pull

Test the pull directly on the host: docker pull jason5ng32/myip:latest

  • "manifest unknown" means the tag no longer exists. This template uses latest, so try pinning a specific version instead.
  • "toomanyrequests" is the Docker Hub rate limit. Log in with docker login to raise it.
  • "no space left on device" means a full disk. Reclaim space with docker system prune

"exec format error"

This means the image was built for a different CPU architecture than your server.

  • This image supports: amd64, arm64
  • Check yours with uname -m: x86_64 is amd64, aarch64 is arm64. Raspberry Pi and other ARM boards are the usual culprits.

Container keeps restarting

The unless-stopped restart policy relaunches the app after every crash, so the real error can scroll past.

  • Check the logs right after a restart, the last few lines before it died are the useful ones.
  • Get the exit code with docker inspect <container> --format '{{.State.ExitCode}}'
  • Still stuck? Redeploy once with the restart policy set to no so the failure stays visible.

Required settings are blank

MYIP_HOSTS has no default value, and myip may crash or misbehave if left empty.

  • Fill it in on the deploy screen before hitting deploy.

Stack won't deploy

Compose stacks fail fast on small mistakes, and Portainer shows the reason just above the editor.

  • YAML only accepts spaces for indentation, a single tab breaks the whole file.

Raise an issue

Found something which isn't working as it should? Here's how to report it.

A Compose stack

MyIP is a Compose stack, a set of containers defined in one file and brought up together by Portainer, then started and stopped as a single app.

The app image

An image is the app packed up ready to go, everything MyIP needs bundled into one download. This template pulls jason5ng32/myip:latest, which Docker fetches once (about 181 MB) and then starts your own copy from.

Where the image comes from

Docker pulls its images from registries, public libraries of ready-built apps. MyIP's comes from Docker Hub, published by jason5ng32.

Version tags

The bit after the colon in the image name is the version tag. Here it's latest, which always points at the newest build, so a redeploy can bump you to a newer release without you asking. Newest right now is v7.7.0. Pin a specific tag if you would rather stay on one version.

Which machines it runs on

Every image is built for particular CPU types. This one ships for amd64, arm64, so it runs on both regular x86 servers and ARM boards like a Raspberry Pi.

No stored data

This template doesn't mount any storage, so whatever MyIP writes stays inside the container and is wiped if it's recreated or updated. That's fine for something stateless, but add a volume before trusting it with anything you want to keep.

Environment variables

Environment variables are the settings you hand over when you deploy, things like a password or a timezone. MyIP takes 3 of them, and 2 need a value before it'll start properly:

  • ALLOWED_DOMAINS, needs a value
  • MYIP_HOSTS, needs a value. Just the host, no http:// and no port, like 192.168.1.20 or myip.example.com. For several, use commas and no spaces.
  • MYIP_PORT, defaults to 18966. Host port for the web UI

Restart policy

The restart policy here is unless-stopped, so Docker restarts MyIP after a crash or reboot, but leaves it off when you stop it on purpose. You can change this on the deploy screen. The choices are no (never restart), on-failure (only after a crash), unless-stopped (restart unless you stop it), and always (bring it back no matter what).

Networking

Nothing custom is set, so MyIP sits on Docker's default bridge network: its own private space that reaches the outside world only through the ports it publishes.

Container name

Once it's deployed, Portainer names the container myip. That's what you'll spot in the containers list and use in commands like docker logs myip.

Platform

The platform is linux, the kind of system the container is built to run on. Docker and Portainer handle this on a normal Linux server.

Open source license

MyIP is open source, released under the MIT license. In plain terms the code is out in the open, so you're free to run it and change it to fit what you need.

Portainer app templates

Zooming out, this whole page comes from a Portainer app template: a short recipe telling Portainer how to set MyIP up. Add the template list to Portainer once, then deploying MyIP is a click rather than a wall of config.