From 944591e2560c7bde42312980a858566a6f6e7c90 Mon Sep 17 00:00:00 2001 From: Loan TALVAT Date: Thu, 13 Aug 2026 15:36:01 +0200 Subject: [PATCH] feat(catalog): add Louez Equipment rental platform: a booking storefront with live availability and a back office for reservations, customers and PDF contracts. Three services: the app, MySQL 8.4 and MinIO for product photos. The app creates its own database schema on first boot; a prepare step creates the image bucket once MinIO answers. --- packages/core/src/apps/catalog.json | 153 ++++++++++++++++++++++ packages/core/src/apps/catalog/louez.json | 153 ++++++++++++++++++++++ 2 files changed, 306 insertions(+) create mode 100644 packages/core/src/apps/catalog/louez.json diff --git a/packages/core/src/apps/catalog.json b/packages/core/src/apps/catalog.json index eb618496f..d2edf0a4d 100644 --- a/packages/core/src/apps/catalog.json +++ b/packages/core/src/apps/catalog.json @@ -2923,6 +2923,159 @@ ] } ] + }, + { + "$schema": "https://openship.io/app.schema.json", + "available": false, + "id": "louez", + "name": "Louez", + "description": "Equipment rental platform: a booking storefront with live availability, and a back office for reservations, customers and PDF contracts.", + "kind": "template", + "logo": "louez", + "category": "other", + "tags": [ + "rental", + "booking", + "reservations", + "inventory", + "ecommerce" + ], + "framework": "docker-compose", + "repository": "https://github.com/Synapsr/Louez", + "services": [ + { + "name": "louez-db", + "image": "mysql:8.4", + "environment": { + "MYSQL_DATABASE": "louez", + "MYSQL_USER": "louez" + }, + "secretEnv": [ + "MYSQL_PASSWORD", + "MYSQL_ROOT_PASSWORD" + ], + "volumes": [ + "louez_db:/var/lib/mysql" + ], + "healthcheck": { + "test": "mysqladmin ping -h 127.0.0.1", + "interval": "5s", + "retries": 20 + }, + "restart": "unless-stopped" + }, + { + "name": "louez-storage", + "image": "minio/minio:RELEASE.2025-09-07T16-13-09Z", + "command": "server /data", + "environment": { + "MINIO_ROOT_USER": "louez" + }, + "secretEnv": [ + "MINIO_ROOT_PASSWORD" + ], + "volumes": [ + "louez_storage:/data" + ], + "healthcheck": { + "test": "curl -sf http://127.0.0.1:9000/minio/health/live", + "interval": "5s", + "retries": 20 + }, + "restart": "unless-stopped" + }, + { + "name": "louez", + "image": "synapsr/louez:2.1.0", + "ports": [ + "3000:3000" + ], + "exposedPort": 3000, + "exposed": true, + "dependsOn": [ + "louez-db", + "louez-storage" + ], + "environment": { + "LOUEZ_MODE": "standalone", + "AUTH_URL": "{{publicUrl:louez}}", + "NEXT_PUBLIC_APP_URL": "{{publicUrl:louez}}", + "AUTH_TRUST_HOST": "true", + "DATABASE_URL": "mysql://louez:{{config:MYSQL_PASSWORD}}@louez-db:3306/louez", + "S3_ENDPOINT": "http://louez-storage:9000", + "S3_REGION": "us-east-1", + "S3_BUCKET": "louez", + "S3_ACCESS_KEY_ID": "louez", + "S3_SECRET_ACCESS_KEY": "{{config:MINIO_ROOT_PASSWORD}}", + "S3_PUBLIC_URL": "/files" + }, + "secretEnv": [ + "DATABASE_URL", + "S3_SECRET_ACCESS_KEY", + "AUTH_SECRET" + ], + "volumes": [ + "louez_data:/app/data" + ], + "restart": "unless-stopped" + } + ], + "endpoints": [ + { + "service": "louez", + "port": 3000, + "label": "Storefront and dashboard", + "kind": "http" + } + ], + "prepare": [ + { + "service": "louez-storage", + "phase": "post-ready", + "readiness": { + "test": "mc alias set local http://127.0.0.1:9000 \"$MINIO_ROOT_USER\" \"$MINIO_ROOT_PASSWORD\"", + "interval": 2000, + "retries": 30 + }, + "command": "mc alias set local http://127.0.0.1:9000 \"$MINIO_ROOT_USER\" \"$MINIO_ROOT_PASSWORD\" && mc mb --ignore-existing local/louez", + "capture": "bucket", + "mustSucceed": true, + "title": "Creating the product image bucket", + "description": "Louez stores product photos in MinIO and streams them back through the app, so the bucket stays private." + } + ], + "configFields": [ + { + "key": "MYSQL_PASSWORD", + "service": "louez-db", + "label": "Database password", + "generate": "secret", + "secret": true + }, + { + "key": "MYSQL_ROOT_PASSWORD", + "service": "louez-db", + "label": "Database root password", + "generate": "secret", + "secret": true + }, + { + "key": "MINIO_ROOT_PASSWORD", + "service": "louez-storage", + "label": "Image store password", + "help": "Credentials Louez uses to read and write product photos.", + "generate": "secret", + "secret": true + }, + { + "key": "AUTH_SECRET", + "service": "louez", + "label": "Auth secret", + "help": "Signs sessions. Auto-generated.", + "generate": "secret", + "secret": true + } + ] } ] } diff --git a/packages/core/src/apps/catalog/louez.json b/packages/core/src/apps/catalog/louez.json new file mode 100644 index 000000000..601292a0b --- /dev/null +++ b/packages/core/src/apps/catalog/louez.json @@ -0,0 +1,153 @@ +{ + "$schema": "https://openship.io/app.schema.json", + "available": false, + "id": "louez", + "name": "Louez", + "description": "Equipment rental platform: a booking storefront with live availability, and a back office for reservations, customers and PDF contracts.", + "kind": "template", + "logo": "louez", + "category": "other", + "tags": [ + "rental", + "booking", + "reservations", + "inventory", + "ecommerce" + ], + "framework": "docker-compose", + "repository": "https://github.com/Synapsr/Louez", + "services": [ + { + "name": "louez-db", + "image": "mysql:8.4", + "environment": { + "MYSQL_DATABASE": "louez", + "MYSQL_USER": "louez" + }, + "secretEnv": [ + "MYSQL_PASSWORD", + "MYSQL_ROOT_PASSWORD" + ], + "volumes": [ + "louez_db:/var/lib/mysql" + ], + "healthcheck": { + "test": "mysqladmin ping -h 127.0.0.1", + "interval": "5s", + "retries": 20 + }, + "restart": "unless-stopped" + }, + { + "name": "louez-storage", + "image": "minio/minio:RELEASE.2025-09-07T16-13-09Z", + "command": "server /data", + "environment": { + "MINIO_ROOT_USER": "louez" + }, + "secretEnv": [ + "MINIO_ROOT_PASSWORD" + ], + "volumes": [ + "louez_storage:/data" + ], + "healthcheck": { + "test": "curl -sf http://127.0.0.1:9000/minio/health/live", + "interval": "5s", + "retries": 20 + }, + "restart": "unless-stopped" + }, + { + "name": "louez", + "image": "synapsr/louez:2.1.0", + "ports": [ + "3000:3000" + ], + "exposedPort": 3000, + "exposed": true, + "dependsOn": [ + "louez-db", + "louez-storage" + ], + "environment": { + "LOUEZ_MODE": "standalone", + "AUTH_URL": "{{publicUrl:louez}}", + "NEXT_PUBLIC_APP_URL": "{{publicUrl:louez}}", + "AUTH_TRUST_HOST": "true", + "DATABASE_URL": "mysql://louez:{{config:MYSQL_PASSWORD}}@louez-db:3306/louez", + "S3_ENDPOINT": "http://louez-storage:9000", + "S3_REGION": "us-east-1", + "S3_BUCKET": "louez", + "S3_ACCESS_KEY_ID": "louez", + "S3_SECRET_ACCESS_KEY": "{{config:MINIO_ROOT_PASSWORD}}", + "S3_PUBLIC_URL": "/files" + }, + "secretEnv": [ + "DATABASE_URL", + "S3_SECRET_ACCESS_KEY", + "AUTH_SECRET" + ], + "volumes": [ + "louez_data:/app/data" + ], + "restart": "unless-stopped" + } + ], + "endpoints": [ + { + "service": "louez", + "port": 3000, + "label": "Storefront and dashboard", + "kind": "http" + } + ], + "prepare": [ + { + "service": "louez-storage", + "phase": "post-ready", + "readiness": { + "test": "mc alias set local http://127.0.0.1:9000 \"$MINIO_ROOT_USER\" \"$MINIO_ROOT_PASSWORD\"", + "interval": 2000, + "retries": 30 + }, + "command": "mc alias set local http://127.0.0.1:9000 \"$MINIO_ROOT_USER\" \"$MINIO_ROOT_PASSWORD\" && mc mb --ignore-existing local/louez", + "capture": "bucket", + "mustSucceed": true, + "title": "Creating the product image bucket", + "description": "Louez stores product photos in MinIO and streams them back through the app, so the bucket stays private." + } + ], + "configFields": [ + { + "key": "MYSQL_PASSWORD", + "service": "louez-db", + "label": "Database password", + "generate": "secret", + "secret": true + }, + { + "key": "MYSQL_ROOT_PASSWORD", + "service": "louez-db", + "label": "Database root password", + "generate": "secret", + "secret": true + }, + { + "key": "MINIO_ROOT_PASSWORD", + "service": "louez-storage", + "label": "Image store password", + "help": "Credentials Louez uses to read and write product photos.", + "generate": "secret", + "secret": true + }, + { + "key": "AUTH_SECRET", + "service": "louez", + "label": "Auth secret", + "help": "Signs sessions. Auto-generated.", + "generate": "secret", + "secret": true + } + ] +}