tower-of-joy
Self-hosted home server infrastructure with GPU-accelerated ML model serving, media streaming, and secure remote access
Overview
tower-of-joy is a containerized home server platform running on the "tower-of-joy" system, leveraging Portainer + Docker Compose for service orchestration. The infrastructure supports GPU-accelerated workloads (ML inference via Ollama, media transcoding via Jellyfin) while maintaining a clean separation between performance-critical configs (SSD) and bulk content storage (HDD).
Quick Start
Main Dashboard: https://home.schweitz.net (Organizr - unified interface for all services)
System Specifications
- Host: tower-of-joy (Zorin OS 16.3 / Ubuntu 20.04)
- CPU: Intel i7-6700 (4C/8T @ 3.40GHz)
- RAM: 16GB
- GPU: NVIDIA RTX 2080 Ti (11GB VRAM)
- Storage:
- SSD (489GB): Configs, databases, Docker images →
/home/jpmschweitzer/docker-data/ - HDD (3.7TB): Media, user content, backups →
/mnt/media/
- SSD (489GB): Configs, databases, Docker images →
Architecture
┌─────────────────────────────────────────┐
│ Infrastructure Layer │
│ ├── Portainer (8080) - Container mgmt │
│ ├── NPM (8000) - Reverse proxy │
│ └── Ollama (11434) - ML models [GPU] │
├─────────────────────────────────────────┤
│ Networking Layer │
│ └── Headscale (8085) - Secure mesh │
├─────────────────────────────────────────┤
│ Monitoring Layer │
│ ├── Uptime Kuma (3001) - Uptime │
│ ├── Netdata (19999) - Metrics │
├─────────────────────────────────────────┤
│ Optimization Layer │
│ ├── Watchtower - Auto-updates │
│ └── Maintenance - Automated backups │
├─────────────────────────────────────────┤
│ Application Layer (Backlog) │
│ ├── Jellyfin (8096) - Media [GPU] │
│ ├── Nextcloud (8082) - Cloud storage │
│ └── Samba (445) - File shares │
└─────────────────────────────────────────┘
Project Structure
tower-of-joy/
├── stacks/ # Docker Compose files (version-controlled)
│ ├── portainer.yml
│ ├── nginx-proxy-manager.yml
│ ├── ollama.yml
│ ├── headscale.yml
│ ├── jellyfin.yml
│ ├── nextcloud.yml
│ └── ...
├── scripts/ # Maintenance automation
│ ├── health-check.sh
│ ├── gpu-check.sh
│ ├── backup-configs.sh
│ ├── disk-usage.sh
│ └── cleanup.sh
├── containers/ # Research & implementation docs
│ ├── research.md
│ └── implementation-plan.md
├── Makefile # Common operations
├── STATUS.md # Current phase tracking
├── CHANGELOG.md # Version history
├── AGENTS.md # AI agent guidelines
└── SYSTEM.md # Hardware documentation
Documentation
- AGENTS.md - Guidelines for AI coding agents (conventions, testing, commits)
- STATUS.md - Current implementation phase and progress
- CHANGELOG.md - Version history and completed work
- SYSTEM.md - Detailed hardware and software specs
- containers/research.md - Platform research and comparison
- containers/implementation-plan.md - Detailed deployment guide
Development Setup
Python Environment
Some automation scripts require Python dependencies. A virtual environment is provided:
# Activate virtual environment
source .venv/bin/activate
# Install/update dependencies
pip install -r requirements.txt
# Deactivate when done
deactivate
Note: The .venv/ directory is gitignored and must be created on each system.
Common Commands
Infrastructure Management
make status # Show running containers and system status
make health # Comprehensive health check
make gpu-check # Verify GPU passthrough
make disk # Disk usage report
make backup # Backup Docker configs
make cleanup # Clean unused Docker resources
Stack Management
make deploy-portainer # Deploy Portainer
make deploy-ollama # Deploy Ollama
make logs-ollama # View Ollama logs
make update-jellyfin # Update Jellyfin to latest
make stop-nextcloud # Stop Nextcloud stack
Phase Deployment
make deploy-phase1 # Deploy foundation (Portainer, NPM, Ollama)
make deploy-phase2 # Deploy networking (Headscale)
make deploy-phase3 # Deploy monitoring (Uptime Kuma, Netdata, Heimdall)
make deploy-phase4 # Deploy optimization (Watchtower, Maintenance)
make deploy-apps # Deploy applications (Jellyfin, Nextcloud, Samba)
Service Ports
| Service | Port | Description |
|---|---|---|
| Nginx Proxy Manager | 8000 | Unified web interface entry point |
| Portainer | 8080 | Container management UI |
| AMP | 8081 | Game server management (existing) |
| Open WebUI | 82 | LLM chat interface |
| Ollama | 11434 | ML model API |
| Core API | 8083 | OpenAPI functions for Open WebUI |
| Code-Server | 8084 | Browser-based IDE (localhost only) |
| Headscale | 8085 | Tailscale control server |
| Jellyfin | 8096 | Media streaming |
| Nextcloud | 8082 | Cloud storage |
| Uptime Kuma | 3001 | Service monitoring |
| Netdata | 19999 | System monitoring |
| Heimdall | 8888 | Application dashboard |
| Organizr | 9999 | Unified dashboard |
GPU Services
Two services leverage the RTX 2080 Ti for GPU acceleration:
-
Ollama (ML inference)
- Supports 3B-13B parameter models
- Recommended: llama3.2:3b, mistral:7b, codellama:7b
-
Jellyfin (Media transcoding)
- NVIDIA NVENC hardware encoding
- Can handle multiple 4K transcodes simultaneously
Storage Strategy
SSD (Performance-Critical):
- Docker configs
- Application databases
- Cache directories
- Container images
HDD (Capacity-Critical):
- Media files (Jellyfin)
- User data (Nextcloud)
- Game server worlds (AMP)
- Backups
Current Status
Phase: Planning & Documentation Complete ✅
Next Steps:
- Review implementation plan
- Verify prerequisites (Docker, GPU, disk space)
- Begin Phase 1: Foundation Setup
See STATUS.md for detailed progress tracking.
Contributing
This is a personal infrastructure project. For AI agents working on this codebase:
- Read AGENTS.md for guidelines
- Follow conventional commit format
- Test GPU access before deploying GPU services
- Update STATUS.md when completing phases
License
Personal infrastructure project - not licensed for reuse.
Resources
- Portainer: https://docs.portainer.io/
- Ollama: https://github.com/ollama/ollama
- Headscale: https://headscale.net/
- Jellyfin: https://jellyfin.org/docs/
- Nextcloud: https://docs.nextcloud.com/
Version: 0.1.0-planning Last Updated: 2025-11-11 System: tower-of-joy