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

79 lines
1.9 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
# Do not rewrite .env while the dev stack is already running: published ports would
# appear "in use" but belong to our own containers.
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)$'; 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