Aggiungo script di bootstrap per il dev locale (Supabase + Strapi + Vite)

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`.
This commit is contained in:
2026-08-29 11:17:57 +02:00
parent 591c047229
commit 67dbf25044
2 changed files with 93 additions and 0 deletions
+92
View File
@@ -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" <<EOF
VITE_SUPABASE_URL=http://localhost:8000
VITE_SUPABASE_PUBLISHABLE_KEY=$ANON_KEY
SUPABASE_SERVICE_ROLE_KEY=$SERVICE_ROLE_KEY
VITE_STRAPI_URL=http://localhost:1337
STRAPI_WRITE_TOKEN=
EOF
echo " .env creato"
echo ""
echo " NOTA: al primo avvio vai su http://localhost:1337/admin per creare l'utente"
echo " Strapi, poi abilita i permessi pubblici find/findOne su Giocatore,"
echo " Riga-classifica e Match-storico (Settings -> Users & Permissions -> Roles"
echo " -> Public) — altrimenti rosa/classifica/storico restano vuoti."
fi
echo "==> bun run dev"
cd "$ROOT" && exec bun run dev