79 lines
1.9 KiB
Bash
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
|