Telegram-first private event management platform.
| Path | Purpose |
|---|---|
Backend/ |
NestJS monorepo — apps/api, apps/bot, apps/worker + shared libs |
Frontend/ |
Next.js Organizer/Admin dashboard |
*.md |
Product/tech blueprint (start with 00-README.md) |
# Infra
docker compose up -d postgres redis
# Backend
cd Backend
cp .env.example .env # adjust DATABASE_URL / secrets
pnpm install
pnpm prisma migrate deploy
pnpm start:api:dev # http://localhost:3000/health + /docs
# optional: pnpm start:bot:dev / pnpm start:worker:dev
# Frontend
cd Frontend
cp .env.example .env
pnpm install
pnpm codegen # types from Backend/openapi/openapi.json
pnpm dev # http://localhost:3001Full app stack via Compose: docker compose --profile full up --build
Eventer supports PAYMENT_PROVIDER=mock (default) or PAYMENT_PROVIDER=orcarail.
- Copy
Backend/.env.example→.envand set:PAYMENT_PROVIDER=orcarailORCARAIL_API_KEY/ORCARAIL_API_SECRETORCARAIL_TOKEN_ID/ORCARAIL_NETWORK_ID(catalog UUIDs from OrcaRail)ORCARAIL_RETURN_URL/ORCARAIL_CANCEL_URL(e.g.http://localhost:3001/payments/returnand.../cancel)ORCARAIL_WEBHOOK_SECRET(dashboard webhook secret, or your API secret)
- In the OrcaRail dashboard, point the webhook URL to
https://<your-eventer-api>/payments/webhook/orcarail
(signature header:x-webhook-signature). - Self-hosted OrcaRail: set
ORCARAIL_BASE_URL=https://your-orcarail-host/api/v1— no code changes required.
Checkout flow: create intent → confirm → open hosted pay_url (Telegram bot sends a Pay button; Frontend has return/cancel pages). Ticket issuance stays webhook-driven (payment_intent.completed).
Derived from 12-deployment-observability.md:
- Secrets — load
JWT_SECRET,TELEGRAM_BOT_TOKEN,R2_*, payment keys,SENTRY_DSNfrom a secrets manager (never bake into images). - Migrate separately — run
pnpm prisma migrate deploy(orBackend/scripts/migrate-and-start.shonly for single-replica staging) before rolling newapi/bot/workerreplicas. - Processes — deploy four independently scalable processes:
api,bot,worker,web(see Dockerfiles underBackend/andFrontend/). - Health —
GET /health(liveness),GET /health/ready(DB readiness),GET /metrics(basic Prometheus text). - Bot mode — long polling in non-production when
TELEGRAM_BOT_TOKENis set; production should use webhook mode (token still required). - Backups — daily Postgres backups with ≥7-day retention; test restore before go-live. Prioritize
audit_logsandpayments. - Observability — structured JSON logs; optional
SENTRY_DSN(stub logs until@sentry/nodeis wired); alert on queue age, 5xx rate, DB pool exhaustion. - CI/CD — Backend: lint → test → build → migrate deploy → roll images. Frontend: lint → codegen → test → build → deploy. Staging auto on
main; production via manual promotion.