diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/deploy.sh | 105 | ||||
| -rwxr-xr-x | scripts/post-receive.sample | 32 |
2 files changed, 28 insertions, 109 deletions
diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 5eae840..5a2ac5c 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,35 +1,29 @@ #!/usr/bin/env bash # -# Production deploy script for Prism v2. +# Build/setup script for Prism v2. # -# Runs on the production server, AFTER the working tree has been updated -# (typically by a git post-receive hook that does `git checkout -f` into -# /var/www/prism-v2). This script does NOT pull — it only builds + restarts. +# Prepares backend and frontend dependencies and builds the frontend so the +# stack is ready to run. This script does NOT install systemd or nginx, restart +# services, or manage git hooks. # # Usage: -# sudo ./scripts/deploy.sh # build + restart + smoke-check -# sudo ./scripts/deploy.sh --install # also install systemd units + nginx site -# sudo ./scripts/deploy.sh --help +# ./scripts/deploy.sh +# ./scripts/deploy.sh --help set -euo pipefail -APP_DIR="${APP_DIR:-/var/www/prism-v2}" -APP_USER="${APP_USER:-www-data}" -APP_GROUP="${APP_GROUP:-www-data}" -DOMAIN="${DOMAIN:-prism.tylerhoang.xyz}" -BACKEND_SVC="prismv2-backend.service" -FRONTEND_SVC="prismv2-frontend.service" - -DO_INSTALL=0 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +APP_DIR="${APP_DIR:-$(cd "$SCRIPT_DIR/.." && pwd)}" +PYTHON_BIN="${PYTHON_BIN:-python3}" +BACKEND_VENV="$APP_DIR/backend/.venv" usage() { - sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//' + sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//' exit 0 } for arg in "$@"; do case "$arg" in - --install) DO_INSTALL=1 ;; -h|--help) usage ;; *) echo "Unknown arg: $arg" >&2; exit 2 ;; esac @@ -37,74 +31,31 @@ done log() { printf '\n=== %s ===\n' "$*"; } -if [[ $EUID -ne 0 ]]; then - echo "deploy.sh must be run as root (use sudo)" >&2 - exit 1 -fi - if [[ ! -d "$APP_DIR/backend" || ! -d "$APP_DIR/frontend" ]]; then - echo "Expected working tree at $APP_DIR (backend/ + frontend/ not found)" >&2 + echo "Expected repo root at $APP_DIR (backend/ + frontend/ not found)" >&2 exit 1 fi -cd "$APP_DIR" - -log "Ensuring ownership of $APP_DIR" -chown -R "$APP_USER:$APP_GROUP" "$APP_DIR" -install -d -o "$APP_USER" -g "$APP_GROUP" "$APP_DIR/frontend/.npm" -install -d -o "$APP_USER" -g "$APP_GROUP" "$APP_DIR/backend/data" - -run_as_app() { - sudo -u "$APP_USER" \ - env HOME="$APP_DIR/frontend" \ - NPM_CONFIG_CACHE="$APP_DIR/frontend/.npm" \ - "$@" -} - log "Backend: venv + dependencies" -if [[ ! -x "$APP_DIR/backend/.venv/bin/pip" ]]; then - sudo -u "$APP_USER" python3 -m venv "$APP_DIR/backend/.venv" +if [[ ! -x "$BACKEND_VENV/bin/pip" ]]; then + "$PYTHON_BIN" -m venv "$BACKEND_VENV" fi -sudo -u "$APP_USER" "$APP_DIR/backend/.venv/bin/pip" install --quiet --upgrade pip -sudo -u "$APP_USER" "$APP_DIR/backend/.venv/bin/pip" install --quiet -r "$APP_DIR/backend/requirements.txt" +"$BACKEND_VENV/bin/pip" install --quiet --upgrade pip +"$BACKEND_VENV/bin/pip" install --quiet -r "$APP_DIR/backend/requirements.txt" log "Frontend: npm ci + build" -run_as_app npm --prefix "$APP_DIR/frontend" ci -run_as_app npm --prefix "$APP_DIR/frontend" run build +npm --prefix "$APP_DIR/frontend" ci +npm --prefix "$APP_DIR/frontend" run build -if [[ $DO_INSTALL -eq 1 ]]; then - log "Installing systemd units" - cp "$APP_DIR/systemd/$BACKEND_SVC" "/etc/systemd/system/$BACKEND_SVC" - cp "$APP_DIR/systemd/$FRONTEND_SVC" "/etc/systemd/system/$FRONTEND_SVC" - systemctl daemon-reload - systemctl enable "$BACKEND_SVC" "$FRONTEND_SVC" +log "Build complete" +cat <<EOF +The stack is prepared. Run it with one of these sets of commands: - log "Installing nginx site" - cp "$APP_DIR/nginx/$DOMAIN.conf" "/etc/nginx/sites-available/$DOMAIN" - ln -sf "/etc/nginx/sites-available/$DOMAIN" "/etc/nginx/sites-enabled/$DOMAIN" - nginx -t - systemctl reload nginx -fi - -log "Restarting services" -systemctl restart "$BACKEND_SVC" "$FRONTEND_SVC" - -log "Smoke checks" -sleep 2 -if curl -fsS http://127.0.0.1:8001/health >/dev/null; then - echo " backend /health OK" -else - echo " backend /health FAILED" >&2 - journalctl -u "$BACKEND_SVC" -n 50 --no-pager >&2 || true - exit 1 -fi -if curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3001/ | grep -qE '^(200|301|302|307|308)$'; then - echo " frontend / OK" -else - echo " frontend / FAILED" >&2 - journalctl -u "$FRONTEND_SVC" -n 50 --no-pager >&2 || true - exit 1 -fi +Development: + $BACKEND_VENV/bin/uvicorn app.main:app --reload --host 127.0.0.1 --port 8001 --app-dir "$APP_DIR/backend" + NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8001 npm --prefix "$APP_DIR/frontend" run dev -- --hostname 127.0.0.1 --port 3001 -log "Deploy complete" -systemctl status "$BACKEND_SVC" "$FRONTEND_SVC" --no-pager --lines=0 || true +Production-style local run: + $BACKEND_VENV/bin/uvicorn app.main:app --host 127.0.0.1 --port 8001 --app-dir "$APP_DIR/backend" + NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8001 npm --prefix "$APP_DIR/frontend" run start -- --hostname 127.0.0.1 --port 3001 +EOF diff --git a/scripts/post-receive.sample b/scripts/post-receive.sample deleted file mode 100755 index 3ee898d..0000000 --- a/scripts/post-receive.sample +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# -# Sample git post-receive hook for /srv/git/prism-v2.git on the VPS. -# -# Install: -# sudo cp /var/www/prism-v2/scripts/post-receive.sample /srv/git/prism-v2.git/hooks/post-receive -# sudo chmod +x /srv/git/prism-v2.git/hooks/post-receive -# -# Required sudoers entry so the git user can restart services without a password. -# Adjust GIT_USER if your git is owned by a different account. -# GIT_USER ALL=(root) NOPASSWD: /var/www/prism-v2/scripts/deploy.sh - -set -euo pipefail - -BRANCH="master" -WEB_DIR="/var/www/prism-v2" -GIT_DIR="/srv/git/prism-v2.git" -LOG="/var/log/git-deploy.log" - -exec >> "$LOG" 2>&1 - -while read -r oldrev newrev refname; do - if [ "$refname" = "refs/heads/$BRANCH" ]; then - echo "$(date -Is): Checking out $BRANCH to $WEB_DIR" - sudo -u www-data git --work-tree="$WEB_DIR" --git-dir="$GIT_DIR" checkout -f "$BRANCH" - - echo "$(date -Is): Running deploy.sh" - sudo "$WEB_DIR/scripts/deploy.sh" - - echo "$(date -Is): Done." - fi -done |
