The Complete Self-Hosted SaaS Stack for 2026: Replace $5,000/Month in SaaS Subscriptions
A complete guide to replacing expensive SaaS subscriptions with self-hosted alternatives. Covers project management, auth, analytics, CI/CD, and more with...
The $60,000 Problem
A typical 15-person startup spends between $3,000 and $7,000 per month on SaaS subscriptions. Slack, Jira, GitHub, Datadog, Auth0, Google Workspace, Notion, analytics platforms, CI/CD services --- it accumulates fast. Over a year, that is $36,000 to $84,000 spent on tools where you own none of the data, control none of the infrastructure, and face price increases at every renewal.
<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 200" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="200" rx="12" fill="#1a1a2e"/><rect x="60" y="30" width="140" height="140" rx="6" fill="none" stroke="#e2e8f0" stroke-width="1.5"/><text x="130" y="24" text-anchor="middle" fill="#94a3b8" font-size="10" font-family="system-ui">Production</text><rect x="70" y="40" width="120" height="22" rx="3" fill="#6366f1" opacity="0.8"/><circle cx="82" cy="51" r="3" fill="#2dd4bf"/><text x="130" y="55" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Web Server</text><rect x="70" y="68" width="120" height="22" rx="3" fill="#6366f1" opacity="0.8"/><circle cx="82" cy="79" r="3" fill="#2dd4bf"/><text x="130" y="83" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">App Server</text><rect x="70" y="96" width="120" height="22" rx="3" fill="#a855f7" opacity="0.8"/><circle cx="82" cy="107" r="3" fill="#2dd4bf"/><text x="130" y="111" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Database</text><rect x="70" y="124" width="120" height="22" rx="3" fill="#f59e0b" opacity="0.6"/><circle cx="82" cy="135" r="3" fill="#2dd4bf"/><text x="130" y="139" text-anchor="middle" fill="#1a1a2e" font-size="9" font-family="system-ui">Monitoring</text><rect x="290" y="30" width="140" height="140" rx="6" fill="none" stroke="#e2e8f0" stroke-width="1.5"/><text x="360" y="24" text-anchor="middle" fill="#94a3b8" font-size="10" font-family="system-ui">Staging</text><rect x="300" y="40" width="120" height="22" rx="3" fill="#3b82f6" opacity="0.6"/><circle cx="312" cy="51" r="3" fill="#2dd4bf"/><text x="360" y="55" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Web Server</text><rect x="300" y="68" width="120" height="22" rx="3" fill="#3b82f6" opacity="0.6"/><circle cx="312" cy="79" r="3" fill="#2dd4bf"/><text x="360" y="83" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">App Server</text><rect x="300" y="96" width="120" height="22" rx="3" fill="#a855f7" opacity="0.5"/><circle cx="312" cy="107" r="3" fill="#f59e0b"/><text x="360" y="111" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Database</text><line x1="200" y1="100" x2="290" y2="100" stroke="#2dd4bf" stroke-width="1.5" stroke-dasharray="5,3"/><text x="245" y="95" text-anchor="middle" fill="#2dd4bf" font-size="8" font-family="system-ui">VLAN</text><rect x="480" y="60" width="90" height="70" rx="6" fill="none" stroke="#f59e0b" stroke-width="1" stroke-dasharray="4,3"/><text x="525" y="85" text-anchor="middle" fill="#f59e0b" font-size="9" font-family="system-ui">Backup</text><text x="525" y="100" text-anchor="middle" fill="#f59e0b" font-size="9" font-family="system-ui">Storage</text><text x="525" y="115" text-anchor="middle" fill="#94a3b8" font-size="8" font-family="system-ui">3-2-1 Rule</text><line x1="430" y1="100" x2="478" y2="95" stroke="#f59e0b" stroke-width="1" stroke-dasharray="4,3"/></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Server infrastructure: production and staging environments connected via VLAN with offsite backups.</p></div>
Self-hosting has matured significantly. The tools available in 2026 are not the fragile, poorly documented projects of five years ago. They are production-grade, actively maintained, and in many cases functionally superior to their commercial counterparts. The trade-off is your team's time for setup and maintenance versus subscription fees.
This guide covers a complete self-hosted stack that replaces the most common SaaS subscriptions, with real cost comparisons, Docker Compose configurations, and an honest assessment of the maintenance burden.
The Cost Comparison
Before diving into specific tools, here is a realistic cost comparison for a 15-person team.
|---|---|---|---|---|
The self-hosted stack runs on infrastructure you control. A dedicated server with 64GB RAM and sufficient storage costs between $50 and $200 per month depending on the provider. Even at the high end, you are saving over $2,000 per month.
The Stack, Category by Category
Project Management: Plane
Plane has emerged as the strongest open-source project management tool. It offers issue tracking, cycles (sprints), modules, project views, and a clean interface that does not overwhelm smaller teams.
Why Plane over alternatives:
# docker-compose.plane.yml
services:
plane-web:
image: makeplane/plane-frontend:stable
restart: unless-stopped
depends_on:
- plane-api
environment:
- NEXT_PUBLIC_API_BASE_URL=https://plane-api.yourdomain.com
plane-api:
image: makeplane/plane-backend:stable
restart: unless-stopped
environment:
- DATABASE_URL=postgresql://plane:secretpassword@plane-db:5432/plane
- REDIS_URL=redis://plane-redis:6379
- SECRET_KEY=${PLANE_SECRET_KEY}
depends_on:
- plane-db
- plane-redis
plane-db:
image: postgres:15
restart: unless-stopped
volumes:
- plane-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=plane
- POSTGRES_PASSWORD=secretpassword
- POSTGRES_DB=plane
plane-redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
plane-db-data:Maintenance reality: Plane releases updates frequently. Plan for monthly update cycles. Database backups are critical --- automate them with a cron job and test restores quarterly.
Communication: Mattermost
Mattermost is the most battle-tested open-source Slack alternative. It supports threads, channels, direct messages, file sharing, integrations, and has robust mobile apps.
Why Mattermost over Rocket.Chat:
# docker-compose.mattermost.yml
services:
mattermost:
image: mattermost/mattermost-team-edition:release-9
restart: unless-stopped
volumes:
- mattermost-config:/mattermost/config
- mattermost-data:/mattermost/data
- mattermost-logs:/mattermost/logs
- mattermost-plugins:/mattermost/plugins
environment:
- MM_SQLSETTINGS_DRIVERNAME=postgres
- MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:${DB_PASSWORD}@mattermost-db:5432/mattermost?sslmode=disable
depends_on:
- mattermost-db
mattermost-db:
image: postgres:15
restart: unless-stopped
volumes:
- mattermost-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=mattermost
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=mattermost
volumes:
mattermost-config:
mattermost-data:
mattermost-logs:
mattermost-plugins:
mattermost-db-data:Maintenance reality: Mattermost is one of the most reliable self-hosted services. Updates are straightforward. The main ongoing task is managing storage growth from file uploads.
Authentication: ZITADEL
ZITADEL is an identity management platform that replaces Auth0, Okta, or Firebase Auth. It provides OIDC, SAML, OAuth2, passkeys, MFA, and user management out of the box.
Why ZITADEL over Keycloak:
ZITADEL runs as a single binary with a PostgreSQL or CockroachDB backend. Resource usage is remarkably low --- expect around 256MB of RAM for moderate workloads.
Maintenance reality: ZITADEL is actively developed with frequent releases. The migration path between versions has been smooth. The main complexity is in initial OIDC/SAML configuration for each connected application.
Analytics: PostHog
PostHog replaces Mixpanel, Amplitude, and to some extent Hotjar. It provides product analytics, session recordings, feature flags, A/B testing, and surveys in a single platform.
# PostHog self-hosted via their official Helm chart or docker-compose
# Minimum recommended: 4 CPU cores, 8GB RAM, 50GB storage
# PostHog uses ClickHouse for analytics data, Kafka for event ingestion,
# and PostgreSQL for application state.Important note: PostHog's self-hosted deployment is resource-intensive. For teams under 20 people, their free cloud tier (1 million events/month) may actually be more practical than self-hosting. Self-host PostHog when you need data sovereignty or exceed free tier limits.
Maintenance reality: PostHog is the most complex self-hosted tool in this stack. ClickHouse requires tuning and monitoring. Budget 2-4 hours per month for maintenance.
Website Analytics: Plausible
Plausible is a lightweight, privacy-focused web analytics tool. It replaces Google Analytics for most use cases while being GDPR-compliant by default (no cookies, no personal data collection).
# docker-compose.plausible.yml
services:
plausible:
image: ghcr.io/plausible/community-edition:v2
restart: unless-stopped
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
- plausible-db
- plausible-events-db
environment:
- DATABASE_URL=postgres://plausible:${DB_PASSWORD}@plausible-db:5432/plausible
- CLICKHOUSE_DATABASE_URL=http://plausible-events-db:8123/plausible_events
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
- BASE_URL=https://analytics.yourdomain.com
plausible-db:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- plausible-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=plausible
- POSTGRES_USER=plausible
plausible-events-db:
image: clickhouse/clickhouse-server:24-alpine
restart: unless-stopped
volumes:
- plausible-events-data:/var/lib/clickhouse
volumes:
plausible-db-data:
plausible-events-data:Maintenance reality: Plausible is extremely low-maintenance. It consumes minimal resources (under 256MB RAM for most sites) and updates are simple image pulls.
Automation: n8n
n8n replaces Zapier, Make (Integromat), and similar workflow automation tools. It provides a visual workflow builder with 400+ integrations and supports custom code nodes for complex logic.
# docker-compose.n8n.yml
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
volumes:
- n8n-data:/home/node/.n8n
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.yourdomain.com/
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=n8n-db
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}
depends_on:
- n8n-db
n8n-db:
image: postgres:15
restart: unless-stopped
volumes:
- n8n-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=n8n
volumes:
n8n-data:
n8n-db-data:Maintenance reality: n8n is reliable but workflows that depend on external APIs can break when those APIs change. Monitor workflow execution logs regularly.
Hosting Platform: Coolify
Coolify is a self-hosted alternative to Vercel, Netlify, and Heroku. It deploys applications from Git repositories, manages SSL certificates, handles environment variables, and supports multiple programming languages and frameworks.
Coolify has matured substantially. It now supports Docker Compose deployments, multi-server setups, automatic SSL via Let's Encrypt, and one-click deployments for dozens of popular applications.
Maintenance reality: Coolify itself requires occasional updates. The main effort is managing the applications it deploys. If you are already comfortable with Docker and reverse proxies, Coolify simplifies rather than complicates your workflow.
<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 170" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="170" rx="12" fill="#1a1a2e"/><path d="M80,90 Q80,50 120,50 Q130,30 160,35 Q190,25 200,50 Q230,45 230,70 Q240,90 210,95 L100,95 Q70,95 80,90 Z" fill="none" stroke="#3b82f6" stroke-width="1.5"/><text x="155" y="75" text-anchor="middle" fill="#3b82f6" font-size="11" font-family="system-ui">Cloud</text><text x="155" y="120" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">$5,000/mo</text><defs><marker id="arrow9" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto"><path d="M0,0 L10,3.5 L0,7" fill="#2dd4bf"/></marker></defs><line x1="245" y1="70" x2="340" y2="70" stroke="#2dd4bf" stroke-width="2.5" marker-end="url(#arrow9)"/><text x="293" y="60" text-anchor="middle" fill="#2dd4bf" font-size="10" font-family="system-ui" font-weight="bold">Migrate</text><rect x="355" y="35" width="180" height="70" rx="8" fill="none" stroke="#6366f1" stroke-width="2"/><rect x="365" y="45" width="160" height="15" rx="3" fill="#6366f1" opacity="0.7"/><rect x="365" y="65" width="160" height="15" rx="3" fill="#a855f7" opacity="0.7"/><rect x="365" y="85" width="100" height="10" rx="2" fill="#2dd4bf" opacity="0.5"/><text x="445" y="57" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Bare Metal</text><text x="445" y="77" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">Docker + LXC</text><text x="445" y="120" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">$200/mo</text><text x="300" y="150" text-anchor="middle" fill="#2dd4bf" font-size="11" font-family="system-ui" font-weight="bold">96% cost reduction</text></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Cloud to self-hosted migration can dramatically reduce infrastructure costs while maintaining full control.</p></div>
File Storage and Collaboration: Nextcloud
Nextcloud replaces Google Drive, Dropbox, and parts of Google Workspace. It provides file storage, sharing, collaborative document editing (via Collabora or OnlyOffice integration), calendars, contacts, and a growing app ecosystem.
Maintenance reality: Nextcloud is the most maintenance-intensive item in this stack after PostHog. Large file sync operations can be slow. Database optimization matters. Budget 2-3 hours per month. Use the official AIO (All-in-One) Docker image for the smoothest experience.
Source Control and CI/CD: Gitea
Gitea replaces GitHub or GitLab for source control, with built-in CI/CD through Gitea Actions (compatible with GitHub Actions workflow syntax).
# docker-compose.gitea.yml
services:
gitea:
image: gitea/gitea:latest
restart: unless-stopped
volumes:
- gitea-data:/data
environment:
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=gitea-db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=${DB_PASSWORD}
- GITEA__server__ROOT_URL=https://git.yourdomain.com
depends_on:
- gitea-db
gitea-db:
image: postgres:15
restart: unless-stopped
volumes:
- gitea-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=gitea
gitea-runner:
image: gitea/act_runner:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- GITEA_INSTANCE_URL=http://gitea:3000
- GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_TOKEN}
volumes:
gitea-data:
gitea-db-data:Maintenance reality: Gitea is remarkably stable and lightweight. It consumes under 200MB of RAM. The CI/CD runner needs Docker socket access, so keep your host Docker engine updated for security.
Monitoring: Grafana + Prometheus + Loki
This trio replaces Datadog, New Relic, and similar observability platforms.
This is the industry-standard open-source monitoring stack. The ecosystem of exporters (node_exporter, cadvisor, postgres_exporter, etc.) covers virtually every service you will run.
Maintenance reality: Initial dashboard setup takes time, but once configured, this stack is very stable. Prometheus storage requires capacity planning --- set appropriate retention periods based on your disk space.
The GDPR and Data Sovereignty Angle
For European companies, self-hosting is not just a cost optimization. It is increasingly a compliance necessity.
The Schrems II decision invalidated the EU-US Privacy Shield. While the EU-US Data Privacy Framework exists as a replacement, its long-term stability remains uncertain. Every time your data crosses the Atlantic to a US-based SaaS provider, you carry regulatory risk.
Self-hosting on European infrastructure (Hetzner, OVH, Scaleway, or your own hardware) eliminates this risk entirely. Your data stays in your jurisdiction, on your servers, under your control.
For companies subject to the EU AI Act, NIS2, or industry-specific regulations, self-hosting provides the auditability and control that compliance demands.
The Maintenance Reality Check
Self-hosting is not free in terms of effort. Here is an honest assessment of the ongoing maintenance burden.
Weekly tasks (1-2 hours):
Monthly tasks (3-5 hours):
Quarterly tasks (4-8 hours):
Total estimated maintenance: 8-15 hours per month. For a team with even one part-time DevOps-oriented engineer, this is manageable. For teams with zero infrastructure experience, start with a managed Kubernetes or PaaS service and migrate individual tools gradually.
Infrastructure Recommendations
For Teams of 5-15 People
A single dedicated server handles the entire stack comfortably.
For Teams of 15-50 People
Consider two servers with service distribution based on resource requirements.
Essential Practices
<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 220" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="220" rx="12" fill="#1a1a2e"/><rect x="230" y="15" width="140" height="35" rx="8" fill="#6366f1" opacity="0.9"/><text x="300" y="38" text-anchor="middle" fill="#ffffff" font-size="12" font-family="system-ui" font-weight="bold">API Gateway</text><rect x="30" y="80" width="100" height="50" rx="8" fill="#3b82f6" opacity="0.8"/><text x="80" y="100" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Auth</text><text x="80" y="115" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Service</text><rect x="160" y="80" width="100" height="50" rx="8" fill="#a855f7" opacity="0.8"/><text x="210" y="100" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">User</text><text x="210" y="115" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Service</text><rect x="290" y="80" width="100" height="50" rx="8" fill="#2dd4bf" opacity="0.8"/><text x="340" y="100" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Order</text><text x="340" y="115" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Service</text><rect x="420" y="80" width="100" height="50" rx="8" fill="#f59e0b" opacity="0.8"/><text x="470" y="100" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Payment</text><text x="470" y="115" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Service</text><line x1="265" y1="50" x2="80" y2="78" stroke="#e2e8f0" stroke-width="1" opacity="0.5"/><line x1="285" y1="50" x2="210" y2="78" stroke="#e2e8f0" stroke-width="1" opacity="0.5"/><line x1="315" y1="50" x2="340" y2="78" stroke="#e2e8f0" stroke-width="1" opacity="0.5"/><line x1="335" y1="50" x2="470" y2="78" stroke="#e2e8f0" stroke-width="1" opacity="0.5"/><ellipse cx="80" cy="175" rx="35" ry="12" fill="none" stroke="#3b82f6" stroke-width="1.5"/><line x1="45" y1="175" x2="45" y2="190" stroke="#3b82f6" stroke-width="1.5"/><line x1="115" y1="175" x2="115" y2="190" stroke="#3b82f6" stroke-width="1.5"/><ellipse cx="80" cy="190" rx="35" ry="12" fill="none" stroke="#3b82f6" stroke-width="1.5"/><line x1="80" y1="130" x2="80" y2="163" stroke="#94a3b8" stroke-width="1" stroke-dasharray="3,3"/><ellipse cx="340" cy="175" rx="35" ry="12" fill="none" stroke="#2dd4bf" stroke-width="1.5"/><line x1="305" y1="175" x2="305" y2="190" stroke="#2dd4bf" stroke-width="1.5"/><line x1="375" y1="175" x2="375" y2="190" stroke="#2dd4bf" stroke-width="1.5"/><ellipse cx="340" cy="190" rx="35" ry="12" fill="none" stroke="#2dd4bf" stroke-width="1.5"/><line x1="340" y1="130" x2="340" y2="163" stroke="#94a3b8" stroke-width="1" stroke-dasharray="3,3"/><rect x="155" y="160" width="150" height="30" rx="6" fill="#a855f7" opacity="0.3"/><text x="230" y="180" text-anchor="middle" fill="#a855f7" font-size="10" font-family="system-ui">Message Bus / Events</text><line x1="210" y1="130" x2="210" y2="158" stroke="#94a3b8" stroke-width="1" stroke-dasharray="3,3"/><line x1="470" y1="130" x2="470" y2="175" stroke="#94a3b8" stroke-width="1" stroke-dasharray="3,3"/><line x1="305" y1="175" x2="470" y2="175" stroke="#94a3b8" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.3"/></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Microservices architecture: independent services communicate through an API gateway and event bus.</p></div>
Getting Started: The First Weekend
If you want to try this approach, here is a pragmatic starting sequence:
1. Day 1 morning: Provision a server, install Docker, configure Traefik with automatic SSL 2. Day 1 afternoon: Deploy Gitea (source control) and Plausible (analytics) --- these are the easiest wins 3. Day 1 evening: Deploy Mattermost (communication) and n8n (automation) 4. Day 2 morning: Deploy Plane (project management) and Grafana + Prometheus (monitoring) 5. Day 2 afternoon: Deploy ZITADEL (auth) and connect it as the SSO provider for other services 6. Day 2 evening: Configure backups and verify everything works
Start migrating one team at a time. Do not force a big-bang switch. Let people experience the self-hosted tools alongside existing SaaS subscriptions, then cancel subscriptions as confidence builds.
The $60,000 per year you save can fund an engineer, a product feature, or simply extend your runway. In 2026, the self-hosted ecosystem has matured to the point where the question is no longer whether self-hosting is viable, but whether paying for SaaS is still justifiable.
Need help with self-hosted?
TechSaaS provides expert consulting and managed services for cloud infrastructure, DevOps, and AI/ML operations.