intra_max_bot/deploy/scripts/setup_variant_a.sh
2026-03-19 17:05:20 +03:00

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."