๐ŸŽฏ New! Master certifications with Performance-Based Questions (PBQ) โ€” realistic hands-on practice for CompTIA & Cisco exams!

The Ultimate Guide to Self-Hosting Nextcloud in 2025

Published on January 12, 2025


1. Introduction

1.1 What is Nextcloud?

Nextcloud is a powerful, open-source, self-hosted productivity platform that provides a suite of client-server software for creating and using file hosting services. Think of it as your personal alternative to Google Drive, Dropbox, Google Photos, and Microsoft 365 โ€” but one where you own and control all your data.

Key Features:

  • File Storage & Sync: Store files and sync them across all your devices
  • Photo Management: View and organize photos with timeline galleries (via Memories app)
  • Calendar & Contacts: CalDAV and CardDAV support for syncing calendars and contacts
  • Document Collaboration: Real-time collaborative editing with Nextcloud Office
  • Video Conferencing: Nextcloud Talk for secure video calls and chat
  • Email Client: Integrated webmail with Nextcloud Mail
  • Extensibility: Over 400+ apps in the App Store for additional functionality

1.2 Current Nextcloud Versions (January 2025)

VersionHub NameRelease DateStatus
32.0.xHub 25 AutumnSeptember 2025Latest Stable
31.0.xHub 10February 2025Stable
30.0.xHub 9September 2024Maintenance
29.0.xHub 8April 2024End of Life

[!NOTE] This guide uses stable Docker images and is compatible with Nextcloud 30+ versions. Always check the official changelog for the latest updates.

1.3 Why Self-Host?

BenefitDescription
Data OwnershipYour files never leave your control
PrivacyNo third-party scanning or data mining
No Storage LimitsLimited only by your hardware
Cost SavingsOne-time hardware cost vs recurring subscriptions
CustomizationFull control over features and integrations
LearningValuable experience with server administration

1.4 What This Guide Covers

This comprehensive guide will walk you through:

  1. System Requirements โ€” Hardware and software prerequisites
  2. Deployment Options โ€” Comparing AIO vs Docker Compose
  3. Docker Installation โ€” Step-by-step for Windows, macOS, and Linux
  4. Secure Remote Access โ€” Setting up Tailscale or Cloudflare Tunnel
  5. Nextcloud Deployment โ€” Complete Docker Compose stack configuration
  6. Initial Configuration โ€” Essential post-installation setup
  7. Photo Management โ€” Configuring the Memories app
  8. Security Hardening โ€” Best practices for protecting your instance
  9. Backup & Restore โ€” Comprehensive backup strategies
  10. Maintenance โ€” Updates, monitoring, and performance tuning
  11. Troubleshooting โ€” Common issues and solutions

2. System Requirements

2.1 Hardware Requirements

Minimum Requirements (1-5 Users, Basic Usage)

ComponentMinimumRecommended
CPU2 cores (x86_64)4+ cores
RAM4 GB8 GB
Storage (OS/Apps)32 GB SSD128 GB+ SSD/NVMe
Storage (Data)100 GBBased on needs
Network10 Mbps100+ Mbps
ComponentRecommendedOptimal
CPU4 cores8+ cores
RAM8 GB16-32 GB
Storage (OS/Apps)256 GB NVMe512 GB+ NVMe
Storage (Data)1 TB+RAID array or NAS
Network100 Mbps1 Gbps

[!IMPORTANT] SSD/NVMe is highly recommended for the OS, database, and Nextcloud installation. Using an HDD for these components will result in significantly slower performance. HDDs can be used for bulk media storage via external storage mounting.

RAM Planning Guide

Use CaseRecommended RAM
Basic file sync only4 GB
+ Office apps (Collabora/OnlyOffice)8 GB
+ Photo management (Memories)8-12 GB
+ AI features (Recognize/Face Recognition)16+ GB
+ Video transcoding16-32 GB

2.2 Supported Operating Systems

For Docker Host (Server)

  • Linux: Debian 12+, Ubuntu 22.04+, Fedora 39+, Rocky Linux 9+, openSUSE
  • Windows: Windows 10/11 Pro/Enterprise/Education with WSL2
  • macOS: macOS 12 (Monterey) or later

Client Devices

  • Android 8.0+
  • iOS 15.0+
  • Windows 10/11
  • macOS 10.15+
  • Linux (various distributions)

2.3 Network Requirements

PortProtocolPurposeRequired
80TCPHTTP (redirect to HTTPS)Optional
443TCP/UDPHTTPS, HTTP/3Yes
22TCPSSH (server management)Yes

[!TIP] When using Tailscale or Cloudflare Tunnel, you do not need to open ports 80/443 on your routerโ€™s firewall. These solutions create secure tunnels that bypass traditional port forwarding.


3. Deployment Options Comparison

Before starting installation, choose your deployment method. This guide covers both options in detail.

3.1 Nextcloud All-in-One (AIO)

Best for: Beginners, small deployments, those wanting minimal configuration

Nextcloud AIO bundles Nextcloud with all dependencies (database, caching, web server) into a single, managed container ecosystem with a web-based control panel.

ProsCons
โœ… Very easy setup via web UIโŒ Less flexibility/customization
โœ… Automatic updates & backupsโŒ Uses PostgreSQL only (no MariaDB)
โœ… Includes Collabora, Talk HPB, ClamAVโŒ May lag behind latest NC versions
โœ… Preconfigured optimizationsโŒ Higher resource usage
โœ… Official Nextcloud supportโŒ Complex reverse proxy setup

3.2 Docker Compose (Individual Containers)

Best for: Experienced users, custom requirements, existing Docker infrastructure

