diff --git a/pkg/web/templates/index.html b/pkg/web/templates/index.html
index 286a104..ffdd580 100644
--- a/pkg/web/templates/index.html
+++ b/pkg/web/templates/index.html
@@ -1182,14 +1182,40 @@
// Fetch and display own external IP for webUI
function displayExternalIP() {
- fetch('https://api.ipify.org?format=json')
- .then(res => res.json())
- .then(data => {
- document.getElementById('external-ip').textContent = data.ip;
- })
- .catch(() => {
- document.getElementById('external-ip').textContent = 'Unavailable';
- });
+ const target = document.getElementById('external-ip');
+ if (!target) return;
+
+ const providers = [
+ { url: 'https://api.ipify.org?format=json', extract: data => data.ip },
+ { url: 'https://ipapi.co/json/', extract: data => data && (data.ip || data.ip_address) },
+ { url: 'https://ipv4.jsonip.com/', extract: data => data.ip }
+ ];
+
+ const tryProvider = (index) => {
+ if (index >= providers.length) {
+ target.textContent = 'Unavailable';
+ return;
+ }
+ const provider = providers[index];
+ fetch(provider.url, { headers: { 'Accept': 'application/json' } })
+ .then(res => {
+ if (!res.ok) throw new Error('HTTP ' + res.status);
+ return res.json();
+ })
+ .then(data => {
+ const ip = provider.extract(data);
+ if (ip) {
+ target.textContent = ip;
+ } else {
+ throw new Error('Missing IP');
+ }
+ })
+ .catch(() => {
+ tryProvider(index + 1);
+ });
+ };
+
+ tryProvider(0);
}
// Function to initialize tooltips