Files
race b4777a5e4d rewire 2026-08-11: single-mount NFS architecture
- topology.svg, container-tree.svg, data-flow.svg: show /srv/nc-files
  bound directly into nextcloud container at /mnt/ncdata (no
  intermediate /mnt/nc-data/nextcloud-data layer).
- architecture.html: explain rewire, update storage table, remove
  pre-rewire 'why two layers' section.
- procedure.html: NEXTCLOUD_DATADIR=/srv/nc-files, no mastercontainer
  bind, add §2.5 Rewire 2026-08-11 with recovery procedure,
  update backup script to also tar local nextcloud app volume,
  fix 4.3 verification (302 -> /login, status.php, file visibility).
- operations.html: 4 backup files now (added aio-nextcloud-app.tar.gz),
  restore procedures updated, single-file restore uses new tar layout.
- troubleshooting.html: add 3 new sections — appdata-missing,
  nextcloud-not-spawning, collabora-discovery-warning.
- request-flow.svg: remove nextcloud/ subdir from NFS write path.
- index.html, README.md: update paths and metadata.
2026-08-11 12:09:26 -05:00

129 lines
8.0 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif">
<defs>
<style>
.lbl { fill: #e6e6e6; font-size: 13px; }
.lbl-sm { fill: #a8b0bd; font-size: 11px; }
.lbl-tiny { fill: #8088a0; font-size: 10px; }
.ttl { fill: #ffffff; font-size: 16px; font-weight: 600; }
.section { fill: #7aa2f7; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; }
.box { fill: #1f2230; stroke: #2a2e3f; stroke-width: 1.5; }
.box-internal { fill: #252938; stroke: #3b4255; stroke-width: 1.5; }
.fs-local { fill: #1f2c3a; stroke: #4a78b5; stroke-width: 2; }
.fs-nfs { fill: #1f2e28; stroke: #4a8a6b; stroke-width: 2; }
.fs-named { fill: #2a2535; stroke: #6b5aa0; stroke-width: 2; }
.fs-bind { fill: #1f2e28; stroke: #6cba92; stroke-width: 2; stroke-dasharray: 3 3; }
.arrow-nfs { stroke: #6cba92; stroke-width: 2; fill: none; marker-end: url(#arr-g); }
.arrow-local { stroke: #7aa2f7; stroke-width: 2; fill: none; marker-end: url(#arr-b); }
.arrow-named { stroke: #9d7ad9; stroke-width: 2; fill: none; marker-end: url(#arr-p); }
.arrow-bind { stroke: #6cba92; stroke-width: 2.5; fill: none; stroke-dasharray: 3 3; marker-end: url(#arr-g); }
</style>
<marker id="arr-g" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
<path d="M0,0 L10,5 L0,10 z" fill="#6cba92"/>
</marker>
<marker id="arr-b" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
<path d="M0,0 L10,5 L0,10 z" fill="#7aa2f7"/>
</marker>
<marker id="arr-p" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
<path d="M0,0 L10,5 L0,10 z" fill="#9d7ad9"/>
</marker>
</defs>
<rect width="1100" height="600" fill="#0f1117"/>
<text x="40" y="38" class="ttl">Data Flow — where each piece lives</text>
<text x="40" y="58" class="lbl-sm">NFS at /srv/nc-files → direct bind into nextcloud container at /mnt/ncdata · rewire 2026-08-11</text>
<text x="80" y="105" class="section">homework03 (local ext4)</text>
<text x="540" y="105" class="section">desslok (NFS v4.1)</text>
<!-- Local column -->
<rect x="60" y="130" width="430" height="380" rx="8" class="fs-local"/>
<text x="80" y="155" class="lbl">/ (ext4)</text>
<!-- /srv/nc-files mount (NFS on homework03 host) -->
<rect x="80" y="180" width="390" height="48" rx="4" class="fs-bind"/>
<text x="275" y="200" text-anchor="middle" class="lbl-sm" fill="#6cba92">/srv/nc-files</text>
<text x="275" y="216" text-anchor="middle" class="lbl-tiny" fill="#6cba92">NFS v4.1 mount → nextcloud-aio-nextcloud:/mnt/ncdata</text>
<rect x="80" y="240" width="190" height="80" rx="4" class="box-internal"/>
<text x="175" y="262" text-anchor="middle" class="lbl-sm">mastercontainer</text>
<text x="175" y="280" text-anchor="middle" class="lbl-tiny">configuration.json</text>
<text x="175" y="296" text-anchor="middle" class="lbl-tiny">domain validation cache</text>
<rect x="80" y="332" width="190" height="60" rx="4" class="box-internal"/>
<text x="175" y="354" text-anchor="middle" class="lbl-sm">apache / nextcloud</text>
<text x="175" y="372" text-anchor="middle" class="lbl-tiny">runtime state</text>
<rect x="80" y="404" width="190" height="60" rx="4" class="box-internal"/>
<text x="175" y="426" text-anchor="middle" class="lbl-sm">collabora / whiteboard</text>
<text x="175" y="444" text-anchor="middle" class="lbl-tiny">fonts, certificates</text>
<rect x="80" y="476" width="390" height="20" rx="3" class="box-internal"/>
<text x="275" y="490" text-anchor="middle" class="lbl-tiny">/usr/local/containers/nextcloudaio/ (compose + bind targets)</text>
<rect x="290" y="240" width="180" height="60" rx="4" class="fs-named"/>
<text x="380" y="262" text-anchor="middle" class="lbl-sm" fill="#bda3e8">database</text>
<text x="380" y="280" text-anchor="middle" class="lbl-tiny" fill="#bda3e8">pg_wal · pg_data</text>
<rect x="290" y="312" width="180" height="50" rx="4" class="fs-named"/>
<text x="380" y="332" text-anchor="middle" class="lbl-sm" fill="#bda3e8">redis</text>
<text x="380" y="348" text-anchor="middle" class="lbl-tiny" fill="#bda3e8">AOF + cache dump</text>
<rect x="290" y="374" width="180" height="50" rx="4" class="fs-named"/>
<text x="380" y="394" text-anchor="middle" class="lbl-sm" fill="#bda3e8">database-dump</text>
<text x="380" y="410" text-anchor="middle" class="lbl-tiny" fill="#bda3e8">empty (AIO_DISABLE_BACKUP)</text>
<rect x="290" y="436" width="180" height="40" rx="4" class="box-internal"/>
<text x="380" y="454" text-anchor="middle" class="lbl-sm">notify-push</text>
<text x="380" y="468" text-anchor="middle" class="lbl-tiny">stateless</text>
<!-- NFS column -->
<rect x="540" y="130" width="500" height="380" rx="8" class="fs-nfs"/>
<text x="560" y="155" class="lbl">/slab/container_storage/office (NFS)</text>
<rect x="560" y="180" width="460" height="80" rx="4" class="box-internal"/>
<text x="790" y="202" text-anchor="middle" class="lbl">office/ (NFS root)</text>
<text x="790" y="220" text-anchor="middle" class="lbl-sm">user-uploaded files at NFS ROOT (no nextcloud/ subdir)</text>
<text x="790" y="238" text-anchor="middle" class="lbl-tiny">admin/ · race/ · appdata_*/ · *.log · .htaccess</text>
<rect x="560" y="272" width="460" height="100" rx="4" class="box-internal"/>
<text x="790" y="294" text-anchor="middle" class="lbl">backups/</text>
<text x="790" y="312" text-anchor="middle" class="lbl-sm">daily backups (written by office-backup.sh)</text>
<text x="790" y="330" text-anchor="middle" class="lbl-tiny">office-YYYYMMDD-pgdump.sql.gz</text>
<text x="790" y="346" text-anchor="middle" class="lbl-tiny">office-YYYYMMDD-aio-config.tar.gz</text>
<text x="790" y="362" text-anchor="middle" class="lbl-tiny">office-YYYYMMDD-ncdata.tar.gz</text>
<rect x="560" y="384" width="460" height="110" rx="4" class="box-internal"/>
<text x="790" y="406" text-anchor="middle" class="lbl-sm">ZFS snapshot policy (desslok)</text>
<text x="790" y="424" text-anchor="middle" class="lbl-tiny">/slab is on a ZFS pool with periodic snapshots</text>
<text x="790" y="440" text-anchor="middle" class="lbl-tiny">nightly snapshot → office/ and backups/ both covered</text>
<text x="790" y="456" text-anchor="middle" class="lbl-tiny">→ true point-in-time recovery available independent of our daily backup</text>
<text x="790" y="478" text-anchor="middle" class="lbl-tiny">daily backup is belt-and-suspenders, ZFS snapshots are the primary</text>
<!-- Arrows -->
<!-- NFS export → /srv/nc-files on homework03 -->
<line x1="540" y1="204" x2="470" y2="204" class="arrow-nfs"/>
<text x="505" y="200" text-anchor="middle" class="lbl-tiny" fill="#6cba92">NFS mount</text>
<!-- /srv/nc-files → /mnt/ncdata (nextcloud container) -->
<line x1="380" y1="228" x2="380" y2="240" class="arrow-bind"/>
<text x="388" y="234" class="lbl-tiny" fill="#6cba92">bind</text>
<!-- mastercontainer ↔ configuration.json → AIO config read by apache -->
<line x1="270" y1="280" x2="380" y2="280" class="arrow-local"/>
<text x="285" y="270" class="lbl-tiny" fill="#7aa2f7">config</text>
<!-- database pg_dumpall → backups/ -->
<line x1="470" y1="270" x2="540" y2="310" class="arrow-named"/>
<text x="500" y="290" class="lbl-tiny" fill="#9d7ad9">pg_dumpall</text>
<!-- database postgres writes stay local (curved loop annotation) -->
<text x="380" y="510" text-anchor="middle" class="lbl-tiny" fill="#bda3e8">postgres WAL writes stay LOCAL →</text>
<!-- Decision note -->
<rect x="60" y="525" width="980" height="40" rx="4" class="box-internal" stroke="#d9a96b"/>
<text x="550" y="546" text-anchor="middle" class="lbl-sm" fill="#d9a96b">postgres WAL writes stay LOCAL (named volume) — PostgreSQL is sensitive to NFS close-to-open consistency</text>
<text x="1060" y="592" text-anchor="end" class="lbl-tiny">2026-08-11 · nextcloud_office · rewire</text>
</svg>