PORT environment variable always takes priority over database settings. Lock UI, when defined

This commit is contained in:
2025-12-01 14:26:19 +01:00
parent 272e112ac9
commit ac0f634236
9 changed files with 103 additions and 11 deletions

View File

@@ -485,17 +485,15 @@ func setDefaultsLocked() {
if currentSettings.Language == "" {
currentSettings.Language = "en"
}
if currentSettings.Port == 0 {
// Check for PORT environment variable first
if portEnv := os.Getenv("PORT"); portEnv != "" {
if port, err := strconv.Atoi(portEnv); err == nil && port > 0 && port <= 65535 {
currentSettings.Port = port
} else {
currentSettings.Port = 8080
}
} else {
// Check for PORT environment variable first - it always takes priority
if portEnv := os.Getenv("PORT"); portEnv != "" {
if port, err := strconv.Atoi(portEnv); err == nil && port > 0 && port <= 65535 {
currentSettings.Port = port
} else if currentSettings.Port == 0 {
currentSettings.Port = 8080
}
} else if currentSettings.Port == 0 {
currentSettings.Port = 8080
}
if currentSettings.CallbackURL == "" {
currentSettings.CallbackURL = fmt.Sprintf("http://127.0.0.1:%d", currentSettings.Port)
@@ -1112,6 +1110,18 @@ func SetDefaultServer(id string) (Fail2banServer, error) {
}
// GetSettings returns a copy of the current settings
// GetPortFromEnv returns the PORT environment variable value if set, and whether it's set
func GetPortFromEnv() (int, bool) {
portEnv := os.Getenv("PORT")
if portEnv == "" {
return 0, false
}
if port, err := strconv.Atoi(portEnv); err == nil && port > 0 && port <= 65535 {
return port, true
}
return 0, false
}
func GetSettings() AppSettings {
settingsLock.RLock()
defer settingsLock.RUnlock()

View File

@@ -93,6 +93,11 @@
"settings.title": "Einstellungen",
"settings.general": "Allgemeine Einstellungen",
"settings.language": "Sprache",
"settings.server_port": "Server-Port",
"settings.server_port_placeholder": "z.B. 8080",
"settings.port_env_set": "Port wird über die PORT-Umgebungsvariable gesetzt:",
"settings.port_env_hint": "Um den Port über die Weboberfläche zu ändern, entfernen Sie die PORT-Umgebungsvariable und starten Sie den Container neu.",
"settings.port_restart_hint": "⚠️ Port-Änderungen erfordern einen Neustart des Containers, um wirksam zu werden.",
"settings.enable_debug": "Debug-Protokoll aktivieren",
"settings.alert": "Alarm-Einstellungen",
"settings.callback_url": "Fail2ban Callback-URL",

View File

@@ -93,6 +93,11 @@
"settings.title": "Istellige",
"settings.general": "Allgemeini Istellige",
"settings.language": "Sprach",
"settings.server_port": "Server-Port",
"settings.server_port_placeholder": "z.B. 8080",
"settings.port_env_set": "Port wird über d PORT-Umgebigsvariable gsetzt:",
"settings.port_env_hint": "Um de Port über d Weboberflächi z ändere, entferne d PORT-Umgebigsvariable und start de Container neu.",
"settings.port_restart_hint": "⚠️ Port-Änderige erfordere ä Neustart vom Container, zum wirksam z werde.",
"settings.enable_debug": "Debug-Modus aktivierä",
"settings.alert": "Alarm-Istellige",
"settings.callback_url": "Fail2ban Callback-URL",

View File

@@ -93,6 +93,11 @@
"settings.title": "Settings",
"settings.general": "General Settings",
"settings.language": "Language",
"settings.server_port": "Server Port",
"settings.server_port_placeholder": "e.g., 8080",
"settings.port_env_set": "Port is set via PORT environment variable:",
"settings.port_env_hint": "To change the port via Web UI, remove the PORT environment variable and restart the container.",
"settings.port_restart_hint": "⚠️ Port changes require a container restart to take effect.",
"settings.enable_debug": "Enable Debug Log",
"settings.alert": "Alert Settings",
"settings.callback_url": "Fail2ban Callback URL",

View File

@@ -93,6 +93,11 @@
"settings.title": "Configuración",
"settings.general": "Configuración general",
"settings.language": "Idioma",
"settings.server_port": "Puerto del servidor",
"settings.server_port_placeholder": "ej. 8080",
"settings.port_env_set": "El puerto está configurado mediante la variable de entorno PORT:",
"settings.port_env_hint": "Para cambiar el puerto mediante la interfaz web, elimine la variable de entorno PORT y reinicie el contenedor.",
"settings.port_restart_hint": "⚠️ Los cambios de puerto requieren un reinicio del contenedor para surtir efecto.",
"settings.enable_debug": "Habilitar el modo de depuración",
"settings.alert": "Configuración de alertas",
"settings.callback_url": "URL de retorno de Fail2ban",

View File

@@ -93,6 +93,11 @@
"settings.title": "Paramètres",
"settings.general": "Paramètres généraux",
"settings.language": "Langue",
"settings.server_port": "Port du serveur",
"settings.server_port_placeholder": "p. ex. 8080",
"settings.port_env_set": "Le port est défini via la variable d'environnement PORT :",
"settings.port_env_hint": "Pour modifier le port via l'interface Web, supprimez la variable d'environnement PORT et redémarrez le conteneur.",
"settings.port_restart_hint": "⚠️ Les modifications du port nécessitent un redémarrage du conteneur pour prendre effet.",
"settings.enable_debug": "Activer le mode débogage",
"settings.alert": "Paramètres d'alerte",
"settings.callback_url": "URL de rappel Fail2ban",

View File

@@ -93,6 +93,11 @@
"settings.title": "Impostazioni",
"settings.general": "Impostazioni generali",
"settings.language": "Lingua",
"settings.server_port": "Porta del server",
"settings.server_port_placeholder": "es. 8080",
"settings.port_env_set": "La porta è impostata tramite la variabile d'ambiente PORT:",
"settings.port_env_hint": "Per modificare la porta tramite l'interfaccia Web, rimuovere la variabile d'ambiente PORT e riavviare il contenitore.",
"settings.port_restart_hint": "⚠️ Le modifiche alla porta richiedono un riavvio del contenitore per avere effetto.",
"settings.enable_debug": "Abilita debug",
"settings.alert": "Impostazioni di allarme",
"settings.callback_url": "URL di callback Fail2ban",

View File

@@ -857,7 +857,25 @@ func GetSettingsHandler(c *gin.Context) {
config.DebugLog("----------------------------")
config.DebugLog("GetSettingsHandler called (handlers.go)") // entry point
s := config.GetSettings()
c.JSON(http.StatusOK, s)
// Check if PORT environment variable is set
envPort, envPortSet := config.GetPortFromEnv()
// Create response with PORT env info
response := make(map[string]interface{})
responseBytes, _ := json.Marshal(s)
json.Unmarshal(responseBytes, &response)
// Add PORT environment variable information
response["portFromEnv"] = envPort
response["portEnvSet"] = envPortSet
// If PORT env is set, override the port value in response
if envPortSet {
response["port"] = envPort
}
c.JSON(http.StatusOK, response)
}
// UpdateSettingsHandler updates the AppSettings from a JSON body
@@ -875,6 +893,13 @@ func UpdateSettingsHandler(c *gin.Context) {
}
config.DebugLog("JSON binding successful, updating settings (handlers.go)")
// Check if PORT environment variable is set - if so, ignore port changes from request
envPort, envPortSet := config.GetPortFromEnv()
if envPortSet {
// Don't allow port changes when PORT env is set
req.Port = envPort
}
oldSettings := config.GetSettings()
newSettings, err := config.UpdateSettings(req)
if err != nil {

View File

@@ -343,6 +343,10 @@
<label for="uiPort" class="block text-sm font-medium text-gray-700 mb-2" data-i18n="settings.server_port">Server Port</label>
<input type="number" class="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" id="uiPort"
data-i18n-placeholder="settings.server_port_placeholder" placeholder="e.g., 8080" required min="80" max="65535" />
<p class="mt-1 text-sm text-gray-500" id="portEnvHint" style="display: none;">
<span data-i18n="settings.port_env_set">Port is set via PORT environment variable:</span> <span id="portEnvValue"></span>. <span data-i18n="settings.port_env_hint">To change the port via Web UI, remove the PORT environment variable and restart the container.</span>
</p>
<p class="mt-1 text-sm text-amber-600" id="portRestartHint" style="display: none;" data-i18n="settings.port_restart_hint">⚠️ Port changes require a container restart to take effect.</p>
</div>
<div class="mb-4">
<label for="callbackURL" class="block text-sm font-medium text-gray-700 mb-2" data-i18n="settings.callback_url">Fail2ban Callback URL</label>
@@ -3149,7 +3153,30 @@
.then(res => res.json())
.then(data => {
document.getElementById('languageSelect').value = data.language || 'en';
document.getElementById('uiPort').value = data.port || 8080,
// Handle PORT environment variable
const uiPortInput = document.getElementById('uiPort');
const portEnvHint = document.getElementById('portEnvHint');
const portEnvValue = document.getElementById('portEnvValue');
const portRestartHint = document.getElementById('portRestartHint');
if (data.portEnvSet) {
// PORT env is set - make field readonly and show hint
uiPortInput.value = data.port || data.portFromEnv || 8080;
uiPortInput.readOnly = true;
uiPortInput.classList.add('bg-gray-100', 'cursor-not-allowed');
portEnvValue.textContent = data.portFromEnv || data.port || 8080;
portEnvHint.style.display = 'block';
portRestartHint.style.display = 'none';
} else {
// PORT env not set - allow editing
uiPortInput.value = data.port || 8080;
uiPortInput.readOnly = false;
uiPortInput.classList.remove('bg-gray-100', 'cursor-not-allowed');
portEnvHint.style.display = 'none';
portRestartHint.style.display = 'block';
}
document.getElementById('debugMode').checked = data.debug || false;
document.getElementById('callbackURL').value = data.callbackUrl || '';