<<<<<<< HEAD
This project provides a full Proxmox VE cluster solution running entirely within Docker containers.
It includes a Datacenter Manager (PDM) and three Proxmox VE nodes, simulating a real-world cluster environment for testing and development.
- Linux Host: Required for cgroup and kernel module mapping.
- Docker: With
docker-composesupport. - Hardware: At least 4GB RAM recommended (1GB per node assigned).
- Kernel Modules:
kvm(Required)vhost_net(Optional, for network acceleration. Uncomment indocker-compose.yamlif loaded on host)
Start the cluster with:
docker compose up -d| Node | Service | Internal IP | IPv6 | SSH Port | HTTP/HTTPS Port | Proxy/SPICE Port |
|---|---|---|---|---|---|---|
Manager (pdm) |
Proxmox Datacenter Manager | 10.0.99.1 |
fd00::1 |
2222 |
8443 (https) |
N/A |
Node 1 (pve-1) |
Proxmox VE | 10.0.99.2 |
fd00::2 |
2223 |
8006 (https) |
3128 |
Node 2 (pve-2) |
Proxmox VE | 10.0.99.3 |
fd00::3 |
2224 |
8006 (https) |
3129 |
Node 3 (pve-3) |
Proxmox VE | 10.0.99.4 |
fd00::4 |
2225 |
8006 (https) |
3130 |
Note:
- Manager (
pdm): Access viahttps://172.17.0.1:8443or your host's Docker bridge IP.- Node 1 (
pve-1): Access viahttps://172.17.0.1:8006or your host's Docker bridge IP.- Node 2 (
pve-2): Access viahttps://172.17.0.1:8007or your host's Docker bridge IP.- Node 3 (
pve-3): Access viahttps://172.17.0.1:8008or your host's Docker bridge IP.- SSH & Web UI ports are bound specifically to
172.17.0.1. Access them viahttps://172.17.0.1:<port>or your host's Docker bridge IP.- Proxy/SPICE ports (
3128-3130) are bound to all interfaces (0.0.0.0).- Node 1 Web UI is mapped to host port
8006, Node 2 to8007, and Node 3 to8008.
The nodes share storage volumes to simulate shared cluster resources:
/var/lib/vz/dump: Shared backups./var/lib/vz/template/iso: Shared ISO images.
System volumes mapped from host (Read-Only where applicable):
/sys/fs/cgroup: Required for systemd./usr/lib/modules: Required for loading kernel modules.
The cluster operates on a dual-stack Docker network (dual_stack):
- IPv4 Subnet:
10.0.99.0/24(Gateway:.99) - IPv6 Subnet:
fd00::/64(Gateway:::99)
Here is a comprehensive Nginx configuration to proxy these services. It handles the required WebSocket headers for Proxmox consoles.
# Define upstreams using the host mappings
upstream proxmox_pdm { server 172.17.0.1:8443; }
upstream proxmox_node_1 { server 172.17.0.1:8006; }
upstream proxmox_node_2 { server 172.17.0.1:8007; }
upstream proxmox_node_3 { server 172.17.0.1:8008; }
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name pdm.*;
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
location / {
proxy_pass https://proxmox_pdm;
proxy_ssl_verify off;
# Standard Proxy Headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket Headers (Critical for VNC/SPICE)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
======= proxmox - Self-hosted Docker Compose deployment
Proxmox is a containerized service deployed using Docker Compose. This setup provides a complete, production-ready deployment with proper security defaults, logging, and configuration management.
This deployment includes the following services:
- pve-1: Service container
- pve-2: Service container
- pve-3: Service container
- pdm: Service container
curl -q -LSsf "https://raw.githubusercontent.com/composemgr/proxmox/main/docker-compose.yaml" -o compose.ymlgit clone "https://github.com/composemgr/proxmox" ~/.local/srv/docker/proxmox
cd ~/.local/srv/docker/proxmox
docker compose up -dcomposemgr install proxmoxThe project follows a standardized rootfs layout:
.
βββ docker-compose.yaml
βββ rootfs/
βββ config/ # Application configuration files
βββ data/ # Application data and logs
Key environment variables (with defaults):
# Core Settings
TZ=America/New_York # Timezone
BASE_HOST_NAME=${HOSTNAME} # Hostname for the service
BASE_DOMAIN_NAME= # Domain name (optional)All variables have sane defaults and can be overridden via .env or app.env files.
- Web Interface: http://172.17.0.1:8006
- Production: Configure your reverse proxy to forward to port 8006
For production deployments, use a reverse proxy (nginx, traefik, caddy) to handle SSL/TLS.
Data persistence locations:
./rootfs/config/- Application configuration./rootfs/data/- Application data and logs
- All secrets use secure defaults with
changeme_*prefix for easy identification - No hardcoded passwords in compose file
- Environment-based configuration for sensitive data
- Logging configured with rotation (5MB max, 1 file retained)
All services use standardized logging:
- Driver: json-file
- Max Size: 5MB per file
- Max Files: 1 (rotated)
View logs:
docker compose logs -f
docker compose logs -f [service_name]docker compose up -ddocker compose downdocker compose restartdocker compose pull
docker compose up -ddocker compose psdocker compose exec [service_name] [command]# Backup volumes
tar -czf proxmox-backup-$(date +%Y%m%d).tar.gz rootfs/# Restore from backup
tar -xzf proxmox-backup-YYYYMMDD.tar.gz
docker compose up -d- Docker Engine 20.10+
- Docker Compose V2+
- Sufficient disk space for data and logs
docker compose psdocker compose logs --tail=100 -fdocker compose restart [service_name]docker compose down -v
docker compose up -dbcb1fdf462eb (ποΈ Major updates ποΈ)