One small AWS Lightsail VM, two independent full-stack apps, one Postgres, one reverse proxy, two separate CI/CD pipelines — and the real production issues that came with getting there.
Rather than one AWS resource per demo app, both Timeline and Paperwork run as separate Docker containers on a single $12/mo Lightsail instance, behind Caddy doing path-based routing (/timeline, /paperwork) with fully automatic Let's Encrypt HTTPS. Each app has its own independent GitHub Actions deploy pipeline, triggered on push to main.
flock lock file, so a push to either repo can't build concurrently with the other and starve the instance's 2GB of RAM (this exact thing happened once and needed a reboot before the lock was added).COPY flattens node_modules/.bin/prisma from a symlink into a plain file copy, which breaks its relative lookup of a sibling WASM file the newer Prisma schema engine needs — a silent MODULE_NOT_FOUND at container start. Fixed by invoking Prisma's real entry point directly instead of the symlinked CLI shim.docker system df's build-cache accounting (separate from image/volume size, easy to miss) and reclaimed with no impact to the running containers.Beyond the hosting itself: a systematic pass through the account found and removed an orphaned Lightsail instance with a stopped-but-still-billing EC2 counterpart, unattached static IPs, two unused VPCs, and a dozen multi-year-old Lightsail snapshots — plus tuning an Aurora Serverless v2 cluster's min capacity to 0 so it scales to zero when idle instead of running (and billing) continuously.