This method uses separate containers for each service, giving you granular control over every component.

ProsCons
โœ… Maximum flexibilityโŒ More complex initial setup
โœ… Choose any database (MariaDB/PostgreSQL)โŒ Manual backup configuration
โœ… Latest versions immediatelyโŒ More maintenance required
โœ… Lower resource footprintโŒ Security tuning is manual
โœ… Easier integration with existing stacksโŒ Steeper learning curve

3.3 Recommendation

If you areโ€ฆChoose
New to self-hosting/DockerAIO
Comfortable with command lineDocker Compose
Need specific database/versionsDocker Compose
Want set-and-forget solutionAIO
Running multiple Docker servicesDocker Compose

[!NOTE] This guide primarily focuses on the Docker Compose approach as it provides more learning opportunities and flexibility. For AIO installation, refer to the official Nextcloud AIO GitHub repository.


4. Installing Docker

Docker is required for both deployment methods. Follow the instructions for your operating system.

4.1 Linux (Debian/Ubuntu)

These commands work for Debian 12+, Ubuntu 22.04+, and derivatives like Linux Mint.

Step 1: Update System Packages

# Update package lists and upgrade existing packages
sudo apt update && sudo apt upgrade -y

What this does: Ensures your system has the latest security patches and package information before installing new software.

Step 2: Install Prerequisites

# Install required packages for adding Docker's repository
sudo apt install -y ca-certificates curl gnupg lsb-release

Package purposes:

  • ca-certificates: SSL/TLS certificate authorities for secure downloads
  • curl: Command-line tool for downloading files
  • gnupg: GPG encryption for verifying package signatures
  • lsb-release: Provides Linux distribution information

Step 3: Add Dockerโ€™s Official GPG Key

# Create directory for apt keyrings
sudo install -m 0755 -d /etc/apt/keyrings

# Download and add Docker's GPG key
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | 
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Set correct permissions
sudo chmod a+r /etc/apt/keyrings/docker.gpg

What this does: Adds Dockerโ€™s cryptographic key to verify that packages are genuine and havenโ€™t been tampered with.

Step 4: Add Docker Repository

# Add Docker's official apt repository
echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]   https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")   $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Update package lists with new repository
sudo apt update

What this does: Configures your system to download Docker packages from Dockerโ€™s official repository instead of potentially outdated distribution packages.

Step 5: Install Docker Engine

# Install Docker and all required components
sudo apt install -y docker-ce docker-ce-cli containerd.io 
  docker-buildx-plugin docker-compose-plugin

Components installed:

  • docker-ce: Docker Community Edition engine
  • docker-ce-cli: Command-line interface
  • containerd.io: Container runtime
  • docker-buildx-plugin: Extended build capabilities
  • docker-compose-plugin: Multi-container orchestration

Step 6: Add User to Docker Group

# Add current user to docker group (avoids needing sudo for docker commands)
sudo usermod -aG docker $USER

# Apply group changes (or log out and back in)
newgrp docker

[!WARNING] You must log out and log back in (or run newgrp docker) for group changes to take effect. SSH users should close and reopen their connection.

Step 7: Verify Installation

# Check Docker version
docker --version

# Check Docker Compose version
docker compose version

# Run test container
docker run hello-world

Expected output: Version numbers for Docker and Compose, followed by โ€œHello from Docker!โ€ message.


4.2 Windows (Docker Desktop with WSL2)

Docker Desktop for Windows uses WSL2 (Windows Subsystem for Linux) for optimal performance.

Prerequisites

  • Windows 10 version 2004+ (Build 19041+) or Windows 11
  • 64-bit processor with SLAT support
  • Hardware virtualization enabled in BIOS/UEFI
  • Minimum 4 GB RAM (8 GB+ recommended)

Step 1: Enable WSL2

Open PowerShell as Administrator and run:

# Enable WSL feature
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# Enable Virtual Machine Platform
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Restart your computer after these commands.

Step 2: Set WSL2 as Default

After restart, open PowerShell as Administrator:

# Set WSL2 as the default version
wsl --set-default-version 2

# Update WSL to latest version
wsl --update

# Verify WSL version
wsl --version
# List available distributions
wsl --list --online

# Install Ubuntu (recommended)
wsl --install -d Ubuntu

Step 4: Download and Install Docker Desktop

  1. Download Docker Desktop from docker.com/products/docker-desktop
  2. Run the installer (Docker Desktop Installer.exe)
  3. Important: Ensure โ€œUse WSL 2 instead of Hyper-Vโ€ is checked during installation
  4. Complete the installation and restart if prompted

Step 5: Configure Docker Desktop

  1. Launch Docker Desktop from the Start Menu
  2. Accept the license agreement
  3. Go to Settings โ†’ General:
    • Ensure โ€œUse the WSL 2 based engineโ€ is checked
  4. Go to Settings โ†’ Resources โ†’ WSL Integration:
    • Enable integration with your installed Linux distribution
  5. Click Apply & Restart

Step 6: Verify Installation

Open PowerShell or Windows Terminal:

# Check Docker version
docker --version

# Check Docker Compose version
docker compose version

# Run test container
docker run hello-world

[!TIP] For server-like workloads, you can run Docker commands from within WSL2 (Ubuntu). Open Windows Terminal, select your Ubuntu profile, and run Docker commands there for a more Linux-like experience.


4.3 macOS (Docker Desktop)

Docker Desktop for macOS has native support for Apple Silicon (M1/M2/M3/M4) Macs.

