67 lines
1.5 KiB
Bash
Executable File
67 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
|
cd "$ROOT"
|
|
|
|
if [[ -f ".env" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source ./.env
|
|
set +a
|
|
fi
|
|
|
|
pick_python() {
|
|
if [[ -n "${VISUAL_CHAT_PYTHON:-}" && -x "${VISUAL_CHAT_PYTHON}" ]]; then
|
|
echo "$VISUAL_CHAT_PYTHON"
|
|
return 0
|
|
fi
|
|
if [[ -n "${VIRTUAL_ENV:-}" && -x "${VIRTUAL_ENV}/bin/python" ]]; then
|
|
echo "${VIRTUAL_ENV}/bin/python"
|
|
return 0
|
|
fi
|
|
if [[ -x "$ROOT/.venv/bin/python" ]]; then
|
|
echo "$ROOT/.venv/bin/python"
|
|
return 0
|
|
fi
|
|
if command -v python3 >/dev/null 2>&1; then
|
|
command -v python3
|
|
return 0
|
|
fi
|
|
command -v python
|
|
}
|
|
|
|
normalize_host() {
|
|
local host="${1:-0.0.0.0}"
|
|
case "$host" in
|
|
127.0.0.1|localhost|::1)
|
|
echo "0.0.0.0"
|
|
;;
|
|
*)
|
|
echo "$host"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
HOST="$(normalize_host "${HTTP_HOST:-0.0.0.0}")"
|
|
PORT="${HTTP_PORT:-8080}"
|
|
PY="$(pick_python)"
|
|
SCHEME="http"
|
|
ARGS=(main:app --host "$HOST" --port "$PORT")
|
|
|
|
if [[ -n "${SSL_CERTFILE:-}" && -n "${SSL_KEYFILE:-}" ]]; then
|
|
SCHEME="https"
|
|
ARGS+=(--ssl-certfile "$SSL_CERTFILE" --ssl-keyfile "$SSL_KEYFILE")
|
|
fi
|
|
|
|
echo "repo: $ROOT"
|
|
echo "python: $PY"
|
|
echo "bind: ${HOST}:${PORT}"
|
|
echo "listen: ${SCHEME}://${HOST}:${PORT}"
|
|
echo "browser test page: ${SCHEME}://<server-ip>:${PORT}/"
|
|
echo "note: only one browser page is allowed to own the session; a newer client replaces the older one."
|
|
echo "note: after browser refresh, one click may still be required to resume mic/audio due to browser media policy."
|
|
|
|
exec "$PY" -m uvicorn "${ARGS[@]}"
|