Files
office/assets/diagrams/topology.svg
T
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

180 lines
10 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1140 740" 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; }
.box-public { fill: #1f2c3a; stroke: #4a78b5; stroke-width: 2; }
.box-netbird { fill: #2a2535; stroke: #6b5aa0; stroke-width: 2; }
.box-storage { fill: #1f2e28; stroke: #4a8a6b; stroke-width: 2; }
.box-bind { fill: #1f2e28; stroke: #6cba92; stroke-width: 2; stroke-dasharray: 3 3; }
.box-retired { fill: #1f2230; stroke: #5a3a3a; stroke-width: 1.5; stroke-dasharray: 4 3; }
.x-link { stroke: #5a6072; stroke-width: 1.5; fill: none; }
.x-link-primary { stroke: #7aa2f7; stroke-width: 2; fill: none; marker-end: url(#arr-b); }
.x-link-mesh { stroke: #9d7ad9; stroke-width: 2; fill: none; stroke-dasharray: 6 4; marker-end: url(#arr-p); }
.x-link-storage { stroke: #6cba92; stroke-width: 2; fill: none; marker-end: url(#arr-g); }
.x-link-bind { stroke: #6cba92; stroke-width: 2; fill: none; stroke-dasharray: 3 3; marker-end: url(#arr-g); }
.x-link-retired { stroke: #a86b6b; stroke-width: 1.5; fill: none; stroke-dasharray: 4 3; marker-end: url(#arr-r); }
.x-link-fail { stroke: #d97a7a; stroke-width: 2; fill: none; marker-end: url(#arr-r); }
</style>
<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>
<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-r" 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="#a86b6b"/>
</marker>
</defs>
<rect width="1100" height="740" fill="#0f1117"/>
<text x="40" y="38" class="ttl">Nextcloud Office — Public Topology</text>
<text x="40" y="58" class="lbl-sm">office.rmf44.xyz · Caddy on hawker · AIO on homework03 · NFS on desslok · rewire 2026-08-11</text>
<!-- Section labels -->
<text x="80" y="110" class="section">Public Internet</text>
<text x="380" y="110" class="section">Edge (hawker)</text>
<text x="660" y="110" class="section">Compute (homework03)</text>
<text x="940" y="110" class="section">Storage (desslok)</text>
<!-- User/Internet -->
<rect x="80" y="140" width="180" height="80" rx="6" class="box-public"/>
<text x="170" y="170" text-anchor="middle" class="lbl">Browser / WebDAV client</text>
<text x="170" y="190" text-anchor="middle" class="lbl-sm">user requests</text>
<text x="170" y="206" text-anchor="middle" class="lbl-tiny">https://office.rmf44.xyz</text>
<!-- Cloudflare DNS -->
<rect x="80" y="260" width="180" height="50" rx="6" class="box"/>
<text x="170" y="282" text-anchor="middle" class="lbl">Cloudflare DNS</text>
<text x="170" y="298" text-anchor="middle" class="lbl-tiny">A · 192.255.159.202</text>
<!-- hawker box -->
<rect x="380" y="140" width="220" height="280" rx="8" class="box-public"/>
<text x="490" y="166" text-anchor="middle" class="lbl">hawker (ColoCrossing, Buffalo NY)</text>
<text x="490" y="184" text-anchor="middle" class="lbl-sm">192.255.159.202 / 100.79.4.103</text>
<!-- Caddy -->
<rect x="400" y="210" width="180" height="68" rx="6" class="box-internal"/>
<text x="490" y="234" text-anchor="middle" class="lbl">Caddy (caddy-caddy-1)</text>
<text x="490" y="252" text-anchor="middle" class="lbl-sm">TLS + reverse proxy</text>
<text x="490" y="268" text-anchor="middle" class="lbl-tiny">:443 → 100.79.142.164:11000</text>
<!-- NetBird client -->
<rect x="400" y="298" width="180" height="48" rx="6" class="box-netbird"/>
<text x="490" y="316" text-anchor="middle" class="lbl">NetBird (wt0)</text>
<text x="490" y="333" text-anchor="middle" class="lbl-tiny">100.79.4.103 · P2P mesh</text>
<!-- Compute homework03 -->
<rect x="660" y="140" width="240" height="380" rx="8" class="box-public"/>
<text x="780" y="166" text-anchor="middle" class="lbl">homework03 (10.0.0.73)</text>
<text x="780" y="184" text-anchor="middle" class="lbl-sm">Debian 13 · Docker 29.6.2 · 15 GB</text>
<!-- NetBird client -->
<rect x="680" y="210" width="200" height="48" rx="6" class="box-netbird"/>
<text x="780" y="228" text-anchor="middle" class="lbl">NetBird (wt0)</text>
<text x="780" y="245" text-anchor="middle" class="lbl-tiny">100.79.142.164</text>
<!-- Mastercontainer -->
<rect x="680" y="278" width="200" height="60" rx="6" class="box-internal"/>
<text x="780" y="300" text-anchor="middle" class="lbl">nextcloud-aio-mastercontainer</text>
<text x="780" y="316" text-anchor="middle" class="lbl-sm">orchestrator · admin UI</text>
<text x="780" y="330" text-anchor="middle" class="lbl-tiny">host :80 · :8080 · :8443</text>
<!-- Apache -->
<rect x="680" y="358" width="200" height="50" rx="6" class="box-internal"/>
<text x="780" y="380" text-anchor="middle" class="lbl">nextcloud-aio-apache</text>
<text x="780" y="397" text-anchor="middle" class="lbl-tiny">:11000 → PHP-FPM</text>
<!-- nextcloud-aio-nextcloud -->
<rect x="680" y="428" width="200" height="80" rx="6" class="box-bind"/>
<text x="780" y="450" text-anchor="middle" class="lbl" fill="#6cba92">nextcloud-aio-nextcloud</text>
<text x="780" y="466" text-anchor="middle" class="lbl-tiny" fill="#6cba92">/srv/nc-files → /mnt/ncdata</text>
<text x="780" y="482" text-anchor="middle" class="lbl-tiny" fill="#6cba92">(named vol) → /var/www/html</text>
<text x="780" y="498" text-anchor="middle" class="lbl-tiny" fill="#6cba92">NFS user data · local app</text>
<!-- NFS mount on homework03 -->
<rect x="940" y="358" width="140" height="50" rx="6" class="box-storage"/>
<text x="1010" y="378" text-anchor="middle" class="lbl-sm">/srv/nc-files</text>
<text x="1010" y="395" text-anchor="middle" class="lbl-tiny">NFS v4.1 mount</text>
<!-- Storage desslok -->
<rect x="940" y="140" width="140" height="200" rx="8" class="box-storage"/>
<text x="1010" y="166" text-anchor="middle" class="lbl">desslok (10.0.0.105)</text>
<text x="1010" y="184" text-anchor="middle" class="lbl-sm">FreeBSD · ZFS slab</text>
<rect x="955" y="210" width="110" height="40" rx="4" class="box-internal"/>
<text x="1010" y="227" text-anchor="middle" class="lbl-sm">/slab/container_storage/</text>
<text x="1010" y="244" text-anchor="middle" class="lbl-tiny">office/</text>
<rect x="955" y="260" width="110" height="30" rx="3" class="box"/>
<text x="1010" y="279" text-anchor="middle" class="lbl-tiny">admin/ race/</text>
<rect x="955" y="294" width="110" height="30" rx="3" class="box"/>
<text x="1010" y="313" text-anchor="middle" class="lbl-tiny">backups/</text>
<!-- Backup pipeline note -->
<rect x="660" y="560" width="420" height="120" rx="6" class="box"/>
<text x="870" y="582" text-anchor="middle" class="lbl">Daily backup pipeline (hector → homework03 → NFS)</text>
<text x="700" y="605" class="lbl-sm">03:30 UTC, systemd timer on hector</text>
<text x="700" y="625" class="lbl-sm">ssh homework03 sudo /usr/local/bin/office-backup.sh</text>
<text x="700" y="645" class="lbl-sm"> → pg_dumpall → /srv/nc-files/backups/office-YYYYMMDD-*.gz</text>
<text x="700" y="665" class="lbl-tiny">retention: 14 days, prunes via find -mtime +14</text>
<!-- Edges -->
<!-- user → DNS -->
<line x1="170" y1="220" x2="170" y2="260" class="x-link"/>
<text x="178" y="245" class="lbl-tiny">1. resolve</text>
<!-- DNS → Caddy -->
<line x1="260" y1="285" x2="400" y2="244" class="x-link-primary"/>
<text x="280" y="260" class="lbl-tiny">2. HTTPS</text>
<!-- NetBird hawker → NetBird homework03 (mesh) -->
<line x1="580" y1="234" x2="680" y2="234" class="x-link-mesh"/>
<text x="630" y="225" text-anchor="middle" class="lbl-tiny" fill="#9d7ad9">WireGuard P2P · UDP 51820</text>
<!-- Caddy → Apache (logically) -->
<line x1="600" y1="244" x2="680" y2="383" class="x-link-primary" stroke-dasharray="3 3"/>
<text x="630" y="320" class="lbl-tiny" fill="#7aa2f7" transform="rotate(60 630 320)">upstream :11000</text>
<!-- NFS mount edge -->
<line x1="880" y1="383" x2="940" y2="383" class="x-link-storage"/>
<text x="910" y="377" text-anchor="middle" class="lbl-tiny" fill="#6cba92">NFS</text>
<!-- Bind arrow: /srv/nc-files → /mnt/ncdata in nextcloud container -->
<line x1="940" y1="408" x2="880" y2="448" class="x-link-bind"/>
<text x="950" y="430" class="lbl-tiny" fill="#6cba92">bind</text>
<text x="945" y="442" class="lbl-tiny" fill="#6cba92">:mnt/ncdata</text>
<!-- Local volume bind (dashed, small) -->
<line x1="880" y1="468" x2="940" y2="408" class="x-link"/>
<text x="900" y="465" class="lbl-tiny" fill="#8088a0">app vol</text>
<!-- Backup arrow from backup pipeline → storage -->
<line x1="1050" y1="600" x2="1010" y2="340" class="x-link-storage" stroke-dasharray="4 4"/>
<text x="1050" y="450" class="lbl-tiny" fill="#6cba92">writes</text>
<!-- Legend -->
<g transform="translate(40, 710)">
<rect x="0" y="-10" width="14" height="14" rx="2" class="box-public"/>
<text x="22" y="2" class="lbl-tiny">public</text>
<rect x="80" y="-10" width="14" height="14" rx="2" class="box-netbird"/>
<text x="102" y="2" class="lbl-tiny">mesh</text>
<rect x="160" y="-10" width="14" height="14" rx="2" class="box-storage"/>
<text x="182" y="2" class="lbl-tiny">storage</text>
<rect x="260" y="-10" width="14" height="14" rx="2" class="box-bind"/>
<text x="282" y="2" class="lbl-tiny">NFS bind</text>
</g>
<text x="1060" y="714" text-anchor="end" class="lbl-tiny">2026-08-11 · nextcloud_office · rewire</text>
</svg>