Files
backend/README.md
Andriy Oblivantsev 18328706bd
CI / test (push) Successful in 5s
Server keys in etc/, bind in docker compose
- bin/gen-server-keys.sh: generate Ed25519 keypair to etc/server-service.{pub,key,env}
- main.go: read keys from file (ADMIN_PUBLIC_KEY_FILE) when env empty
- docker-compose: env_file etc/server-service.env, mount etc/
- bin/up.sh: auto-run gen-server-keys if etc/server-service.env missing
- ErrRegistrationNotConfigured for clearer 503 when keys not set
- etc/README.md, etc/.gitignore
- bin/gen-admin-key.sh for one-off key gen
- .env.example

Made-with: Cursor
2026-03-01 13:02:40 +00:00

119 lines
3.1 KiB
Markdown

# Momswap Geo Backend
Go backend service for user-owned GeoJSON feature collections with Ed25519 authentication and invitation-based onboarding.
## What is implemented
- Ed25519 challenge-response auth (`/v1/auth/challenge`, `/v1/auth/login`)
- Hybrid invitation onboarding (signed invite payload + inviter lineage)
- User registration with ownership proof (`/v1/auth/register`)
- Per-user collections and Point feature CRUD endpoints
- Static no-build frontend (`web/`) using Vue + Vuetify from CDN
- Reusable TypeScript API client (`libs/geo-api-client`) using `@noble/ed25519`
- Bun tests for the TS client and Go tests for API flows
- Gitea CI workflow running Go and Bun test suites
## Quick start
```bash
go test ./...
go run ./cmd/api
```
Run tests via Docker (avoids local permission issues, e.g. `var/`):
```bash
docker compose --profile test run --rm test
```
Primary deployed base URL: `https://momswap.produktor.duckdns.org/`.
Local default (for development): `http://localhost:8122`.
Optional environment variables:
- `ADDR` (default `:8122`)
- `ADMIN_PUBLIC_KEY`**required for registration**: bootstrap admin + service key for `register-by-signature`. Generate with `./bin/gen-admin-key.sh`
- `SERVICE_PUBLIC_KEY` (public key users sign to register; defaults to `ADMIN_PUBLIC_KEY`)
**Deployment:** Set `ADMIN_PUBLIC_KEY` before starting. Without it, `/v1/service-key` returns 503 and registration is disabled.
## Docker Compose
Generate server keys (creates `etc/server-service.*`), then build and run:
```bash
./bin/gen-server-keys.sh
COMPOSE_BAKE=true docker compose up --build -d
```
Or use `./bin/up.sh` which runs the key generation if needed.
This starts:
- `db` (`postgis/postgis`) on `5432`
- `api` on `8122`, wired with `DATABASE_URL` to the `db` service
Stop the service:
```bash
docker compose down
```
For local development with auto-rebuild on file changes:
```bash
COMPOSE_BAKE=true docker compose --profile dev up --watch
```
Notes:
- `api` service listens on `8122` inside the container, mapped to host `8122` (reverse proxy at `https://momswap.produktor.duckdns.org`).
- `api` service uses the production `runtime` image target.
- `api-dev` profile uses the `dev` image target and Docker Compose watch.
- DB defaults can be overridden via `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`.
## Frontend
Frontend is served by the Go backend at runtime.
Example:
```bash
go run ./cmd/api
```
Then visit:
- Production: `https://momswap.produktor.duckdns.org/web/`
- Local: `http://localhost:8122/web/`
## API client library
Path: `libs/geo-api-client`
```bash
cd libs/geo-api-client
bun install
bun test
bun run build
```
Frontend TypeScript integration guide:
- `docs/typescript-frontend-integration.md`
- `docs/ed25519-security-use-cases.md`
## CI
Workflow: `.gitea/workflows/ci.yml`
- `go test ./...`
- `bun test` in `libs/geo-api-client`
## Testing policy
- Keep fast unit tests as the default (`go test ./...`).
- If a test requires a real Postgres instance, use embedded/ephemeral Postgres in the test process or test fixture lifecycle.
- Do not require manually running an external Postgres container for routine test runs.