Initial docs: Nextcloud AIO office suite (Collabora + Whiteboard)
- Full deployment reference for office.rmf44.xyz - Architecture, procedure, troubleshooting, operations pages - 4 SVG diagrams (topology, container-tree, data-flow, request-flow) - Mirrors gite_replacement template structure - Verified via 70/70 ad-hoc checks on 2026-08-10
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1140 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; }
|
||||
.box-emp { fill: #1f2c3a; stroke: #4a78b5; stroke-width: 2; }
|
||||
.box-host { fill: #2a2535; stroke: #6b5aa0; stroke-width: 2; }
|
||||
.box-storage { fill: #1f2e28; stroke: #4a8a6b; stroke-width: 2; }
|
||||
.arrow { stroke: #7aa2f7; stroke-width: 2; fill: none; marker-end: url(#arr-b); }
|
||||
.arrow-sto { stroke: #6cba92; stroke-width: 2; fill: none; marker-end: url(#arr-g); }
|
||||
.arrow-back { stroke: #d9a96b; stroke-width: 2; fill: none; marker-end: url(#arr-o); }
|
||||
</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-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-o" 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="#d9a96b"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<rect width="1100" height="600" fill="#0f1117"/>
|
||||
|
||||
<text x="40" y="38" class="ttl">Container Tree — AIO on homework03</text>
|
||||
<text x="40" y="58" class="lbl-sm">network_mode: host on mastercontainer · 8 active · 5 disabled</text>
|
||||
|
||||
<!-- homework03 host frame -->
|
||||
<rect x="320" y="100" width="760" height="450" rx="10" class="box-host"/>
|
||||
<text x="335" y="124" class="ttl" fill="#bda3e8">homework03 (10.0.0.73) · Debian 13 · 15 GB</text>
|
||||
<text x="335" y="142" class="lbl-sm">Docker 29.6.2 · host network namespace shared with mastercontainer</text>
|
||||
|
||||
<!-- Mastercontainer -->
|
||||
<rect x="345" y="170" width="200" height="100" rx="6" class="box-emp"/>
|
||||
<text x="445" y="194" text-anchor="middle" class="lbl">nextcloud-aio-mastercontainer</text>
|
||||
<text x="445" y="212" text-anchor="middle" class="lbl-sm">all-in-one:latest</text>
|
||||
<text x="445" y="228" text-anchor="middle" class="lbl-tiny">host :80 · :8080 · :8443</text>
|
||||
<text x="445" y="244" text-anchor="middle" class="lbl-tiny">host :9000 → nextcloud-fcgi</text>
|
||||
<text x="445" y="260" text-anchor="middle" class="lbl-tiny">orchestrator / domain validator</text>
|
||||
|
||||
<!-- Apache -->
|
||||
<rect x="575" y="170" width="220" height="80" rx="6" class="box-internal"/>
|
||||
<text x="685" y="194" text-anchor="middle" class="lbl">nextcloud-aio-apache</text>
|
||||
<text x="685" y="212" text-anchor="middle" class="lbl-sm">reverse proxy → :9000</text>
|
||||
<text x="685" y="228" text-anchor="middle" class="lbl-tiny">host :11000 (public ingress)</text>
|
||||
<text x="685" y="244" text-anchor="middle" class="lbl-tiny">33:33 (www-data)</text>
|
||||
|
||||
<!-- nextcloud-fcgi -->
|
||||
<rect x="825" y="170" width="235" height="80" rx="6" class="box-internal"/>
|
||||
<text x="942" y="194" text-anchor="middle" class="lbl">nextcloud-aio-nextcloud</text>
|
||||
<text x="942" y="212" text-anchor="middle" class="lbl-sm">PHP-FPM 8.3 + Nextcloud</text>
|
||||
<text x="942" y="228" text-anchor="middle" class="lbl-tiny">:9000 (PHP-FPM listen)</text>
|
||||
<text x="942" y="244" text-anchor="middle" class="lbl-tiny">NEXTCLOUD_DATADIR bind</text>
|
||||
|
||||
<!-- Middle row: backing services -->
|
||||
<rect x="345" y="295" width="160" height="60" rx="6" class="box"/>
|
||||
<text x="425" y="316" text-anchor="middle" class="lbl">database</text>
|
||||
<text x="425" y="333" text-anchor="middle" class="lbl-sm">postgres 16 · :5432</text>
|
||||
<text x="425" y="349" text-anchor="middle" class="lbl-tiny">999:999</text>
|
||||
|
||||
<rect x="520" y="295" width="135" height="60" rx="6" class="box"/>
|
||||
<text x="587" y="316" text-anchor="middle" class="lbl">redis</text>
|
||||
<text x="587" y="333" text-anchor="middle" class="lbl-sm">cache · :6379</text>
|
||||
<text x="587" y="349" text-anchor="middle" class="lbl-tiny">999:999</text>
|
||||
|
||||
<rect x="670" y="295" width="145" height="60" rx="6" class="box"/>
|
||||
<text x="742" y="316" text-anchor="middle" class="lbl">database-dump</text>
|
||||
<text x="742" y="333" text-anchor="middle" class="lbl-sm">empty (we dump manually)</text>
|
||||
<text x="742" y="349" text-anchor="middle" class="lbl-tiny">999:999</text>
|
||||
|
||||
<rect x="830" y="295" width="230" height="60" rx="6" class="box"/>
|
||||
<text x="945" y="316" text-anchor="middle" class="lbl">notify-push</text>
|
||||
<text x="945" y="333" text-anchor="middle" class="lbl-sm">websocket · :7867</text>
|
||||
<text x="945" y="349" text-anchor="middle" class="lbl-tiny">required when install_latest_major=on</text>
|
||||
|
||||
<!-- Office suite row -->
|
||||
<rect x="345" y="380" width="320" height="100" rx="6" class="box-emp"/>
|
||||
<text x="505" y="404" text-anchor="middle" class="lbl">nextcloud-aio-collabora</text>
|
||||
<text x="505" y="422" text-anchor="middle" class="lbl-sm">Collabora CODE 24.04</text>
|
||||
<text x="505" y="440" text-anchor="middle" class="lbl-tiny">WOPI server · :9980 (container-only)</text>
|
||||
<text x="505" y="456" text-anchor="middle" class="lbl-tiny">100:101 (coolwsd)</text>
|
||||
<text x="505" y="472" text-anchor="middle" class="lbl-tiny">Apache proxies WOPI at :23973 internally</text>
|
||||
|
||||
<rect x="680" y="380" width="380" height="100" rx="6" class="box-emp"/>
|
||||
<text x="870" y="404" text-anchor="middle" class="lbl">nextcloud-aio-whiteboard</text>
|
||||
<text x="870" y="422" text-anchor="middle" class="lbl-sm">built-in collaborative canvas</text>
|
||||
<text x="870" y="440" text-anchor="middle" class="lbl-tiny">Node.js · :3002 (internal)</text>
|
||||
<text x="870" y="456" text-anchor="middle" class="lbl-tiny">exposed via Apache at /apps/whiteboard/</text>
|
||||
<text x="870" y="472" text-anchor="middle" class="lbl-tiny">no persistent state</text>
|
||||
|
||||
<!-- Disabled row -->
|
||||
<rect x="345" y="500" width="715" height="40" rx="6" class="box" stroke="#5a3a3a" stroke-dasharray="4 3"/>
|
||||
<text x="702" y="520" text-anchor="middle" class="lbl-sm" fill="#a86b6b">DISABLED: talk · imaginary · fulltextsearch · clamav · adminer (RAM budget)</text>
|
||||
<text x="702" y="534" text-anchor="middle" class="lbl-tiny" fill="#a86b6b">re-enable via AIO admin UI if needed (mastercontainer will pull + start)</text>
|
||||
|
||||
<!-- External: clients -->
|
||||
<rect x="40" y="170" width="220" height="80" rx="6" class="box-emp"/>
|
||||
<text x="150" y="194" text-anchor="middle" class="lbl">Browser</text>
|
||||
<text x="150" y="212" text-anchor="middle" class="lbl-sm">Nextcloud + Collabora + WB</text>
|
||||
<text x="150" y="228" text-anchor="middle" class="lbl-tiny">:443 → Caddy</text>
|
||||
|
||||
<!-- External: storage -->
|
||||
<rect x="40" y="380" width="220" height="80" rx="6" class="box-storage"/>
|
||||
<text x="150" y="404" text-anchor="middle" class="lbl">desslok NFS</text>
|
||||
<text x="150" y="422" text-anchor="middle" class="lbl-sm">/slab/container_storage/office</text>
|
||||
<text x="150" y="438" text-anchor="middle" class="lbl-tiny">NFSv4.1 · /srv/nc-files/</text>
|
||||
|
||||
<!-- External: backup -->
|
||||
<rect x="40" y="500" width="220" height="60" rx="6" class="box" stroke="#d9a96b" stroke-width="1.5"/>
|
||||
<text x="150" y="522" text-anchor="middle" class="lbl" fill="#d9a96b">hector timer</text>
|
||||
<text x="150" y="538" text-anchor="middle" class="lbl-tiny" fill="#d9a96b">03:30 UTC daily</text>
|
||||
|
||||
<!-- Arrows -->
|
||||
<line x1="260" y1="210" x2="345" y2="210" class="arrow"/>
|
||||
<text x="265" y="205" class="lbl-tiny" fill="#7aa2f7">HTTPS</text>
|
||||
|
||||
<line x1="445" y1="270" x2="425" y2="295" class="arrow"/>
|
||||
<text x="450" y="288" class="lbl-tiny" fill="#7aa2f7">spawns</text>
|
||||
|
||||
<line x1="545" y1="220" x2="575" y2="210" class="arrow"/>
|
||||
|
||||
<line x1="795" y1="210" x2="825" y2="210" class="arrow"/>
|
||||
|
||||
<line x1="685" y1="250" x2="685" y2="295" class="arrow"/>
|
||||
<text x="691" y="278" class="lbl-tiny" fill="#7aa2f7">?php-fpm</text>
|
||||
|
||||
<line x1="942" y1="250" x2="945" y2="295" class="arrow"/>
|
||||
|
||||
<line x1="505" y1="480" x2="685" y2="380" class="arrow" stroke-dasharray="3 3"/>
|
||||
<line x1="870" y1="380" x2="942" y2="250" class="arrow" stroke-dasharray="3 3"/>
|
||||
|
||||
<line x1="425" y1="355" x2="425" y2="380" class="arrow"/>
|
||||
<line x1="945" y1="355" x2="945" y2="380" class="arrow"/>
|
||||
|
||||
<line x1="260" y1="420" x2="345" y2="380" class="arrow-sto"/>
|
||||
<text x="265" y="405" class="lbl-tiny" fill="#6cba92">user files</text>
|
||||
|
||||
<line x1="260" y1="530" x2="345" y2="500" class="arrow-back"/>
|
||||
<text x="265" y="518" class="lbl-tiny" fill="#d9a96b">triggers</text>
|
||||
|
||||
<line x1="425" y1="355" x2="260" y2="420" class="arrow-sto" stroke-dasharray="4 4"/>
|
||||
<text x="355" y="398" class="lbl-tiny" fill="#6cba92">writes pgdump</text>
|
||||
|
||||
<text x="1060" y="592" text-anchor="end" class="lbl-tiny">2026-08-10 · nextcloud_office</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.9 KiB |
@@ -0,0 +1,121 @@
|
||||
<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; }
|
||||
.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); }
|
||||
</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 for user data + backups · ext4 for container state · local named volumes for postgres</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>
|
||||
|
||||
<rect x="80" y="180" width="390" height="48" rx="4" class="box-internal"/>
|
||||
<text x="275" y="200" text-anchor="middle" class="lbl-sm">/mnt/nc-data/nextcloud-data</text>
|
||||
<text x="275" y="216" text-anchor="middle" class="lbl-tiny">→ nextcloud-aio-nextcloud:/nextcloud-aio/data</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">nextcloud/</text>
|
||||
<text x="790" y="220" text-anchor="middle" class="lbl-sm">user-uploaded files</text>
|
||||
<text x="790" y="238" text-anchor="middle" class="lbl-tiny">mounted at /srv/nc-files/nextcloud/ on homework03</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 → nextcloud/ 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 -->
|
||||
<!-- nextcloud-data → nextcloud/ (NFS read/write) -->
|
||||
<line x1="470" y1="204" x2="540" y2="220" class="arrow-nfs"/>
|
||||
<text x="505" y="206" text-anchor="middle" class="lbl-tiny" fill="#6cba92">read/write</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-10 · nextcloud_office</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1,138 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 720" 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; }
|
||||
.lane-ttl { fill: #ffffff; font-size: 12px; font-weight: 600; }
|
||||
.step { fill: #1f2230; stroke: #3b4255; stroke-width: 1.5; }
|
||||
.step-alt { fill: #252938; stroke: #4a5267; stroke-width: 1.5; }
|
||||
.ok { fill: #1f2e28; stroke: #4a8a6b; stroke-width: 1.5; }
|
||||
.step-emp { fill: #1f2c3a; stroke: #4a78b5; stroke-width: 2; }
|
||||
.arrow-flow { stroke: #7aa2f7; stroke-width: 2; fill: none; marker-end: url(#arr-b); }
|
||||
.arrow-back { stroke: #d97a7a; stroke-width: 2; fill: none; marker-end: url(#arr-r); }
|
||||
.arrow-ok { stroke: #6cba92; stroke-width: 2; fill: none; marker-end: url(#arr-g); }
|
||||
.arrow-time { stroke: #d9a96b; stroke-width: 1.5; fill: none; stroke-dasharray: 2 2; }
|
||||
</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-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="#d97a7a"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<rect width="1100" height="720" fill="#0f1117"/>
|
||||
|
||||
<text x="40" y="38" class="ttl">Request Flow — file upload via WebDAV</text>
|
||||
<text x="40" y="58" class="lbl-sm">curl PUT smoke-test.md · 2026-08-10 · HTTP 201 Created</text>
|
||||
|
||||
<!-- Lanes -->
|
||||
<line x1="180" y1="100" x2="180" y2="690" stroke="#3b4255" stroke-width="1"/>
|
||||
<line x1="360" y1="100" x2="360" y2="690" stroke="#3b4255" stroke-width="1"/>
|
||||
<line x1="540" y1="100" x2="540" y2="690" stroke="#3b4255" stroke-width="1"/>
|
||||
<line x1="720" y1="100" x2="720" y2="690" stroke="#3b4255" stroke-width="1"/>
|
||||
<line x1="900" y1="100" x2="900" y2="690" stroke="#3b4255" stroke-width="1"/>
|
||||
|
||||
<text x="90" y="120" text-anchor="middle" class="lane-ttl">Client</text>
|
||||
<text x="270" y="120" text-anchor="middle" class="lane-ttl">DNS</text>
|
||||
<text x="450" y="120" text-anchor="middle" class="lane-ttl">Caddy</text>
|
||||
<text x="630" y="120" text-anchor="middle" class="lane-ttl">AIO Apache</text>
|
||||
<text x="810" y="120" text-anchor="middle" class="lane-ttl">PHP-FPM</text>
|
||||
<text x="1000" y="120" text-anchor="middle" class="lane-ttl">Storage</text>
|
||||
|
||||
<text x="90" y="136" text-anchor="middle" class="lbl-tiny">curl</text>
|
||||
<text x="270" y="136" text-anchor="middle" class="lbl-tiny">Cloudflare</text>
|
||||
<text x="450" y="136" text-anchor="middle" class="lbl-tiny">caddy-caddy-1</text>
|
||||
<text x="630" y="136" text-anchor="middle" class="lbl-tiny">:11000</text>
|
||||
<text x="810" y="136" text-anchor="middle" class="lbl-tiny">:9000</text>
|
||||
<text x="1000" y="136" text-anchor="middle" class="lbl-tiny">NFS</text>
|
||||
|
||||
<!-- Steps -->
|
||||
<!-- 1. PUT request -->
|
||||
<rect x="20" y="160" width="160" height="50" rx="4" class="step-emp"/>
|
||||
<text x="100" y="180" text-anchor="middle" class="lbl">PUT</text>
|
||||
<text x="100" y="197" text-anchor="middle" class="lbl-tiny">/remote.php/dav/...</text>
|
||||
|
||||
<!-- 2. DNS lookup -->
|
||||
<rect x="200" y="160" width="160" height="50" rx="4" class="step"/>
|
||||
<text x="280" y="180" text-anchor="middle" class="lbl">Resolve office.rmf44.xyz</text>
|
||||
<text x="280" y="197" text-anchor="middle" class="lbl-tiny">→ 192.255.159.202</text>
|
||||
|
||||
<!-- 3. TLS handshake + request to Caddy -->
|
||||
<rect x="370" y="160" width="160" height="60" rx="4" class="step"/>
|
||||
<text x="450" y="180" text-anchor="middle" class="lbl">TLS handshake</text>
|
||||
<text x="450" y="197" text-anchor="middle" class="lbl-tiny">Let's Encrypt cert</text>
|
||||
<text x="450" y="212" text-anchor="middle" class="lbl-tiny">office.rmf44.xyz</text>
|
||||
|
||||
<!-- 4. Caddy routes -->
|
||||
<rect x="370" y="240" width="160" height="50" rx="4" class="step"/>
|
||||
<text x="450" y="260" text-anchor="middle" class="lbl">Match Host header</text>
|
||||
<text x="450" y="277" text-anchor="middle" class="lbl-tiny">reverse_proxy :11000</text>
|
||||
|
||||
<!-- 5. NetBird forward -->
|
||||
<rect x="555" y="320" width="160" height="50" rx="4" class="step-alt"/>
|
||||
<text x="635" y="340" text-anchor="middle" class="lbl">WireGuard P2P</text>
|
||||
<text x="635" y="357" text-anchor="middle" class="lbl-tiny">100.79.4.103 → 100.79.142.164</text>
|
||||
|
||||
<!-- 6. Apache receives -->
|
||||
<rect x="555" y="395" width="160" height="50" rx="4" class="step-emp"/>
|
||||
<text x="635" y="415" text-anchor="middle" class="lbl">AIO Apache :11000</text>
|
||||
<text x="635" y="432" text-anchor="middle" class="lbl-tiny">terminate, forward :9000</text>
|
||||
|
||||
<!-- 7. PHP-FPM auth -->
|
||||
<rect x="735" y="395" width="160" height="50" rx="4" class="step"/>
|
||||
<text x="815" y="415" text-anchor="middle" class="lbl">PHP-FPM Nextcloud</text>
|
||||
<text x="815" y="432" text-anchor="middle" class="lbl-tiny">auth via session cookie</text>
|
||||
|
||||
<!-- 8. WebDAV write -->
|
||||
<rect x="735" y="465" width="160" height="60" rx="4" class="step"/>
|
||||
<text x="815" y="485" text-anchor="middle" class="lbl">WebDAV handler</text>
|
||||
<text x="815" y="503" text-anchor="middle" class="lbl-tiny">authorize /admin/files/</text>
|
||||
<text x="815" y="518" text-anchor="middle" class="lbl-tiny">write smoke-test.md</text>
|
||||
|
||||
<!-- 9. NFS write -->
|
||||
<rect x="920" y="465" width="160" height="60" rx="4" class="ok"/>
|
||||
<text x="1000" y="485" text-anchor="middle" class="lbl" fill="#9d7ad9">NFS write</text>
|
||||
<text x="1000" y="503" text-anchor="middle" class="lbl-tiny" fill="#9d7ad9">→ /slab/container_storage/office/</text>
|
||||
<text x="1000" y="518" text-anchor="middle" class="lbl-tiny" fill="#9d7ad9">nextcloud/admin/files/</text>
|
||||
|
||||
<!-- 10. 201 Created returned -->
|
||||
<rect x="20" y="555" width="160" height="50" rx="4" class="ok"/>
|
||||
<text x="100" y="575" text-anchor="middle" class="lbl" fill="#9d7ad9">HTTP/2 201 Created</text>
|
||||
<text x="100" y="592" text-anchor="middle" class="lbl-tiny" fill="#9d7ad9">curl exits 0</text>
|
||||
|
||||
<!-- Response path (dashed red arrows going back) -->
|
||||
<line x1="920" y1="495" x2="180" y2="495" stroke="#3b4255" stroke-dasharray="2 2" stroke-width="1"/>
|
||||
|
||||
<!-- Forward arrows -->
|
||||
<line x1="100" y1="160" x2="270" y2="160" class="arrow-flow"/>
|
||||
<line x1="270" y1="210" x2="450" y2="160" class="arrow-flow"/>
|
||||
<line x1="450" y1="220" x2="450" y2="240" class="arrow-flow"/>
|
||||
<line x1="530" y1="265" x2="555" y2="345" class="arrow-flow"/>
|
||||
<line x1="635" y1="370" x2="635" y2="395" class="arrow-flow"/>
|
||||
<line x1="715" y1="420" x2="735" y2="420" class="arrow-flow"/>
|
||||
<line x1="895" y1="495" x2="920" y2="495" class="arrow-ok"/>
|
||||
|
||||
<!-- Response arrows (back through lanes) -->
|
||||
<line x1="180" y1="495" x2="100" y2="555" class="arrow-back"/>
|
||||
<text x="510" y="485" text-anchor="middle" class="lbl-tiny" fill="#d97a7a">201 Created (response)</text>
|
||||
|
||||
<!-- Timing annotation -->
|
||||
<text x="100" y="640" text-anchor="middle" class="lbl-tiny">total ≈ 50ms</text>
|
||||
<text x="450" y="640" text-anchor="middle" class="lbl-tiny">TLS: ~15ms</text>
|
||||
<text x="635" y="640" text-anchor="middle" class="lbl-tiny">P2P hop: ~2ms</text>
|
||||
<text x="815" y="640" text-anchor="middle" class="lbl-tiny">PHP-FPM: ~25ms</text>
|
||||
<text x="1000" y="640" text-anchor="middle" class="lbl-tiny">NFS: ~5ms</text>
|
||||
|
||||
<!-- Note -->
|
||||
<rect x="20" y="660" width="1060" height="40" rx="4" class="step" stroke="#d9a96b"/>
|
||||
<text x="550" y="681" text-anchor="middle" class="lbl-sm" fill="#d9a96b">Tip: WOPI (Collabora file open) follows a parallel path — browser iframe → apache → nextcloud PHP → wopi URL → apache proxy → collabora → WOPI read</text>
|
||||
<text x="550" y="694" text-anchor="middle" class="lbl-tiny" fill="#d9a96b">the WOPI URL is verified as http://nextcloud-aio-apache.nextcloud-aio:23973 (internal docker network only)</text>
|
||||
|
||||
<text x="1060" y="715" text-anchor="end" class="lbl-tiny">2026-08-10 · nextcloud_office</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.1 KiB |
@@ -0,0 +1,180 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1140 720" 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-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-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="720" 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</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>
|
||||
|
||||
<!-- Note -->
|
||||
<text x="490" y="370" text-anchor="middle" class="lbl-sm" fill="#9d7ad9">+ retired OnlyOffice torn down</text>
|
||||
<text x="490" y="386" text-anchor="middle" class="lbl-tiny" fill="#9d7ad9">see procedure.html §4.4</text>
|
||||
<rect x="400" y="395" width="180" height="18" rx="3" class="box-retired"/>
|
||||
<text x="490" y="408" text-anchor="middle" class="lbl-sm" fill="#a86b6b">[retired] onlyoffice-files-1</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>
|
||||
|
||||
<!-- Sidecar group -->
|
||||
<rect x="680" y="428" width="200" height="80" rx="6" class="box"/>
|
||||
<text x="780" y="448" text-anchor="middle" class="lbl-sm">5 sidecars</text>
|
||||
<text x="780" y="466" text-anchor="middle" class="lbl-tiny">nextcloud · database · redis</text>
|
||||
<text x="780" y="481" text-anchor="middle" class="lbl-tiny">collabora · whiteboard</text>
|
||||
<text x="780" y="497" text-anchor="middle" class="lbl-tiny">notify-push · database-dump</text>
|
||||
|
||||
<!-- NFS mount -->
|
||||
<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">nextcloud/</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="540" width="420" height="120" rx="6" class="box"/>
|
||||
<text x="870" y="562" text-anchor="middle" class="lbl">Daily backup pipeline (hector → homework03 → NFS)</text>
|
||||
<text x="700" y="585" class="lbl-sm">03:30 UTC, systemd timer on hector</text>
|
||||
<text x="700" y="605" class="lbl-sm">ssh homework03 sudo /usr/local/bin/office-backup.sh</text>
|
||||
<text x="700" y="625" class="lbl-sm"> → pg_dumpall → /srv/nc-files/backups/office-YYYYMMDD-*.gz</text>
|
||||
<text x="700" y="645" 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>
|
||||
|
||||
<!-- Caddy → NetBird -->
|
||||
<line x1="490" y1="278" x2="490" y2="298" class="x-link"/>
|
||||
|
||||
<!-- 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>
|
||||
|
||||
<!-- NetBird homework03 → Apache -->
|
||||
<line x1="780" y1="258" x2="780" y2="358" class="x-link"/>
|
||||
|
||||
<!-- 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 from compute → storage -->
|
||||
<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>
|
||||
|
||||
<!-- Backup arrow from backup pipeline → storage -->
|
||||
<line x1="1050" y1="580" 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, 690)">
|
||||
<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-retired"/>
|
||||
<text x="282" y="2" class="lbl-tiny">retired</text>
|
||||
</g>
|
||||
|
||||
<text x="1060" y="694" text-anchor="end" class="lbl-tiny">2026-08-10 · nextcloud_office</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
Reference in New Issue
Block a user