mirror of
https://github.com/Dvorinka/Bookra.git
synced 2026-06-03 20:13:00 +00:00
2.5 KiB
2.5 KiB
Bookra Backend
Go + Gin API for Bookra, designed for Railway deployment with Neon Auth, Neon Postgres, and Paddle billing.
Commands
go run ./cmd/api
go build ./...
npm run db:generate
npm run db:migrate:status
npm run db:migrate:up
Environment
BOOKRA_FRONTEND_URLallowed browser originBOOKRA_DATABASE_URLNeon pooled connectionBOOKRA_DATABASE_DIRECT_URLNeon direct connection for migrations/admin tasksBOOKRA_NEON_AUTH_URLNeon Auth base URL used for JWKS verificationBOOKRA_AUTH_JWT_SECREToptional local JWT fallback when not using Neon AuthBOOKRA_JOB_RUNNER_KEYshared secret for remote reminder dispatch callsBOOKRA_EMAIL_FROMsender identity for email remindersBOOKRA_PADDLE_ENVbilling environment:sandboxorliveBOOKRA_PADDLE_API_KEYPaddle API keyBOOKRA_PADDLE_WEBHOOK_SECRETPaddle notification destination secretBOOKRA_PADDLE_{STARTER,PRO,BUSINESS}_{CZK,USD}_PRICE_IDPaddle price IDsBOOKRA_UMAMI_API_URLandBOOKRA_UMAMI_API_KEYoptional analytics integration
Notes
- Auth verification is isolated in
internal/auth. - OpenAPI lives in
openapi/bookra.openapi.yaml. - SQL migrations live in
migrations/. sqlc.yamlis wired throughnpm run db:generate.- Goose migrations are wired through
npm run db:migrate:*and use the Neon direct connection URL. - Reminder dispatch now runs through
POST /v1/internal/jobs/reminders/dispatchwithX-Bookra-Job-Key.
Production Auth
Bookra production auth should use Neon Auth directly:
- frontend uses
VITE_NEON_AUTH_URL - backend verifies Neon JWTs with
BOOKRA_NEON_AUTH_URL - auth-service may stay deployed for standalone auth/admin workflows, but backend billing and app APIs do not depend on it
Trusted redirect domains in Neon Auth should include your frontend origin such as https://bookra.eu, plus local dev origins when needed.
Paddle Setup
Get these values from Paddle dashboard:
BOOKRA_PADDLE_ENV:sandboxfor testing,livefor productionBOOKRA_PADDLE_API_KEY: Developer tools -> AuthenticationBOOKRA_PADDLE_WEBHOOK_SECRET: Notification settings -> destination secret keyBOOKRA_PADDLE_*_PRICE_ID: Catalog -> each SaaS plan recurring price ID
Create one recurring price per plan/currency you support:
starterczkstarterusdproczkprousdbusinessczkbusinessusd
Set your webhook destination to:
POST /v1/webhooks/paddle
POST /api/paddle_webhook
Use Paddle webhook simulator for event testing.