Files

79 lines
2.8 KiB
Bash

#!/usr/bin/env bash
#
# One-command local setup. Idempotent: safe to re-run at any time.
#
# pnpm setup
#
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$ROOT"
blue() { printf "\033[34m%s\033[0m\n" "$1"; }
green() { printf "\033[32m%s\033[0m\n" "$1"; }
warn() { printf "\033[33m%s\033[0m\n" "$1"; }
# --- 1. Environment files ---------------------------------------------------
blue "→ Preparing environment files"
for example in .env.example apps/api/.env.example apps/storefront/.env.example apps/admin/.env.example; do
target="${example%.example}"
if [ -f "$target" ]; then
echo " · $target already exists, leaving it alone"
else
cp "$example" "$target"
echo " · created $target"
fi
done
# --- 2. Real JWT secrets ----------------------------------------------------
# The committed examples contain obvious placeholders. Replace them with real
# random values so that no environment — not even a laptop — runs on a secret
# that exists in the repository.
if grep -q "dev-only-access-secret-change-me" apps/api/.env 2>/dev/null; then
blue "→ Generating JWT secrets"
access_secret="$(openssl rand -base64 48 | tr -d '\n/+=' | cut -c1-48)"
refresh_secret="$(openssl rand -base64 48 | tr -d '\n/+=' | cut -c1-48)"
# BSD and GNU sed disagree about -i; write through a temp file instead.
tmp="$(mktemp)"
sed -e "s|^JWT_ACCESS_SECRET=.*|JWT_ACCESS_SECRET=${access_secret}|" \
-e "s|^JWT_REFRESH_SECRET=.*|JWT_REFRESH_SECRET=${refresh_secret}|" \
apps/api/.env > "$tmp" && mv "$tmp" apps/api/.env
echo " · wrote fresh secrets to apps/api/.env"
fi
# --- 3. Dependencies --------------------------------------------------------
blue "→ Installing dependencies"
pnpm install
# --- 4. Backing services ----------------------------------------------------
blue "→ Starting PostgreSQL, Redis, MinIO and Mailpit"
docker compose up -d postgres redis minio minio-init mailpit
blue "→ Waiting for PostgreSQL"
for _ in $(seq 1 30); do
if docker compose exec -T postgres pg_isready -q 2>/dev/null; then break; fi
sleep 1
done
# --- 5. Database ------------------------------------------------------------
blue "→ Applying migrations and seeding"
pnpm --filter @sport/api run db:generate
if [ -d apps/api/prisma/migrations ]; then
pnpm --filter @sport/api exec prisma migrate deploy
else
warn " · no migrations yet — run: pnpm db:migrate --name init"
pnpm --filter @sport/api exec prisma db push
fi
pnpm --filter @sport/api run db:seed
green ""
green "Ready. Start everything with: pnpm dev"
green ""
echo " Storefront http://localhost:3000"
echo " Admin http://localhost:3001"
echo " API http://localhost:4000/api/v1/health"
echo " API docs http://localhost:4000/docs"
echo " MinIO http://localhost:9001"
echo " Mailpit http://localhost:8025"