# Nextcloud AIO

## Purpose

Nextcloud AIO provides private file storage, synchronization, sharing, productivity, and collaboration services for the Bytek environment.

Nextcloud currently supports or is intended to support:

<div id="bkmrk-personal-file-storag" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Personal file storage.
- Shared folders.
- File synchronization across computers and mobile devices.
- Public and private file sharing.
- Calendar synchronization.
- Contact synchronization.
- Tasks and notes.
- Browser-based document editing.
- Simultaneous document collaboration.
- Authentik single sign-on.
- Desktop and mobile Nextcloud clients.
- WebDAV, CalDAV, and CardDAV access.
- Optional photo, communication, and productivity applications.

</div>Nextcloud runs as an isolated application VM and uses Nextcloud All-in-One to manage its containers.

<div id="bkmrk-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Service Information

<div id="bkmrk-setting-value-servic" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Service name</td><td>Nextcloud AIO</td></tr><tr><td>Private IP address</td><td>`192.168.2.100`</td></tr><tr><td>Public hostname</td><td>`cloud.bytek.ca`</td></tr><tr><td>AIO management port</td><td>TCP 8080</td></tr><tr><td>Traefik backend port</td><td>TCP 11000</td></tr><tr><td>Deployment directory</td><td>`/opt/nextcloud-aio`</td></tr><tr><td>Operating-system disk</td><td>64 GB</td></tr><tr><td>User-data disk</td><td>500 GB</td></tr><tr><td>User-data mount</td><td>`/mnt/nextcloud-data`</td></tr><tr><td>Nextcloud data directory</td><td>`/mnt/nextcloud-data/ncdata`</td></tr><tr><td>Reverse proxy</td><td>Traefik</td></tr><tr><td>Authentication</td><td>Authentik OIDC</td></tr><tr><td>Office integration</td><td>AIO-managed Collabora CODE</td></tr><tr><td>Time zone</td><td>`America/Toronto`</td></tr><tr><td>Backup coverage</td><td>Proxmox OS and data-disk backup</td></tr><tr><td>Proxmox VM ID</td><td>Confirm current VM ID</td></tr></tbody></table>

</div></div></div>User application:

