#!/bin/sh # Avvia tutto il necessario per lo sviluppo locale di CrAPP: stack Supabase self-hosted, # CMS Strapi (stesso Postgres dello stack Supabase, database logico "strapi") e il dev server Vite. # Idempotente: rilanciabile, salta i passi già fatti (creazione .env, migration già applicate). # # Uso: sh scripts/dev-up.sh set -e # bun si installa in ~/.bun/bin: non sempre sul PATH in shell non interattive. export PATH="$HOME/.bun/bin:$PATH" ROOT="$(cd "$(dirname "$0")/.." && pwd)" SUPA_DIR="$ROOT/infra/supabase/docker" STRAPI_DIR="$ROOT/infra/strapi" echo "==> Stack Supabase self-hosted" if [ ! -f "$SUPA_DIR/.env" ]; then cp "$SUPA_DIR/.env.example" "$SUPA_DIR/.env" (cd "$SUPA_DIR" && sh utils/generate-keys.sh --update-env >/dev/null) echo " .env creato e chiavi generate" fi (cd "$SUPA_DIR" && docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d) echo "==> Attendo che supabase-db sia pronto" until docker exec supabase-db pg_isready -U postgres >/dev/null 2>&1; do sleep 1; done MIGRATIONS_APPLIED=$(docker exec supabase-db psql -U postgres -d postgres -tAc \ "SELECT to_regclass('public.turni_palloni') IS NOT NULL") if [ "$MIGRATIONS_APPLIED" != "t" ]; then echo "==> Applico le migration SQL (prima volta)" for f in "$ROOT"/supabase/migrations/*.sql; do docker exec -i supabase-db psql -U postgres -d postgres -v ON_ERROR_STOP=1 <"$f" done fi # ANON_KEY/SERVICE_ROLE_KEY sono su una riga sola nel .env dello stack self-hosted. ANON_KEY=$(grep -m1 '^ANON_KEY=' "$SUPA_DIR/.env" | cut -d= -f2-) SERVICE_ROLE_KEY=$(grep -m1 '^SERVICE_ROLE_KEY=' "$SUPA_DIR/.env" | cut -d= -f2-) echo "==> CMS Strapi (Postgres condiviso con lo stack Supabase, database logico 'strapi')" if [ ! -f "$STRAPI_DIR/.env" ]; then # DB e utente si creano solo insieme al .env: la password generata qui è l'unica copia, # quindi user/password vengono (ri)allineati ad ogni creazione del .env. DB_PASSWORD=$(openssl rand -base64 24) docker exec supabase-db psql -U postgres -v ON_ERROR_STOP=1 -tAc \ "DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'strapi') THEN CREATE USER strapi WITH PASSWORD '${DB_PASSWORD}'; ELSE ALTER USER strapi WITH PASSWORD '${DB_PASSWORD}'; END IF; END \$\$;" # "postgres" qui non è superuser (immagine Supabase): serve la membership del ruolo # target per poterlo assegnare come OWNER di un database. docker exec supabase-db psql -U postgres -v ON_ERROR_STOP=1 -c "GRANT strapi TO postgres;" docker exec supabase-db psql -U postgres -tAc \ "SELECT 1 FROM pg_database WHERE datname='strapi'" | grep -q 1 || docker exec supabase-db psql -U postgres -v ON_ERROR_STOP=1 \ -c "CREATE DATABASE strapi OWNER strapi;" cp "$STRAPI_DIR/.env.production.example" "$STRAPI_DIR/.env" for key in APP_KEYS API_TOKEN_SALT ADMIN_JWT_SECRET JWT_SECRET TRANSFER_TOKEN_SALT ENCRYPTION_KEY; do val=$(openssl rand -base64 32) sed -i "s#^${key}=.*#${key}=${val}#" "$STRAPI_DIR/.env" done sed -i "s#^DATABASE_HOST=.*#DATABASE_HOST=supabase-db#" "$STRAPI_DIR/.env" sed -i "s#^DATABASE_PASSWORD=.*#DATABASE_PASSWORD=${DB_PASSWORD}#" "$STRAPI_DIR/.env" echo " database 'strapi', utente e .env creati con secret generati" fi (cd "$STRAPI_DIR" && docker compose up -d --build) echo "==> .env dell'app (root)" if [ ! -f "$ROOT/.env" ]; then cat >"$ROOT/.env" < Users & Permissions -> Roles" echo " -> Public) — altrimenti rosa/classifica/storico restano vuoti." fi echo "==> bun run dev" cd "$ROOT" && exec bun run dev