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:
Executable
+92
@@ -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
|
||||
Reference in New Issue
Block a user