Hosting types

Each model involves a different trade-off between control, cost, and maintenance burden.

VPS

A virtual machine you manage yourself. The default for Docker-based self-hosted apps.

Providers: Hetzner, DigitalOcean, Vultr, Linode, OVH
Best for: Docker apps, CRMs, dashboards, n8n, Mautic, Listmonk, Directus, database-heavy stacks
  • Cheap and powerful
  • Full control over the stack
  • You handle security, backups, updates, and 11pm emergencies
Managed Hosting

A VPS with a control panel layer for server management, SSL, backups, and staging.

Providers: Cloudways, RunCloud, GridPane, Plesk, cPanel
Best for: WordPress, PHP apps, client sites, lower maintenance requirements
  • Easier backups, SSL, staging, and support
  • More expensive, less flexible for modern Docker apps
Platform as a Service

Git-based deployment with managed scaling, logs, and environment variables.

Providers: Render, Railway, Fly.io, Heroku
Best for: APIs, small SaaS tools, apps with straightforward database needs
  • Easy deployment, scaling, and logs
  • Costs can creep; persistent storage and databases need attention
Static Hosting

Pre-built HTML, CSS, and JS served from a CDN. No server to manage.

Providers: Cloudflare Pages, Netlify, Vercel, S3 + CloudFront
Best for: Content sites, directories, landing pages, Astro, Hugo, Eleventy
  • Fast, secure, cheap, low maintenance
  • Forms, search, auth, and admin need external services

App management tools

This layer sits between your server and your apps. Getting it right makes updates, rollbacks, and new installs much less painful.

Docker Compose
The default for most self-hosted apps. Portable, well-documented, and supported by nearly every project.
Coolify
Self-hosted alternative to Heroku or Render. Good for deploying apps from Git with a UI you control.
Dokploy
Similar to Coolify. Useful for Docker Compose management and multi-app deployments from one panel.
CapRover
Older but stable. Good for simple app hosting via a one-click app marketplace.
CloudPanel
Server management focused on PHP, WordPress, and static sites. Clean interface.
RunCloud
More polished managed panel, especially suited to PHP and WordPress. Has a paid tier.

Before you deploy

Check these before committing to an app. Many self-hosting regrets come from skipping this step.

Database requirements

A simple site needs nothing. A CRM might need Postgres, Redis, file uploads, background jobs, and scheduled tasks. An email platform adds queue workers, bounce handling, and large table management. Know before you provision.

  • PostgreSQL or MySQL
  • Redis
  • Object storage (S3-compatible)
  • Queue workers and cron jobs
  • Elasticsearch or Meilisearch

Project health

Self-hosting ties you to the project's maintenance cycle. A tool with no recent commits or a complex upgrade path becomes a liability.

  • Is it actively maintained?
  • Are there security releases?
  • Is there a Docker image?
  • Is the upgrade path documented?
  • Can you export your data?

Backups

A snapshot from your host is not a backup. You need off-server copies, a retention policy, and a restore you have actually tested.

A backup you have never restored is more of a comforting superstition than a backup.

What to back up

  • Database (daily, automated)
  • Uploaded files
  • Docker Compose files and env vars
  • App configuration
  • DNS records
  • Email templates and campaign data

Good defaults

  • Daily database backups to off-server storage
  • 7 daily / 4 weekly / 6 monthly retention
  • Restore test at least once after setup
  • Written restore instructions somewhere findable

Tools: Restic, Borg, Duplicati. Storage: Cloudflare R2, Backblaze B2, AWS S3.

Security

The basics are not glamorous, but skipping them is how things go wrong. Treat security as part of the product, not an afterthought.

  • SSH keys, no password login
  • Root password login disabled
  • Firewall enabled, only necessary ports open
  • Automatic security updates
  • Two-factor auth where available
  • Fail2ban or equivalent
  • Rate limiting on login pages
  • Private databases not exposed publicly
  • Secrets kept outside Git
  • Strong admin passwords
  • Web application firewall for public apps
  • Subdomains for each app (crm.example.com, etc.)
  • Admin tools not public-facing where possible

Cloudflare is a good layer in front of self-hosted sites. DNS, SSL, caching, firewall rules, and bot protection in one place.

Monitoring

At minimum: uptime alerts and disk space alerts. Disk filling up silently is one of the classic self-hosting disasters.

Uptime Kuma
Self-hosted uptime monitoring with alerts. Free, Docker-based.
Better Stack
Hosted uptime and incident management. Good free tier.
Healthchecks.io
Dead-simple cron job and backup success monitoring.
Netdata
Real-time CPU, RAM, disk, and process monitoring. Self-hosted.
Sentry
App error tracking. Self-hostable or hosted free tier.

Email sending

Self-hosted email marketing is not just install the app and send newsletters. Deliverability is a separate problem from the software.

Do not send bulk email directly from a VPS IP. It might technically work. It will also likely land in spam, get rate-limited, or burn your sending domain's reputation.

The standard model is a self-hosted app for list management, campaigns, and automations, combined with an external SMTP provider for actual sending.

Before sending, set up SPF, DKIM, and DMARC records. Use a subdomain for sending (mail.example.com). Warm up gradually. Handle bounces and complaints.