Prerequisites

  • macOS 12 (Monterey) or later
  • Minimum 4 GB RAM (8 GB+ recommended)
  • Apple Silicon or Intel processor

Step 1: Download Docker Desktop

  1. Go to docker.com/products/docker-desktop
  2. Click Download for Mac
  3. Important: Select the correct version:
    • Apple Silicon for M1/M2/M3/M4 Macs
    • Intel for older Intel-based Macs

Step 2: Install Docker Desktop

  1. Open the downloaded .dmg file
  2. Drag the Docker icon to the Applications folder
  3. Open Docker from Applications or Spotlight (Cmd+Space, type โ€œDockerโ€)
  4. Accept the license agreement when prompted
  5. Enter your Mac password if requested for privileged access

Step 3: Install Rosetta 2 (Apple Silicon Only)

For best compatibility on Apple Silicon Macs:

# Install Rosetta 2 for x86 emulation
softwareupdate --install-rosetta

Step 4: Verify Installation

Open Terminal and run:

# Check Docker version
docker --version

# Check Docker Compose version
docker compose version

# Run test container
docker run hello-world

Alternative: Install via Homebrew

# Install Docker Desktop using Homebrew
brew install --cask docker

# Launch Docker Desktop (required for first-time setup)
open /Applications/Docker.app

5. Secure Remote Access Options

Before deploying Nextcloud, decide how youโ€™ll access it remotely. This guide uses Tailscale for its simplicity and security, but Cloudflare Tunnel is an excellent alternative.

5.1 Comparison: Tailscale vs Cloudflare Tunnel

FeatureTailscaleCloudflare Tunnel
ArchitecturePeer-to-peer mesh VPNTraffic through Cloudflare
Port ForwardingNot requiredNot required
Client RequiredYes, on all devicesNo (web access)
Protocol SupportAll (TCP, UDP, ICMP)HTTP/HTTPS, SSH, RDP
Best ForFull network accessPublic web services
PrivacyEnd-to-end encryptedTraffic passes through CF
Domain RequiredNo (MagicDNS)Yes (on Cloudflare)
Free Tier3 users, 100 devicesGenerous, unlimited tunnels

5.2 Setting Up Tailscale

Tailscale creates a secure, private network (called a โ€œtailnetโ€) between your devices using the WireGuard protocol. Your Nextcloud server and client devices become part of this network.

Step 1: Create a Tailscale Account

  1. Go to tailscale.com
  2. Click Get Started or Log In
  3. Sign in with Google, Microsoft, GitHub, or your email

Step 2: Install Tailscale on Your Server

Linux (Debian/Ubuntu):

# Install Tailscale using the official script
curl -fsSL https://tailscale.com/install.sh | sh

# Verify installation
tailscale --version

Windows:

  1. Download the installer from tailscale.com/download
  2. Run the installer and follow the prompts
  3. Sign in when Tailscale opens

macOS:

# Install via Homebrew
brew install --cask tailscale

# Or download from the Mac App Store or tailscale.com/download

Step 3: Connect Server to Your Tailnet

# Start Tailscale and authenticate
sudo tailscale up

# Optional: Advertise local network routes (replace with YOUR subnet)
# sudo tailscale up --advertise-routes=192.168.1.0/24

What happens: A URL will be displayed. Open it in a browser, log in to your Tailscale account, and authorize the device.

Step 4: Get Your Serverโ€™s Tailscale Information

# Verify connection status
tailscale status

# Get your Tailscale IP address (starts with 100.x.x.x)
tailscale ip -4

Important: Note down:

  • Tailscale IP: e.g., 100.64.0.1
  • MagicDNS Name: e.g., my-server.tail1234.ts.net (find this in Tailscale Admin Console)

To find your MagicDNS name:

  1. Go to login.tailscale.com/admin/machines
  2. Find your server in the list
  3. Note the full DNS name (e.g., my-server.your-tailnet.ts.net)

Step 5: Install Tailscale on Client Devices

Install Tailscale on every device that needs to access Nextcloud:

Sign in with the same account used for your server.

[!TIP] Once connected, all your Tailscale devices can communicate directly using their Tailscale IPs or MagicDNS names, completely bypassing your routerโ€™s firewall.

5.3 Alternative: Cloudflare Tunnel (Brief Overview)

If you prefer web-based access without client software, Cloudflare Tunnel is an excellent choice.

Requirements:

  • A domain name (you own or can transfer to Cloudflare)
  • Free Cloudflare account

Basic Setup:

  1. Add your domain to Cloudflare
  2. Install cloudflared on your server:
    # Debian/Ubuntu
    curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloudflare-main.gpg
    echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
    sudo apt update && sudo apt install cloudflared -y
  3. Authenticate: cloudflared tunnel login
  4. Create tunnel: cloudflared tunnel create nextcloud
  5. Configure routes in ~/.cloudflared/config.yml
  6. Run as service: cloudflared service install

[!WARNING] Cloudflareโ€™s Terms of Service may prohibit streaming video content. Using Cloudflare Tunnel for applications like Jellyfin or Plex could result in account suspension. Tailscale has no such restrictions.


6. Docker Compose Deployment

This section covers deploying Nextcloud with Docker Compose using individual containers for maximum control and flexibility.

6.1 Architecture Overview

