docs: drop lyrion from the VPS plan, add emby music-only, update swap notes

lyrion was ruled out for two protocol-level reasons Authelia can't work
around (single shared server password, and SlimProto has no auth of its
own for Authelia's HTTP-only forward_auth to gate) — emby covers music
instead, with real per-user library access. Also updates the swapfile
rule of thumb to reflect it now being a default for every install
rather than an Asterisk-droplet-specific behavior, and adds a final
RAM budget table/verdict for the full confirmed service list.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TBtExJcqxnokyZZKmphdug
This commit is contained in:
Claude
2026-08-09 18:14:32 +00:00
parent ad38b96cfe
commit 033ffeee48
+55 -12
View File
@@ -26,9 +26,11 @@ Rough per-service RAM budget, idle:
Rules of thumb:
- Keep at least 25-30% of total RAM free at idle for burst load (image
pulls, log bursts, concurrent call/session spikes).
- A swapfile is cheap insurance below ~2GB RAM. `services/asterisk.sh`
already automates this for droplet installs ≤2GB — the same logic applies
to any small box running more than one service.
- A swapfile is cheap insurance and is now a **default for every install**,
not just Asterisk droplets — `base.sh` calls `lib/common.sh`'s
`ensure_swapfile()` unconditionally, which offers a 2GB swapfile any time
RAM is ≤4096MB and none exists yet (`services/asterisk.sh` also calls it
directly for the standalone-run case, so it's covered either way).
- Sharing one `coturn` instance (`services/coturn.sh`) instead of letting
each WebRTC-capable service (Asterisk, Mattermost) embed its own saves a
container per consumer and — more importantly — avoids relay-port
@@ -43,8 +45,8 @@ meaningful fraction of the box. **Pick one purpose, not a stack:**
- **Option A — Asterisk only.** Asterisk + the shared coturn service fits
comfortably per this repo's own droplet-sizing notes (`services/asterisk.sh`
README section) — a swapfile is added automatically on droplets2GB, and
this plan is "fine for a couple of extensions and light personal use."
README section) — a swapfile is added automatically (RAM4GB, see above),
and this plan is "fine for a couple of extensions and light personal use."
- **Option B — a lightweight utility box.** Caddy + CrowdSec + NetBird
(all near-zero RAM) plus at most one or two of the smallest apps (`ntfy`,
`vaultwarden`, `wg-easy`) — total comfortably under 500MB.
@@ -113,15 +115,29 @@ means mounting a network share from that tunnel at the mount point instead
of a local directory. Avoids the disk/CPU tradeoffs of a local media
library; real bandwidth depends on home upload speed, which wasn't checked.
**Floated, not yet decided:** `lyrion` (music) doing the same
home-library-over-VPN thing — same pattern as `audiobookshelf` above,
architecturally sound, just not explicitly confirmed yet.
**Music: `emby`, music-only — not `lyrion`.** `lyrion` (LMS/Squeezebox) was
floated first since it's a purpose-built, well-regarded music server, but
ruled out for two protocol-level reasons neither Caddy nor Authelia can
paper over: its own web-UI auth is one shared server-wide password (no
per-user accounts), and its player protocol (SlimProto, port 3483) is raw
TCP with no authentication of its own, so Authelia's HTTP-only
`forward_auth` can't gate it at all. `emby` (already registered in this
repo, `media` category) solves both — real per-user accounts with
per-library access restriction, and every client protocol it uses is HTTP,
so Caddy fronts all of it cleanly. `services/emby.sh` now has a music-only
mode (prompts for this, defaults the folder to `~/music`, and the generated
README walks through adding only a Music library plus the
Dashboard → Users → Access per-user restriction steps in Emby's own setup
wizard). Tradeoff accepted knowingly: Emby is a generalist media server, not
a purpose-built one — it lacks LMS's music-specific depth (its lyrics
fetching, its many audio-focused plugins). Since there's no hardware
Squeezebox tie-in to preserve, that tradeoff was fine to make.
**Explicitly out of scope for this box** (wrong fit, not "can't run"):
- Local media servers storing media on the VPS (`emby`, `jellyfin`,
`immich`, and `lyrion`/`audiobookshelf` *without* the home-library-over-VPN
approach above) — disk-hungry, and transcoding CPU load risks contending
with active calls.
- Local media servers storing media on the VPS (`jellyfin`, `immich`,
`lyrion`, and `emby`/`audiobookshelf` *without* the home-library-over-VPN
approach used above) — disk-hungry, and transcoding CPU load risks
contending with active calls.
- AI stacks (`ai-stack`, `ai-gpu`, `iopaint`, `paintplus`) — need real
VRAM/RAM most VPS plans don't have.
- Gaming (`minecraft`, `wolf`, `wolf-pair`, `sunshine`, `kyber-*`) — CPU/RAM
@@ -135,3 +151,30 @@ architecturally sound, just not explicitly confirmed yet.
- SSH `ProxyJump`/bastion-hop chaining for reaching genuinely isolated
(CGNAT, no local peer) boxes — a good idea in principle, parked for later
since NetBird already covers the current need.
## Final RAM budget for the IONOS box (everything above, idle)
| Service | ~RAM |
|---|---|
| OS + Docker baseline | ~400MB |
| Caddy | ~30MB |
| CrowdSec | ~150MB |
| coturn (shared) | ~40MB |
| Asterisk | ~100MB |
| Mattermost × 2 (app+Postgres each) | ~1200MB |
| Traccar (JVM) | ~425MB |
| NetBird client | ~35MB |
| ntfy, wg-easy, homebox, actualbudget, mealie | ~490MB combined |
| audiobookshelf | ~200MB |
| Emby (music-only) | ~300MB |
| **Total** | **~3.37GB** |
Leaves roughly **~600-700MB headroom (~16-18%)** out of 4GB — tighter than
the 25-30% rule of thumb above, but with the swapfile now automatic
(`ensure_swapfile`, see above) there's real insurance against burst load
rather than relying on manual setup. Deploy incrementally and check
`free -h` / `docker stats` against this table rather than trusting it
blindly — each line carries real estimate uncertainty, and they're stacked
close enough to the ceiling that it's worth confirming. If real usage runs
higher than estimated, the two Mattermost instances (~1.2GB combined) are
the single biggest lever to reconsider.