Files
yakpanel-core/scripts/ensure-env-ports.sh
2026-04-07 21:35:20 +05:30

98 lines
2.6 KiB
Bash

#!/usr/bin/env bash
# Remap host ports in .env when they are already bound (e.g. system Redis on 6379).
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ROOT}/.env"
[[ -f "$ENV_FILE" ]] || exit 0
# Add new keys when .env was created before panel-ui/observability existed.
add_key_if_missing() {
local key="$1" value="$2"
if ! grep -qE "^${key}=" "$ENV_FILE"; then
echo "${key}=${value}" >> "$ENV_FILE"
fi
}
add_key_if_missing PANEL_UI_PORT 3080
add_key_if_missing PANEL_CORS_EXTRA_ORIGINS ""
add_key_if_missing PROMETHEUS_PORT 19090
add_key_if_missing GRAFANA_PORT 13000
add_key_if_missing GRAFANA_ADMIN_USER admin
add_key_if_missing GRAFANA_ADMIN_PASSWORD yakpanel_grafana_admin
add_key_if_missing CADVISOR_PORT 18081
# Do not rewrite .env while our stack is already running.
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
if docker ps --format '{{.Names}}' 2>/dev/null | grep -qE '^yakpanel-(redis|postgres|api|nats|minio|agent-gateway|panel-api|panel-worker|panel-scheduler|panel-frontend|prometheus|grafana|cadvisor)$'; then
exit 0
fi
fi
port_listening() {
local port="$1"
if command -v ss >/dev/null 2>&1; then
ss -tuln 2>/dev/null | grep -qE ":${port}($|[[:space:]])" && return 0
fi
if command -v netstat >/dev/null 2>&1; then
netstat -tuln 2>/dev/null | grep -qE ":${port}($|[[:space:]])" && return 0
fi
return 1
}
get_kv() {
grep -E "^${1}=" "$ENV_FILE" 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '\r'
}
set_kv() {
local key="$1" val="$2"
if grep -qE "^${key}=" "$ENV_FILE"; then
sed -i "s/^${key}=.*/${key}=${val}/" "$ENV_FILE"
else
echo "${key}=${val}" >> "$ENV_FILE"
fi
}
find_free_port() {
local start="$1"
local end=$((start + 400))
local p
for ((p = start; p <= end; p++)); do
if ! port_listening "$p"; then
echo "$p"
return 0
fi
done
echo "$start"
}
remap_key() {
local key="$1"
local preferred_alt="$2"
local p alt
p=$(get_kv "$key")
[[ -z "$p" ]] && return 0
if ! port_listening "$p"; then
return 0
fi
alt="$preferred_alt"
if port_listening "$alt"; then
alt=$(find_free_port "$preferred_alt")
fi
echo "[yakpanel] Host port ${p} (${key}) is already in use; set ${key}=${alt} in .env"
set_kv "$key" "$alt"
}
remap_key REDIS_PORT 16379
remap_key POSTGRES_PORT 15432
remap_key API_PORT 18080
remap_key NATS_PORT 14222
remap_key NATS_MONITOR_PORT 18222
remap_key MINIO_PORT 19000
remap_key MINIO_CONSOLE_PORT 19001
remap_key PANEL_UI_PORT 13080
remap_key PROMETHEUS_PORT 19090
remap_key GRAFANA_PORT 13000
remap_key CADVISOR_PORT 18081