#!/usr/bin/env bash # Allow the app to bind to port 80 without root. # Run once: sudo scripts/setup-port80.sh (from repo root) # Or: scripts/setup-port80.sh (will prompt for sudo only for setcap) set -e cd "$(dirname "$0")/.." REPO_ROOT="$(pwd)" # If run under sudo, use the invoking user's pipenv so the venv is found if [ -n "$SUDO_USER" ]; then VENV="$(sudo -u "$SUDO_USER" bash -c "cd '$REPO_ROOT' && pipenv --venv" 2>/dev/null)" || true else VENV="$(pipenv --venv 2>/dev/null)" || true fi if [ -z "$VENV" ]; then echo "Run 'pipenv install' first, then run this script again." exit 1 fi PYTHON="${VENV}/bin/python3" if [ ! -f "$PYTHON" ]; then PYTHON="${VENV}/bin/python" fi if [ ! -f "$PYTHON" ]; then echo "Python not found in venv: $VENV" exit 1 fi # Use the real binary (setcap can fail on symlinks or some filesystems) REAL_PYTHON="$(readlink -f "$PYTHON" 2>/dev/null)" || REAL_PYTHON="$PYTHON" if sudo setcap 'cap_net_bind_service=+ep' "$REAL_PYTHON" 2>/dev/null; then echo "OK: port 80 enabled for $REAL_PYTHON" echo "Start the app with: pipenv run run" else echo "setcap failed on $REAL_PYTHON" exit 1 fi