Files
platform/ecosystem.light.config.cjs
T
pastilhasandClaude Opus 5 3216040d2f unbreak the linux light profile: classify officer-gitea
`ecosystem.light.config.cjs` did not mention officer-gitea, so `defineProfile` threw while the file was
being loaded and pm2 could start NOTHING from it — not the app, not the agent, not the terminal. The
profile has been dead on arrival since gitea was added to ecosystem.config.cjs and to the mac profile
but not to this one.

That is the drift check doing its job rather than a flaw in it: the alternative is a light install that
silently starts less than it claims. The cost is that adding a sidecar breaks every profile until each
one classifies it, which is the trade the file already documents.

Included rather than excluded, matching the mac profile's reasoning: this sidecar fronts a REMOTE Gitea
whose URL and token live in `service_connections`, so it installs nothing locally. That is the line
between it and the excluded sidecars, which supervise a local daemon or container.

Both light profiles now load and contain the same six processes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 11:46:03 +00:00

55 lines
3.0 KiB
JavaScript

// Linux light profile — the platform without the self-hosted estate around it.
//
// For a machine that should run the file browser, the terminal and Claude/opencode chat, and nothing
// else. Paired with `OFFICER_PROFILE=light bash scripts/setup.sh`, which installs only what these
// processes need: node, bun, ffmpeg, Postgres, pm2 and the two agent CLIs.
//
// This is a subset of ecosystem.config.cjs, not a copy of it — see ecosystem.profile.cjs for why, and
// for the two checks that make a drifted profile fail loudly instead of silently starting less than it
// claims. To change what runs, edit INCLUDE. To change HOW something runs, edit ecosystem.config.cjs
// and every profile follows.
//
// The app itself is unchanged: every API route stays mounted, so features whose sidecars are absent
// report themselves unavailable rather than disappearing. A profile decides which processes start, not
// which code ships.
//
// Start with: pm2 startOrRestart ecosystem.light.config.cjs
const { defineProfile } = require('./ecosystem.profile.cjs');
module.exports = defineProfile({
file: 'ecosystem.light.config.cjs',
include: [
'officer', // the app: SPA, /api, websockets
'officer-anthropic-proxy', // holds the Anthropic credential, forwards upstream
'officer-agent', // spawns `claude` — chat is dead without it
'officer-opencode', // the alternative agent
'officer-pty', // the terminal
// Included even though a light host runs no Gitea: this sidecar fronts a REMOTE instance. Its URL
// and token live in `service_connections`, set from /gitea, so it needs nothing installed here.
// That is what separates it from the sidecars below, which supervise a local daemon or container.
// Same reasoning as the mac light profile, which has included it since it was added.
'officer-gitea',
],
// Excluded by CHOICE rather than by platform limits — every one of these would run on a Linux host.
// A light install simply is not running the thing behind it.
excluded: {
'officer-vnc': 'no desktop to mirror on a light install',
'officer-email': 'needs the mbsync/IMAP stack the light profile does not install',
'officer-music': 'the ffprobe indexer works, but a full library index is not a light-install concern',
'officer-vault': 'reverse-proxies a self-hosted Vaultwarden container',
'officer-slskd': 'supervises the slskd daemon',
'officer-headscale': 'fronts a headscale server',
'officer-transmission': 'fronts a transmission daemon',
'officer-invoiceshelf': 'fronts an InvoiceShelf container',
'officer-jellyfin': 'fronts a Jellyfin container',
'officer-memos': 'needs an owner-configured Memos instance URL and token',
'officer-photos': 'needs an owner-configured Immich instance URL and API key',
'officer-caldav': 'supervises Radicale, which the light profile does not install',
'officer-notify': 'its producers are the queue and the email/agent sidecars; nothing to notify about',
'officer-wallet': 'holds seed and node credentials',
},
});