88 lines
2.7 KiB
Bash
Executable File
88 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# deploy.sh — build and deploy PWA + backend to Uberspace 8
|
|
# Usage: ./deploy.sh [uberspace-user@host] (default: serve)
|
|
set -euo pipefail
|
|
|
|
# activate mise so tool versions (bun, node, etc.) from .mise.toml are on $PATH
|
|
eval "$(mise activate bash --shims)"
|
|
|
|
REMOTE="${1:-serve}"
|
|
LOCAL_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
# reuse a single SSH connection to avoid rate limiting
|
|
SSH_SOCK="/tmp/deploy-ssh-$$"
|
|
ssh -fNM -o ControlMaster=yes -S "$SSH_SOCK" "$REMOTE"
|
|
trap 'ssh -S "$SSH_SOCK" -O exit "$REMOTE" 2>/dev/null' EXIT
|
|
r() { ssh -S "$SSH_SOCK" "$REMOTE" "$@"; }
|
|
|
|
REMOTE_USER=$(r 'echo $USER')
|
|
REMOTE_AGW_DIR="/var/www/virtual/$REMOTE_USER/html/agw"
|
|
REMOTE_SERVICE_DIR="/home/$REMOTE_USER/services/agw-backend"
|
|
SERVICE_NAME="agw-backend"
|
|
BACKEND_PORT=3002
|
|
|
|
# --- PWA ---
|
|
|
|
echo "==> Building PWA"
|
|
cd "$LOCAL_DIR"
|
|
bun install --frozen-lockfile
|
|
bun run build
|
|
|
|
echo "==> Deploying static files to $REMOTE:$REMOTE_AGW_DIR"
|
|
r "mkdir -p $REMOTE_AGW_DIR"
|
|
rsync -avz --delete -e "ssh -S $SSH_SOCK" \
|
|
"$LOCAL_DIR/dist/" "$REMOTE:$REMOTE_AGW_DIR/"
|
|
|
|
# --- Backend ---
|
|
|
|
echo "==> Deploying backend to $REMOTE:$REMOTE_SERVICE_DIR"
|
|
r "mkdir -p $REMOTE_SERVICE_DIR"
|
|
rsync -avz --delete -e "ssh -S $SSH_SOCK" \
|
|
--exclude='node_modules/' \
|
|
--exclude='.env' \
|
|
"$LOCAL_DIR/server/" "$REMOTE:$REMOTE_SERVICE_DIR/"
|
|
|
|
echo "==> Installing backend dependencies"
|
|
r "cd $REMOTE_SERVICE_DIR && npm install"
|
|
|
|
echo "==> Checking .env exists"
|
|
r "test -f $REMOTE_SERVICE_DIR/.env || { echo 'ERROR: $REMOTE_SERVICE_DIR/.env not found — create it first'; exit 1; }"
|
|
|
|
echo "==> Running database migrations"
|
|
r "cd $REMOTE_SERVICE_DIR && set -a && source .env && set +a && npx drizzle-kit migrate"
|
|
|
|
# --- systemd user service (Uberspace 8) ---
|
|
|
|
echo "==> Configuring systemd user service"
|
|
r "mkdir -p ~/.config/systemd/user && cat > ~/.config/systemd/user/$SERVICE_NAME.service << EOF
|
|
[Unit]
|
|
Description=Abgeordnetenwatch Backend
|
|
After=network.target postgresql.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=$REMOTE_SERVICE_DIR
|
|
EnvironmentFile=$REMOTE_SERVICE_DIR/.env
|
|
ExecStart=$REMOTE_SERVICE_DIR/node_modules/.bin/tsx src/index.ts
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF"
|
|
|
|
echo "==> Restarting backend service"
|
|
r "systemctl --user daemon-reload && systemctl --user enable $SERVICE_NAME && systemctl --user restart $SERVICE_NAME"
|
|
sleep 2
|
|
r "systemctl --user status $SERVICE_NAME --no-pager" || true
|
|
|
|
# --- Web backend (reverse proxy) ---
|
|
|
|
echo "==> Configuring web backend for /agw/api/"
|
|
r "uberspace web backend add /agw/api PORT $BACKEND_PORT --remove-prefix --force --wait" 2>/dev/null || true
|
|
|
|
echo ""
|
|
echo "Done."
|
|
echo " PWA: https://$REMOTE_USER.uber.space/agw/"
|
|
echo " Backend: https://$REMOTE_USER.uber.space/agw/api/"
|