Homelab Project · VM 102 · Container Infrastructure

Docker Portainer

A dedicated container host on Proxmox for deploying self-hosted services as isolated Docker Compose stacks, with secure external access through a Cloudflare Tunnel and no router port forwarding.

Container host Ubuntu Server 24.04 LTS
VM 102Proxmox guest
4 GBMemory
40 GBLocal-LVM disk
0Forwarded router ports

01 / Overview

One host for multiple services.

01 — TARGET

The Goal

Build a dedicated Proxmox VM for deploying and managing self-hosted applications, with each service contained in its own reproducible stack.

02 — SYSTEM

What I Built

A hardened Ubuntu Server running Docker Engine and Portainer CE, with Compose stacks, persistent volumes, shared proxy networking, and isolated databases.

03 — VALUE

Why It Matters

The project demonstrates practical container operations, service networking, reverse proxying, secure publishing, and infrastructure documentation.

02 / Stack

Container platform & host.

HypervisorProxmox VEVM 102 · vmbr0 bridge · local-lvm storage
Guest OSUbuntu Server 24.04 LTS2 vCPU · 4 GB RAM · 40 GB disk
RuntimeDocker EngineInstalled from the official Docker apt repository
ManagementPortainer CEStack deployment, logs, monitoring, and lifecycle control
ProxyNginx Proxy ManagerContainer-name routing across the shared proxy network
External accessCloudflare TunnelHTTPS ingress without public router ports

03 / Architecture

From browser to container.

01 / Client

User browser

Requests a service on a dedicated munyakazi.org subdomain.

02 / Edge

Cloudflare

Handles public DNS, HTTPS, TLS termination, and edge security.

03 / Tunnel

cloudflared

Maintains an outbound encrypted connection from VM 102.

04 / Proxy

Nginx Proxy Manager

Routes each hostname to its container over the shared Docker network.

05 / Service

Target container

Serves the application while its database remains isolated.

Proxmox VM 102 Docker and Portainer container infrastructure

The tunnel originates inside the homelab, so the public request path requires no inbound router rule, public server port, or dynamic DNS update.

The tunnel originates inside the homelab, so the public request path requires no inbound router rule, public server port, or dynamic DNS update.

04 / Services

Compose stacks with clear roles.

DocumentationWiki.js + PostgreSQL

Technical knowledge base

Runbook-style homelab documentation served from Wiki.js with PostgreSQL on an isolated internal network.

IngressNginx Proxy Manager

Reverse proxy

Routes subdomains to containers by service name through the shared npm_default Docker network.

ConnectivityCloudflare Tunnel

Secure external access

Publishes selected services through an outbound encrypted tunnel without exposing router ports to the internet.

05 / Implementation

Built as a repeatable platform.

01

Provision VM 102

Created an Ubuntu Server guest on Proxmox with two virtual CPUs, 4 GB RAM, a 40 GB local-lvm disk, and bridged LAN networking.

02

Install Docker Engine

Used Docker’s official apt repository, verified the runtime with hello-world, and granted the administrative user controlled Docker access.

03

Deploy Portainer CE

Ran Portainer as a persistent standalone container with access to the Docker socket for stack deployment, inspection, logs, and lifecycle management.

04

Design the networks

Connected public-facing application containers to npm_default while keeping MariaDB and PostgreSQL on private per-stack networks.

05

Deploy Compose stacks

Defined service configuration, named volumes, environment variables, restart policies, dependencies, and networks in version-controlled Compose files.

06

Publish through Cloudflare

Connected cloudflared to Nginx Proxy Manager, then mapped public hostnames to internal container names without opening inbound router ports.

07

Sanitize and document

Moved secrets into ignored environment files, published safe templates to GitHub, and documented the complete deployment in a Wiki runbook.

06 / Security

Expose services, not the host.

01 / IngressNo port forwarding

Cloudflare Tunnel provides inbound access through an outbound-only connection.

02 / DataPrivate databases

Database containers have no published ports and remain on isolated stack networks.

03 / SecretsEnvironment isolation

Real credentials stay in ignored environment files; GitHub contains sanitized examples.

04 / EdgeCloudflare controls

TLS termination and web application firewall rules protect public service endpoints.

07 / Competencies

Skills demonstrated in practice.

Docker

Images, containers, volumes, restart policies, and lifecycle operations

Docker Compose

Multi-service stacks and reproducible configuration

Portainer

GUI deployment, monitoring, inspection, and logs

Container Networking

Bridge networks, service DNS, shared proxying, and isolation

Reverse Proxy

Hostname routing through Nginx Proxy Manager

Cloudflare

Zero Trust Tunnel, public DNS, HTTPS, and WAF controls

Security Hardening

Secret handling, private databases, and minimal exposure

Documentation

Sanitized repository plus a detailed operational Wiki

Code + documentation

Built openly. Documented fully.

The public GitHub repository contains sanitized Docker Compose stacks and environment templates. The Wiki provides the full infrastructure overview and operational build notes.

VM 102 · Container Infrastructure

A practical platform for self-hosted services.

One virtual machine brings container deployment, persistent storage, service discovery, reverse proxying, encrypted ingress, and network isolation together as a working infrastructure system.

Back to Proxmox Homelab