8 Commits
Author SHA1 Message Date
James Wampler bb2a499569 Expose Novelly API port + service-key auth for MCP access to QA deploy
CI / build-and-push (push) Successful in 46s
CI / deploy (push) Successful in 9s
MCP server is a stdio process run outside docker, pointed at the API
over HTTP via NOVELLY_API_URL. The api container previously had no
port mapping, so it was unreachable outside the compose network.
2026-08-21 09:42:10 -07:00
James Wampler 13fa29e8e9 Pin container names in QA compose to match Caddy's upstream hostnames
CI / build-and-push (push) Successful in 53s
CI / deploy (push) Successful in 9s
Caddy reverse-proxies to novelly-web/novelly-api by DNS name, but compose
only registered aliases web/api (service names) plus novelly-web-1/-api-1
(container-number suffixed). Any Caddy restart re-resolves DNS and 502s
until the alias exists again. Pin container_name so the alias is stable
across every redeploy.
2026-08-20 17:32:30 -07:00
James Wampler 661f2917ea Add zip upload and mapped-path picker for outline import
Sandbox source paths under a configured Imports:RootPath, browse it
from the web dialog, upload a zip that extracts into staging, and
import a single markdown file (agent infers chapter vs character).
2026-08-20 14:21:44 -07:00
James Wampler bbd5e66777 QA deploy: override Agent model to Sonnet 5 (was Opus default)
CI / build-and-push (push) Successful in 45s
CI / deploy (push) Successful in 9s
2026-08-19 15:01:03 -07:00
James Wampler 2d7c2a93b7 fix: bind mount path is /mnt/storage/apps (typo)
CI / build-and-push (push) Successful in 41s
CI / deploy (push) Successful in 9s
2026-08-19 14:48:15 -07:00
James Wampler 304b8b4c59 Switch novelly-data to a bind mount at /mnt/storage/app/novelly/data
CI / build-and-push (push) Successful in 41s
CI / deploy (push) Successful in 8s
Named docker volume replaced with an explicit host path per user request.
Requires the path to exist on the QA server and any data from the old
novelly-data volume to be copied over manually before the next deploy.
2026-08-19 14:46:35 -07:00
James Wampler 8f93dce065 Guard deploys against a broken migration
CI / build-and-push (push) Successful in 46s
CI / deploy (push) Successful in 9s
Program.cs: wrap the boot-time MigrateAsync in try/catch (was an unhandled
exception into a restart:unless-stopped crash-loop), log critical and exit(1)
on failure, and add a --migrate-only flag that applies migrations then exits
0 without starting the web host.

deploy.sh: run migrations as a preflight via the new --migrate-only image
against the live novelly-data volume, before the running (old-image) stack
is touched. A failing migration now aborts the deploy with the old
containers still serving traffic, instead of swapping to a crash-looping
new container first and finding out from the health-check timeout.
2026-08-19 14:23:34 -07:00
James Wampler 44f722019b Mirror mic-check's Gitea/GitHub CI-CD pipeline for novelly
CI / build-and-push (push) Successful in 58s
CI / deploy (push) Successful in 10s
Dual-engine workflow (.github/workflows/ci.yml, read by both GitHub Actions
and Gitea Actions): build, test, coverage badge on every push; on Gitea main
pushes only, build+push API/web images to the Gitea registry and redeploy
the persistent LAN stack via the shared [self-hosted, qa] runner. Replaces
the ad hoc docker-compose.deploy.yml manual workflow with
deploy/qa/docker-compose.qa.yml, pulled by CI — data volume preserved
across deploys (no -v on down), unlike mic-check's throwaway QA stack.
2026-08-18 18:25:01 -07:00