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:
2026-08-10 15:43:46 -05:00
commit d172771aa1
12 changed files with 2423 additions and 0 deletions
+151
View File
@@ -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