Complete Guide: Building a Self-Hosted Business Stack
advanced · 2-4 hours · Multiple
Published: March 1, 2026 Updated: March 10, 2026
Overview
This guide walks you through building a complete self-hosted business stack — replacing $500+/month in SaaS subscriptions with open-source alternatives running on a single server.
What We’re Building
| Function | SaaS | Self-Hosted | Monthly Savings |
|---|---|---|---|
| CRM | HubSpot ($200/mo) | Twenty | $195 |
| Email Marketing | Mailchimp ($70/mo) | Listmonk | $65 |
| Analytics | - | Umami | Free |
| Scheduling | Calendly ($40/mo) | Cal.com | $35 |
| Wiki | Confluence ($100/mo) | BookStack | $95 |
| Total | $410/mo | $15/mo VPS | $395/mo |
Prerequisites
- A VPS with 4GB+ RAM (Hetzner CAX21 at $7/mo recommended)
- Docker and Docker Compose installed
- A domain with DNS access (for subdomains)
- Basic terminal/SSH knowledge
Step 1: Server Setup
# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Install Docker Compose
sudo apt install docker-compose-plugin -y
Step 2: Reverse Proxy (Caddy)
Create a docker-compose.yml for Caddy as a reverse proxy:
version: "3.8"
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Step 3: Deploy Each Tool
Follow our individual deployment guides:
Each tool runs as a separate Docker Compose stack behind Caddy.
Step 4: Backups
Set up automated daily backups:
#!/bin/bash
# backup.sh — run via cron daily
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/backups/$DATE
mkdir -p $BACKUP_DIR
# Dump each database
docker exec postgres pg_dump -U postgres twenty > $BACKUP_DIR/twenty.sql
docker exec postgres pg_dump -U postgres listmonk > $BACKUP_DIR/listmonk.sql
docker exec postgres pg_dump -U postgres umami > $BACKUP_DIR/umami.sql
# Compress and upload to S3
tar -czf /backups/$DATE.tar.gz $BACKUP_DIR
# aws s3 cp /backups/$DATE.tar.gz s3://your-bucket/backups/
Total Cost
| Item | Monthly Cost |
|---|---|
| Hetzner CAX21 (4GB ARM) | $7 |
| Domain (annual ÷ 12) | $1 |
| Amazon SES (email sending) | $1-5 |
| S3 backups | $1-2 |
| Total | $10-15/mo |
That’s a $395/month saving compared to the equivalent SaaS stack — or $4,740/year.
Need Help?
Setting up a full self-hosted stack takes 2-4 hours if you’re comfortable with Docker. If you’d rather have it done for you, upready.dev offers turnkey deployment with SSL, backups, monitoring, and ongoing support.