replace vanilla TS + Bun.serve() + MariaDB with: - frontend: React 19, Vite 6, TanStack Router/Query, Tailwind v4 - backend: Hono + @hono/node-server, Drizzle ORM, PostgreSQL, Zod - shared: algorithm, round-state, types in src/shared/ - tooling: Biome (lint/format), Vitest (tests) - deploy: static files at /movie-select/, API at /movie-select/api URL scheme changes from /movies/ to /movie-select/, API from action-based to RESTful endpoints. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
63 lines
2.1 KiB
Bash
Executable File
63 lines
2.1 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=3001
|
|
DB_NAME="movie_select"
|
|
|
|
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 ${DB_NAME} 2>/dev/null || echo 'Database already exists'"
|
|
|
|
echo "==> Fetching PostgreSQL credentials..."
|
|
DB_PASS=$(ssh "${REMOTE_HOST}" "my_print_defaults client 2>/dev/null | grep -oP '(?<=--password=).*' || echo ''")
|
|
DB_USER="serve"
|
|
DB_HOST="localhost"
|
|
DB_PORT="5432"
|
|
|
|
echo "==> Creating .env on server..."
|
|
ssh "${REMOTE_HOST}" "cat > ${REMOTE_APP_DIR}/.env" <<EOF
|
|
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}
|
|
PORT=${REMOTE_PORT}
|
|
EOF
|
|
|
|
echo "==> Deploying app files..."
|
|
bash deploy.sh
|
|
|
|
echo "==> Detecting node path on server..."
|
|
NODE_PATH=$(ssh "${REMOTE_HOST}" 'which node || echo "$HOME/.local/bin/node"')
|
|
echo " node at: ${NODE_PATH}"
|
|
|
|
echo "==> Creating systemd service..."
|
|
ssh "${REMOTE_HOST}" NODE_PATH="${NODE_PATH}" REMOTE_APP_DIR="${REMOTE_APP_DIR}" bash <<'ENDSSH'
|
|
mkdir -p ~/.config/systemd/user
|
|
cat > ~/.config/systemd/user/movie-select.service <<SERVICE
|
|
[Install]
|
|
WantedBy=default.target
|
|
|
|
[Service]
|
|
ExecStart=${NODE_PATH} --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 start 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/"
|