apps/web: Next.js 16 (App Router), Tailwind 4 and shadcn/ui, light and dark from the system. Pages render on the server and call the API with Eden Treaty (typed by @t5de/api), forwarding the visitor's cookie; forms use server actions; sign-up, sign-in and sign-out use Better Auth's React client. /api is rewritten to the API so its cookies are first-party. Who's online follows the API's event stream (Next's gzip is off: it held the stream back). Standalone output with a Dockerfile; deploys to Vercel as is. Co-Authored-By: Claude Opus 5.5 <[email protected]>
53 lines
2.3 KiB
Markdown
53 lines
2.3 KiB
Markdown
# T5DE Hub website
|
|
|
|
The hub's website: accounts, linked IMVU accounts, who's online, signing T5DE in, and the moderation console.
|
|
Next.js (App Router), Tailwind CSS and shadcn/ui. Pages are rendered on the server, which calls the hub's API
|
|
(`apps/api`) with the visitor's cookie; forms use server actions. The browser only talks to this app: `/api/*` is
|
|
rewritten to the API, so the API's session cookies belong to the website's origin.
|
|
|
|
## Develop
|
|
|
|
From the repository root, `bun install`, then start the API (`cd apps/api && bun src/index.ts`) and the website:
|
|
|
|
```sh
|
|
cd apps/web
|
|
bun run dev # http://localhost:4100
|
|
bun run check-types
|
|
bun run build
|
|
```
|
|
|
|
The first account created is the hub's admin.
|
|
|
|
## Configuration
|
|
|
|
| Variable | Default | What |
|
|
| --------- | ----------------------- | -------------------------------------------------------------------------------------- |
|
|
| `API_URL` | `http://localhost:4101` | The API's address as this app reaches it. Needed at build time and at run time (below). |
|
|
| `PORT` | `4100` | The standalone server's port (`next start` and `bun run dev` use 4100). |
|
|
|
|
The API's `WEB_URL` must be this website's public address (it's where Better Auth trusts requests from, and where
|
|
T5DE's sign-in code page is).
|
|
|
|
`API_URL` is read in two places: by server code on every request, and by `next.config.ts`'s `/api` rewrite, which
|
|
Next fixes when it builds. So build with the same `API_URL` the app will run with.
|
|
|
|
## Deploy
|
|
|
|
### Container
|
|
|
|
The `Dockerfile` builds a standalone server (`output: "standalone"`). Build it from the repository root:
|
|
|
|
```sh
|
|
docker build -f apps/web/Dockerfile --build-arg API_URL=http://api:4101 -t t5de-hub-web .
|
|
docker run -p 4100:4100 -e API_URL=http://api:4101 t5de-hub-web
|
|
```
|
|
|
|
Next's own gzip is off (it held back the API's live event stream), so put a reverse proxy that compresses in front,
|
|
and don't let it buffer `text/event-stream` responses (`/api/v1/online/events`).
|
|
|
|
### Vercel
|
|
|
|
Import the repository with the project's root directory set to `apps/web` (Vercel installs the Bun workspace from the
|
|
root). Set `API_URL` to the API's public address for both builds and runtime. Nothing else is needed: there's no
|
|
custom server.
|