feat(demo): add tenant demo data generator
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled

Add a relaunchable demo seed flow so a tenant can be populated quickly on a VPS or demo environment without manual setup.
This commit is contained in:
2026-03-10 22:44:39 +01:00
parent 8a3262faf9
commit ee62beea8c
8 changed files with 1810 additions and 2 deletions

200
deploy/vps/generate-demo-data.sh Executable file
View File

@@ -0,0 +1,200 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)
ROOT_DIR=$(cd -- "${SCRIPT_DIR}/../.." && pwd)
ENV_FILE="${CLASSEO_ENV_FILE:-${SCRIPT_DIR}/.env}"
COMPOSE_FILE="${CLASSEO_COMPOSE_FILE:-${ROOT_DIR}/compose.prod.yaml}"
PHP_SERVICE="${CLASSEO_PHP_SERVICE:-php}"
usage() {
cat <<EOF
Usage: ./deploy/vps/generate-demo-data.sh [options]
Generate a full demo dataset inside the tenant database used by the VPS deployment.
Options:
--tenant SUBDOMAIN Tenant subdomain. Defaults to TENANT_SUBDOMAIN from ${ENV_FILE}.
--password PASSWORD Shared password for all generated accounts.
Default: DemoPassword123!
--school NAME School name displayed on generated accounts.
--zone ZONE School zone: A, B or C. Default: B
--period-type TYPE Academic period type: trimester or semester.
Default: trimester
--env-file PATH Override env file path. Default: ${ENV_FILE}
--compose-file PATH Override compose file path. Default: ${COMPOSE_FILE}
--service NAME Override PHP service name. Default: ${PHP_SERVICE}
-h, --help Show this help.
Examples:
./deploy/vps/generate-demo-data.sh
./deploy/vps/generate-demo-data.sh --password 'Demo2026!'
./deploy/vps/generate-demo-data.sh --tenant demo --school 'College de demo'
EOF
}
prompt_with_default() {
local label="${1}"
local default_value="${2:-}"
local answer
if [ -n "${default_value}" ]; then
printf "%s [%s]: " "${label}" "${default_value}" >&2
else
printf "%s: " "${label}" >&2
fi
IFS= read -r answer
printf '%s\n' "${answer:-${default_value}}"
}
require_file() {
local path="${1}"
local label="${2}"
if [ ! -f "${path}" ]; then
echo "Missing ${label}: ${path}" >&2
exit 1
fi
}
ensure_command() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Required command not found: $1" >&2
exit 1
fi
}
TENANT=""
PASSWORD="DemoPassword123!"
SCHOOL=""
ZONE="B"
PERIOD_TYPE="trimester"
while [ "$#" -gt 0 ]; do
case "$1" in
--tenant)
TENANT="${2:-}"
shift 2
;;
--tenant=*)
TENANT="${1#*=}"
shift
;;
--password)
PASSWORD="${2:-}"
shift 2
;;
--password=*)
PASSWORD="${1#*=}"
shift
;;
--school)
SCHOOL="${2:-}"
shift 2
;;
--school=*)
SCHOOL="${1#*=}"
shift
;;
--zone)
ZONE="${2:-}"
shift 2
;;
--zone=*)
ZONE="${1#*=}"
shift
;;
--period-type)
PERIOD_TYPE="${2:-}"
shift 2
;;
--period-type=*)
PERIOD_TYPE="${1#*=}"
shift
;;
--env-file)
ENV_FILE="${2:-}"
shift 2
;;
--env-file=*)
ENV_FILE="${1#*=}"
shift
;;
--compose-file)
COMPOSE_FILE="${2:-}"
shift 2
;;
--compose-file=*)
COMPOSE_FILE="${1#*=}"
shift
;;
--service)
PHP_SERVICE="${2:-}"
shift 2
;;
--service=*)
PHP_SERVICE="${1#*=}"
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1" >&2
echo >&2
usage >&2
exit 1
;;
esac
done
ensure_command docker
require_file "${ENV_FILE}" "env file"
require_file "${COMPOSE_FILE}" "compose file"
set -a
# shellcheck disable=SC1090
. "${ENV_FILE}"
set +a
if [ -z "${TENANT}" ]; then
TENANT="${TENANT_SUBDOMAIN:-}"
fi
if [ -z "${TENANT}" ] && [ -t 0 ]; then
TENANT=$(prompt_with_default "Tenant subdomain" "demo")
fi
if [ -z "${TENANT}" ]; then
echo "Tenant subdomain is required. Pass --tenant or define TENANT_SUBDOMAIN in ${ENV_FILE}." >&2
exit 1
fi
if [ -z "${SCHOOL}" ] && [ -t 0 ]; then
SCHOOL=$(prompt_with_default "School name (optional)" "")
fi
COMMAND=(
docker compose
--env-file "${ENV_FILE}"
-f "${COMPOSE_FILE}"
exec "${PHP_SERVICE}"
php bin/console app:dev:generate-demo-data
"--tenant=${TENANT}"
"--password=${PASSWORD}"
"--zone=${ZONE}"
"--period-type=${PERIOD_TYPE}"
)
if [ -n "${SCHOOL}" ]; then
COMMAND+=("--school=${SCHOOL}")
fi
echo "Running demo data generator for tenant: ${TENANT}"
echo "Compose file: ${COMPOSE_FILE}"
echo "Env file: ${ENV_FILE}"
echo
"${COMMAND[@]}"