Proxmox VE Deployment
Prerequisites
Section titled “Prerequisites”| Component | Requirement |
|---|---|
| Proxmox VE | 8.x |
| VM OS | Debian 13 (Trixie) |
| vCPU | 4 |
| RAM | 8 GB |
| Storage | ZFS dataset for Docker volumes |
| Docker | Engine 27+ with Compose v2 |
| Network | VLAN with port :3847 exposed |
| Registry | Authenticated to git.satware.ai |
-
Create VM on Proxmox host
Terminal window qm create 200 --name onlyoffice-mcp \--memory 8192 --cores 4 \--net0 virtio,bridge=vmbr0,tag=<VLAN_ID> \--scsi0 local-zfs:32 \--ostype l26 -
Install Docker on the VM
Terminal window apt-get update && apt-get install -y ca-certificates curlinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.ascecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \https://download.docker.com/linux/debian trixie stable" > /etc/apt/sources.list.d/docker.listapt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin -
Configure ZFS
Terminal window zfs create rpool/docker -
Configure firewall
Terminal window # Only expose the single MCP portufw allow 3847/tcp comment "MCP Server"ufw enable -
Authenticate to container registry
Terminal window echo "$GITEA_TOKEN" | docker login git.satware.ai -u <username> --password-stdin -
Deploy
Terminal window mkdir -p /opt/onlyoffice-mcp/secretscd /opt/onlyoffice-mcp# Copy docker-compose.prod.yml and .env to the server# Create JWT secretopenssl rand -hex 32 > secrets/jwt_secret.txtchmod 600 secrets/jwt_secret.txt# Set versionecho "VERSION=v1.3.0" > .env# Start servicesdocker compose -f docker-compose.prod.yml up -d
Updates
Section titled “Updates”Rolling Update (light services)
Section titled “Rolling Update (light services)”cd /opt/onlyoffice-mcpecho "VERSION=v1.2.0" > .envdocker compose -f docker-compose.prod.yml pulldocker compose -f docker-compose.prod.yml up -dOnlyOffice Update (maintenance window)
Section titled “OnlyOffice Update (maintenance window)”OnlyOffice Document Server is heavy — schedule a maintenance window:
docker compose -f docker-compose.prod.yml stop onlyofficedocker compose -f docker-compose.prod.yml pull onlyofficedocker compose -f docker-compose.prod.yml up -d onlyoffice# Wait for healthcheck (start_period: 120s)docker compose -f docker-compose.prod.yml up -dRollback
Section titled “Rollback”echo "VERSION=v1.0.0" > .envdocker compose -f docker-compose.prod.yml up -dBackup
Section titled “Backup”Proxmox Backup Server
Section titled “Proxmox Backup Server”# On Proxmox hostpvesh create /cluster/backup \ --vmid 200 \ --storage pbs \ --schedule "0 2 * * *" \ --mode snapshot \ --maxfiles 7Docker Volume Backup
Section titled “Docker Volume Backup”docker run --rm \ -v onlyoffice-mcp_artifacts_data:/data:ro \ -v /backup:/backup \ alpine tar czf /backup/artifacts-$(date +%Y%m%d).tar.gz -C /data .Monitoring
Section titled “Monitoring”| Service | URL | Expected |
|---|---|---|
| OnlyOffice | http://localhost:9980/healthcheck |
200 OK |
| MCP Server | http://localhost:3847/health |
200 OK |
#!/bin/bashfor url in "http://localhost:9980/healthcheck" "http://localhost:3847/health"; do if ! curl -sf "$url" > /dev/null 2>&1; then echo "ALERT: $url is DOWN" | logger -t onlyoffice-mcp fidoneAdd to cron: */5 * * * * /opt/onlyoffice-mcp/health-check.sh
Resource Limits
Section titled “Resource Limits”| Service | CPU | Memory |
|---|---|---|
| onlyoffice | 2.0 | 4 GB |
| mcp-server | 1.0 | 1 GB |
| cleanup | 0.25 | 128 MB |
Related
Section titled “Related”- Docker Stack Deployment - Compose configuration details
- Architecture - System overview