Our stack consists of five containers:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Your Network                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚ HTTPS (443)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              Caddy (Reverse Proxy)                       โ”‚
โ”‚         Handles HTTPS, SSL certificates                  โ”‚
โ”‚                   172.20.0.2                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚ HTTP (80)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚            Nextcloud (Apache/PHP)                        โ”‚
โ”‚              Main application                            โ”‚
โ”‚                   172.20.0.3                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                                 โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚    MariaDB      โ”‚               โ”‚     Redis       โ”‚
โ”‚    Database     โ”‚               โ”‚     Cache       โ”‚
โ”‚   172.20.0.4    โ”‚               โ”‚   172.20.0.5    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Components:

  • Caddy: Modern web server/reverse proxy with automatic HTTPS
  • Nextcloud: The main application (Apache variant)
  • MariaDB: MySQL-compatible database for metadata storage
  • Redis: In-memory cache for improved performance

6.2 Create Project Structure

All platforms use these commands (run in PowerShell for Windows, Terminal for macOS/Linux):

Linux/macOS:

# Create main project directory
sudo mkdir -p /srv/nextcloud-stack
cd /srv/nextcloud-stack

# Create subdirectories for persistent data
sudo mkdir -p nextcloud_data mariadb_data mariadb_config
sudo mkdir -p caddy_data caddy_config caddy_certs

# Set ownership for Nextcloud data (UID 33 = www-data inside container)
sudo chown -R 33:33 /srv/nextcloud-stack/nextcloud_data

Windows (PowerShell as Administrator):

# Create project directory structure
$basePath = "C:DockerData\nextcloud-stack"
New-Item -ItemType Directory -Force -Path $basePath
Set-Location $basePath

# Create subdirectories
$dirs = @("nextcloud_data", "mariadb_data", "mariadb_config", 
          "caddy_data", "caddy_config", "caddy_certs")
foreach ($dir in $dirs) {
    New-Item -ItemType Directory -Force -Path "$basePath$dir"
}

[!NOTE] For Windows users: Docker Desktop handles permissions automatically via WSL2. The Linux permission commands are not needed.

6.3 Create Environment File

The .env file stores sensitive credentials. Never commit this file to version control.

Create the file:

Linux/macOS:

sudo nano /srv/nextcloud-stack/.env

Windows (PowerShell):

notepad C:DockerData\nextcloud-stack.env

Add the following content (replace placeholders with your own strong passwords):

# Database Configuration
MYSQL_ROOT_PASSWORD=YOUR_STRONG_ROOT_PASSWORD_HERE
MYSQL_DATABASE=nextcloud_db
MYSQL_USER=nextcloud_user
MYSQL_PASSWORD=YOUR_STRONG_DB_PASSWORD_HERE

# Timezone (find yours: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
TZ=UTC

# Your Tailscale Information (update with YOUR values)
TAILSCALE_IP=100.x.x.x
TAILSCALE_DOMAIN=your-server.your-tailnet.ts.net

Secure the file (Linux/macOS only):

sudo chmod 600 /srv/nextcloud-stack/.env

[!IMPORTANT] Generate strong passwords using a password manager or this command:

openssl rand -base64 24

6.4 Create MariaDB Configuration

This configuration optimizes MariaDB for Nextcloud and enables database triggers required by some apps.

Create the configuration file:

Linux/macOS:

sudo nano /srv/nextcloud-stack/mariadb_config/custom.cnf

Windows:

notepad C:DockerData\nextcloud-stackmariadb_configcustom.cnf

Add the following content:

[mysqld]
# Adjust based on available RAM:
# - 4GB RAM: 256M
# - 8GB RAM: 512M-1G
# - 16GB+ RAM: 1G-2G
innodb_buffer_pool_size = 1G

# Required for Nextcloud Memories and other apps that use triggers
log_bin_trust_function_creators = 1

# Performance optimizations
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

6.5 Generate SSL Certificate

For Tailscale access, weโ€™ll create a self-signed certificate that works with MagicDNS.

Navigate to certs directory:

Linux/macOS:

cd /srv/nextcloud-stack/caddy_certs

Windows (PowerShell):

Set-Location C:DockerData\nextcloud-stackcaddy_certs

Create OpenSSL configuration:

Create a file named openssl.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = your-server.your-tailnet.ts.net

[v3_req]
basicConstraints = CA:TRUE
nsCertType = server
keyUsage = digitalSignature, keyEncipherment, keyCertSign
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = your-server.your-tailnet.ts.net
IP.1 = 100.x.x.x

[!IMPORTANT] Replace your-server.your-tailnet.ts.net with YOUR actual MagicDNS name and 100.x.x.x with YOUR Tailscale IP.

Generate the certificate:

Linux/macOS:

sudo openssl req -x509 -nodes -newkey rsa:2048 
  -keyout private.key -out certificate.crt 
  -days 3650 -config openssl.cnf -extensions v3_req

Windows (PowerShell):

openssl req -x509 -nodes -newkey rsa:2048 `
  -keyout private.key -out certificate.crt `
  -days 3650 -config openssl.cnf -extensions v3_req

[!TIP] Windows users: If openssl is not found, install it via choco install openssl (Chocolatey) or winget install OpenSSL. Alternatively, use Git Bash which includes OpenSSL.

Return to project directory:

cd /srv/nextcloud-stack   # Linux/macOS
# or
Set-Location C:DockerDatanextcloud-stack   # Windows

6.6 Create Caddyfile

Caddy serves as our reverse proxy, handling HTTPS and forwarding requests to Nextcloud.

Create the Caddyfile:

