Files
portainer-core/stacks
jpmschweitzerandClaude Opus 4.5 1a41e5bb80 feat(library-desk): implement Phase 1 service clients and infrastructure
Implements comprehensive service client layer for Library Desk API to support
Librarian AI agent with multi-tenant knowledge management across Neo4j, Qdrant,
Wiki.js, SearXNG, and Ollama.

## Service Clients (src/clients/)
- Neo4j async client with connection pooling and user-scoped labels
- Qdrant vector store with collection-per-user multi-tenancy
- Wiki.js GraphQL API client for page/dossier management
- SearXNG client for web search integration
- Ollama client for text embeddings (nomic-embed-text)

## Core Infrastructure (src/core/)
- Multi-tenancy helpers for user namespace management
  - Wiki.js: path-based namespaces (/users/{user})
  - Neo4j: user-specific labels (User_{User}_Document)
  - Qdrant: collection per user (library_desk_{user})
- Dependency injection with FastAPI Depends and @lru_cache singletons
- Lifecycle management (startup/shutdown) for all service connections

## Background Jobs (src/jobs/)
- Redis-based job manager for long-running operations
- Job status tracking with 24-hour TTL
- Support for queued, processing, completed, failed states

## Configuration
- Updated config.py with Redis DB 4 for library-desk jobs
- Updated docker-compose.yml: REDIS_DB from 2 to 4
- Added pytest and pytest-asyncio to requirements.txt

## Testing
- Unit tests: 25/25 passed (multi-tenancy helpers)
- Integration tests: 12/12 passed (all services verified)
  - Neo4j connection and CRUD operations
  - Qdrant vector operations with 768-dim embeddings
  - Wiki.js GraphQL queries
  - SearXNG web search
  - Job Manager with Redis
  - Dependency injection lifecycle
- pytest.ini configuration with asyncio support

## Health Monitoring
- Real-time service health checks via /health endpoint
- Connection status for all 5 external services
- Graceful degradation for partial service availability

## Architecture
- Follows async/await pattern throughout
- Connection pooling for Neo4j (singleton driver)
- HTTP client lifecycle management (httpx)
- Multi-tenancy enforced at client layer
- Default user: jpmschweitzer

Files changed: 26 files
- 5 new service clients (~1500 lines)
- 2 core modules (~500 lines)
- 1 job manager (~350 lines)
- 3 test files with 37 test cases
- Updated main.py with lifecycle hooks

All services tested and operational. Ready for Phase 2 (routers/services).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 19:09:54 +01:00
..
2025-11-14 15:31:25 +01:00

Docker Compose Stacks

This directory contains version-controlled Docker Compose files for all services in the tower-of-joy infrastructure.

Deployment

review the http://core-api/docs openapi documentation for infrastructure management REST endpoints.

Stack Inventory

Phase 1: Foundation

Stack File Ports GPU Description
Portainer portainer.yml 8080, 8443 No Container management UI
Nginx Proxy Manager nginx-proxy-manager.yml 8000, 80, 443 No Reverse proxy and unified web interface
Ollama ollama.yml 11434 Yes ML model serving with GPU acceleration

Phase 2: Networking

Stack File Ports GPU Description
Headscale headscale.yml 8085, 9090 No Self-hosted Tailscale control server

Phase 3: Monitoring

Stack File Ports GPU Description
Uptime Kuma uptime-kuma.yml 3001 No Service availability monitoring
Netdata netdata.yml 19999 No Real-time system performance monitoring
Heimdall heimdall.yml 8888, 8889 No Application dashboard

Phase 4: Optimization

Stack File Ports GPU Description
Watchtower watchtower.yml - No Automatic container updates
Duplicati duplicati.yml 8200 No Backup solution

Backlog: Applications

Stack File Ports GPU Description
Jellyfin jellyfin.yml 8096, 8920, 7359, 1900 Yes Media server with GPU transcoding
Nextcloud nextcloud.yml 8082 No Cloud storage (includes DB and Redis)
Gitea gitea.yml 3002, 2222 No Git repository hosting (includes PostgreSQL)
Samba samba.yml 139, 445 No Network file sharing

Port Allocation

Infrastructure Services (8000-8099)

  • 8000: Nginx Proxy Manager (unified web interface)
  • 8080: Portainer
  • 8081: AMP (game servers - existing)
  • 8082: Nextcloud
  • 8085: Headscale
  • 8096: Jellyfin

Git & Development Services

  • 2222: Gitea SSH
  • 3002: Gitea HTTP

Monitoring Services (3000-3999, 19000-19999)

  • 3001: Uptime Kuma
  • 8200: Duplicati
  • 8888: Heimdall
  • 19999: Netdata

ML/API Services (11000+)

  • 11434: Ollama

Network Services

  • 80: HTTP (NPM reverse proxy)
  • 443: HTTPS (NPM reverse proxy)
  • 139, 445: Samba/SMB
  • 9090: Headscale metrics

Storage Convention

All stacks follow the dual-disk strategy:

SSD (Performance):

  • Configs: /home/jpmschweitzer/docker-data/<service>/config
  • Cache: /home/jpmschweitzer/docker-data/<service>/cache
  • Databases: /home/jpmschweitzer/docker-data/<service>/db

HDD (Capacity):

  • User content: /mnt/media/<service>/data
  • Media files: /mnt/media/<service>/media
  • Backups: /mnt/media/backups/<service>

GPU Services

Stacks requiring GPU access (marked with Yes above):

  • ollama.yml - ML model inference
  • jellyfin.yml - Hardware transcoding

Prerequisites:

  • NVIDIA Container Toolkit installed
  • GPU verified: docker run --rm --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi

Before Deploying

  1. Review environment variables - Change default passwords!
  2. Create directories - Ensure volume paths exist
  3. Check ports - Verify no conflicts with existing services
  4. GPU services - Confirm NVIDIA toolkit installed
  5. Update STATUS.md - Mark stack as deployed when complete

After Deploying

  1. Test service - Access web UI or API endpoint
  2. Check logs - docker logs <container-name>
  3. Verify GPU - docker exec <container> nvidia-smi (if applicable)
  4. Update documentation - Add to STATUS.md and CHANGELOG.md
  5. Configure backup - Add to Duplicati backup job

Maintenance

Update a Stack

# Pull latest images
docker compose -f stacks/<stack-name>.yml pull

# Recreate containers with new images
docker compose -f stacks/<stack-name>.yml up -d

# Or let Watchtower handle it automatically

Backup Stack Configuration

# Stacks are version-controlled in this directory
# Backup container data separately (see scripts/backup.sh)

Troubleshooting

  • Container won't start: docker logs <container-name>
  • Port conflicts: sudo netstat -tulpn | grep <port>
  • Permission issues: Check volume path ownership
  • GPU not detected: Verify NVIDIA toolkit and restart Docker

For detailed implementation instructions, see containers/implementation-plan.md