Browse Source

feat: add automatic public IP refresh for dynamic IP users

pull/2339/head
SurceBeats 7 months ago
parent
commit
738c7fcadd
  1. 39
      src/server/utils/WireGuard.ts
  2. 9
      src/server/utils/config.ts
  3. 9
      src/server/utils/ip.ts

39
src/server/utils/WireGuard.ts

@ -1,6 +1,8 @@
import fs from 'node:fs/promises';
import debug from 'debug';
import { encodeQR } from 'qr';
import { getCurrentPublicIpv4 } from './ip';
import { WG_AUTO_REFRESH_ENV } from './config';
import type { InterfaceType } from '#db/repositories/interface/types';
const WG_DEBUG = debug('WireGuard');
@ -9,6 +11,8 @@ const generateRandomHeaderValue = () =>
Math.floor(Math.random() * 2147483642) + 5;
class WireGuard {
private lastIpCheck = 0;
/**
* Save and sync config
*/
@ -306,6 +310,41 @@ class WireGuard {
if (needsSave) {
await this.saveConfig();
}
// Auto-refresh IP Feature
if (WG_AUTO_REFRESH_ENV.ENABLED) {
await this.checkAndUpdatePublicIp();
}
}
private async checkAndUpdatePublicIp() {
const now = Date.now();
// Only check at configured interval (default 5m)
if (now - this.lastIpCheck < WG_AUTO_REFRESH_ENV.INTERVAL) {
return;
}
this.lastIpCheck = now;
try {
const currentIp = await getCurrentPublicIpv4();
if (!currentIp) {
WG_DEBUG('Auto-refresh: Could not detect public IP');
return;
}
const userConfig = await Database.userConfigs.get();
if (userConfig.host !== currentIp) {
WG_DEBUG(
`Auto-refresh: IP changed from ${userConfig.host} to ${currentIp}`
);
await Database.userConfigs.updateHostPort(currentIp, userConfig.port);
WG_DEBUG('Auto-refresh: Database updated with new IP');
}
} catch (err) {
WG_DEBUG('Auto-refresh: Failed to check/update IP');
console.error(err);
}
}
}

9
src/server/utils/config.ts

@ -54,6 +54,15 @@ export const WG_INITIAL_ENV = {
: undefined,
};
export const WG_AUTO_REFRESH_ENV = {
/** Enable automatic IP refresh when host was set to auto-detected IP */
ENABLED: process.env.SERVERURL_AUTO_REFRESH === 'true',
/** Interval in milliseconds between IP checks (default: 300000 = 5 minutes) */
INTERVAL: process.env.SERVERURL_AUTO_REFRESH_INTERVAL
? Number.parseInt(process.env.SERVERURL_AUTO_REFRESH_INTERVAL, 10) * 1000
: 300 * 1000,
};
function assertEnv<T extends string>(env: T) {
const val = process.env[env];

9
src/server/utils/ip.ts

@ -170,3 +170,12 @@ async function getIpInformation() {
export const cachedGetIpInformation = cacheFunction(getIpInformation, {
expiry: 15 * 60 * 1000,
});
/**
* Get current public IPv4 address (non-cached)
* Used for auto-refresh feature
*/
export async function getCurrentPublicIpv4(): Promise<string | null> {
const ip = await getPublicIpv4();
return ip ?? null;
}

Loading…
Cancel
Save