Files
movie-select/setup-server.sh

63 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Run once to set up the movie-select service on Uberspace 8.
# Usage: bash setup-server.sh
set -euo pipefail
REMOTE_HOST="serve"
REMOTE_APP_DIR="/home/serve/services/movie-select"
REMOTE_STATIC_DIR="/var/www/virtual/serve/html/movie-select"
REMOTE_PORT=3003
DB_NAME="movie_select"
PG_SOCKET_DIR="/home/serve/tmp"
PG_PORT=5433
echo "==> Creating app + static directories on server..."
ssh "${REMOTE_HOST}" "mkdir -p ${REMOTE_APP_DIR} ${REMOTE_STATIC_DIR}"
echo "==> Creating PostgreSQL database (if not exists)..."
ssh "${REMOTE_HOST}" "createdb -h ${PG_SOCKET_DIR} -p ${PG_PORT} ${DB_NAME} 2>/dev/null || echo 'Database already exists'"
echo "==> Fetching PostgreSQL password..."
DB_PASS=$(ssh "${REMOTE_HOST}" "awk -F: '{print \$5}' ~/.pgpass | head -1")
DB_USER="serve"
echo "==> Creating .env on server..."
ssh "${REMOTE_HOST}" "cat > ${REMOTE_APP_DIR}/.env" <<EOF
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@localhost:${PG_PORT}/${DB_NAME}?host=${PG_SOCKET_DIR}
PORT=${REMOTE_PORT}
EOF
echo "==> Deploying app files..."
bash deploy.sh
echo "==> Running database migration..."
ssh "${REMOTE_HOST}" "cd ${REMOTE_APP_DIR} && psql -h ${PG_SOCKET_DIR} -p ${PG_PORT} -d ${DB_NAME} < drizzle/0000_parched_valeria_richards.sql 2>&1 || echo 'Tables may already exist'"
echo "==> Creating systemd service..."
ssh "${REMOTE_HOST}" REMOTE_APP_DIR="${REMOTE_APP_DIR}" bash <<'ENDSSH'
BUN_PATH=$(which bun)
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/movie-select.service <<SERVICE
[Install]
WantedBy=default.target
[Service]
ExecStart=${BUN_PATH} run --env-file=.env src/server/index.ts
WorkingDirectory=${REMOTE_APP_DIR}
Restart=on-failure
RestartSec=3
SERVICE
systemctl --user daemon-reload
systemctl --user enable movie-select
systemctl --user restart movie-select
ENDSSH
echo "==> Configuring web backend for API..."
ssh "${REMOTE_HOST}" "uberspace web backend add /movie-select/api port ${REMOTE_PORT} --remove-prefix 2>/dev/null || uberspace web backend set /movie-select/api port ${REMOTE_PORT} --remove-prefix"
echo "==> Service status:"
ssh "${REMOTE_HOST}" "systemctl --user status movie-select --no-pager"
echo ""
echo "Done. Live at https://serve.uber.space/movie-select/"