Tobias González Arriola
All work

Self-Hosted VPS

August 2026 - Present

My own server on a Hostinger VPS, home to everything self-hosted: all of MineCall (API, frontend, Control Center and LiveKit), Postgres and whatever project comes next, with Caddy as the single front door.

The problem

Pay-per-use cloud didn't add up for this pattern: LiveKit Cloud bills per participant-minute and a presence app keeps people connected all day, and the asset bucket on GCP had already cost US$33 in twenty days.

Features

  • Caddy as the single front door: automatic HTTPS, one vhost per domain and a reverse proxy to each service
  • Atalaya, my own monitoring panel: live CPU, memory, disk and network
  • The state of the ten watched services, with memory and uptime for each

My responsibility

All mine: provisioning and hardening the VPS (Debian 13, key-only SSH, no root login), a one-folder-per-project convention, systemd units with CPU and memory limits, Caddy with automatic HTTPS and a vhost per domain, local PostgreSQL 17 with a nightly backup to a private bucket, and MineCall's domain in production. On top of it I built Atalaya, my own logging and monitoring panel: live CPU, memory, disk and network, the state of the ten watched services, traffic and latency per app, server logins, an event log and alerts — a single Go binary with the React frontend embedded, no agents and no exporters, reading what the machine already has (/proc, systemctl, journalctl and Caddy's access logs).

Stack

Frontend
Caddy as the single entry point — automatic HTTPS, per-domain vhosts, reverse proxy and static hosting; Atalaya, a React dashboard with live charts, embedded in the Go binary
Backend
Debian 13, systemd units with CPU/memory limits, PostgreSQL 17, LiveKit SFU, Docker, nightly pg_dump to private object storage, key-only SSH; Atalaya reads /proc, systemctl, journalctl and Caddy access logs into SQLite — no agents, no exporters
DebianCaddysystemdPostgreSQLLiveKitGoObservabilityDevOps