Self-Hosted Cloud & Virtualization Homelab

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

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 as root with 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.com and *.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 match APACHE_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.com and 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-lvm and 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.