66 lines
1.8 KiB
Bash
Executable File
66 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Generate a gitignored docker-compose.override.yml on free host ports, then
|
|
# start the stack. Invoked by `make up-local`.
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$ROOT"
|
|
|
|
COMPOSE="${COMPOSE:-docker compose}"
|
|
COMPOSE_OVERRIDE="${COMPOSE_OVERRIDE:-docker-compose.override.yml}"
|
|
LOCAL_HTTP_PORT="${LOCAL_HTTP_PORT:-18080}"
|
|
LOCAL_HTTPS_PORT="${LOCAL_HTTPS_PORT:-18443}"
|
|
LOCAL_POSTGRES_PORT="${LOCAL_POSTGRES_PORT:-15434}"
|
|
|
|
port_ok() {
|
|
local p="$1"
|
|
if ! lsof -nP -iTCP:"$p" -sTCP:LISTEN >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
# Reuse ports already published by this compose project.
|
|
$COMPOSE port api-gateway 80 2>/dev/null | grep -q ":${p}$" && return 0
|
|
$COMPOSE port api-gateway 443 2>/dev/null | grep -q ":${p}$" && return 0
|
|
$COMPOSE port postgres 5432 2>/dev/null | grep -q ":${p}$" && return 0
|
|
return 1
|
|
}
|
|
|
|
pick() {
|
|
local start="$1" name="$2" p
|
|
for p in $(seq "$start" $((start + 40))); do
|
|
if port_ok "$p"; then
|
|
echo "$p"
|
|
return 0
|
|
fi
|
|
done
|
|
echo "No free host port near ${start} for ${name}" >&2
|
|
exit 1
|
|
}
|
|
|
|
test -f .env || cp .env.example .env
|
|
|
|
http="$(pick "$LOCAL_HTTP_PORT" HTTP)"
|
|
https="$(pick "$LOCAL_HTTPS_PORT" HTTPS)"
|
|
pg="$(pick "$LOCAL_POSTGRES_PORT" Postgres)"
|
|
|
|
cat >"$COMPOSE_OVERRIDE" <<EOF
|
|
# Generated by make up-local — gitignored, do not commit.
|
|
services:
|
|
postgres:
|
|
ports:
|
|
- "127.0.0.1:${pg}:5432"
|
|
api-gateway:
|
|
ports:
|
|
- "${http}:80"
|
|
- "${https}:443"
|
|
EOF
|
|
|
|
echo "Wrote ${COMPOSE_OVERRIDE}: HTTP=${http} HTTPS=${https} Postgres=127.0.0.1:${pg}"
|
|
|
|
$COMPOSE up -d --build --wait
|
|
|
|
echo ""
|
|
echo "Local stack is up (override ports, not committed):"
|
|
echo " HTTPS https://localhost:${https}"
|
|
echo " HTTP http://localhost:${http}"
|
|
echo " DB 127.0.0.1:${pg}"
|