72 lines
2.4 KiB
Bash
72 lines
2.4 KiB
Bash
#!/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."
|
|
|