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-plugin2. 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 ps3. 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:latest4. 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/Caddyfileportainer.dotcms.info {
reverse_proxy localhost:9000
}Reload Caddy:
caddy reload --config /etc/caddy/CaddyfileOpen 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