- 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.
180 lines
10 KiB
XML
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>
|