# Replace these with YOUR actual values
your-server.your-tailnet.ts.net, 100.x.x.x {
    # Use our self-signed certificate
    tls /etc/caddy/certs/certificate.crt /etc/caddy/certs/private.key

    # Security headers
    header Strict-Transport-Security "max-age=15552000;"

    # CalDAV/CardDAV discovery redirects
    redir /.well-known/carddav /remote.php/dav 301
    redir /.well-known/caldav /remote.php/dav 301
    redir /.well-known/webfinger /index.php/.well-known/webfinger 301
    redir /.well-known/nodeinfo /index.php/.well-known/nodeinfo 301

    # Reverse proxy to Nextcloud
    reverse_proxy http://app:80 {
        header_up Host {http.request.host}
        header_up X-Real-IP {http.request.remote.host}
        header_up X-Forwarded-Proto {http.request.scheme}
        header_up X-Forwarded-For {http.request.remote.host}
    }
}

# HTTP to HTTPS redirect
http://your-server.your-tailnet.ts.net, http://100.x.x.x {
    redir https://{host}{uri} permanent
}

Save this file as Caddyfile in your project directory.

6.7 Create Docker Compose File

This is the main configuration file that defines all containers.

Create docker-compose.yml:

services:
  # Nextcloud Application
  app:
    image: nextcloud:30-apache
    container_name: nextcloud_app
    restart: always
    volumes:
      - nextcloud_config:/var/www/html/config
      - nextcloud_custom_apps:/var/www/html/custom_apps
      - nextcloud_themes:/var/www/html/themes
      - ./nextcloud_data:/var/www/html/data
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - REDIS_HOST=redis
      - OVERWRITEPROTOCOL=https
      - PHP_MEMORY_LIMIT=1G
      - PHP_UPLOAD_LIMIT=16G
      - TZ=${TZ}
      - TRUSTED_PROXIES=172.20.0.2
    extra_hosts:
      - "${TAILSCALE_DOMAIN}:172.20.0.2"
    depends_on:
      - db
      - redis
      - caddy
    networks:
      nextcloud_network:
        ipv4_address: 172.20.0.3

  # MariaDB Database
  db:
    image: mariadb:11.4
    container_name: nextcloud_db
    restart: always
    command: >
      --transaction-isolation=READ-COMMITTED
      --log-bin=binlog
      --binlog-format=ROW
      --log_bin_trust_function_creators=1
    volumes:
      - ./mariadb_data:/var/lib/mysql
      - ./mariadb_config:/etc/mysql/conf.d:ro
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TZ}
    networks:
      nextcloud_network:
        ipv4_address: 172.20.0.4

  # Redis Cache
  redis:
    image: redis:7-alpine
    container_name: nextcloud_redis
    restart: always
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      nextcloud_network:
        ipv4_address: 172.20.0.5

  # Caddy Reverse Proxy
  caddy:
    image: caddy:2-alpine
    container_name: nextcloud_caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy_data:/data
      - ./caddy_config:/config
      - ./caddy_certs:/etc/caddy/certs:ro
    environment:
      - TZ=${TZ}
    networks:
      nextcloud_network:
        ipv4_address: 172.20.0.2

# Named volumes (managed by Docker)
volumes:
  nextcloud_config:
  nextcloud_custom_apps:
  nextcloud_themes:
  redis_data:

# Custom network with static IPs
networks:
  nextcloud_network:
    driver: bridge
    name: nextcloud_network
    ipam:
      config:
        - subnet: 172.20.0.0/16

Key configuration notes:

  • nextcloud:30-apache: Uses Nextcloud 30 with Apache (change version as needed)
  • mariadb:11.4: Current LTS version of MariaDB
  • redis:7-alpine: Lightweight Redis image
  • PHP_UPLOAD_LIMIT=16G: Allows large file uploads
  • Static IPs ensure consistent networking between containers

7. Starting and Accessing Nextcloud

7.1 Start the Docker Stack

Navigate to your project directory and start all containers:

Linux/macOS:

cd /srv/nextcloud-stack
docker compose up -d

Windows (PowerShell):

Set-Location C:DockerData\nextcloud-stack
docker compose up -d

What -d does: Runs containers in โ€œdetachedโ€ mode (background), freeing your terminal.

7.2 Monitor Startup Progress

# View logs from all containers
docker compose logs -f

# View logs from specific container
docker compose logs -f app

# Press Ctrl+C to stop viewing logs

Wait 1-2 minutes for all services to initialize. You should see log messages indicating services are ready.

7.3 Verify Containers Are Running

docker compose ps

Expected output: All containers should show status Up or running (healthy).

7.4 Initial Web Setup

  1. Connect via Tailscale: Ensure your client device has Tailscale active
  2. Open browser: Navigate to https://your-server.your-tailnet.ts.net
  3. Accept certificate warning: Since weโ€™re using a self-signed certificate, click โ€œAdvancedโ€ โ†’ โ€œProceedโ€ (or equivalent)
  4. Create admin account:
    • Enter your desired admin username
    • Create a strong password (save this securely!)
    • The database fields should auto-populate from your .env file
  5. Click โ€œInstallโ€: Wait for installation to complete (may take a few minutes)

[!TIP] Skip the โ€œInstall recommended appsโ€ prompt for nowโ€”weโ€™ll install specific apps manually for better control.


8. Initial Configuration

After installation, run these essential commands to configure Nextcloud properly.

8.1 Essential occ Commands

The occ (ownCloud console) command is Nextcloudโ€™s command-line tool for administration.

Navigate to project directory first:

cd /srv/nextcloud-stack  # Linux/macOS
# or
Set-Location C:DockerDatanextcloud-stack  # Windows

Set Trusted Domains

Replace placeholders with YOUR actual values:

# Add Tailscale IP as trusted domain
docker compose exec --user www-data app php occ config:system:set 
  trusted_domains 0 --value="YOUR_TAILSCALE_IP"

