CSDS553_Demo / scripts /bootstrap.sh
Juju519
Create bootstrap.sh
50a8916 unverified
#!/usr/bin/env bash
# scripts/bootstrap.sh
set -euo pipefail
# ======== CONFIG ========
APP_USER="${APP_USER:-student-admin}"
APP_HOME="/home/${APP_USER}"
APP_DIR="${APP_DIR:-$APP_HOME/Case_study1}"
ENV_DIR="${ENV_DIR:-$APP_HOME/conda/envs/app311}"
GITHUB_REPO="${GITHUB_REPO:-https://github.com/Juju519/Case_study1.git}"
BRANCH="${BRANCH:-main}"
ENV_FILE="/etc/yourapp.env"
UNIT="/etc/systemd/system/gompei.service"
HEALTH_SVC="/etc/systemd/system/gompei-health.service"
HEALTH_TMR="/etc/systemd/system/gompei-health.timer"
PY="$ENV_DIR/bin/python"
PIP="$ENV_DIR/bin/pip"
# ========================
echo "[bootstrap] starting"
# 0) user
if ! id -u "$APP_USER" >/dev/null 2>&1; then
useradd -m "$APP_USER"
fi
# 1) Miniconda
if ! [ -x /opt/miniconda/bin/conda ]; then
echo "[bootstrap] installing Miniconda"
curl -fsSL https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -o /tmp/m.sh
bash /tmp/m.sh -b -p /opt/miniconda
fi
# shellcheck disable=SC1091
source /opt/miniconda/etc/profile.d/conda.sh
# 2) Repo
if [ ! -d "$APP_DIR/.git" ]; then
echo "[bootstrap] cloning $GITHUB_REPO"
sudo -u "$APP_USER" git clone -b "$BRANCH" "$GITHUB_REPO" "$APP_DIR"
else
echo "[bootstrap] updating repo"
pushd "$APP_DIR" >/dev/null
sudo -u "$APP_USER" git fetch --all --prune
sudo -u "$APP_USER" git reset --hard "origin/$BRANCH"
popd >/dev/null
fi
chown -R "$APP_USER:$APP_USER" "$APP_DIR"
# 3) Conda env
if ! [ -x "$PY" ]; then
echo "[bootstrap] creating conda env at $ENV_DIR"
conda create -y -p "$ENV_DIR" python=3.11
fi
# 4) Deps
echo "[bootstrap] installing deps"
"$PIP" install -U pip
[ -f "$APP_DIR/requirements.txt" ] && "$PIP" install -r "$APP_DIR/requirements.txt" || true
"$PIP" install "gradio==4.44.1" "huggingface_hub>=0.25" requests
# 5) Runtime env (secrets)
if [ ! -f "$ENV_FILE" ]; then
echo "[bootstrap] writing $ENV_FILE (fill in secrets!)"
cat >"$ENV_FILE" <<'EOF'
# === runtime config (edit values) ===
API_PROVIDER=nebius
NEBIUS_API_KEY=sk_fill_me
NEBIUS_MODEL=meta-llama/Meta-Llama-3.1-8B-Instruct-fast
NEBIUS_BASE_URL=https://api.studio.nebius.ai/v1
# (Optional HF route)
# API_PROVIDER=hf
# HF_TOKEN=hf_fill_me
# HF_MODEL_ID=sshleifer/tiny-gpt2
GRADIO_SERVER_NAME=0.0.0.0
GRADIO_SERVER_PORT=7860
ENABLE_OAUTH=0
SKIP_UI_ON_IMPORT=0
EOF
fi
chmod 600 "$ENV_FILE"
chown root:root "$ENV_FILE"
# 6) systemd unit
echo "[bootstrap] installing systemd unit"
cat >"$UNIT" <<EOF
[Unit]
Description=Chat with Gompei (Gradio) service
Wants=network-online.target
After=network-online.target
[Service]
User=$APP_USER
WorkingDirectory=$APP_DIR
EnvironmentFile=$ENV_FILE
ExecStart=$PY $APP_DIR/app.py
Restart=always
RestartSec=5
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=false
PrivateTmp=true
KillSignal=SIGTERM
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target
EOF
# 7) health timer (self-restart if UI goes down)
cat >"$HEALTH_SVC" <<'EOF'
[Unit]
Description=Gompei healthcheck
[Service]
Type=oneshot
EnvironmentFile=/etc/yourapp.env
ExecStart=/bin/bash -lc 'curl -fsS --max-time 5 "http://127.0.0.1:${GRADIO_SERVER_PORT:-7860}/" >/dev/null || systemctl restart gompei.service'
EOF
cat >"$HEALTH_TMR" <<'EOF'
[Unit]
Description=Run Gompei healthcheck every minute
[Timer]
OnBootSec=2min
OnUnitActiveSec=1min
AccuracySec=10s
Unit=gompei-health.service
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable gompei.service gompei-health.timer
systemctl restart gompei.service
systemctl start gompei-health.timer
echo "[bootstrap] done"
systemctl --no-pager --full status gompei.service || true