From 67dbf25044593f37ac011216ba04f60273a3c392 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Sat, 29 Aug 2026 11:17:57 +0200 Subject: [PATCH] Aggiungo script di bootstrap per il dev locale (Supabase + Strapi + Vite) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/dev-up.sh avvia in un colpo solo tutto quello che serve per sviluppare in locale: stack Supabase self-hosted (genera le chiavi e applica le migration SQL solo la prima volta), CMS Strapi sul Postgres condiviso con Supabase (crea database/utente dedicati, dato che il container Strapi ha solo il driver pg — sqlite non è un'opzione senza ricompilare l'immagine con better-sqlite3), e infine bun run dev. Idempotente: rilanciabile, salta i passi già completati. Esposto anche come `bun run dev:up`. --- package.json | 1 + scripts/dev-up.sh | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100755 scripts/dev-up.sh diff --git a/package.json b/package.json index d9b1301..b48f806 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "dev": "vite dev", + "dev:up": "sh scripts/dev-up.sh", "build": "vite build", "build:dev": "vite build --mode development", "preview": "vite preview", diff --git a/scripts/dev-up.sh b/scripts/dev-up.sh new file mode 100755 index 0000000..a288c7a --- /dev/null +++ b/scripts/dev-up.sh @@ -0,0 +1,92 @@ +#!/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