# Add MagicDNS name as trusted domain
docker compose exec --user www-data app php occ config:system:set 
  trusted_domains 1 --value="your-server.your-tailnet.ts.net"

Configure Reverse Proxy Settings

# Set the overwrite host
docker compose exec --user www-data app php occ config:system:set 
  overwritehost --value="your-server.your-tailnet.ts.net"

# Set overwrite protocol to HTTPS
docker compose exec --user www-data app php occ config:system:set 
  overwriteprotocol --value="https"

# Set CLI URL for background jobs
docker compose exec --user www-data app php occ config:system:set 
  overwrite.cli.url --value="https://your-server.your-tailnet.ts.net"

# Configure forwarded headers
docker compose exec --user www-data app php occ config:system:set 
  forwarded_for_headers 0 --value="HTTP_X_FORWARDED_FOR"

Configure Caching

# Enable Redis for file locking
docker compose exec --user www-data app php occ config:system:set 
  memcache.locking --value='\OC\Memcache\Redis'

# Verify Redis host is set
docker compose exec --user www-data app php occ config:system:set 
  redis host --value="redis"

docker compose exec --user www-data app php occ config:system:set 
  redis port --value=6379 --type=integer

Set Default Phone Region

Required for user profile settings (replace US with your 2-letter country code):

docker compose exec --user www-data app php occ config:system:set 
  default_phone_region --value="US"

Set Maintenance Window

Prevents heavy background jobs during peak hours (value is hour in 24h format, UTC):

docker compose exec --user www-data app php occ config:system:set 
  maintenance_window_start --type=integer --value=3

8.2 Apply Changes

docker compose restart app

8.3 Set Up Cron Jobs

Nextcloud requires periodic background tasks. Configure the host system to run them.

Linux (via crontab):

sudo crontab -e

Add this line:

*/5 * * * * docker exec --user www-data nextcloud_app php -f /var/www/html/cron.php

Windows (Task Scheduler):

  1. Open Task Scheduler
  2. Create Basic Task โ†’ Name: โ€œNextcloud Cronโ€
  3. Trigger: Daily, repeat every 5 minutes
  4. Action: Start a program
  5. Program: docker
  6. Arguments: exec --user www-data nextcloud_app php -f /var/www/html/cron.php

Enable Cron in Nextcloud:

  1. Log in as admin
  2. Go to Administration Settings โ†’ Basic settings
  3. Under โ€œBackground jobsโ€, select Cron

9. Memories App Setup

The Memories app transforms Nextcloud into a powerful photo management solution similar to Google Photos.

9.1 Install Dependencies

Install ffmpeg and ImageMagick for video/image processing:

# Update package list inside container
docker compose exec app apt update

# Install ffmpeg and ImageMagick
docker compose exec app apt install -y --no-install-recommends 
  ffmpeg libmagickwand-dev

# Install PHP ImageMagick extension
docker compose exec app pecl install imagick
docker compose exec app docker-php-ext-enable imagick

# Restart to load new extension
docker compose restart app

9.2 Verify Dependencies

# Check ImageMagick is loaded
docker compose exec app php -m | grep imagick

# Check ffmpeg is installed
docker compose exec app which ffmpeg ffprobe

Expected: imagick output and paths like /usr/bin/ffmpeg.

9.3 Install Nextcloud Apps

  1. Log in to Nextcloud as admin
  2. Click your profile icon โ†’ Apps
  3. Search and install:
    • Memories - Photo/video timeline and gallery
    • Preview Generator - Pre-generates thumbnails for faster loading
    • Recognize (optional) - AI-powered face/object recognition

9.4 Configure Memories

  1. Go to Administration Settings โ†’ Memories
  2. Verify File Support section shows no ffmpeg/ffprobe errors
  3. If errors appear, manually set paths:
    docker compose exec --user www-data app php occ config:app:set 
      memories ffmpeg --value="/usr/bin/ffmpeg"
    docker compose exec --user www-data app php occ config:app:set 
      memories ffprobe --value="/usr/bin/ffprobe"
  4. Under Performance, ensure โ€œDatabase triggersโ€ shows no warning
  5. Under Video Streaming, keep โ€œEnable transcodingโ€ unchecked unless you have powerful hardware

9.5 Run Initial Indexing

For large photo libraries, use screen or tmux to prevent disconnection:

# Start a screen session
screen -S indexing

# Run Memories indexing
docker compose exec --user www-data app php occ memories:index

# Generate previews (can take hours for large libraries)
docker compose exec --user www-data app php occ preview:generate-all -vv

# Detach from screen: Press Ctrl+A, then D
# Reattach later: screen -r indexing

10. Security Hardening

Protect your Nextcloud instance with these security best practices.

10.1 Enable Two-Factor Authentication

  1. Go to Apps โ†’ Search โ€œTwo-Factor TOTP Providerโ€ โ†’ Enable
  2. Go to Personal Settings โ†’ Security โ†’ Two-Factor Authentication
  3. Set up with an authenticator app (Google Authenticator, Authy, etc.)

[!IMPORTANT] Enable 2FA for ALL users, especially the admin account. Store backup codes securely.

10.2 Configure Brute-Force Protection

Nextcloud has built-in brute-force protection. Verify itโ€™s enabled:

docker compose exec --user www-data app php occ config:system:get 
  auth.bruteforce.protection.enabled

Should return true. If not:

docker compose exec --user www-data app php occ config:system:set 
  auth.bruteforce.protection.enabled --value=true --type=boolean

10.3 Install Fail2ban (Linux Servers)

Add additional protection at the OS level:

# Install fail2ban
sudo apt install fail2ban -y

