#!/usr/bin/env bash set -Eeuo pipefail # One-shot setup script for Variant A (no Docker runtime). # It prepares venv, installs dependencies, installs systemd unit, # installs sudoers rule for CI restart, and starts the service. APP_DIR="${APP_DIR:-/opt/max-support}" APP_USER="${APP_USER:-$USER}" SERVICE_NAME="${SERVICE_NAME:-max-support}" PYTHON_BIN="${PYTHON_BIN:-python3}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" SYSTEMD_TEMPLATE="${PROJECT_ROOT}/deploy/systemd/max-support.service.template" SUDOERS_TEMPLATE="${PROJECT_ROOT}/deploy/sudoers/max-support-restart.template" if [[ ! -d "${APP_DIR}" ]]; then echo "ERROR: APP_DIR '${APP_DIR}' does not exist." exit 1 fi if [[ ! -f "${APP_DIR}/requirements.txt" ]]; then echo "ERROR: '${APP_DIR}/requirements.txt' not found. Clone repo first." exit 1 fi if [[ ! -f "${APP_DIR}/.env" ]]; then echo "ERROR: '${APP_DIR}/.env' not found. Create .env first." exit 1 fi echo "==> Ensuring ownership for ${APP_DIR}" sudo chown -R "${APP_USER}:${APP_USER}" "${APP_DIR}" echo "==> Creating/updating venv" if [[ ! -d "${APP_DIR}/.venv" ]]; then sudo -u "${APP_USER}" "${PYTHON_BIN}" -m venv "${APP_DIR}/.venv" fi echo "==> Installing Python dependencies" sudo -u "${APP_USER}" bash -lc "cd '${APP_DIR}' && . .venv/bin/activate && pip install --no-cache-dir -r requirements.txt" echo "==> Installing systemd unit" SERVICE_RENDERED="$(sed "s|__APP_USER__|${APP_USER}|g; s|__APP_DIR__|${APP_DIR}|g" "${SYSTEMD_TEMPLATE}")" echo "${SERVICE_RENDERED}" | sudo tee "/etc/systemd/system/${SERVICE_NAME}.service" > /dev/null echo "==> Installing sudoers rule for CI restart" SUDOERS_RENDERED="$(sed "s|__APP_USER__|${APP_USER}|g" "${SUDOERS_TEMPLATE}")" echo "${SUDOERS_RENDERED}" | sudo tee "/etc/sudoers.d/${SERVICE_NAME}-restart" > /dev/null sudo chmod 0440 "/etc/sudoers.d/${SERVICE_NAME}-restart" sudo visudo -cf "/etc/sudoers.d/${SERVICE_NAME}-restart" echo "==> Reloading and starting service" sudo systemctl daemon-reload sudo systemctl enable "${SERVICE_NAME}" sudo systemctl restart "${SERVICE_NAME}" sudo systemctl --no-pager status "${SERVICE_NAME}" || true echo "==> Health check" set -a # shellcheck disable=SC1090 source "${APP_DIR}/.env" set +a curl -fsS "http://127.0.0.1:${APP_PORT}/health" || { echo "ERROR: health check failed." exit 1 } echo "Setup completed successfully."