new changes
This commit is contained in:
78
scripts/ensure-env-ports.sh
Normal file
78
scripts/ensure-env-ports.sh
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user