Skip to content

Proxmox VE Deployment

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
  1. 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
  2. Install Docker on the VM

    Terminal window
    apt-get update && apt-get install -y ca-certificates curl
    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
    echo "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.list
    apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  3. Configure ZFS

    Terminal window
    zfs create rpool/docker
  4. Configure firewall

    Terminal window
    # Only expose the single MCP port
    ufw allow 3847/tcp comment "MCP Server"
    ufw enable
  5. Authenticate to container registry

    Terminal window
    echo "$GITEA_TOKEN" | docker login git.satware.ai -u <username> --password-stdin
  6. Deploy

    Terminal window
    mkdir -p /opt/onlyoffice-mcp/secrets
    cd /opt/onlyoffice-mcp
    # Copy docker-compose.prod.yml and .env to the server
    # Create JWT secret
    openssl rand -hex 32 > secrets/jwt_secret.txt
    chmod 600 secrets/jwt_secret.txt
    # Set version
    echo "VERSION=v1.3.0" > .env
    # Start services
    docker compose -f docker-compose.prod.yml up -d
Terminal window
cd /opt/onlyoffice-mcp
echo "VERSION=v1.2.0" > .env
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d

OnlyOffice Document Server is heavy — schedule a maintenance window:

Terminal window
docker compose -f docker-compose.prod.yml stop onlyoffice
docker compose -f docker-compose.prod.yml pull onlyoffice
docker compose -f docker-compose.prod.yml up -d onlyoffice
# Wait for healthcheck (start_period: 120s)
docker compose -f docker-compose.prod.yml up -d
Terminal window
echo "VERSION=v1.0.0" > .env
docker compose -f docker-compose.prod.yml up -d
Terminal window
# On Proxmox host
pvesh create /cluster/backup \
--vmid 200 \
--storage pbs \
--schedule "0 2 * * *" \
--mode snapshot \
--maxfiles 7
Terminal window
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 .
Service URL Expected
OnlyOffice http://localhost:9980/healthcheck 200 OK
MCP Server http://localhost:3847/health 200 OK
/opt/onlyoffice-mcp/health-check.sh
#!/bin/bash
for 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
fi
done

Add to cron: */5 * * * * /opt/onlyoffice-mcp/health-check.sh

Service CPU Memory
onlyoffice 2.0 4 GB
mcp-server 1.0 1 GB
cleanup 0.25 128 MB