Initial Commit
This commit is contained in:
@@ -82,8 +82,8 @@ export type {
|
||||
${FEATURE_PASCAL}Response
|
||||
} from './domain/${FEATURE_CAMEL}.types';
|
||||
|
||||
// Internal: Register routes with Express app
|
||||
export { register${FEATURE_PASCAL}Routes } from './api/${FEATURE_CAMEL}.routes';
|
||||
// Internal: Register routes with Fastify app (plugin)
|
||||
export { ${FEATURE_PASCAL}Routes } from './api/${FEATURE_CAMEL}.routes';
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN}✅ Feature capsule created: $FEATURE_NAME${NC}"
|
||||
@@ -92,4 +92,4 @@ echo "1. Implement business logic in domain/${FEATURE_CAMEL}.service.ts"
|
||||
echo "2. Add database columns to migrations/"
|
||||
echo "3. Implement API validation"
|
||||
echo "4. Add tests"
|
||||
echo "5. Register routes in backend/src/app.ts"
|
||||
echo "5. Register Fastify plugin in backend/src/app.ts"
|
||||
|
||||
75
scripts/provision-tenant.sh
Executable file
75
scripts/provision-tenant.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
TENANT_ID=${1:-}
|
||||
|
||||
if [[ -z "$TENANT_ID" ]]; then
|
||||
echo "Usage: $0 <tenant-id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [[ "$TENANT_ID" =~ ^[a-z0-9-]+$ ]]; then
|
||||
echo "Error: tenant-id must be lowercase alphanumeric and dashes (e.g., acme-corp)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COMPOSE_FILE="docker-compose.yml"
|
||||
|
||||
echo "Appending services for tenant '$TENANT_ID' to $COMPOSE_FILE..."
|
||||
|
||||
cat >> "$COMPOSE_FILE" <<YAML
|
||||
|
||||
${TENANT_ID}-backend:
|
||||
build: ./backend
|
||||
environment:
|
||||
- TENANT_ID=${TENANT_ID}
|
||||
- DATABASE_URL=postgresql://motovault_user:\${DB_PASSWORD}@${TENANT_ID}-postgres:5432/motovault
|
||||
- REDIS_URL=redis://${TENANT_ID}-redis:6379
|
||||
- PLATFORM_TENANTS_API_URL=http://mvp-platform-tenants:8000
|
||||
- PLATFORM_VEHICLES_API_URL=http://mvp-platform-vehicles-api:8000
|
||||
- PLATFORM_VEHICLES_API_KEY=\${PLATFORM_VEHICLES_API_KEY:-mvp-platform-vehicles-secret-key}
|
||||
depends_on:
|
||||
- ${TENANT_ID}-postgres
|
||||
- ${TENANT_ID}-redis
|
||||
|
||||
${TENANT_ID}-frontend:
|
||||
build: ./frontend
|
||||
environment:
|
||||
- VITE_API_BASE_URL=http://${TENANT_ID}-backend:3001
|
||||
- VITE_TENANT_ID=${TENANT_ID}
|
||||
- VITE_AUTH0_DOMAIN=\${VITE_AUTH0_DOMAIN:-motovaultpro.us.auth0.com}
|
||||
- VITE_AUTH0_CLIENT_ID=\${VITE_AUTH0_CLIENT_ID:-replace-me}
|
||||
- VITE_AUTH0_AUDIENCE=\${VITE_AUTH0_AUDIENCE:-https://api.motovaultpro.com}
|
||||
depends_on:
|
||||
- ${TENANT_ID}-backend
|
||||
|
||||
${TENANT_ID}-postgres:
|
||||
image: postgres:15-alpine
|
||||
environment:
|
||||
POSTGRES_DB: motovault
|
||||
POSTGRES_USER: motovault_user
|
||||
POSTGRES_PASSWORD: \${DB_PASSWORD:-localdev123}
|
||||
POSTGRES_INITDB_ARGS: "--encoding=UTF8"
|
||||
volumes:
|
||||
- ./backend/src/_system/migrations:/docker-entrypoint-initdb.d
|
||||
- ${TENANT_ID}_postgres_data:/var/lib/postgresql/data
|
||||
|
||||
${TENANT_ID}-redis:
|
||||
image: redis:7-alpine
|
||||
command: redis-server --appendonly yes
|
||||
volumes:
|
||||
- ${TENANT_ID}_redis_data:/data
|
||||
|
||||
YAML
|
||||
|
||||
echo "Adding volumes for tenant '$TENANT_ID'..."
|
||||
|
||||
cat >> "$COMPOSE_FILE" <<YAML
|
||||
|
||||
${TENANT_ID}_postgres_data:
|
||||
${TENANT_ID}_redis_data:
|
||||
|
||||
YAML
|
||||
|
||||
echo "Tenant '${TENANT_ID}' provisioned. Run 'docker compose up -d' to start services."
|
||||
|
||||
43
scripts/run-monthly-etl.sh
Executable file
43
scripts/run-monthly-etl.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
SERVICE_MSSQL="mvp-platform-vehicles-mssql"
|
||||
SERVICE_ETL="mvp-platform-vehicles-etl"
|
||||
MSSQL_VOLUME="platform_vehicles_mssql_data"
|
||||
|
||||
echo "[monthly-etl] Starting MSSQL (profile: mssql-monthly)"
|
||||
docker compose --profile mssql-monthly up -d "$SERVICE_MSSQL"
|
||||
|
||||
echo "[monthly-etl] Waiting for MSSQL to accept connections..."
|
||||
ATTEMPTS=120 # up to ~10 minutes (120 * 5s)
|
||||
SLEEP=5
|
||||
for i in $(seq 1 $ATTEMPTS); do
|
||||
if docker compose exec -T "$SERVICE_MSSQL" /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Platform123!' -Q "SELECT 1" >/dev/null 2>&1; then
|
||||
echo "[monthly-etl] MSSQL is ready"
|
||||
break
|
||||
fi
|
||||
echo "[monthly-etl] MSSQL not ready yet... ($i/$ATTEMPTS)"
|
||||
sleep "$SLEEP"
|
||||
done
|
||||
|
||||
if ! docker compose exec -T "$SERVICE_MSSQL" /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Platform123!' -Q "SELECT 1" >/dev/null 2>&1; then
|
||||
echo "[monthly-etl] ERROR: MSSQL did not become ready in time" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
echo "[monthly-etl] Stopping and removing MSSQL container..."
|
||||
docker compose stop "$SERVICE_MSSQL" >/dev/null 2>&1 || true
|
||||
docker compose rm -f "$SERVICE_MSSQL" >/dev/null 2>&1 || true
|
||||
echo "[monthly-etl] Removing MSSQL data volume ($MSSQL_VOLUME)..."
|
||||
docker volume rm "$MSSQL_VOLUME" >/dev/null 2>&1 || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "[monthly-etl] Running ETL pipeline (build-catalog)..."
|
||||
docker compose run --rm "$SERVICE_ETL" python -m etl.main build-catalog
|
||||
|
||||
echo "[monthly-etl] Monthly ETL completed successfully."
|
||||
Reference in New Issue
Block a user