# Create Nextcloud jail configuration
sudo nano /etc/fail2ban/jail.d/nextcloud.conf

Add:

[nextcloud]
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
logpath = /srv/nextcloud-stack/nextcloud_data/nextcloud.log
maxretry = 3
bantime = 3600
findtime = 600

Create filter:

sudo nano /etc/fail2ban/filter.d/nextcloud.conf

Add:

[Definition]
failregex = ^.*Login failed: .* (Remote IP: <HOST>.*$
            ^.*Trusted domain error.*Remote IP: <HOST>.*$
ignoreregex =

Restart fail2ban:

sudo systemctl restart fail2ban

10.4 Security Headers Check

Run the official security scan:

  1. Go to scan.nextcloud.com
  2. Enter your Nextcloud URL (must be publicly accessible or use Cloudflare Tunnel)
  3. Review and address any warnings

10.5 Additional Security Measures

MeasureImplementation
Strong passwordsEnforce password policy in Admin โ†’ Security
Regular updatesUpdate Nextcloud and apps monthly
Disable unused appsRemove apps you donโ€™t use
File encryptionEnable server-side encryption if needed
Audit loggingInstall โ€œAdmin Audit Logโ€ app
Login notificationsInstall โ€œSuspicious Loginโ€ app

11. Backup and Restore

11.1 The 3-2-1 Backup Rule

Follow this industry-standard backup strategy:

  • 3 copies of your data
  • 2 different storage media
  • 1 copy offsite

11.2 What to Back Up

ComponentLocationPriority
config folderDocker volume nextcloud_configCritical
data folder./nextcloud_dataCritical
DatabaseMariaDB containerCritical
custom_appsDocker volumeImportant
themesDocker volumeLow
Caddyfile + .env./Caddyfile, ./.envCritical
SSL certificates./caddy_certsImportant

11.3 Backup Script

Create a comprehensive backup script:

#!/bin/bash
# Nextcloud Backup Script
# Save as /srv/nextcloud-stack/backup.sh

set -e

# Configuration
BACKUP_DIR="/mnt/backups/nextcloud"
DATE=$(date +%Y%m%d_%H%M%S)
STACK_DIR="/srv/nextcloud-stack"
RETENTION_DAYS=30

# Create backup directory
mkdir -p "$BACKUP_DIR/$DATE"

cd "$STACK_DIR"

echo "Starting Nextcloud backup - $DATE"

# 1. Enable maintenance mode
echo "Enabling maintenance mode..."
docker compose exec --user www-data app php occ maintenance:mode --on

# 2. Backup database
echo "Backing up database..."
source .env
docker compose exec -T db mariadb-dump 
  --single-transaction 
  -u "$MYSQL_USER" 
  -p"$MYSQL_PASSWORD" 
  "$MYSQL_DATABASE" | gzip > "$BACKUP_DIR/$DATE/database.sql.gz"

# 3. Backup data directory
echo "Backing up data directory..."
tar -czf "$BACKUP_DIR/$DATE/nextcloud_data.tar.gz" 
  -C "$STACK_DIR" nextcloud_data

# 4. Backup config volume
echo "Backing up config..."
docker run --rm -v nextcloud-stack_nextcloud_config:/data 
  -v "$BACKUP_DIR/$DATE":/backup alpine 
  tar -czf /backup/nextcloud_config.tar.gz -C /data .

# 5. Backup configuration files
echo "Backing up stack configuration..."
cp .env "$BACKUP_DIR/$DATE/"
cp Caddyfile "$BACKUP_DIR/$DATE/"
cp docker-compose.yml "$BACKUP_DIR/$DATE/"
tar -czf "$BACKUP_DIR/$DATE/caddy_certs.tar.gz" -C "$STACK_DIR" caddy_certs

# 6. Disable maintenance mode
echo "Disabling maintenance mode..."
docker compose exec --user www-data app php occ maintenance:mode --off

# 7. Clean old backups
echo "Cleaning backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} ;

echo "Backup completed: $BACKUP_DIR/$DATE"

Make executable and schedule:

chmod +x /srv/nextcloud-stack/backup.sh

# Add to crontab (runs daily at 3 AM)
sudo crontab -e
# Add: 0 3 * * * /srv/nextcloud-stack/backup.sh >> /var/log/nextcloud-backup.log 2>&1

11.4 Restore Procedure

# 1. Stop containers
cd /srv/nextcloud-stack
docker compose down

# 2. Restore database
gunzip -c /path/to/backup/database.sql.gz | 
  docker compose exec -T db mysql -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"

# 3. Restore data directory
rm -rf nextcloud_data/*
tar -xzf /path/to/backup/nextcloud_data.tar.gz -C ./

# 4. Restore config volume
docker run --rm -v nextcloud-stack_nextcloud_config:/data 
  -v /path/to/backup:/backup alpine 
  sh -c "rm -rf /data/* && tar -xzf /backup/nextcloud_config.tar.gz -C /data"

# 5. Fix permissions
sudo chown -R 33:33 nextcloud_data

# 6. Start containers
docker compose up -d

# 7. Scan files
docker compose exec --user www-data app php occ files:scan --all
docker compose exec --user www-data app php occ maintenance:data-fingerprint

12. Maintenance and Updates

12.1 Updating Nextcloud

cd /srv/nextcloud-stack

# Pull latest images
docker compose pull

# Recreate containers with new images
docker compose up -d --remove-orphans

# Run upgrade command if needed
docker compose exec --user www-data app php occ upgrade

# Clear caches
docker compose exec --user www-data app php occ maintenance:repair

[!WARNING] Never skip major versions when upgrading (e.g., donโ€™t go from 28 to 30 directly). Upgrade one major version at a time.

12.2 Updating Host System

Linux:

sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y

12.3 Routine Maintenance Commands

# Check for missing indices
docker compose exec --user www-data app php occ db:add-missing-indices

# Check for missing columns
docker compose exec --user www-data app php occ db:add-missing-columns

# Convert columns to big int (for large installations)
docker compose exec --user www-data app php occ db:convert-filecache-bigint

# Repair installation
docker compose exec --user www-data app php occ maintenance:repair

12.4 Monitoring

# Check container status
docker compose ps

# View resource usage
docker stats

# Check disk usage
df -h

# View Nextcloud logs
docker compose logs app --tail 100

# Check container health
docker inspect nextcloud_app | grep -A 10 "Health"

13. Performance Optimization

13.1 Low-RAM Tuning (Under 8GB)

Adjust these settings for systems with limited RAM:

In docker-compose.yml:

environment:
  - PHP_MEMORY_LIMIT=512M  # Reduce from 1G

In mariadb_config/custom.cnf:

innodb_buffer_pool_size = 256M  # Reduce from 1G

13.2 Apache Worker Tuning

For limited resources, reduce Apache workers:

docker compose exec app nano /etc/apache2/mods-available/mpm_prefork.conf

Reduce MaxRequestWorkers to 10-15 for low-RAM systems.

13.3 System-Level Optimizations

Reduce swappiness (Linux):

echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Enable OPcache preloading (advanced):

docker compose exec --user www-data app php occ config:system:set 
  opcache.jit --value=1255

14. Troubleshooting

14.1 Common Issues and Solutions

Container Wonโ€™t Start

# Check logs for errors
docker compose logs app

# Common fix: permissions
sudo chown -R 33:33 nextcloud_data

# Restart stack
docker compose down && docker compose up -d

โ€œAccess through untrusted domainโ€

# Add the domain to trusted list
docker compose exec --user www-data app php occ config:system:set 
  trusted_domains 2 --value="NEW_DOMAIN_HERE"

Database Connection Failed

# Check if database container is running
docker compose ps db

# Check database logs
docker compose logs db

# Verify credentials in .env match
docker compose exec db mysql -u root -p

Slow Performance

# Enable Redis caching (if not already)
docker compose exec --user www-data app php occ config:system:set 
  memcache.local --value='\OC\Memcache\APCu'

# Check for missing database indices
docker compose exec --user www-data app php occ db:add-missing-indices

File Upload Errors

# Check PHP upload limits
docker compose exec app php -i | grep upload_max

# Verify client_max_body_size in reverse proxy
# Check Caddyfile or nginx config

14.2 Useful Debug Commands

# View current config
docker compose exec --user www-data app php occ config:list

# Check Nextcloud status
docker compose exec --user www-data app php occ status

# Enable debug mode temporarily
docker compose exec --user www-data app php occ config:system:set 
  debug --value=true --type=boolean

# View Nextcloud log
tail -f nextcloud_data/nextcloud.log

14.3 Getting Help


15. Client Device Setup

15.1 Android

  1. Install Tailscale from Play Store โ†’ Sign in
  2. Install Nextcloud from Play Store
  3. Open Nextcloud โ†’ Log in
  4. Server: https://your-server.your-tailnet.ts.net
  5. Accept certificate warning โ†’ Enter credentials
  6. Configure auto-upload in More โ†’ Auto upload

15.2 iOS/iPadOS

  1. Install Tailscale from App Store โ†’ Sign in
  2. Install certificate (required for self-signed):
    • Transfer certificate.crt to device (AirDrop/Email)
    • Open file โ†’ Allow profile download
    • Settings โ†’ Profile Downloaded โ†’ Install
    • Settings โ†’ General โ†’ About โ†’ Certificate Trust Settings โ†’ Enable your certificate
  3. Install Nextcloud from App Store
  4. Log in with your server address and credentials

15.3 Windows Desktop

  1. Install Tailscale from tailscale.com/download โ†’ Sign in
  2. Download Nextcloud Desktop from nextcloud.com/install
  3. Install and configure:
    • Server: https://your-server.your-tailnet.ts.net
    • Accept certificate โ†’ Log in
    • Choose folders to sync

15.4 macOS Desktop

  1. Install Tailscale (App Store or Homebrew) โ†’ Sign in
  2. Download Nextcloud Desktop from nextcloud.com/install
  3. Install .dmg and configure with your server address

16. Conclusion

Congratulations! Youโ€™ve successfully deployed a fully-featured, private cloud solution with:

  • โœ… Nextcloud for file storage and collaboration
  • โœ… Memories for Google Photos-like experience
  • โœ… Tailscale for secure, zero-config remote access
  • โœ… Docker for easy management and updates
  • โœ… Comprehensive security with 2FA and brute-force protection
  • โœ… Automated backups for peace of mind

Next Steps

  1. Explore Apps: Browse the Nextcloud App Store for:

    • Nextcloud Office (Collabora/OnlyOffice)
    • Calendar and Contacts
    • Notes and Tasks
    • Nextcloud Talk for video calls
  2. Mobile Auto-Upload: Configure your phone to automatically upload photos

  3. Share with Family: Create additional user accounts and share folders

  4. Regular Maintenance: Schedule monthly updates and backup verification

Resources


Last updated: January 2025

This guide is maintained and regularly updated. For corrections or suggestions, please reach out through our community channels.

Comments

Sign in to join the discussion!

Your comments help others in the community.