- 🔍 What is this repo?
- 🚀 Quick Start
- 🏗️ Metadata Architecture
- 🛠️ Manual Commands (optional)
- 🥋🔬 Karate Tests
- 🤝 Contributing
- 📄 License
The backend infrastructure for SafeTrust — a decentralized P2P escrow platform for rental transactions on the Stellar blockchain. This repo contains:
- ⚡ Hasura GraphQL Engine — auto-generated API with JWT auth and row-level permissions
- 🐘 PostgreSQL — multi-tenant schema (
safetrust+hotel_industry) - 🪝 Webhook service — Node/Express, handles Firebase auth sync and escrow lifecycle events
- 📂 Migrations + seeds — versioned schema and dev data for both tenants
| Tool | Version |
|---|---|
| Docker + Docker Compose | ≥ 24 |
| Hasura CLI | ≥ 2.x |
| curl | any |
💡 Windows Note: Run
bin/startinside WSL (Ubuntu) or Git Bash.
cp .env.example .env
Fill in .env before running anything:
POSTGRES_PASSWORD=your_postgres_password
# Must be valid JSON, key ≥ 32 characters for HS256
HASURA_GRAPHQL_JWT_SECRET={"type":"HS256","key":"replace-with-min-32-char-secret-here"}
HASURA_EVENT_SECRET=your_event_secret
⚠️ HASURA_GRAPHQL_JWT_SECRETmust be valid JSON with a key of at least 32 characters.startwill fail if this is malformed.
bin/start tenant-name tenant-name
start runs in order:
| Step | Action |
|---|---|
| 1 | Start postgres, graphql-engine, webhook containers |
| 2 | Poll GET /healthz until Hasura is ready (up to 3 min) |
| 3 | Build and deploy tenant metadata for all tenants |
| 4 | Apply all migrations per tenant |
| 5 | Reload Hasura metadata |
| 6 | Apply seed data per tenant |
Target a specific tenant:
bin/start safetrust # one tenant
bin/start safetrust hotel_industry # both explicitly
docker compose down -v
bin/start
# Rollback safetrust migrations:
hasura migrate apply \
--endpoint http://localhost:8080 \
--admin-secret myadminsecretkey \
--database-name safetrust \
--down all
# Rollback hotel_industry migrations:
hasura migrate apply \
--endpoint http://localhost:8080 \
--admin-secret myadminsecretkey \
--database-name hotel_industry \
--down all
metadata/
├── base/ ← shared Hasura config across all tenants
├── tenants/
│ ├── safetrust/ ← apartments, escrows, users, wallets
│ └── hotel_industry/ ← hotels, rooms, reservations, escrow_transactions
├── build/ ← generated output (tenants merged with base), ready to deploy
├── build-metadata.sh
├── deploy-tenant.sh
└── setup-tenant.sh ← runs build + deploy in one command ✅
bin/starthandles all of these automatically. Use these only when targeting a specific step in isolation.
cd metadata
./setup-tenant.sh safetrust --endpoint http://localhost:8080 --admin-secret myadminsecretkey
hasura migrate apply \
--database-name safetrust \
--endpoint http://localhost:8080 \
--admin-secret myadminsecretkey
hasura migrate apply \
--database-name safetrust \
--version <timestamp> \
--type up \
--endpoint http://localhost:8080 \
--admin-secret myadminsecretkey
hasura seed apply \
--database-name safetrust \
--endpoint http://localhost:8080 \
--admin-secret myadminsecretkey
bin/deploy_init is an experimental benchmarking tool for evaluating parallel deployment vs the canonical sequential path.
Contributors run both scripts from identical starting conditions and record the JSON output:
docker compose down -v
bin/start safetrust hotel_industry # canonical path
# record: tests/results/deploy_timings_sequential_N2.json
docker compose down -v
bin/start # infrastructure only
bin/deploy_init safetrust hotel_industry # PARALLEL_DEPLOY=false
# record: tests/results/deploy_init_timings_sequential_N2.jsondocker compose down -v
bin/start
PARALLEL_DEPLOY=true bin/deploy_init safetrust hotel_industry
# record: tests/results/deploy_init_timings_parallel_N2.json# Simulate 5 tenants by deploying same 2 tenants with 3 aliases
# This validates the parallel execution model without requiring real tenant data
docker compose down -v
bin/start
PARALLEL_DEPLOY=true bin/deploy_init \
safetrust hotel_industry safetrust hotel_industry safetrust
# record: tests/results/deploy_init_timings_parallel_N5.jsonAPI tests using the Karate framework, running in Docker.
bin/test # start karate testingReports are generated at:
tests/results/karate-summary.htmltests/results/karate-tags.html
Add new tests: Create .feature files in tests/karate/features/ — picked up automatically.
Config files:
tests/karate/src/test/resources/karate-config.jsdocker-compose-test.ymlDockerfile.test
📍
bin/testrunsdocker compose -f docker-compose-test.yml run --rm --build karateinternally.
bin/startmust complete without errors.- No raw SQL outside of
migrations/— all schema changes go through versioned migration files. - Never edit a migration that has already been applied — add a new one instead.
- Link the issue your PR closes.
Branch naming: feat/<issue-number>-short-description · fix/<issue-number>-short-description
© 2026 SafeTrust. Released under the MIT License.
