Actively Maintained
Self-Hosted Server
Linux Docker Shell
Overview
Repurposed an old desktop into a always-on home server running Ubuntu Server. Everything runs in Docker containers so services are isolated, easy to update, and simple to back up. The goal was to replace as many cloud subscriptions as possible with self-hosted alternatives I actually control, and to learn how real infrastructure works by running it myself, not just reading about it.
What I built
- Ubuntu Server on bare metal with SSH-only remote access
- Docker Compose stacks for all services, no manual container management
- Nginx reverse proxy with SSL termination for clean local and remote access
- Automated backups with scheduled scripts and off-site copies
- Tailscale VPN for secure remote access without port-forwarding
- Self-hosted apps including Homebox, Nextcloud, and others
- Monitoring with Uptime Kuma to track service health
What I learned
- Linux system administration, users, permissions, systemd services, cron jobs
- Networking fundamentals: DNS, reverse proxies, VLANs, and firewalls in practice
- Docker and Docker Compose at a deeper level than just running dev containers
- How to think about backup strategies, failure modes, and recovery
- The real cost (and value) of running your own infrastructure vs. managed services
Architecture
flowchart TD
Internet([" Internet"])
Phone([" Remote Device"])
subgraph VPN["Tailscale VPN"]
TS["Tailscale"]
end
subgraph Server["Home Server · Ubuntu"]
Nginx["Nginx
Reverse Proxy + SSL"]
subgraph Containers["Docker Compose Stacks"]
NC["Nextcloud"]
HB["Homebox"]
UK["Uptime Kuma"]
Other["Other Services"]
end
Backup["Backup Scripts
(cron)"]
end
Offsite[" Off-site
Backup"]
Internet -->|"blocked / no open ports"| Server
Phone --> TS
TS --> Nginx
Nginx --> NC
Nginx --> HB
Nginx --> UK
Nginx --> Other
UK -->|"monitors"| Containers
Backup -->|"scheduled"| Offsite