fix(skill): public domain 404s swagger — origin-aware base URL + discovery

Verified live: https://table.inkreach.cc/docs-json and /docs → 404
(frontend doesn't proxy swagger paths), while /api/* IS proxied
(PAT auth → 200). Guide now: two-origin table (domain for API calls,
backend origin for swagger), ssh-tunnel fallback for remote machines,
backend-controller grep as last resort; instance-access.md connection
table gains the public-domain row.
This commit is contained in:
yeuimu
2026-09-23 05:33:35 +00:00
parent 3df9225a68
commit c5e291a7cf
2 changed files with 24 additions and 9 deletions
@@ -11,8 +11,15 @@ the CLI. For one-off table/automation operations, prefer the CLI.
## 1. Base URL & Authentication ## 1. Base URL & Authentication
Two origins — pick by where you run:
| Origin | API (`/api/*`) | Swagger (`/docs`, `/docs-json`) |
|---|---|---|
| Public domain, e.g. `https://table.inkreach.cc` | ✅ works (proxied to backend) | ❌ 404 — frontend does NOT proxy swagger paths |
| Backend origin, e.g. `http://localhost:3003` (reference deployment) | ✅ | ✅ |
```bash ```bash
BASE=http://localhost:3003 # backend API origin (see instance-access.md) BASE=https://table.inkreach.cc # or http://localhost:3003 on the backend host
TOKEN=teable_xxx_yyy # PAT; web UI Settings → Personal Access Tokens TOKEN=teable_xxx_yyy # PAT; web UI Settings → Personal Access Tokens
curl -s "$BASE/api/auth/user" -H "Authorization: Bearer $TOKEN" # verify → 200 + user JSON curl -s "$BASE/api/auth/user" -H "Authorization: Bearer $TOKEN" # verify → 200 + user JSON
``` ```
@@ -157,12 +164,17 @@ const res = await fetch(triggerInput._apiBaseUrl + "/api/table/tblB/record", {
## 5. Full Route Inventory (this guide ≠ the whole API) ## 5. Full Route Inventory (this guide ≠ the whole API)
The backend exposes **~362 paths**; this guide documents the The backend exposes **~362 paths**; this guide documents the
agent-operational core (what the CLI wraps). For everything else, the agent-operational core (what the CLI wraps). The authoritative full spec is
authoritative source is the live OpenAPI spec — **no auth needed**: the live OpenAPI JSON — but it is only served on the **backend origin** (the
public domain 404s it):
```bash ```bash
curl -s "$BASE/docs-json" | python3 -c "import json,sys; [print(m.upper(), p) for p,o in json.load(sys.stdin)['paths'].items() for m in o]" # full list # works ONLY when BASE is the backend origin (e.g. http://localhost:3003):
curl -s "$BASE/docs-json" | python3 -c "import json,sys; [print(m.upper(), p) for p,o in json.load(sys.stdin)['paths'].items() for m in o]"
# browsable UI: $BASE/docs # browsable UI: $BASE/docs
# from any other machine, reach the backend origin via an ssh tunnel:
ssh -L 3003:localhost:3003 <backend-host> # then use http://localhost:3003/docs-json
``` ```
Route groups NOT detailed in this guide (see docs-json for shapes): Route groups NOT detailed in this guide (see docs-json for shapes):
@@ -180,6 +192,8 @@ Route groups NOT detailed in this guide (see docs-json for shapes):
automation webhook route), plugin UI endpoints (`/api/plugin/*` panels, automation webhook route), plugin UI endpoints (`/api/plugin/*` panels,
chart, proxy), `/api/v2/integrity`, `/api/v1/ai-proxy`. chart, proxy), `/api/v2/integrity`, `/api/v1/ai-proxy`.
When you use one of these, verify the exact param shape from docs-json When you use one of these, verify the exact param shape before calling —
first — do not guess key names (the automation contract lesson applies from docs-json (backend origin / ssh tunnel), or from the backend source:
instance-wide). `grep -rh "@Controller(\|@Get(\|@Post(\|@Patch(\|@Put(\|@Delete(" apps/nestjs-backend/src/features --include='*.controller.ts'`
in the inkreach-teable app repo. Do not guess key names (the automation
contract lesson applies instance-wide).
@@ -8,7 +8,8 @@ endpoint/ports for your own deployment.
| Service | URL / Port | Mode | Purpose | | Service | URL / Port | Mode | Purpose |
|---------|-----------|------|---------| |---------|-----------|------|---------|
| Backend API | `http://localhost:3003` | production (`NODE_ENV=production`) | REST API, automation engine, websocket | | Public domain | `https://table.inkreach.cc` | — | Frontend UI + `/api/*` proxied to backend; swagger (`/docs`, `/docs-json`) NOT proxied (404) — use the backend origin for those |
| Backend API | `http://localhost:3003` | production (`NODE_ENV=production`) | REST API, automation engine, websocket, swagger `/docs` + `/docs-json` |
| Frontend | `http://localhost:3002` | production | End-user web UI (Next.js) | | Frontend | `http://localhost:3002` | production | End-user web UI (Next.js) |
| PostgreSQL | `localhost:5432` | — | Database (db: `teable`, user: `teable`) | | PostgreSQL | `localhost:5432` | — | Database (db: `teable`, user: `teable`) |
| Redis | `localhost:6379` | — | BullMQ queue for automation runs, distributed lock | | Redis | `localhost:6379` | — | BullMQ queue for automation runs, distributed lock |