Skip to content

release/20260731 — 3 commit(s) | Dev - #20

Merged
cdrrazan merged 7 commits into
mainfrom
develop
Jul 31, 2026
Merged

release/20260731 — 3 commit(s) | Dev#20
cdrrazan merged 7 commits into
mainfrom
develop

Conversation

@cdrrazan

Copy link
Copy Markdown
Owner

🎉 Release day | By @cdrrazan

3 commit(s) develop → main. Merging deploy sthe fresh changes!.


🚀 Features

  • 19af198 feat(config): per-app persistent volumes

🐛 Fixes

  • a53d693 fix(generate): own-Dockerfile apps never get roost's source mount

📝 Docs & Tests

  • 32d78c1 docs: document per-app volumes: + paperless-ngx recipe

cdrrazan and others added 3 commits July 31, 2026 06:49
Stateful apps whose data lives on disk (paperless documents/index,
uploads) lost everything on `up --build` — apps got only a read-only
source mount, never a persistent volume. Add a per-app `volumes:` key.

Each entry is a compose mount "source:/container/path[:ro]". A named
source ("data") becomes a named volume, namespaced with the app name
(paperless-data) so two apps' "data" volumes never collide, and declared
at the top level. A path source ("/srv/x", "~/x", "./x") is a host bind
mount, passed through verbatim and never declared.

Resolve rejects a malformed mount with an actionable remedy; the app
service block merges persistent volumes with the existing :ro source
mount under the one volumes: key.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- configuration.md: new "Persistent volumes — volumes:" section (named vs
  bind sources, namespacing, coexistence with the source mount) + the key
  in the map-form example.
- runbook.md: copy-paste "Stateful app with persistent files —
  paperless-ngx" recipe (wrapper image, Redis+Postgres, volumes, manual
  role create, first-admin) + TOC entry; notes immich stays out of roost.
- README.md: volumes: row in the per-app key table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
An own-Dockerfile app builds everything into its image and defines its
own filesystem layout, so bind-mounting host source over /app is never
wanted — for an interpreted framework (django, rails) it would shadow the
image's /app with a near-empty wrapper dir. Previously dodged only by
picking framework: node (in the no-mount list); now correct for any
framework. Lets a wrapper-image app (paperless) use its accurate
framework: django.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 31, 2026

Copy link
Copy Markdown

Deploying roost-gh with  Cloudflare Pages  Cloudflare Pages

Latest commit: e972b73
Status: ✅  Deploy successful!
Preview URL: https://8bda1235.roost-gh.pages.dev
Branch Preview URL: https://develop.roost-gh.pages.dev

View logs

cdrrazan and others added 4 commits July 31, 2026 08:14
full.yml gains a stateful app (files on disk) with volumes: — a named
source (persistent named volume) and a host bind mount, plus the
own-Dockerfile + migrate:false + redis:true shape a wrapper-image app
uses. examples/README lists volumes in the full.yml knob set and adds a
"my app stores files on disk" recipe pointing at the paperless runbook.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The annotated config block on the landing page listed every per-app key
except volumes:; add it (named volume + host-bind-mount note) for parity
with the README key table and docs/configuration.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rework the paperless-ngx recipe to match what actually ships:
- clone the fork to a real source dir and make its ROOT Dockerfile the
  wrapper (roost only builds a file named Dockerfile), backing up
  upstream and setting .dockerignore to * so the ~300MB tree isn't
  uploaded as build context on every build; commit so `roost deploy`'s
  ff-only pull stays clean.
- own-Dockerfile app => no source mount, no generated healthcheck.
- admin via PAPERLESS_ADMIN_USER/PASSWORD (no manual createsuperuser).
- note volumes are keyed by app name, so repointing path: keeps data;
  and the "password authentication failed" symptom of a missing role.

Add a "Sharing one base domain across both envs" subsection: the box
owns the wildcard, the laptop uses exact per-host records that override
it, `roost tunnel setup` is wrong there (it makes wildcards), and adding
a host needs BOTH a DNS record AND a tunnel ingress rule (catch-all is
404) — plus how to rebuild a state.json that holds the other env's data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Keep the internal/generate architecture notes current: the per-app
volumes: key (named-vs-bind sources, app-name namespacing, NamedVolumes
top-level declaration, ValidateVolume) and the rule that own-Dockerfile
apps get no source mount (MountSource gated on !HasOwnDockerfile).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@cdrrazan
cdrrazan merged commit e3c2869 into main Jul 31, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant