Add a hardened systemd unit, a Caddy reverse-proxy snippet that maps /fabula/api/* to the loopback service, and Justfile build-server/ deploy-server recipes that build a static binary and ship + restart it. Includes server/README documenting the API, config, and deploy steps. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
1.8 KiB
Markdown
52 lines
1.8 KiB
Markdown
# share-svc
|
||
|
||
Tiny Go + SQLite service that stores character-sheet JSON blobs and returns
|
||
short, content-addressed IDs, so sheets share as `...?s=<id>` instead of a giant
|
||
inline `?c=` payload.
|
||
|
||
## API
|
||
|
||
| Method | Path | Body | Response |
|
||
| ------ | ------------ | ----------- | ------------------- |
|
||
| POST | `/api/s` | sheet JSON | `{"id":"<id>"}` |
|
||
| GET | `/api/s/{id}`| – | sheet JSON |
|
||
|
||
IDs are `base64url(sha256(json))[:12]`, so identical sheets dedupe and re-sharing
|
||
is idempotent. Payloads are stored deflated in a single SQLite file.
|
||
|
||
### Config (env)
|
||
|
||
| Var | Default | Notes |
|
||
| ------------- | ------------- | ------------------------------------------------ |
|
||
| `ADDR` | `:8090` | Listen address. The unit binds `127.0.0.1:8090`. |
|
||
| `DB_PATH` | `shares.db` | SQLite file path. |
|
||
| `CORS_ORIGIN` | _(unset)_ | Set to allow a cross-origin dev frontend. |
|
||
|
||
## Deploy
|
||
|
||
From the repo root:
|
||
|
||
```sh
|
||
just deploy-server # build (linux/amd64) + ship + restart
|
||
just go-arch=arm64 deploy-server # if the host is arm64
|
||
```
|
||
|
||
That installs `/usr/local/bin/share-svc` and `share-svc.service`, then
|
||
`daemon-reload` + `enable --now` + `restart`. The SQLite DB lives in
|
||
`/var/lib/share-svc/` (created by the unit's `StateDirectory`).
|
||
|
||
### One-time Caddy setup
|
||
|
||
Add the `/fabula/api/*` reverse-proxy block from `Caddyfile.snippet` to your site
|
||
block (before the static `/fabula/*` handler) and reload Caddy.
|
||
|
||
## Local dev
|
||
|
||
`webpack serve` (port 8080) does not serve `/api/*`, so `?s=` sharing falls back
|
||
to inline `?c=` links. To exercise short links locally, run the service and point
|
||
the frontend at it:
|
||
|
||
```sh
|
||
CORS_ORIGIN=http://localhost:8080 go run ./server
|
||
```
|