<span class="___xxxjie0 f1w7gpdv f1gqqdtu" data-wra="1" style="opacity: 1; transition: opacity 500ms ease-out;">[Open Nextcloud](https://cloud.bytek.ca/)</span>

AIO management address:

`https://192.168.2.100:8080/`

<div id="bkmrk--1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Architecture Role

Nextcloud is the central user-file and collaboration platform.

Nextcloud is separate from:

<div id="bkmrk-bookstack-documentat" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- BookStack documentation.
- Vikunja task management.
- Authentik identity management.
- Traefik HTTPS routing.
- Uptime Kuma monitoring.
- Proxmox infrastructure management.

</div>This separation limits the effect of an application failure and allows Nextcloud storage to grow independently from the infrastructure VMs.

<div id="bkmrk--2" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Container Architecture

Nextcloud AIO manages the application stack.

Core containers include equivalents of:

<div id="bkmrk-aio-master-container" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- AIO master container.
- Apache and Caddy.
- Nextcloud.
- PostgreSQL.
- Redis.
- Notify Push.
- Domain validation during initial setup.

</div>Optional containers may include:

<div id="bkmrk-collabora-online.-cl" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Collabora Online.
- ClamAV.
- Full-text search.
- Imaginary.
- Nextcloud Talk.
- Talk recording.
- HaRP.
- Whiteboard.
- Community containers.

</div>Optional containers should be added one at a time and tested before enabling another.

<div id="bkmrk--3" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Public Request Flow

When an external user opens Nextcloud:

<div id="bkmrk-the-browser-opens-cl" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. The browser opens `cloud.bytek.ca`.
2. WHC public DNS resolves the hostname to `38.29.213.101`.
3. The public VPS accepts the HTTPS connection.
4. The VPS forwards the traffic through WireGuard.
5. The home WireGuard gateway forwards the request to Traefik.
6. Traefik receives the request for `cloud.bytek.ca`.
7. Traefik forwards the request to `192.168.2.100` on TCP port 11000.
8. The AIO Apache container serves Nextcloud.

---

</div>## Internal Request Flow

When a LAN user opens Nextcloud:

<div id="bkmrk-the-client-queries-p" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. The client queries Pi-hole.
2. Pi-hole resolves `cloud.bytek.ca` to `192.168.2.182`.
3. The client connects directly to Traefik.
4. Traefik forwards the request to `192.168.2.100:11000`.
5. Nextcloud serves the request.

</div>Internal clients use the same HTTPS hostname as external clients.

<div id="bkmrk--4" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Traefik Route

The Nextcloud Traefik router uses:

<div id="bkmrk-setting-value-hostna" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Hostname rule</td><td>`cloud.bytek.ca`</td></tr><tr><td>Entry point</td><td>`websecure`</td></tr><tr><td>Certificate resolver</td><td>`letsencrypt`</td></tr><tr><td>Backend protocol</td><td>HTTP</td></tr><tr><td>Backend destination</td><td>`192.168.2.100:11000`</td></tr><tr><td>Host-header forwarding</td><td>Enabled</td></tr><tr><td>Authentik ForwardAuth</td><td>Disabled</td></tr></tbody></table>

</div></div></div>Do not attach Authentik ForwardAuth to the Nextcloud Traefik router.

Nextcloud requires direct access for:

<div id="bkmrk-desktop-clients.-mob" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Desktop clients.
- Mobile clients.
- WebDAV.
- CalDAV.
- CardDAV.
- Application passwords.
- Public shares.
- Federation.
- Synchronization APIs.

</div>Nextcloud performs user authentication through its native OIDC integration.

<div id="bkmrk--5" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## AIO Management Interface

The AIO management interface is available only by private IP:

`https://192.168.2.100:8080/`

The management interface uses its own certificate, so a browser warning may appear.

Always use the private IP for AIO management.

Do not use:

<div id="bkmrk-cloud.bytek.ca%3A8080-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `cloud.bytek.ca:8080`
- A public WHC record.
- A Traefik public router.
- VPS forwarding.
- Public router forwarding.
- Authentik ForwardAuth.

</div>The AIO management interface controls:

<div id="bkmrk-container-startup-an" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Container startup and shutdown.
- Updates.
- Optional containers.
- Backup settings.
- AIO passphrase.
- Application version selection.
- Time-zone settings.
- Container logs.

---

</div>## Restricted Ports

The following ports must not be exposed publicly:

<div id="bkmrk-port-purpose-tcp-808" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Port</th><th>Purpose</th></tr><tr><td>TCP 8080</td><td>AIO management</td></tr><tr><td>TCP 11000</td><td>AIO Apache backend</td></tr><tr><td>TCP 8443</td><td>AIO-managed certificate interface, not used in this reverse-proxy design</td></tr><tr><td>TCP 9000</td><td>Internal AIO service</td></tr><tr><td>Docker socket</td><td>Container management</td></tr></tbody></table>

</div></div></div>Only Traefik should reach TCP port 11000 during normal operation.

LAN administrators may reach TCP port 8080.

<div id="bkmrk--6" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Storage Architecture

Nextcloud uses separate virtual disks for the operating system and user data.

### Operating-System Disk

<div id="bkmrk-setting-value-nomina" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Nominal size</td><td>64 GB</td></tr><tr><td>Proxmox storage</td><td>`local-lvm`</td></tr><tr><td>Root filesystem</td><td>ext4</td></tr><tr><td>Purpose</td><td>Debian, Docker, AIO configuration, and system files</td></tr></tbody></table>

</div></div></div>### User-Data Disk

<div id="bkmrk-setting-value-nomina-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Nominal size</td><td>500 GB</td></tr><tr><td>Proxmox storage</td><td>`user-data`</td></tr><tr><td>Guest device</td><td>`/dev/sda1` at the time of configuration</td></tr><tr><td>Filesystem</td><td>ext4</td></tr><tr><td>Filesystem label</td><td>`nextcloud-data`</td></tr><tr><td>Mount point</td><td>`/mnt/nextcloud-data`</td></tr><tr><td>Nextcloud data path</td><td>`/mnt/nextcloud-data/ncdata`</td></tr><tr><td>Mount options</td><td>Defaults and `noatime`</td></tr></tbody></table>

</div></div></div>The operating-system disk appeared as `/dev/sdb`, while the 500 GB data disk appeared as `/dev/sda` during initial configuration.

Linux device names may change, so the permanent mount uses the filesystem UUID rather than `/dev/sda1`.

<div id="bkmrk--7" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Data-Disk Validation

Confirm the data disk is mounted using:

`findmnt /mnt/nextcloud-data`

Confirm available capacity using:

`df -h / /mnt/nextcloud-data`

Confirm the filesystem using:

`lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINTS`

Confirm the data directory exists using:

`sudo ls -ld /mnt/nextcloud-data/ncdata`

The Nextcloud containers should not be started if the expected data filesystem is missing.

Starting the application with an unmounted data path could cause data to be written to the operating-system disk instead.

<div id="bkmrk--8" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Filesystem Mount

The data filesystem is mounted through `/etc/fstab` using its UUID.

The mount point is:

`/mnt/nextcloud-data`

The intended behavior is:

<div id="bkmrk-the-disk-mounts-auto" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- The disk mounts automatically at boot.
- The mount fails visibly if the filesystem is unavailable.
- The path remains consistent even if Linux device letters change.
- Nextcloud AIO always receives the same data location.

</div>Review the mount after every storage or boot issue.

<div id="bkmrk--9" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## AIO Data Directory

The AIO deployment uses:

<div id="bkmrk-nextcloud-data-direc" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- **Nextcloud data directory:** `/mnt/nextcloud-data/ncdata`

</div>The directory should remain on the 500 GB user-data disk.

Do not move the directory manually while Nextcloud containers are running.

Do not directly edit files inside the Nextcloud data directory using normal filesystem tools unless following a documented recovery process.

Nextcloud tracks files through its database and filesystem metadata.

Files manually copied into the data directory may not appear correctly until an application-level rescan is performed.

<div id="bkmrk--10" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Authentication

Nextcloud uses native OpenID Connect through Authentik.

The installed Nextcloud application is:

<div id="bkmrk-openid-connect-user-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- **OpenID Connect user backend**
- **Application ID:** `user_oidc`

</div>Do not install another OIDC login application alongside it unless a migration is deliberately planned.

Avoid enabling overlapping authentication applications such as:

<div id="bkmrk-openid-connect-login" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- OpenID Connect Login.
- Social Login.
- OpenID Connect SSO by Gluu.
- OIDC Identity Provider.

</div>The OIDC Identity Provider application serves the opposite role by making Nextcloud an identity provider.

<div id="bkmrk--11" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Authentik OIDC Configuration

<div id="bkmrk-setting-value-authen" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Authentik application name</td><td>Nextcloud</td></tr><tr><td>Application slug</td><td>`nextcloud`</td></tr><tr><td>Provider type</td><td>OAuth2/OpenID Connect</td></tr><tr><td>Client type</td><td>Confidential</td></tr><tr><td>Subject mode</td><td>User UUID</td></tr><tr><td>Signing key</td><td>Selected</td></tr><tr><td>Encryption key</td><td>None</td></tr><tr><td>Authorization callback</td><td>`https://cloud.bytek.ca/apps/user_oidc/code`</td></tr><tr><td>Required group</td><td>`bytek-users`</td></tr><tr><td>Required policy</td><td>`Allow bytek.ca users`</td></tr><tr><td>Policy engine</td><td>`ALL`</td></tr></tbody></table>

</div></div></div>Normal users must:

<div id="bkmrk-belong-to-bytek-user" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Belong to `bytek-users`.
- Pass the `Allow bytek.ca users` policy.

</div>Do not attach `bytek-admin` as another required `ALL` binding for normal Nextcloud access.

Administrators who need Nextcloud should also belong to `bytek-users`.

<div id="bkmrk--12" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Nextcloud OIDC Settings

<div id="bkmrk-setting-value-provid" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Setting</th><th>Value</th></tr><tr><td>Provider identifier</td><td>`authentik`</td></tr><tr><td>Discovery endpoint</td><td>Authentik discovery URL for application slug `nextcloud`</td></tr><tr><td>Scopes</td><td>`openid email profile`</td></tr><tr><td>User ID mapping</td><td>`sub`</td></tr><tr><td>Display-name mapping</td><td>`name`</td></tr><tr><td>Email mapping</td><td>`email`</td></tr></tbody></table>

</div></div></div>The OIDC discovery endpoint must be reachable from inside the Nextcloud application container.

The client ID and client secret must match the Authentik Nextcloud provider.

Do not place the client secret in BookStack.

<div id="bkmrk--13" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## OIDC Login Flow

<div id="bkmrk-the-user-opens-cloud" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. The user opens `cloud.bytek.ca`.
2. Nextcloud offers Authentik login.
3. The browser is redirected to `portal.bytek.ca`.
4. Authentik requests authentication and MFA.
5. Authentik evaluates the `bytek-users` group.
6. Authentik evaluates the Bytek email policy.
7. Authentik redirects to the Nextcloud callback.
8. Nextcloud validates the OIDC response.
9. Nextcloud creates or matches the user.
10. The user enters Nextcloud.

</div>Nextcloud application permissions remain controlled inside Nextcloud.

<div id="bkmrk--14" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Local Break-Glass Administrator

The local Nextcloud administrator must remain available.

The local account provides recovery when:

<div id="bkmrk-authentik-is-unavail" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Authentik is unavailable.
- Pi-hole is unavailable.
- OIDC is misconfigured.
- Authentik policies deny access.
- The user OIDC application fails.
- A signing or discovery problem occurs.

</div>The direct local-login path is:

<span class="___xxxjie0 f1w7gpdv f1gqqdtu" data-wra="1" style="opacity: 1; transition: opacity 500ms ease-out;">[Open the Nextcloud Local Login](https://cloud.bytek.ca/)</span>

The local administrator password must:

<div id="bkmrk-be-unique.-be-stored" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Be unique.
- Be stored in the password manager.
- Differ from the Authentik password.
- Be rotated if exposed.
- Be tested periodically.

</div>A local Nextcloud second factor may be enabled for the break-glass account if recovery codes are stored securely.

<div id="bkmrk--15" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Trusted Proxy

Nextcloud must trust Traefik as its reverse proxy.

Expected trusted proxy:

<div id="bkmrk-192.168.2.182" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `192.168.2.182`

</div>Review using:

`sudo docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:get trusted_proxies`

The output should include Traefik’s current private address.

If Traefik’s IP changes, update:

<div id="bkmrk-nextcloud-trusted-pr" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Nextcloud trusted proxies.
- Traefik route.
- Pi-hole records if required.
- Proxmox firewall rules.
- Uptime Kuma monitors.
- Documentation.

---

</div>## HTTPS Detection

Nextcloud must generate HTTPS URLs when accessed through Traefik.

If Nextcloud generates HTTP links, investigate:

<div id="bkmrk-trusted-proxy.-forwa" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Trusted proxy.
- Forwarded protocol headers.
- `overwriteprotocol`.
- `overwrite.cli.url`.
- `APP_URL` equivalent settings.
- Traefik host-header forwarding.

</div>The expected external URL is:

`https://cloud.bytek.ca`

Do not set the external URL to the private IP or TCP port 11000.

<div id="bkmrk--16" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Office Integration

Nextcloud uses the AIO-managed Collabora Online container.

This component provides browser-based document editing and simultaneous collaboration.

The Nextcloud Office application connects Nextcloud to the AIO-managed Collabora CODE server.

Do not also install the separate Built-in CODE Server application.

Using both would create competing office backends and complicate troubleshooting.

<div id="bkmrk--17" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Office Dictionaries

Configured dictionaries:

<div id="bkmrk-en_us-fr_fr" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `en_US`
- `fr_FR`

</div>These provide:

<div id="bkmrk-english%2C-united-stat" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- English, United States.
- French, France.

</div>Canadian French would normally use `fr_CA`, but the AIO interface should be checked before adding a locale not listed as supported.

Locale values are separated by spaces.

<div id="bkmrk--18" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Office Validation

To validate collaborative editing:

<div id="bkmrk-sign-in-as-the-first" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Sign in as the first Nextcloud user.
2. Create or upload an office document.
3. Open the document in the browser editor.
4. Share the document with a second user.
5. Open a private browser session.
6. Sign in as the second user.
7. Open the same document.
8. Make an edit from each session.
9. Confirm both sessions see updates.
10. Confirm the file is saved in Nextcloud.

</div>If a document does not open:

<div id="bkmrk-check-the-aio-collab" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Check the AIO Collabora container.
- Check Nextcloud Office settings.
- Check Nextcloud logs.
- Check Traefik.
- Check browser console errors.
- Check the Collabora container log.

---

</div>## Enabled Applications

Recommended core applications include:

<div id="bkmrk-files.-openid-connec" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Files.
- OpenID Connect user backend.
- Nextcloud Office.
- Calendar.
- Contacts.
- Tasks.
- Notes.

</div>Applications that may be added later include:

<div id="bkmrk-team-folders.-deck.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Team Folders.
- Deck.
- Forms.
- Collectives.
- Memories.
- Imaginary.
- Talk.
- Mail.
- Whiteboard.

</div>Add applications only when there is a clear use case.

Every additional application becomes part of:

<div id="bkmrk-update-testing.-back" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Update testing.
- Backup scope.
- Database growth.
- Background processing.
- Compatibility testing.
- Recovery procedures.

---

</div>## Team Folders

Team Folders may be used for administrator-managed shared storage.

Use Team Folders instead of placing every shared resource inside one user’s personal files.

Possible shared folders include:

<div id="bkmrk-shared-documents.-fa" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Shared Documents.
- Family Photos.
- Game Project.
- Common Resources.
- Collaboration Files.

</div>Team Folder permissions should use stable Nextcloud users and groups after OIDC account provisioning has been tested.

<div id="bkmrk--19" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Optional AIO Containers

### Collabora

Enabled for browser-based document editing.

### Imaginary

May be enabled later for expanded preview support.

Possible preview formats include:

<div id="bkmrk-heic.-heif.-pdf.-svg" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HEIC.
- HEIF.
- PDF.
- SVG.
- TIFF.
- WebP.

</div>Review compatibility before enabling server-side encryption.

### ClamAV

May be enabled later for antivirus scanning.

ClamAV requires additional memory and may affect upload processing.

### Full-Text Search

May be enabled later when enough content exists to justify indexing.

Initial indexing can consume significant resources and affect availability.

### Nextcloud Talk

May be enabled later.

Talk requires deliberate network configuration, including TCP and UDP port 3478 for TURN functionality.

Do not enable Talk before designing the complete VPS, WireGuard, firewall, and guest-port path.

### HaRP

May be enabled if a future ExApp requires it.

Do not enable it without a specific application requirement.

### Docker Socket Proxy

Do not enable the deprecated Docker Socket Proxy when HaRP is the supported alternative for the intended application.

<div id="bkmrk--20" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Community Containers

AIO Community Containers are not official core Nextcloud containers.

Community containers may:

<div id="bkmrk-have-independent-mai" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Have independent maintenance.
- Introduce additional dependencies.
- Become incompatible.
- Require additional ports.
- Expand backup size.
- Complicate AIO updates.

</div>Do not enable community containers merely because they are available.

Plex was considered as an AIO Community Container but rejected in favor of a dedicated Plex VM.

Reasons include:

<div id="bkmrk-gpu-isolation.-servi" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- GPU isolation.
- Service separation.
- Backup control.
- Network separation.
- Avoiding dependency between Plex and Nextcloud.
- Keeping the media library outside the Nextcloud VM.

---

</div>## Time Zone

Nextcloud AIO uses:

<div id="bkmrk-america%2Ftoronto" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `America/Toronto`

</div>The Debian host should also use:

<div id="bkmrk-america%2Ftoronto-1" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `America/Toronto`

</div>Verify the host using:

`timedatectl`

Expected properties:

<div id="bkmrk-correct-local-time.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Correct local time.
- Correct UTC time.
- System clock synchronized.
- NTP active.
- RTC stored in UTC.

</div>The AIO time-zone setting and Debian host time zone are separate settings.

<div id="bkmrk--21" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Email Configuration

Nextcloud should use SMTP for:

<div id="bkmrk-user-notifications.-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- User notifications.
- Shares.
- Security events.
- Password-related messages.
- Calendar invitations.
- Administrative alerts.

</div>WHC SMTP settings should be obtained from:

<div id="bkmrk-cpanel.-email-accoun" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- cPanel.
- Email Accounts.
- Connect Devices.
- Manual configuration.

</div>Typical secure combinations include:

<div id="bkmrk-port-encryption-587-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Port</th><th>Encryption</th></tr><tr><td>587</td><td>STARTTLS</td></tr><tr><td>465</td><td>SSL/TLS</td></tr></tbody></table>

</div></div></div>The full mailbox address is normally used as the SMTP username.

Use the mailbox password, not the cPanel password.

Do not store the SMTP password in BookStack.

<div id="bkmrk--22" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Email Troubleshooting

If Nextcloud cannot send email:

<div id="bkmrk-confirm-the-mailbox-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Confirm the mailbox credentials in WHC webmail.
2. Confirm the exact WHC SMTP hostname.
3. Confirm the selected port and encryption match.
4. Test DNS from the Nextcloud VM.
5. Test TCP reachability from the VM.
6. Test TCP reachability from the Nextcloud container.
7. Test STARTTLS using OpenSSL if using port 587.
8. Review the Nextcloud log.
9. Review cPanel Email Track Delivery.
10. Contact WHC support only after collecting the exact error.

</div>If no attempt appears in cPanel Track Delivery, the message may not have reached the WHC mail server.

<div id="bkmrk--23" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Application Administration Overview

Review the Nextcloud administration overview after installation and updates.

Common warnings may include:

<div id="bkmrk-missing-default-phon" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Missing default phone region.
- Email server not configured.
- Maintenance window.
- Missing database indexes.
- Mimetype migrations.
- Background-job configuration.
- Proxy-header issues.
- HTTPS URL detection.
- App compatibility warnings.

</div>Use the exact warning text from the installed Nextcloud version before running administrative commands.

Do not copy commands from unrelated versions without reviewing the current warning.

<div id="bkmrk--24" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Default Phone Region

For Canadian phone numbers, use:

<div id="bkmrk-ca" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `CA`

</div>This helps Nextcloud interpret local phone-number formats.

Review the current value using the Nextcloud system configuration.

<div id="bkmrk--25" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Container Management

Nextcloud AIO containers should be managed through the AIO interface whenever practical.

AIO management address:

`https://192.168.2.100:8080/`

Use the AIO interface for:

<div id="bkmrk-starting-containers." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Starting containers.
- Stopping containers.
- Updating containers.
- Adding optional containers.
- Removing optional containers.
- Reviewing container logs.
- Changing the AIO configuration.

</div>Do not manually recreate AIO-generated application containers unless following an AIO-specific recovery procedure.

<div id="bkmrk--26" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Docker Compose Management

The master container deployment is stored under:

`/opt/nextcloud-aio`

Move to the directory using:

`cd /opt/nextcloud-aio`

Validate Compose using:

`sudo docker compose config --quiet`

Check the master container using:

`sudo docker compose ps`

View master-container logs using:

`sudo docker logs nextcloud-aio-mastercontainer --tail 100`

Container-level settings in the master Compose definition require recreation of the master container.

AIO-managed child containers remain controlled through AIO.

<div id="bkmrk--27" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Container Health

List containers using:

`sudo docker ps --format='table {{.Names}}\t{{.Status}}\t{{.Ports}}'`

Expected core containers include equivalents of:

<div id="bkmrk-nextcloud-aio-master" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `nextcloud-aio-mastercontainer`
- `nextcloud-aio-database`
- `nextcloud-aio-redis`
- `nextcloud-aio-nextcloud`
- `nextcloud-aio-apache`
- `nextcloud-aio-notify-push`
- Collabora container when enabled

</div>A running container may still be unhealthy.

Review the status and relevant application endpoint.

<div id="bkmrk--28" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Backend Validation

Confirm TCP port 11000 from the Nextcloud VM using:

`curl -I http://127.0.0.1:11000/`

Confirm from the Traefik VM using:

`curl -I http://192.168.2.100:11000/`

A redirect or Nextcloud response confirms the HTTP backend is reachable.

A timeout indicates a firewall or routing issue.

A connection refusal indicates that the VM was reached but no service is listening.

<div id="bkmrk--29" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Public Validation

Validate the public hostname using:

<span class="___xxxjie0 f1w7gpdv f1gqqdtu" data-wra="1" style="opacity: 1; transition: opacity 500ms ease-out;">[Open Nextcloud](https://cloud.bytek.ca/)</span>

Expected behavior:

<div id="bkmrk-valid-let%E2%80%99s-encrypt-" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Valid Let’s Encrypt certificate.
- Redirect to the Nextcloud login page when unauthenticated.
- Secure session cookies.
- HTTPS links.
- Authentik login option.

</div>A browser cache previously caused a Firefox TLS error while Edge worked.

Before changing Traefik or certificates, test:

<div id="bkmrk-another-browser.-pri" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Another browser.
- Private mode.
- Browser DNS cache.
- Browser socket cache.
- DNS over HTTPS.
- Operating-system DNS.

---

</div>## Monitoring

Recommended Uptime Kuma monitors include:

<div id="bkmrk-monitor-target-nextc" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;"><div aria-expanded="false" class="___5wvz9a0 ftgm304 f1oy3dpc fm6nont f48hbct" data-stable-ignore="true" data-tabster="{"restorer":{"type":1}}" role="presentation" tabindex="0"><div class="___1dmoc29 f10pi13n ftgm304 f1enuhaj fdclmfp f1nbblvp fat0sn4 f1ov4xf1 fekwl8i f1lmfglv f1oz7aqm f1abmfm4 f1w619qj f16h0jq8"><table class="___1vyiefv f1ddd56o f16vktn6 f1ahpp82 f11qra4b f1uinfot fibjyge fvueend f9yszdx f1fu4s3n f3l3pb3 f10ghnd0 f8fmt76 fjvbh62 f1qrqxae f1vw5qpk fc02sbz fxawf59 fymf513 f1aoyrul f1el8yx3 f1pymoxg f1ofu761 fe6itr f7coize f1794535 f1o0pw0q fbjjl9v fk1v6el f16pyhcb f1ixlhx9 f12zef0i flu5r5u f19haqzy f1owmcxx f1oddm8q f1004tna fcoaxci fh0ee9u f15v23i2 f1dmj53 f1r1gcv9 f14z1veh ffufd3x f1ypplot f1660cg"><tbody><tr><th>Monitor</th><th>Target</th></tr><tr><td>Nextcloud VM</td><td>Ping `192.168.2.100`</td></tr><tr><td>Nextcloud AIO Apache</td><td>TCP `192.168.2.100:11000`</td></tr><tr><td>Nextcloud Through Traefik</td><td>`https://cloud.bytek.ca/status.php`</td></tr><tr><td>Nextcloud certificate</td><td>`cloud.bytek.ca`</td></tr><tr><td>AIO management</td><td>Optional private monitor on TCP 8080</td></tr></tbody></table>

</div></div></div>Expected routed status:

<div id="bkmrk-http-200." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- HTTP 200.

</div>The Nextcloud VM firewall must allow Uptime Kuma if direct monitoring is used.

<div id="bkmrk--30" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Firewall Policy

### AIO Management

Allow TCP port 8080 only from approved LAN or VPN management sources.

### AIO Apache Backend

Allow TCP port 11000 from:

<div id="bkmrk-traefik-at-192.168.2" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Traefik at `192.168.2.182`.
- Uptime Kuma at `192.168.2.115` only if direct backend monitoring is used.

</div>### SSH

Allow SSH only from approved LAN or VPN administration sources.

### Public Exposure

Do not publicly forward:

<div id="bkmrk-tcp-8080.-tcp-11000." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- TCP 8080.
- TCP 11000.
- TCP 8443.
- Docker ports.
- Database ports.
- Redis ports.

---

</div>## Backup Architecture

The AIO Borg backup location is currently not configured.

This is intentional because the currently available local destinations are not sufficiently separate from the live data or existing Proxmox backup.

Current backup protection consists of:

<div id="bkmrk-proxmox-backup-of-th" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Proxmox backup of the 64 GB operating-system disk.
- Proxmox backup of the 500 GB data disk.
- Backup archive stored on the dedicated 4 TB HDD.

</div>An AIO Borg repository placed on the same Nextcloud data disk would not protect against failure of that disk.

It would also cause the Proxmox backup to contain both live data and an embedded Borg backup copy.

<div id="bkmrk--31" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Future AIO Backup

A future AIO Borg repository should use:

<div id="bkmrk-another-physical-com" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Another physical computer.
- A remote Borg server.
- A dedicated storage device not included in the Nextcloud VM.
- A trusted remote host.
- A dedicated future backup platform.

</div>A remote AIO backup would add an application-aware recovery method alongside Proxmox’s whole-VM backup.

The separate location is more important than simply enabling the backup field.

<div id="bkmrk--32" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Proxmox Backup Coverage

Both Nextcloud virtual disks must be included in the Proxmox backup.

Review the VM configuration using:

`qm config <NEXTCLOUD_VMID>`

Confirm the operating-system disk and data disk do not contain:

<div id="bkmrk-backup%3D0" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `backup=0`

</div>The initial consistent baseline may use a stopped backup.

Routine backups may use snapshot mode if brief application downtime is undesirable.

<div id="bkmrk--33" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Restore Testing

A Nextcloud restore test must avoid creating a duplicate live instance.

Recommended procedure:

<div id="bkmrk-restore-the-backup-u" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Restore the backup under a new VM ID.
2. Disconnect the restored VM network adapter.
3. Start the VM using the Proxmox console.
4. Confirm the operating-system disk.
5. Confirm the data disk.
6. Confirm `/mnt/nextcloud-data`.
7. Confirm Docker.
8. Confirm the AIO containers.
9. Confirm user files exist.
10. Shut down and delete the restored test VM.

</div>Do not connect the restored clone to the production LAN while the live Nextcloud VM is active.

<div id="bkmrk--34" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Data Growth

Monitor Nextcloud growth using:

`df -h /mnt/nextcloud-data`

Review directory usage using:

`sudo du -sh /mnt/nextcloud-data/ncdata`

Monitor the Proxmox `user-data` thin pool using:

`pvesm status`

Also review LVM-thin data and metadata utilization.

Storage monitoring must account for:

<div id="bkmrk-user-uploads.-file-v" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- User uploads.
- File versions.
- Deleted-file retention.
- Application data.
- Previews.
- Office files.
- Shared folders.
- Future photo libraries.

---

</div>## Security Considerations

<div id="bkmrk-nextcloud-is-availab" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Nextcloud is available only through HTTPS.
- Traefik is explicitly trusted.
- AIO management remains private.
- The local administrator is preserved.
- Normal users authenticate through Authentik.
- MFA is handled by Authentik.
- Public registration is reviewed.
- Application installation is controlled.
- Optional containers are added deliberately.
- Backend ports remain private.
- SMTP credentials remain secret.
- Proxmox backups cover both disks.
- File sharing settings are reviewed.
- Administrative roles are assigned intentionally.

---

</div>## Common Failure Scenarios

### AIO Management Loads but Nextcloud Does Not

Check:

<div id="bkmrk-aio-child-containers" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- AIO child containers.
- Apache container.
- TCP port 11000.
- Traefik route.
- Nextcloud application log.
- Database and Redis.

</div>### Direct Backend Works but Public Hostname Fails

Check:

<div id="bkmrk-pi-hole.-traefik-rou" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Pi-hole.
- Traefik router.
- Certificate.
- Public DNS.
- VPS.
- WireGuard.
- Browser cache.

</div>### Public Hostname Works but OIDC Fails

Check:

<div id="bkmrk-authentik-readiness." style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Authentik readiness.
- OIDC discovery.
- Client ID and secret.
- Redirect URI.
- Scope mappings.
- Container DNS.
- Authentik policies.
- Nextcloud log.

</div>### Discovery Endpoint Not Reachable

Check DNS inside the Nextcloud container.

Use:

`sudo docker exec nextcloud-aio-nextcloud getent hosts portal.bytek.ca`

No output indicates container DNS failure.

After confirming Pi-hole, restart the AIO containers or Docker as appropriate.

### User Is Denied by Authentik

Check the Nextcloud Authentik application bindings.

Expected requirements:

<div id="bkmrk-bytek-users-allow-by" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `bytek-users`
- `Allow bytek.ca users`

</div>Do not require `bytek-admin` for all Nextcloud users.

### Wrong Time Display

Confirm:

<div id="bkmrk-debian-host-time-zon" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Debian host time zone is `America/Toronto`.
- AIO time zone is `America/Toronto`.
- UTC clock is synchronized.
- NTP is active.

</div>### Data Disk Missing

Do not start normal application use until the data disk is mounted.

Check:

<div id="bkmrk-lsblk-findmnt-%2Fetc%2Ff" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- `lsblk`
- `findmnt`
- `/etc/fstab`
- Filesystem UUID
- Proxmox virtual disk

---

</div>## Power-Failure Recovery

After a power interruption:

<div id="bkmrk-confirm-proxmox.-con" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Confirm Proxmox.
2. Confirm Pi-hole.
3. Confirm the WireGuard gateway.
4. Confirm Authentik.
5. Confirm Traefik.
6. Confirm the Nextcloud VM owns `192.168.2.100`.
7. Confirm the user-data disk.
8. Confirm `/mnt/nextcloud-data`.
9. Confirm Docker.
10. Open AIO management by private IP.
11. Confirm the AIO master container.
12. Confirm PostgreSQL.
13. Confirm Redis.
14. Confirm Nextcloud.
15. Confirm Apache.
16. Confirm Collabora.
17. Test TCP port 11000.
18. Test `cloud.bytek.ca`.
19. Test Authentik login.
20. Test a file download.

</div>If container DNS remains broken after Pi-hole recovery, restart the affected containers in a controlled manner.

<div id="bkmrk--35" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">---

</div>## Recovery Procedure

If the Nextcloud application is unavailable:

<div id="bkmrk-use-the-proxmox-cons" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Use the Proxmox console or SSH.
2. Confirm the VM address.
3. Confirm the data-disk mount.
4. Confirm free disk space.
5. Confirm Docker.
6. Open the AIO interface.
7. Review container states.
8. Review master-container logs.
9. Review the failing child-container log.
10. Test the local backend.
11. Test the Traefik route.
12. Test the public route.
13. Use the local administrator if Authentik is unavailable.
14. Restore only after identifying the failure.

</div>If the data disk is damaged:

<div id="bkmrk-stop-the-aio-contain" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">1. Stop the AIO containers.
2. Avoid writing to the damaged filesystem.
3. Review filesystem and device health.
4. Identify the latest valid Proxmox backup.
5. Restore both the OS and data disks.
6. Test the restored VM offline.
7. Reconnect only after validation.

---

</div>## Validation Checklist

<div id="bkmrk-nextcloud-vm-owns-19" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- Nextcloud VM owns `192.168.2.100`.
- Operating-system disk is available.
- User-data disk is mounted at `/mnt/nextcloud-data`.
- Nextcloud data directory exists.
- Docker is active.
- AIO master container is healthy.
- PostgreSQL is running.
- Redis is running.
- Nextcloud is running.
- Apache is running on TCP 11000.
- Collabora is running.
- Traefik can reach TCP 11000.
- `cloud.bytek.ca` has a valid certificate.
- Authentik login works.
- Local administrator login works.
- File upload works.
- File download works.
- Collaborative editing works.
- SMTP test works.
- Uptime Kuma reports healthy.
- Both VM disks are included in backup.
- Offline restore test has been completed.
- AIO management is not publicly exposed.

---

</div>## Document Control

<div id="bkmrk-owner%3A-bryan-gagne-p" style="font-family: 'Segoe UI'; font-size: 14px; font-style: normal; font-weight: 400; line-height: 20px;">- **Owner:** Bryan Gagne-Plante
- **Private address:** `192.168.2.100`
- **Public hostname:** `cloud.bytek.ca`
- **AIO management port:** TCP 8080
- **Traefik backend port:** TCP 11000
- **Deployment directory:** `/opt/nextcloud-aio`
- **Operating-system disk:** 64 GB on `local-lvm`
- **User-data disk:** 500 GB on `user-data`
- **Data mount:** `/mnt/nextcloud-data`
- **Data directory:** `/mnt/nextcloud-data/ncdata`
- **Authentication:** Authentik OIDC
- **OIDC application:** OpenID Connect user backend
- **Office integration:** AIO-managed Collabora
- **AIO backup repository:** Not configured
- **Proxmox VM ID:** Confirm current VM ID
- **Last verified:** YYYY-MM-DD
- **Last OIDC test:** YYYY-MM-DD
- **Last collaborative-editing test:** YYYY-MM-DD
- **Last SMTP test:** YYYY-MM-DD
- **Last backup test:** YYYY-MM-DD
- **Last restore test:** YYYY-MM-DD
- **Known limitations:** No separate remote AIO Borg repository and no offsite backup copy

</div>