119 lines
4.6 KiB
Bash
Executable File
119 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# celebrate-esc deploy script — idempotent, can be re-run safely
|
|
# Target: Uberspace 8 (serve.uber.space)
|
|
|
|
HOST="serve"
|
|
SERVICE_DIR="services/celebrate-esc"
|
|
STATIC_DIR="/var/www/virtual/serve/html/celebrate-esc"
|
|
DB_NAME="celebrate_esc"
|
|
PORT=3006
|
|
|
|
echo "=== celebrate-esc deploy ==="
|
|
|
|
# ── 1. Create database if needed ─────────────────────────────────────
|
|
echo "→ ensuring database exists..."
|
|
ssh "$HOST" "createdb -h localhost -p 5433 $DB_NAME 2>/dev/null || true"
|
|
|
|
# ── 2. Build client locally ──────────────────────────────────────────
|
|
echo "→ building client..."
|
|
cd packages/client
|
|
VITE_BASE="/celebrate-esc/" bun run build
|
|
cd ../..
|
|
|
|
# ── 3. Sync server code ─────────────────────────────────────────────
|
|
echo "→ syncing server to $HOST:~/$SERVICE_DIR/..."
|
|
ssh "$HOST" "mkdir -p ~/$SERVICE_DIR"
|
|
rsync -az --delete \
|
|
--exclude='node_modules' \
|
|
--exclude='.env' \
|
|
packages/server/ "$HOST:~/$SERVICE_DIR/server/"
|
|
rsync -az --delete \
|
|
--exclude='node_modules' \
|
|
packages/shared/ "$HOST:~/$SERVICE_DIR/shared/"
|
|
|
|
# Copy root workspace files needed for bun install
|
|
scp package.json "$HOST:~/$SERVICE_DIR/"
|
|
scp tsconfig.json "$HOST:~/$SERVICE_DIR/"
|
|
scp bun.lock "$HOST:~/$SERVICE_DIR/"
|
|
|
|
# ── 4. Install server dependencies on remote ─────────────────────────
|
|
echo "→ installing server dependencies..."
|
|
ssh "$HOST" "cd ~/$SERVICE_DIR && cat > package.json << 'PKGJSON'
|
|
{
|
|
\"name\": \"celebrate-esc\",
|
|
\"private\": true,
|
|
\"workspaces\": [
|
|
\"shared\",
|
|
\"server\"
|
|
]
|
|
}
|
|
PKGJSON
|
|
bun install --frozen-lockfile 2>/dev/null || bun install"
|
|
|
|
# ── 5. Create .env on remote if missing ──────────────────────────────
|
|
echo "→ ensuring .env exists..."
|
|
ssh "$HOST" "test -f ~/$SERVICE_DIR/.env || cat > ~/$SERVICE_DIR/.env << 'ENVFILE'
|
|
DATABASE_URL=postgresql://localhost:5433/$DB_NAME
|
|
PORT=$PORT
|
|
ENVFILE"
|
|
|
|
# ── 6. Run migrations ────────────────────────────────────────────────
|
|
echo "→ running database migrations..."
|
|
ssh "$HOST" "cd ~/$SERVICE_DIR/server && DATABASE_URL=postgresql://localhost:5433/$DB_NAME bun drizzle-kit migrate"
|
|
|
|
# ── 7. Deploy static client files ────────────────────────────────────
|
|
echo "→ deploying client static files..."
|
|
ssh "$HOST" "mkdir -p $STATIC_DIR"
|
|
rsync -az --delete packages/client/dist/ "$HOST:$STATIC_DIR/"
|
|
|
|
# Create .htaccess for SPA routing
|
|
ssh "$HOST" "cat > $STATIC_DIR/.htaccess << 'HTACCESS'
|
|
RewriteEngine On
|
|
RewriteBase /celebrate-esc/
|
|
|
|
# Don't rewrite API requests — handled by web backend
|
|
RewriteCond %{REQUEST_URI} ^/celebrate-esc/api [NC]
|
|
RewriteRule . - [L]
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
RewriteRule . index.html [L]
|
|
HTACCESS"
|
|
|
|
# ── 8. Create systemd service ────────────────────────────────────────
|
|
echo "→ setting up systemd service..."
|
|
ssh "$HOST" "cat > ~/.config/systemd/user/celebrate-esc.service << 'UNIT'
|
|
[Unit]
|
|
Description=celebrate-esc API server
|
|
After=postgresql.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=%h/services/celebrate-esc/server
|
|
ExecStart=/usr/bin/bun run --env-file=../.env src/index.ts
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
UNIT
|
|
|
|
systemctl --user daemon-reload
|
|
systemctl --user enable celebrate-esc.service
|
|
systemctl --user restart celebrate-esc.service"
|
|
|
|
# ── 9. Set up web backend routing ────────────────────────────────────
|
|
echo "→ configuring web backend routing..."
|
|
ssh "$HOST" "uberspace web backend add /celebrate-esc/api PORT $PORT --remove-prefix --force 2>/dev/null || true"
|
|
|
|
# ── 10. Verify ────────────────────────────────────────────────────────
|
|
echo "→ verifying deployment..."
|
|
sleep 2
|
|
ssh "$HOST" "systemctl --user status celebrate-esc.service --no-pager | head -5"
|
|
echo ""
|
|
echo "=== deploy complete ==="
|
|
echo "Frontend: https://serve.uber.space/celebrate-esc/"
|
|
echo "API: https://serve.uber.space/celebrate-esc/api/health"
|