98 lines
2.6 KiB
Bash
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
|