A self-hosted home server built on a Raspberry Pi 4 for photo management, media streaming, file sharing, secure remote access, and real-time system monitoring.
Along with the server, I built a custom 3.5-inch LCD dashboard using Python and Tkinter. It displays live weather, Raspberry Pi temperature, rain probability, and the health of Docker, Immich, Jellyfin, and Tailscale.
- Personal photo cloud: Immich for storing and managing photos and videos.
- Media server: Jellyfin for streaming movies and other media.
- Persistent storage: External SSD mounted on Linux for application and media data.
- Network file sharing: Samba/SMB for accessing files from other devices.
- Secure remote access: Tailscale for private access to the server and SSH away from home.
- Smart LCD dashboard: Python/Tkinter dashboard for weather and server monitoring.
- Service monitoring: Live health indicators for Docker, Immich, Jellyfin, and Tailscale.
- Automatic startup: systemd user service starts the dashboard automatically after boot/login.
+----------------------+
| Raspberry Pi 4 |
| Debian Linux |
+----------+-----------+
|
+-----------------+------------------+
| | |
Docker Networking Python
| | |
+-----+-----+ +----+-----+ +----+------+
| | | | | |
Immich Jellyfin Samba Tailscale Tkinter Open-Meteo
| | | API
+-----+-----+ |
| 3.5-inch LCD
External SSD |
System Monitor
| Area | Technology |
|---|---|
| Hardware | Raspberry Pi 4, external SSD, 3.5-inch SPI LCD |
| Programming | Python, Tkinter |
| OS | Debian Linux |
| Containers | Docker, Docker Compose |
| Photos | Immich |
| Media | Jellyfin |
| Database / Services | PostgreSQL, Redis/Valkey |
| Networking | Tailscale, Samba/SMB, SSH |
| API | Open-Meteo |
| Service management | systemd |
| Version control | Git, GitHub |
The dashboard shows:
- Current time and date
- Current temperature and weather condition
- Animated day/night weather visuals
- Humidity
- Rain probability
- Wind speed
- Raspberry Pi CPU temperature
- Docker health
- Immich health
- Jellyfin health
- Tailscale status
The UI uses a daytime theme from 7 AM to 6 PM, a night theme after 6 PM, and clears the display between midnight and 7 AM.
The project uses an external SSD mounted at /mnt/storage. A typical layout is:
/mnt/storage/
├── immich/
│ ├── library/
│ └── postgres/
└── media/
├── movies/
└── tv/
Actual credentials and private configuration are intentionally not included in this repository.
raspberry-pi-home-server/
├── README.md
├── LICENSE
├── .gitignore
├── dashboard/
│ └── lcd_dashboard.py
├── config/
│ ├── jellyfin-compose.example.yml
│ ├── immich.env.example
│ ├── samba-share.example.conf
│ ├── lcd-dashboard.service
│ └── labwc-autostart.example
└── docs/
├── SETUP.md
├── ARCHITECTURE.md
└── TROUBLESHOOTING.md
This project gave me hands-on experience beyond application development. I worked with Linux storage and permissions, Docker volumes and health checks, networking, private remote access, API integration, systemd services, SPI displays, Wayland display configuration, and debugging across hardware and software.
The most useful part was bringing all of those pieces together into a system I can actually use rather than building them as isolated demos.
- Do not commit passwords, API secrets, personal media, Tailscale authentication keys, or private IP information.
- The example configuration files use placeholders.
- Keep administrative interfaces protected and update containers and the host OS regularly.
MIT License. See LICENSE.