feat(stack): add Tatlock UI home lab dashboard

Add Flutter-based dashboard to replace Organizr:
- Port 8092, stateless static web app via nginx
- Resource limits (128M/32M), wget-based healthcheck
- Documented in CONTAINERS.md with full service profile

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-02 13:58:26 +01:00
co-authored by Claude Opus 4.5
parent 7b729aa285
commit 4dc72b2128
2 changed files with 75 additions and 3 deletions
+31 -3
View File
@@ -1,8 +1,8 @@
# Container Reference - tower-of-joy Infrastructure
> **Last Updated:** 2026-01-01
> **Total Services:** 27 containers across 21 stacks
> **System:** Intel i7-6700, RTX 2080 Ti (11GB VRAM), 16GB RAM, Zorin OS 16.3
> **Last Updated:** 2026-01-02
> **Total Services:** 28 containers across 22 stacks
> **System:** Intel i7-6700, RTX 2080 Ti (11GB VRAM), 64GB RAM, Zorin OS 16.3
---
@@ -37,6 +37,7 @@
| **Paperless-ngx** | 8091 | https://documents.schweitz.net | Internet | No | 8 | ✅ Running |
| **ClamAV** | 3310 | N/A (host service) | No | No | - | ✅ Running |
| **AdGuard Home** | 53, 3053 | http://dns.schweitz.internal | LAN (DNS) | No | - | ✅ Running |
| **Tatlock UI** | 8092 | http://192.168.86.149:8092 | LAN (future: home.schweitz.net) | No | - | ✅ Running |
### External Domains (SSL via Let's Encrypt)
- **home.schweitz.net** → Organizr (Protected by Authentik SSO)
@@ -86,6 +87,7 @@ Services marked "(external)" have source code in separate Gitea repositories. Co
| **Scheduler** | [scheduler](https://git.schweitz.net/jpmschweitzer/scheduler) | `git.schweitz.net/jpmschweitzer/scheduler:latest` |
| **Core API** | [core-api](https://git.schweitz.net/jpmschweitzer/core-api) | `git.schweitz.net/jpmschweitzer/core-api:latest` |
| **Library Desk** | [library-desk](https://git.schweitz.net/jpmschweitzer/library-desk) | `git.schweitz.net/jpmschweitzer/library-desk:latest` |
| **Tatlock UI** | [tatlock-ui](https://git.schweitz.net/jpmschweitzer/tatlock-ui) | `git.schweitz.net/jpmschweitzer/tatlock-ui:latest` |
**Development workflow:** Clone repo → make changes → create Gitea release → Watchtower auto-updates container.
@@ -373,6 +375,30 @@ Organizr serves as a comprehensive unified dashboard that consolidates all homel
---
### Tatlock UI
Tatlock UI is a modern Flutter-based home lab dashboard designed to replace Organizr, providing a responsive web interface for monitoring and accessing all infrastructure services. Built as a stateless static web application served via nginx, it offers fast load times and a clean, customizable interface for the tower-of-joy infrastructure. The Flutter web build is compiled and containerized via Gitea Actions, with automatic deployment through Watchtower.
| Property | Value |
|----------|-------|
| **Image** | `git.schweitz.net/jpmschweitzer/tatlock-ui:latest` |
| **Container Name** | `tatlock-ui` |
| **Access URL (LAN)** | http://192.168.86.149:8092 |
| **Access URL (Public)** | https://home.schweitz.net (future, replacing Organizr) |
| **External Access** | LAN only (future: via NPM reverse proxy with SSL) |
| **Port Mapping** | 8092:80 (HTTP) |
| **Network Mode** | Bridge (docker-dataplane) |
| **Restart Policy** | `unless-stopped` |
| **Volume Mounts** | None (stateless static web app) |
| **Resource Limits** | Memory: 128M limit, 32M reservation |
| **GPU Required** | No |
| **Dependencies** | None (static frontend) |
| **Source Repository** | https://git.schweitz.net/jpmschweitzer/tatlock-ui |
| **Health Check** | `wget -q --spider http://localhost:80/` (30s interval) |
| **Features** | Service dashboard, infrastructure monitoring, responsive design |
---
## Optimization Layer
### Watchtower
@@ -659,6 +685,7 @@ Gitea is a lightweight, self-hosted Git service providing repository hosting, is
| **Gitea** | https://git.schweitz.net | Yes | Git repository hosting |
| **Samba** | \\\\192.168.86.149 | No | Network file shares |
| **Home Assistant** | https://housekeeping.schweitz.net | Yes | Smart home automation |
| **Tatlock UI** | http://192.168.86.149:8092 | No (future: Yes) | Home lab dashboard |
| **Watchtower** | N/A (background) | N/A | Auto-updates |
---
@@ -694,6 +721,7 @@ Gitea is a lightweight, self-hosted Git service providing repository hosting, is
| **Gitea** | `~/docker-data/gitea/` | N/A | Data: ~100MB, DB: ~50MB, Repos: variable |
| **Samba** | `~/docker-data/samba/` | Mounts: `/mnt/media/` (shares) | Config: ~5MB |
| **Home Assistant** | `~/docker-data/home-assistant/config/` | N/A | Config: ~100MB, DB: ~50MB |
| **Tatlock UI** | None (stateless) | N/A | ~0MB (static files in container) |
**SSD Usage (docker-data):** ~6-11GB (configs, caches, databases)
**HDD Usage (/mnt/media):** ~2.1TB / 3.6TB (58% used)
+44
View File
@@ -0,0 +1,44 @@
version: '3.8'
# Tatlock UI - Home Lab Dashboard (Flutter Web)
# Port: 8092 (HTTP)
# GPU: No
# External: home.schweitz.net (future, replacing Organizr)
# Storage: None (stateless static web app)
#
# Container image built from: git.schweitz.internal/jpmschweitzer/tatlock-ui
# See CONTAINERS.md for port allocation reference
services:
tatlock-ui:
image: git.schweitz.internal/jpmschweitzer/tatlock-ui:latest
container_name: tatlock-ui
restart: unless-stopped
ports:
- "8092:80"
networks:
- docker-dataplane
labels:
- "com.centurylinklabs.watchtower.enable=true"
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:80/ || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
deploy:
resources:
limits:
memory: 128M
reservations:
memory: 32M
networks:
docker-dataplane:
external: true
name: docker-dataplane
# Access:
# - Internal: http://tower-of-joy:8092
# - Mesh VPN: http://10.99.0.1:8092
# - Future: https://home.schweitz.net (after NPM switch from Organizr)