Files
gerbeur/dev/instances.ts
khannurien a25500d833 v4: the devcontainer starts several gerbeur instances side by side, so that signing in from one to another can be tried on one machine — the dev environment ran a single instance. dev/instances.ts lists them (gerbeur on :3000 and :8000, musique on :3001 and :8001), and dev/start.ts starts an API server, restarted on change, and a Vite server for each instance it's given, by one rule: instance <name> keeps api/sql/<name>.db and api/uploads/<name>/, reads .env, and takes its ports and what sets it apart from its entry, with federation allowed over http on localhost. It prefixes each line of output with the instance's name, and stops every server when one stops, such as a Vite server whose port is taken. The devcontainer is now a compose project (.devcontainer/compose.yaml): the workspace, a one-shot install that runs deno install and draws the icons once, and a service per instance running dev/start.ts for it, all on the host's network as before and sharing Deno's cache through a volume. ffmpeg moves from a feature into the Dockerfile, since the instances' services get no features, and docker-outside-of-docker gives the workspace's terminal their logs and restarts. Outside the devcontainer, deno task dev starts them all, or those named. Each Vite server keeps its own dependency cache. The existing dev uploads move to api/uploads/gerbeur/.
dev/start.ts was checked by hand: musique starting alone on a fresh database, an unknown name refused, a taken port stopping both servers, and Ctrl+C or SIGTERM leaving no server behind. The compose project couldn't be run here (no Docker in the workspace): its YAML parses and resolves as intended, but it is untested; tsc, eslint, deno check, deno fmt, deno lint and doc:lint, which now covers dev/, are clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:31:25 +00:00

59 lines
1.9 KiB
TypeScript

/**
* Lists the dev instances of gerbeur, each an API server and a Vite server of
* its own, run side by side so that federated sign-in between instances can be
* tried on one machine. In the devcontainer each is a service of
* `.devcontainer/compose.yaml`, which starts with it; outside, `deno task dev`
* starts them all, or `deno task dev <name>…` those named. Both run
* `dev/start.ts`. A new instance is an entry here, and a service there.
*
* Every instance follows the same rule, which `start.ts` applies:
*
* - its API at `http://localhost:<apiPort>`, its pages at
* `http://localhost:<webPort>`;
* - its database at `api/sql/<name>.db`, its uploads under
* `api/uploads/<name>/`;
* - the base `.env` for everything else, `env` overriding it.
*
* A new database starts with the user `admin` / `admin`. The instances may
* reach each other over http on localhost; whether one trusts another is up to
* its admin, on `/manage`.
*
* @module
*/
/** One instance of {@link INSTANCES}. */
export interface DevInstance {
/**
* Names its database and uploads, and prefixes its output. Lowercase
* letters, digits and hyphens.
*/
name: string;
/** The port of its API server, `GERBEUR_PORT`. */
apiPort: number;
/** The port of its Vite server, where its pages are. */
webPort: number;
/**
* `GERBEUR_*` settings of its own, over the base `.env`: a site name, an
* emoji or a style, to tell the instances apart.
*/
env?: Record<string, string>;
}
/**
* The instances `deno task dev` starts, in this order. The first keeps the
* ports the single dev server always had.
*/
export const INSTANCES: readonly DevInstance[] = [
{ name: "gerbeur", apiPort: 8000, webPort: 3000 },
{
name: "musique",
apiPort: 8001,
webPort: 3001,
env: {
GERBEUR_SITE_NAME: "musique",
GERBEUR_SITE_EMOJI: "🎵",
GERBEUR_DEFAULT_STYLE: "kanagawa",
},
},
];