11: Nextcloud - Cloud Storage Platform
Nextcloud is a full-featured, self-hosted collaboration and file storage platform. It provides file sync and share, WebDAV, CalDAV/CardDAV, and a rich app ecosystem. For full configuration details and the admin manual, see the official Nextcloud documentation.
Architecture Overview
- ✅ Core services: Apache/PHP application with PostgreSQL database
- ✅ Protocols: WebDAV, CalDAV, CardDAV
- ✅ Identity: Local users; supports SSO/OIDC via apps
- ✅ Networking: Traefik reverse proxy (recommended) or standalone
- ✅ Data: Application files + user data volume + database
Resource Requirements
- Minimum: 1 vCPU, 512 MB RAM, 10 GB disk (grows with user data)
- Recommended: 2+ vCPU, 2 GB+ RAM, 20 GB+ disk
Prerequisites
- ✅ Traefik installed (Chapter 4) with Let's Encrypt
- ✅ Docker installed (Chapter 3)
- ✅ Apprise installed (Chapter 5) for notifications
- ✅ Borgmatic installed (Chapter 6) for automated backups
- ✅ Domain configured (Chapter 4.5) for production HTTPS
Interdependencies: The PostgreSQL service is attached to a borgmatic-db network for backup discovery. Borgmatic relies on Apprise for notifications.
Installation Methods
Via Infinity Tools Menu
📱 APPLICATIONS → Nextcloud → Install
Command Line
# Show current status (no changes)
sudo bash /opt/InfinityTools/Solutions/setup-nextcloud.sh
# Run interactive installation
sudo bash /opt/InfinityTools/Solutions/setup-nextcloud.sh --install
Configuration Parameters
- SSL Mode: Traefik (HTTPS, recommended) or standalone (HTTP or self-signed HTTPS)
- Domain: Required for Traefik (e.g.,
cloud.example.com) - Standalone Port: If not using Traefik
- Default Quota: Per-user storage limit in GB (recommended)
- Credentials: Admin and DB passwords are generated and stored in
/opt/speedbits/nextcloud/.env
Generated Files & Directories
/opt/speedbits/nextcloud/.env— Installation parameters and credentials/opt/speedbits/nextcloud/docker-compose.yml— Service definition/opt/speedbits/nextcloud/html— App files/opt/speedbits/nextcloud/data— User data/opt/speedbits/nextcloud/db— PostgreSQL data
Compose (Traefik Mode - Highlights)
services:
db:
image: postgres:${DB_VERSION}
networks: [ ${NETWORK}, borgmatic-db ]
nextcloud:
image: nextcloud:${NEXTCLOUD_VERSION}
environment:
POSTGRES_HOST: nextcloud-db
NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER}
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: ${DOMAIN}
OVERWRITEPROTOCOL: https
OVERWRITEHOST: ${DOMAIN}
PHP_UPLOAD_LIMIT: 16G
PHP_MEMORY_LIMIT: 512M
labels:
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.routers.nextcloud.tls.certresolver=myresolver"
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
- "traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.permanent=true"
- "traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.regex=https://(.*)/.well-known/(card|cal)dav"
- "traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.replacement=https://$${1}/remote.php/dav/"
- "traefik.http.middlewares.nextcloud-security.headers.customResponseHeaders.X-Content-Type-Options=nosniff"
- "traefik.http.middlewares.nextcloud-security.headers.customResponseHeaders.X-Frame-Options=SAMEORIGIN"
- "traefik.http.middlewares.nextcloud-security.headers.customResponseHeaders.X-XSS-Protection=1; mode=block"
- "traefik.http.routers.nextcloud.middlewares=nextcloud-redirectregex,nextcloud-security"
Post-Install Hardening & Tasks
- Trusted domains and overwrite settings are applied automatically (Traefik mode)
- Default quota is applied if configured
- Security hardening executed: brute-force protection, file locking, log level
- Background jobs switched to Cron
Cron Setup
*/5 * * * * docker exec -u www-data nextcloud php -f /var/www/html/cron.php
Backup Integration (Borgmatic)
- Database container is auto-registered with Borgmatic (if available)
- Include these paths in backups:
/opt/speedbits/nextcloud/data— User files/opt/speedbits/nextcloud/db— Database volume/opt/speedbits/nextcloud/config(if present) — Config overrides
- Ensure Apprise is configured for notifications
Operations
# Logs
docker logs nextcloud
# Restart
cd /opt/speedbits/nextcloud && docker compose restart
# Update
cd /opt/speedbits/nextcloud && docker compose pull && docker compose up -d
# OCC (run as www-data)
docker exec -u www-data nextcloud php occ status
docker exec -u www-data nextcloud php occ app:list
Troubleshooting
- SSL/Domain: Verify Traefik routing, DNS A/AAAA, and ACME logs
- Database: Check container health; confirm credentials in
.env - Storage: Monitor
df -h /opt/speedbits/nextcloud; enforce quotas - Trusted Domains:
occ config:system:set trusted_domains 1 --value="cloud.example.com" - Background Jobs: Confirm cron runs; see
Settings → Basic settings
Security Best Practices
- Enable 2FA for admin and users
- Enforce sane quotas to prevent disk exhaustion
- Regularly apply updates and review logs
- Restrict admin access and consider IP allowlists
- Review app permissions and disable unused apps
Verification Checklist
- ✅ Nextcloud and database containers running and healthy
- ✅ HTTPS reachable via Traefik with valid certificate
- ✅ Admin login works; quotas visible under Users
- ✅ Cron executing background jobs
- ✅ Backups configured and tested
No comments to display
No comments to display