Self-Hosting dotCMS on a VPS: A Complete Production Guide
Install Docker and Portainer
1. Install Docker#
Follow the official Docker installation for Ubuntu:
# Remove any conflicting packages for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg done # Add Docker's official repository sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update # Install Docker Engine sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. Add Your User to the Docker Group#
Without this, every Docker command requires sudo:
sudo usermod -aG docker <USERNAME>
Exit and reconnect for the group change to take effect:
exit ssh cms-vps # Verify — this should work without sudo: docker ps
3. Install Portainer#
Portainer is a web UI for managing Docker containers. It's useful for deploying stacks, viewing logs, and managing containers without typing Docker commands each time.
Create the Portainer data volume and run the container:
docker volume create portainer_data docker run -d \ -p 9000:9000 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
4. Expose Portainer via Caddy#
Add an A record for portainer.dotcms.info pointing to your static IP (if you haven't already).
Update the Caddyfile:
sudo nano /etc/caddy/Caddyfile
portainer.dotcms.info { reverse_proxy localhost:9000 }
Reload Caddy:
caddy reload --config /etc/caddy/Caddyfile
Open https://portainer.dotcms.info. You'll be prompted to create an admin user. Do this within the first few minutes — Portainer times out the initial setup for security.
After logging in, click Get Started to use the local Docker environment. You'll see your running Portainer container and its resource usage.
Next up
Chapter 5: Deploy dotCMS