Project Overview
I built a home cloud on spare hardware by installing Proxmox VE, creating an Ubuntu VM, and deploying Nextcloud All-in-One behind Nginx Proxy Manager with a Cloudflare DNS certificate. This page documents the exact steps, commands, and settings I used.
Table of Contents
- Part 1: Install Proxmox VE on an old PC
- Part 2: First login and post-install storage fix on Proxmox
- Part 3: Create an Ubuntu VM and prepare Docker
- Part 4: Compose stack for Nginx Proxy Manager and Nextcloud AIO
- Part 5: Cloudflare DNS certificate in NPM
- Part 6: Reverse proxy entries for AIO UI and Nextcloud
- Part 7: Finish the Nextcloud AIO install
- Summary
- Tools, Skills, and Concepts Demonstrated
Part 1: Install Proxmox VE on an old PC
Create boot media and install
- Create a Proxmox VE USB installer with Rufus or Balena Etcher.
- Boot the PC from USB. In BIOS, set the USB device as Boot Option 1, save with F10, then select Install Proxmox VE.
- Walk through the installer: accept EULA, pick the target disk, set locale, admin password, hostname, and network. If DHCP does not populate, assign a static IP.
- Reboot when done and remove the USB installer.
First login to the Proxmox web UI
- From another machine, browse to
https://<your-proxmox-ip>:8006, proceed past the certificate warning, and log in asrootwith the password you set. - You can ignore the no subscription banner for homelab use.
Part 2: First login and post-install storage fix on Proxmox
On single-disk installs, the default LVM split leaves local storage small. I removed local-lvm and gave the space back to root, which lets me store ISOs, templates, and disk images in one large directory storage. Do this before creating VMs.
Remove local-lvm in the UI
- Navigate to Datacenter → Storage → local-lvm and click Remove.
Expand the root LV from the shell on the Proxmox node
# Delete the thinpool LV named "data" that backed local-lvm
lvremove /dev/pve/data
# Resize root to consume all free space
lvresize -l +100%FREE /dev/pve/root
# Grow the filesystem
resize2fs /dev/mapper/pve-root
You should now see more free space under Storage → local.
Part 3: Create an Ubuntu VM and prepare Docker
Create a VM
- Upload an Ubuntu Server or Desktop ISO to Storage → local → ISO Images → Upload.
- Click Create VM, select your ISO, and set vCPU, memory, and disk values.
- If you cannot select disk images or container templates on local, edit Datacenter → Storage → local and enable needed content types such as Disk image and Container template.
Inside the Ubuntu VM, update and install Docker
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
Create a working directory and data path:
sudo mkdir -p /opt/nextcloud/NC-data
sudo chown -R $USER:$USER /opt/nextcloud
cd /opt/nextcloud
Part 4: Compose stack for Nginx Proxy Manager and Nextcloud AIO
Create compose.yaml in /opt/nextcloud with the following content:
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
network_mode: host
environment:
DISABLE_IPV6: "true"
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
nextcloud-aio-mastercontainer:
image: nextcloud/all-in-one:latest
restart: unless-stopped
ports:
- "8080:8080" # AIO management UI
volumes:
- ./nextcloud-aio:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
APACHE_PORT: "10000" # Expose Apache from the Nextcloud container
NEXTCLOUD_DATA_DIR: "/opt/nextcloud/NC-data"
SKIP_DOMAIN_VALIDATION: "false"
# Optional examples you can tune later:
# NEXTCLOUD_UPLOAD_LIMIT: "16384M"
# NEXTCLOUD_MEMORY_LIMIT: "2048M"
# TRUSTED_PROXIES: "192.168.1.0/24"
# NEXTCLOUD_TRUSTED_DOMAINS: "nc.example.com"
Bring the stack up:
docker compose up -d
NPM will bind to ports 80, 81, and 443 on the host. The AIO master UI is on https://<docker-host-ip>:8080.
Part 5: Cloudflare DNS certificate in NPM
Open the NPM UI
With host networking, NPM’s admin UI is at http://<docker-host-ip>:81. Log in and create your admin user if this is the first run.
Add a wildcard certificate
- Navigate to SSL Certificates → Add new → Request a new SSL certificate.
- Domains:
yourdomain.comand*.yourdomain.com. - Choose DNS Challenge, select Cloudflare, paste your API token with Zone DNS Edit permission, accept terms, and save.
- You now have a wildcard TLS cert usable across all subdomains.
Part 6: Reverse proxy entries for AIO UI and Nextcloud
Create two Proxy Hosts in Nginx Proxy Manager.
AIO management UI
- Domain:
aio.yourdomain.com - Forward Hostname/IP:
<docker-host-ip> - Forward Port:
8080 - Scheme: HTTPS
- Enable Force SSL and HTTP/2. Save. If you see a 502, verify the scheme is HTTPS. You can now access AIO securely at
https://aio.yourdomain.com.
Primary Nextcloud site
- Domain:
nc.yourdomain.com - Forward Hostname/IP:
<docker-host-ip> - Forward Port:
10000(must matchAPACHE_PORT) - Enable Websockets, Block Common Exploits, Force SSL, and HTTP/2.
- In Advanced, paste the Nextcloud recommended reverse proxy snippet for Nginx Proxy Manager to set forward headers and client size. Save.
Part 7: Finish the Nextcloud AIO install
Submit the domain in AIO
In the AIO web UI, enter https://nc.yourdomain.com and submit. It should validate through the proxy.
Choose version and optional containers
- Select Nextcloud Hub 10.
- Optional: enable Full Text Search and any other containers you want.
- Click Download and start containers and wait for provisioning.
First login
- AIO will display the initial admin user and password.
- Open
https://nc.yourdomain.comand sign in. - Immediately change the admin password and set a recovery email in Settings → Users.
Data location reminder
The data path is set to /opt/nextcloud/NC-data in the compose file. If you prefer, map this to a NAS or other storage.
Summary
- Installed Proxmox VE on spare hardware and reclaimed single-disk space by removing
local-lvmand expanding the root LV. - Created an Ubuntu VM and prepared Docker for application deployment.
- Deployed Nginx Proxy Manager in host mode and Nextcloud AIO via Docker Compose.
- Issued a wildcard TLS certificate with Cloudflare DNS challenge and terminated TLS in NPM.
- Published two proxy hosts: one for AIO on 8080 and one for Nextcloud on the Apache port from the AIO stack.
- Completed AIO install of Nextcloud Hub 10 and confirmed first login.
Tools, Skills, and Concepts Demonstrated
- Virtualization and Hypervisor Ops: Proxmox VE install, web UI access on 8006, and storage layout adjustments for single-disk hosts.
- Linux Administration: Shell work on the Proxmox node, LVM management, filesystem growth, and systemd tuning.
- Containerization: Docker install and group setup, Compose deployments, and environment tuning for Nextcloud AIO.
- Networking and Reverse Proxy: Nginx Proxy Manager in host mode, Cloudflare DNS challenge for wildcard certs, HTTPS offload, websockets, and application publishing.
- Self-Hosted Cloud: Nextcloud AIO management, optional containers like Full Text Search, data directory control, and SMB integration.