unsubbed.co

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

FunctionSaaSSelf-HostedMonthly Savings
CRMHubSpot ($200/mo)Twenty$195
Email MarketingMailchimp ($70/mo)Listmonk$65
Analytics-UmamiFree
SchedulingCalendly ($40/mo)Cal.com$35
WikiConfluence ($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:

  1. Deploy Twenty CRM
  2. Deploy Listmonk
  3. Deploy Umami Analytics
  4. Self-Host Cal.com

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

ItemMonthly 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.